|
|
@ -2,6 +2,7 @@ package com.jeluchu.features.anime.services
|
|
|
|
|
|
|
|
|
|
|
|
import com.jeluchu.core.connection.RestClient
|
|
|
|
import com.jeluchu.core.connection.RestClient
|
|
|
|
import com.jeluchu.core.enums.TimeUnit
|
|
|
|
import com.jeluchu.core.enums.TimeUnit
|
|
|
|
|
|
|
|
import com.jeluchu.core.enums.parseAnimeStatusType
|
|
|
|
import com.jeluchu.core.enums.parseAnimeType
|
|
|
|
import com.jeluchu.core.enums.parseAnimeType
|
|
|
|
import com.jeluchu.core.extensions.needsUpdate
|
|
|
|
import com.jeluchu.core.extensions.needsUpdate
|
|
|
|
import com.jeluchu.core.extensions.update
|
|
|
|
import com.jeluchu.core.extensions.update
|
|
|
@ -19,7 +20,8 @@ import com.jeluchu.features.anime.mappers.documentToAnimeLastEpisodeEntity
|
|
|
|
import com.jeluchu.features.anime.mappers.documentToAnimeTypeEntity
|
|
|
|
import com.jeluchu.features.anime.mappers.documentToAnimeTypeEntity
|
|
|
|
import com.jeluchu.features.anime.mappers.documentToMoreInfoEntity
|
|
|
|
import com.jeluchu.features.anime.mappers.documentToMoreInfoEntity
|
|
|
|
import com.mongodb.client.MongoDatabase
|
|
|
|
import com.mongodb.client.MongoDatabase
|
|
|
|
import com.mongodb.client.model.Filters.eq
|
|
|
|
import com.mongodb.client.model.Filters
|
|
|
|
|
|
|
|
import com.mongodb.client.model.Sorts
|
|
|
|
import io.ktor.http.*
|
|
|
|
import io.ktor.http.*
|
|
|
|
import io.ktor.server.response.*
|
|
|
|
import io.ktor.server.response.*
|
|
|
|
import io.ktor.server.routing.*
|
|
|
|
import io.ktor.server.routing.*
|
|
|
@ -63,7 +65,7 @@ class AnimeService(
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(response))
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(response))
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
val animes = directoryCollection
|
|
|
|
val animes = directoryCollection
|
|
|
|
.find(eq("type", type.uppercase()))
|
|
|
|
.find(Filters.eq("type", type.uppercase()))
|
|
|
|
.skip(skipCount)
|
|
|
|
.skip(skipCount)
|
|
|
|
.limit(size)
|
|
|
|
.limit(size)
|
|
|
|
.toList()
|
|
|
|
.toList()
|
|
|
@ -84,7 +86,7 @@ class AnimeService(
|
|
|
|
|
|
|
|
|
|
|
|
suspend fun getAnimeByMalId(call: RoutingCall) = try {
|
|
|
|
suspend fun getAnimeByMalId(call: RoutingCall) = try {
|
|
|
|
val id = call.parameters["id"]?.toInt() ?: throw IllegalArgumentException(ErrorMessages.InvalidMalId.message)
|
|
|
|
val id = call.parameters["id"]?.toInt() ?: throw IllegalArgumentException(ErrorMessages.InvalidMalId.message)
|
|
|
|
directoryCollection.find(eq("malId", id)).firstOrNull()?.let { anime ->
|
|
|
|
directoryCollection.find(Filters.eq("malId", id)).firstOrNull()?.let { anime ->
|
|
|
|
val info = documentToMoreInfoEntity(anime)
|
|
|
|
val info = documentToMoreInfoEntity(anime)
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(info))
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(info))
|
|
|
|
} ?: call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.AnimeNotFound.message))
|
|
|
|
} ?: call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.AnimeNotFound.message))
|
|
|
@ -110,38 +112,42 @@ class AnimeService(
|
|
|
|
if (needsUpdate) {
|
|
|
|
if (needsUpdate) {
|
|
|
|
collection.deleteMany(Document())
|
|
|
|
collection.deleteMany(Document())
|
|
|
|
|
|
|
|
|
|
|
|
val response = RestClient.request(
|
|
|
|
val animes = mutableListOf<LastEpisodeEntity>()
|
|
|
|
BaseUrls.JIKAN + "anime?status=airing&type=tv",
|
|
|
|
|
|
|
|
|
|
|
|
RestClient.request(
|
|
|
|
|
|
|
|
BaseUrls.JIKAN + "anime?status=airing&type=tv&page=1",
|
|
|
|
AnimeSearch.serializer()
|
|
|
|
AnimeSearch.serializer()
|
|
|
|
)
|
|
|
|
).let { firstPage ->
|
|
|
|
|
|
|
|
val totalPage = firstPage.pagination?.lastPage ?: 2
|
|
|
|
|
|
|
|
|
|
|
|
val animes = mutableListOf<LastEpisodeEntity>()
|
|
|
|
firstPage.data?.let { firstAnimes ->
|
|
|
|
val totalPage = response.pagination?.lastPage ?: 0
|
|
|
|
firstAnimes.map { it.toLastEpisodeData() }.let { animes.addAll(it) }
|
|
|
|
response.data?.map { it.toLastEpisodeData() }.orEmpty().let { animes.addAll(it) }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (page in 2..totalPage) {
|
|
|
|
for (page in 2..totalPage) {
|
|
|
|
val responsePage = RestClient.request(
|
|
|
|
RestClient.request(
|
|
|
|
BaseUrls.JIKAN + "anime?status=airing&type=tv&page=$page",
|
|
|
|
BaseUrls.JIKAN + "anime?status=airing&type=tv&page=$page",
|
|
|
|
AnimeSearch.serializer()
|
|
|
|
AnimeSearch.serializer()
|
|
|
|
).data?.map { it.toLastEpisodeData() }.orEmpty()
|
|
|
|
).data?.let { pagesAnimes ->
|
|
|
|
|
|
|
|
animes.addAll(pagesAnimes.map { it.toLastEpisodeData() })
|
|
|
|
animes.addAll(responsePage)
|
|
|
|
|
|
|
|
delay(1000)
|
|
|
|
delay(1000)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
val documentsToInsert = parseDataToDocuments(animes, LastEpisodeEntity.serializer())
|
|
|
|
val documentsToInsert = parseDataToDocuments(animes.distinctBy { it.malId }, LastEpisodeEntity.serializer())
|
|
|
|
if (documentsToInsert.isNotEmpty()) collection.insertMany(documentsToInsert)
|
|
|
|
if (documentsToInsert.isNotEmpty()) collection.insertMany(documentsToInsert)
|
|
|
|
timers.update(timerKey)
|
|
|
|
timers.update(timerKey)
|
|
|
|
|
|
|
|
|
|
|
|
val queryDb = collection
|
|
|
|
val queryDb = collection
|
|
|
|
.find(eq("day", dayOfWeek))
|
|
|
|
.find(Filters.eq("day", dayOfWeek))
|
|
|
|
.toList()
|
|
|
|
.toList()
|
|
|
|
|
|
|
|
|
|
|
|
val elements = queryDb.map { documentToAnimeLastEpisodeEntity(it) }
|
|
|
|
val elements = queryDb.map { documentToAnimeLastEpisodeEntity(it) }
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(elements))
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(elements))
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
val elements = collection
|
|
|
|
val elements = collection
|
|
|
|
.find(eq("day", dayOfWeek))
|
|
|
|
.find(Filters.eq("day", dayOfWeek))
|
|
|
|
.toList()
|
|
|
|
.toList()
|
|
|
|
.map { documentToAnimeLastEpisodeEntity(it) }
|
|
|
|
.map { documentToAnimeLastEpisodeEntity(it) }
|
|
|
|
|
|
|
|
|
|
|
@ -150,4 +156,23 @@ class AnimeService(
|
|
|
|
} catch (ex: Exception) {
|
|
|
|
} catch (ex: Exception) {
|
|
|
|
call.respond(HttpStatusCode.Unauthorized, ErrorResponse(ErrorMessages.UnauthorizedMongo.message))
|
|
|
|
call.respond(HttpStatusCode.Unauthorized, ErrorResponse(ErrorMessages.UnauthorizedMongo.message))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
suspend fun getAnimeByType(call: RoutingCall) = try {
|
|
|
|
|
|
|
|
val type = call.request.queryParameters["type"] ?: throw IllegalArgumentException(ErrorMessages.InvalidTopAnimeType.message)
|
|
|
|
|
|
|
|
val status = call.request.queryParameters["status"] ?: throw IllegalArgumentException(ErrorMessages.InvalidAnimeStatusType.message)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val animes = directoryCollection.find(
|
|
|
|
|
|
|
|
Filters.and(
|
|
|
|
|
|
|
|
Filters.eq("type", parseAnimeType(type)),
|
|
|
|
|
|
|
|
Filters.eq("status", parseAnimeStatusType(status)),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
.sort(Sorts.descending("aired.from"))
|
|
|
|
|
|
|
|
.toList()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val elements = animes.map { documentToAnimeTypeEntity(it) }
|
|
|
|
|
|
|
|
call.respond(HttpStatusCode.OK, Json.encodeToString(elements))
|
|
|
|
|
|
|
|
} catch (ex: Exception) {
|
|
|
|
|
|
|
|
call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.InvalidInput.message))
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|