-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: added ability to handle course errors #14
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,33 @@ | ||
package org.openedx.core.data.model | ||
|
||
import com.google.gson.annotations.SerializedName | ||
import org.openedx.core.domain.model.CourseAccessDetails | ||
import org.openedx.core.data.model.room.discovery.CourseAccessDetailsDb | ||
import org.openedx.core.utils.TimeUtils | ||
import org.openedx.core.domain.model.CourseAccessDetails as DomainCourseAccessDetails | ||
|
||
data class CourseAccessDetails( | ||
@SerializedName("has_unmet_prerequisites") | ||
val hasUnmetPrerequisites: Boolean, | ||
@SerializedName("is_too_early") | ||
val isTooEarly: Boolean, | ||
@SerializedName("is_staff") | ||
val isStaff: Boolean, | ||
@SerializedName("audit_access_expires") | ||
val auditAccessExpires: String?, | ||
@SerializedName("courseware_access") | ||
var coursewareAccess: CoursewareAccess?, | ||
) { | ||
fun mapToDomain(): DomainCourseAccessDetails = | ||
DomainCourseAccessDetails( | ||
TimeUtils.iso8601ToDate(auditAccessExpires ?: ""), | ||
coursewareAccess?.mapToDomain() | ||
) | ||
fun mapToDomain() = CourseAccessDetails( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
hasUnmetPrerequisites = hasUnmetPrerequisites, | ||
isTooEarly = isTooEarly, | ||
isStaff = isStaff, | ||
auditAccessExpires = TimeUtils.iso8601ToDate(auditAccessExpires ?: ""), | ||
coursewareAccess = coursewareAccess?.mapToDomain(), | ||
) | ||
|
||
fun mapToRoomEntity(): CourseAccessDetailsDb = | ||
CourseAccessDetailsDb(auditAccessExpires, coursewareAccess?.mapToRoomEntity()) | ||
CourseAccessDetailsDb( | ||
hasUnmetPrerequisites, isTooEarly, isStaff, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please mention the attributes names as well.
|
||
auditAccessExpires, coursewareAccess?.mapToRoomEntity() | ||
) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package org.openedx.core.data.model | ||
|
||
import com.google.gson.annotations.SerializedName | ||
import org.openedx.core.domain.model.CourseEnrollmentDetails | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here |
||
|
||
data class CourseEnrollmentDetails( | ||
@SerializedName("id") | ||
val id: String, | ||
@SerializedName("course_updates") | ||
val courseUpdates: String, | ||
@SerializedName("course_handouts") | ||
val courseHandouts: String, | ||
@SerializedName("discussion_url") | ||
val discussionUrl: String, | ||
@SerializedName("course_access_details") | ||
val courseAccessDetails: CourseAccessDetails, | ||
@SerializedName("certificate") | ||
val certificate: Certificate?, | ||
@SerializedName("enrollment_details") | ||
val enrollmentDetails: EnrollmentDetails, | ||
@SerializedName("course_info_overview") | ||
val courseInfoOverview: CourseInfoOverview, | ||
) { | ||
fun mapToDomain(): CourseEnrollmentDetails { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please use alias |
||
return CourseEnrollmentDetails( | ||
id = id, | ||
courseUpdates = courseUpdates, | ||
courseHandouts = courseHandouts, | ||
discussionUrl = discussionUrl, | ||
courseAccessDetails = courseAccessDetails.mapToDomain(), | ||
certificate = certificate?.mapToDomain(), | ||
enrollmentDetails = enrollmentDetails.mapToDomain(), | ||
courseInfoOverview = courseInfoOverview.mapToDomain(), | ||
) | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we need to define a JsonDeserializer here to update SKUs according to IAP implementation.
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package org.openedx.core.data.model | ||
|
||
import com.google.gson.annotations.SerializedName | ||
import org.openedx.core.domain.model.CourseInfoOverview | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here |
||
import org.openedx.core.utils.TimeUtils | ||
|
||
data class CourseInfoOverview( | ||
@SerializedName("name") | ||
val name: String, | ||
@SerializedName("number") | ||
val number: String, | ||
@SerializedName("org") | ||
val org: String, | ||
@SerializedName("start") | ||
val start: String?, | ||
@SerializedName("start_display") | ||
val startDisplay: String, | ||
@SerializedName("start_type") | ||
val startType: String, | ||
@SerializedName("end") | ||
val end: String?, | ||
@SerializedName("is_self_paced") | ||
val isSelfPaced: Boolean, | ||
@SerializedName("media") | ||
var media: Media?, | ||
@SerializedName("course_sharing_utm_parameters") | ||
val courseSharingUtmParameters: CourseSharingUtmParameters, | ||
@SerializedName("course_about") | ||
val courseAbout: String, | ||
@SerializedName("course_modes") | ||
val courseModes: List<CourseMode>, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. CourseModes can be null here. |
||
) { | ||
fun mapToDomain() = CourseInfoOverview( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please use alias |
||
name = name, | ||
number = number, | ||
org = org, | ||
start = TimeUtils.iso8601ToDate(start ?: ""), | ||
startDisplay = startDisplay, | ||
startType = startType, | ||
end = TimeUtils.iso8601ToDate(end ?: ""), | ||
isSelfPaced = isSelfPaced, | ||
media = media?.mapToDomain(), | ||
courseSharingUtmParameters = courseSharingUtmParameters.mapToDomain(), | ||
courseAbout = courseAbout, | ||
courseModes = courseModes.map { it.mapToDomain() }, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we need to add a custom property named
|
||
) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
package org.openedx.core.data.model | ||
|
||
import com.google.gson.annotations.SerializedName | ||
import org.openedx.core.domain.model.CourseMode | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here |
||
import kotlin.math.ceil | ||
|
||
/** | ||
|
@@ -10,20 +11,26 @@ import kotlin.math.ceil | |
data class CourseMode( | ||
@SerializedName("slug") | ||
val slug: String?, | ||
|
||
@SerializedName("sku") | ||
val sku: String?, | ||
|
||
@SerializedName("android_sku") | ||
val androidSku: String?, | ||
|
||
@SerializedName("ios_sku") | ||
val iosSku: String?, | ||
@SerializedName("min_price") | ||
val price: Double?, | ||
|
||
val minPrice: Double?, | ||
var storeSku: String?, | ||
) { | ||
fun mapToDomain() = CourseMode( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please use alias |
||
slug = slug, | ||
sku = sku, | ||
androidSku = androidSku, | ||
iosSku = iosSku, | ||
minPrice = minPrice, | ||
storeSku = storeSku | ||
) | ||
fun setStoreProductSku(storeProductPrefix: String) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please add a blank line |
||
val ceilPrice = price | ||
val ceilPrice = minPrice | ||
?.let { ceil(it).toInt() } | ||
?.takeIf { it > 0 } | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,24 +9,21 @@ import org.openedx.core.domain.model.EnrollmentDetails as DomainEnrollmentDetail | |
data class EnrollmentDetails( | ||
@SerializedName("created") | ||
var created: String?, | ||
|
||
@SerializedName("date") | ||
val date: String?, | ||
@SerializedName("mode") | ||
var mode: String?, | ||
|
||
val mode: String, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. mode can be null here. |
||
@SerializedName("is_active") | ||
var isActive: Boolean = false, | ||
|
||
val isActive: Boolean = false, | ||
@SerializedName("upgrade_deadline") | ||
var upgradeDeadline: String?, | ||
val upgradeDeadline: String?, | ||
) { | ||
fun mapToDomain(): DomainEnrollmentDetails { | ||
return DomainEnrollmentDetails( | ||
created = TimeUtils.iso8601ToDate(created ?: ""), | ||
mode = mode, | ||
isActive = isActive, | ||
upgradeDeadline = TimeUtils.iso8601ToDate(upgradeDeadline ?: ""), | ||
) | ||
} | ||
fun mapToDomain() = DomainEnrollmentDetails( | ||
created = TimeUtils.iso8601ToDate(date ?: ""), | ||
mode = mode, | ||
isActive = isActive, | ||
upgradeDeadline = TimeUtils.iso8601ToDate(upgradeDeadline ?: ""), | ||
) | ||
|
||
fun mapToRoomEntity() = EnrollmentDetailsDB( | ||
created = created, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package org.openedx.core.domain.model | ||
|
||
import android.os.Parcelable | ||
import kotlinx.parcelize.Parcelize | ||
import java.util.Date | ||
|
||
@Parcelize | ||
data class CourseEnrollmentDetails( | ||
val id: String, | ||
val courseUpdates: String, | ||
val courseHandouts: String, | ||
val discussionUrl: String, | ||
val courseAccessDetails: CourseAccessDetails, | ||
val certificate: Certificate?, | ||
val enrollmentDetails: EnrollmentDetails, | ||
val courseInfoOverview: CourseInfoOverview, | ||
) : Parcelable { | ||
fun isUpgradable(): Boolean { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we can define some utility methods here for efficient use.
|
||
val start = courseInfoOverview.start ?: return false | ||
val upgradeDeadline = enrollmentDetails.upgradeDeadline ?: return false | ||
if (enrollmentDetails.mode != "audit") return false | ||
|
||
return start < Date() && getCourseMode() != null && upgradeDeadline > Date() | ||
} | ||
|
||
fun getCourseMode(): CourseMode? { | ||
return courseInfoOverview.courseModes | ||
.firstOrNull { it.slug == "verified" && !it.androidSku.isNullOrEmpty() } | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we can also define the enum class CourseAccessError here
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package org.openedx.core.domain.model | ||
|
||
import android.os.Parcelable | ||
import kotlinx.parcelize.Parcelize | ||
import java.util.Date | ||
|
||
@Parcelize | ||
data class CourseInfoOverview( | ||
val name: String, | ||
val number: String, | ||
val org: String, | ||
val start: Date?, | ||
val startDisplay: String, | ||
val startType: String, | ||
val end: Date?, | ||
val isSelfPaced: Boolean, | ||
var media: Media?, | ||
val courseSharingUtmParameters: CourseSharingUtmParameters, | ||
val courseAbout: String, | ||
val courseModes: List<CourseMode>, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. courseModes can be null.
|
||
) : Parcelable | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we can also define a boolean method here
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,7 +10,7 @@ data class EnrollmentDetails( | |
var created: Date?, | ||
var mode: String?, | ||
var isActive: Boolean, | ||
var upgradeDeadline: Date?, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no need for this change. |
||
var upgradeDeadline: Date? | ||
) : Parcelable { | ||
val isUpgradeDeadlinePassed: Boolean | ||
get() = TimeUtils.isDatePassed(Date(), upgradeDeadline) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -282,6 +282,11 @@ object TimeUtils { | |
} | ||
} | ||
|
||
fun getCourseAccessFormattedDate(context: Context, date: Date): String { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add doc for this method. |
||
val resourceManager = ResourceManager(context) | ||
return dateToCourseDate(resourceManager, date) | ||
} | ||
|
||
/** | ||
* Returns the number of days difference between the given date and the current date. | ||
*/ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As data model and domain model have the same names, so it will be a good approach if we can define the domain model alias.
i.e,