Migrate rest of ApiEndpoints usages to ApiEndpoints2 with map-based mapping

This commit is contained in:
Mikołaj Pich 2024-05-11 16:56:53 +02:00
parent 816e41f41f
commit 48a6c72d00
No known key found for this signature in database
4 changed files with 45 additions and 79 deletions

View file

@ -1,49 +0,0 @@
package io.github.wulkanowy.sdk.scrapper
internal object ApiEndpoints : IApiEndpoints {
var currentVersion = 58698
private val endpoints
get() = when (currentVersion) {
58698 -> ApiEndpoints_24_4_3_58698
in 58666..58697 -> ApiEndpoints_24_4_2_58666
else -> ApiEndpoints_24_4_1_58566
}
override val UczenCache get() = endpoints.UczenCache
override val UczenDziennik get() = endpoints.UczenDziennik
override val PlusContext get() = endpoints.PlusContext
override val PlusOkresyKlasyfikacyjne get() = endpoints.PlusOkresyKlasyfikacyjne
}
internal interface IApiEndpoints {
val UczenCache: String
val UczenDziennik: String
val PlusContext: String
val PlusOkresyKlasyfikacyjne: String
}
internal object ApiEndpoints_24_4_1_58566 : IApiEndpoints {
override val UczenCache = "UczenCache"
override val UczenDziennik = "UczenDziennik"
// uczenplus
override val PlusContext = "Context"
override val PlusOkresyKlasyfikacyjne = "OkresyKlasyfikacyjne"
}
internal object ApiEndpoints_24_4_2_58666 : IApiEndpoints {
override val UczenCache = "f18ddca0-400e-47cc-89a1-4bbe6685810b"
override val UczenDziennik = "bef3daf1-07cd-4de6-b059-ee5909a7beb9"
override val PlusContext = "7fbcc3fc-1021-444e-86ec-506683e02337"
override val PlusOkresyKlasyfikacyjne = "0669f1fd-e6f0-4007-ba4a-1d99c9107bb4"
}
internal object ApiEndpoints_24_4_3_58698 : IApiEndpoints {
override val UczenCache = "21a5186d-2aab-4123-bad7-269aa7173bb2"
override val UczenDziennik = "a01ea13f-14f0-4c56-8b91-790e5aeecdf1"
// uczenplus
override val PlusContext = "Context"
override val PlusOkresyKlasyfikacyjne = "OkresyKlasyfikacyjne"
}

View file

@ -201,13 +201,13 @@ internal fun String.md5(): String {
return digest.toHexString()
}
internal fun HttpUrl.mapModuleUrls(moduleHost: String, url: HttpUrl, appVersion: String?): HttpUrl {
internal fun HttpUrl.mapModuleUrls(moduleHost: String, appVersion: String?): HttpUrl {
val pathSegmentIndex = when (moduleHost) {
StudentPlusModuleHost -> 3
StudentModuleHost, MessagesModuleHost -> 2
else -> error("Not supported!")
}
val pathKey = url.pathSegments.getOrNull(pathSegmentIndex)
val pathKey = pathSegments.getOrNull(pathSegmentIndex)
val mappedPath = ApiEndpointsMap[appVersion]
?.get(moduleHost)
?.get(pathKey?.substringBefore(".mvc"))

View file

@ -1,6 +1,5 @@
package io.github.wulkanowy.sdk.scrapper.interceptor
import io.github.wulkanowy.sdk.scrapper.ApiEndpoints
import io.github.wulkanowy.sdk.scrapper.ApiResponse
import io.github.wulkanowy.sdk.scrapper.CookieJarCabinet
import io.github.wulkanowy.sdk.scrapper.Scrapper.LoginType
@ -156,10 +155,6 @@ internal class AutoLoginInterceptor(
return
}
moduleHeaders.appVersion.substringAfterLast(".").toIntOrNull()?.let {
ApiEndpoints.currentVersion = it
}
when {
MessagesModuleHost in url.host -> headersByHost[MessagesModuleHost] = moduleHeaders
StudentPlusModuleHost in url.host -> headersByHost[StudentPlusModuleHost] = moduleHeaders
@ -177,9 +172,9 @@ internal class AutoLoginInterceptor(
logger.info("X-V-AppVersion: ${headers?.appVersion}")
val mappedUrl = when {
MessagesModuleHost in url.host -> url.mapModuleUrls(MessagesModuleHost, url, headers?.appVersion)
StudentPlusModuleHost in url.host -> url.mapModuleUrls(StudentPlusModuleHost, url, headers?.appVersion)
StudentModuleHost in url.host -> url.mapModuleUrls(StudentModuleHost, url, headers?.appVersion)
MessagesModuleHost in url.host -> url.mapModuleUrls(MessagesModuleHost, headers?.appVersion)
StudentPlusModuleHost in url.host -> url.mapModuleUrls(StudentPlusModuleHost, headers?.appVersion)
StudentModuleHost in url.host -> url.mapModuleUrls(StudentModuleHost, headers?.appVersion)
else -> url
}

View file

@ -1,11 +1,12 @@
package io.github.wulkanowy.sdk.scrapper.repository
import io.github.wulkanowy.sdk.scrapper.ApiEndpoints
import io.github.wulkanowy.sdk.scrapper.Scrapper
import io.github.wulkanowy.sdk.scrapper.exception.ScrapperException
import io.github.wulkanowy.sdk.scrapper.exception.StudentGraduateException
import io.github.wulkanowy.sdk.scrapper.getNormalizedSymbol
import io.github.wulkanowy.sdk.scrapper.getScriptParam
import io.github.wulkanowy.sdk.scrapper.interceptor.StudentModuleHost
import io.github.wulkanowy.sdk.scrapper.interceptor.StudentPlusModuleHost
import io.github.wulkanowy.sdk.scrapper.interceptor.handleErrors
import io.github.wulkanowy.sdk.scrapper.isCurrentLoginHasEduOne
import io.github.wulkanowy.sdk.scrapper.login.CertificateResponse
@ -13,6 +14,7 @@ import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException
import io.github.wulkanowy.sdk.scrapper.login.LoginHelper
import io.github.wulkanowy.sdk.scrapper.login.NotLoggedInException
import io.github.wulkanowy.sdk.scrapper.login.UrlGenerator
import io.github.wulkanowy.sdk.scrapper.mapModuleUrls
import io.github.wulkanowy.sdk.scrapper.register.Diary
import io.github.wulkanowy.sdk.scrapper.register.HomePageResponse
import io.github.wulkanowy.sdk.scrapper.register.RegisterStudent
@ -178,8 +180,8 @@ internal class RegisterRepository(
val registerStudents = runCatching {
when {
isEduOne -> {
val (baseStudentPlus, _) = loginResult.getOrThrow()
getEduOneDiaries(baseStudentPlus)
val (baseStudentPlus, homepage) = loginResult.getOrThrow()
getEduOneDiaries(baseStudentPlus = baseStudentPlus, homepage = homepage)
}
else -> getStudentsFromOldModule(
@ -227,7 +229,7 @@ internal class RegisterRepository(
): List<RegisterStudent> {
val (_, startPage) = loginResult
val isParent = isStudentFromParentAccount(startPage)
val diaries = getStudentDiaries()
val diaries = getStudentDiaries(startPage)
return diaries.getStudentsFromDiaries(
isParent = isParent,
isEduOne = false,
@ -241,10 +243,19 @@ internal class RegisterRepository(
}
}
private suspend fun getStudentDiaries(): List<Diary> = student
.getSchoolInfo(url.generate(UrlGenerator.Site.STUDENT) + "${ApiEndpoints.UczenDziennik}.mvc/Get")
.handleErrors()
.data.orEmpty()
private suspend fun getStudentDiaries(startPage: String): List<Diary> {
val appVersion = getScriptParam("version", startPage).ifBlank {
getScriptParam("appVersion", startPage)
}
val diaryUrl = (url.generate(UrlGenerator.Site.STUDENT) + "UczenDziennik.mvc/Get")
.toHttpUrl()
.mapModuleUrls(StudentModuleHost, appVersion)
return student
.getSchoolInfo(url = diaryUrl.toString())
.handleErrors()
.data.orEmpty()
}
private suspend fun getLoginType(symbol: String): Scrapper.LoginType {
runCatching { symbolService.getSymbolPage(symbol) }
@ -312,8 +323,15 @@ internal class RegisterRepository(
// used only for check is student from parent account
private suspend fun isStudentFromParentAccount(startPage: String): Boolean? {
val appVersion = getScriptParam("version", startPage).ifBlank {
getScriptParam("appVersion", startPage)
}
val cacheUrl = (url.generate(UrlGenerator.Site.STUDENT) + "UczenCache.mvc/Get")
.toHttpUrl()
.mapModuleUrls(StudentModuleHost, appVersion)
val userCache = student.getUserCache(
url = url.generate(UrlGenerator.Site.STUDENT) + "${ApiEndpoints.UczenCache}.mvc/Get",
url = cacheUrl.toString(),
token = getScriptParam("antiForgeryToken", startPage),
appGuid = getScriptParam("appGuid", startPage),
appVersion = getScriptParam("version", startPage),
@ -322,15 +340,25 @@ internal class RegisterRepository(
return userCache?.isParent
}
private suspend fun getEduOneDiaries(baseStudentPlus: String): List<RegisterStudent> {
private suspend fun getEduOneDiaries(baseStudentPlus: String, homepage: String): List<RegisterStudent> {
val appVersion = getScriptParam("version", homepage).ifBlank {
getScriptParam("appVersion", homepage)
}
val contextUrl = (baseStudentPlus + "api/Context")
.toHttpUrl()
.mapModuleUrls(StudentPlusModuleHost, appVersion)
val semestersUrl = (baseStudentPlus + "api/OkresyKlasyfikacyjne")
.toHttpUrl()
.mapModuleUrls(StudentModuleHost, appVersion)
return studentPlus
.getContextByUrl(url = baseStudentPlus + "api/${ApiEndpoints.PlusContext}").students
.getContextByUrl(url = contextUrl.toString()).students
.map { contextStudent ->
val semesters = runCatching {
when {
contextStudent.isAuthorizationRequired -> emptyList()
else -> studentPlus.getSemestersByUrl(
url = baseStudentPlus + "api/${ApiEndpoints.PlusOkresyKlasyfikacyjne}",
url = semestersUrl.toString(),
key = contextStudent.key,
diaryId = contextStudent.registerId,
)
@ -364,14 +392,6 @@ internal class RegisterRepository(
} else {
start
}
val appVersion = getScriptParam("version", homepage).ifBlank {
getScriptParam("appVersion", homepage)
}
appVersion.substringAfterLast(".").toIntOrNull()?.let {
ApiEndpoints.currentVersion = it
}
return baseStudentPlus to homepage
}
}