Include random endpoint

v5 v5.8.0
Jéluchu 1 month ago
parent 937d5c6ab3
commit 05227eca80

@ -76,6 +76,7 @@ object Routes {
const val THEMES = "/themes" const val THEMES = "/themes"
const val SUGGESTIONS = "/suggestions" const val SUGGESTIONS = "/suggestions"
const val YEAR_INDEX = "/yearIndex" const val YEAR_INDEX = "/yearIndex"
const val RANDOM = "/random"
} }
object TimerKey { object TimerKey {

@ -18,6 +18,7 @@ fun Route.animeEndpoints(
) = route(Routes.ANIME) { ) = route(Routes.ANIME) {
getToJson { service.getAnimeByType(call) } getToJson { service.getAnimeByType(call) }
getToJson(Routes.ID) { service.getAnimeByMalId(call) } getToJson(Routes.ID) { service.getAnimeByMalId(call) }
getToJson(Routes.RANDOM) { service.getRandomAnime(call) }
getToJson(Routes.LAST_EPISODES) { service.getLastEpisodes(call) } getToJson(Routes.LAST_EPISODES) { service.getLastEpisodes(call) }
route(Routes.SUGGESTIONS) { route(Routes.SUGGESTIONS) {

@ -1,6 +1,8 @@
package com.jeluchu.features.anime.services package com.jeluchu.features.anime.services
import com.jeluchu.core.connection.RestClient import com.jeluchu.core.connection.RestClient
import com.jeluchu.core.enums.AnimeStatusTypes
import com.jeluchu.core.enums.AnimeTypes
import com.jeluchu.core.enums.TimeUnit import com.jeluchu.core.enums.TimeUnit
import com.jeluchu.core.enums.parseAnimeStatusType import com.jeluchu.core.enums.parseAnimeStatusType
import com.jeluchu.core.enums.parseAnimeType import com.jeluchu.core.enums.parseAnimeType
@ -21,6 +23,7 @@ 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.Aggregates
import com.mongodb.client.model.Filters import com.mongodb.client.model.Filters
import com.mongodb.client.model.Sorts import com.mongodb.client.model.Sorts
import io.ktor.http.* import io.ktor.http.*
@ -95,6 +98,39 @@ class AnimeService(
call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.InvalidInput.message)) call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.InvalidInput.message))
} }
suspend fun getRandomAnime(call: RoutingCall) = try {
val nsfw = call.request.queryParameters["nsfw"]?.toBoolean() ?: false
val filters = mutableListOf<org.bson.conversions.Bson>().apply {
add(Filters.`in`("type", listOf(
AnimeTypes.TV,
AnimeTypes.MOVIE,
AnimeTypes.OVA,
AnimeTypes.SPECIAL,
AnimeTypes.ONA,
AnimeTypes.TV_SPECIAL
)))
add(Filters.nin("status", listOf(
AnimeStatusTypes.UPCOMING
)))
if (!nsfw) add(Filters.eq("nsfw", false))
}
val aggregates = listOf(
Aggregates.match(Filters.and(filters)),
Aggregates.sample(1)
)
directoryCollection.aggregate(aggregates).firstOrNull()?.let { anime ->
val info = documentToMoreInfoEntity(anime)
call.respond(HttpStatusCode.OK, Json.encodeToString(info))
} ?: call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.AnimeNotFound.message))
} catch (ex: Exception) {
call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.InvalidInput.message))
}
suspend fun getLastEpisodes(call: RoutingCall) = try { suspend fun getLastEpisodes(call: RoutingCall) = try {
val dayOfWeek = LocalDate.now() val dayOfWeek = LocalDate.now()
.dayOfWeek .dayOfWeek

@ -1,6 +1,7 @@
package com.jeluchu.features.anime.services package com.jeluchu.features.anime.services
import com.jeluchu.core.enums.AnimeStatusTypes import com.jeluchu.core.enums.AnimeStatusTypes
import com.jeluchu.core.enums.AnimeTypes
import com.jeluchu.core.models.documentToSimpleAnimeEntity import com.jeluchu.core.models.documentToSimpleAnimeEntity
import com.jeluchu.core.utils.Collections import com.jeluchu.core.utils.Collections
import com.mongodb.client.MongoCollection import com.mongodb.client.MongoCollection
@ -19,6 +20,7 @@ class TagsService(
) { ) {
suspend fun getAnimeByAnyTag(call: RoutingCall) { suspend fun getAnimeByAnyTag(call: RoutingCall) {
val tags = call.request.queryParameters["tags"].orEmpty() val tags = call.request.queryParameters["tags"].orEmpty()
val nsfw = call.request.queryParameters["nsfw"].toBoolean()
val tagsList = if (tags.isNotEmpty()) { val tagsList = if (tags.isNotEmpty()) {
tags.split(",").map { it.trim() } tags.split(",").map { it.trim() }
@ -29,17 +31,22 @@ class TagsService(
return return
} }
val query = directory.find( val filters = mutableListOf<org.bson.conversions.Bson>().apply {
Filters.and( add(Filters.or(
Filters.or(
Filters.`in`("tags.es", tagsList), Filters.`in`("tags.es", tagsList),
Filters.`in`("tags.en", tagsList) Filters.`in`("tags.en", tagsList)
), ))
Filters.`in`("status", listOf(AnimeStatusTypes.FINISHED, AnimeStatusTypes.ONGOING)),
Filters.ne("type", "MUSIC"), add(Filters.`in`("status", listOf(AnimeStatusTypes.FINISHED, AnimeStatusTypes.ONGOING)))
Filters.ne("type", "PV")
) add(Filters.ne("type", AnimeTypes.MUSIC))
) add(Filters.ne("type", AnimeTypes.PV))
add(Filters.ne("type", AnimeTypes.CM))
if (!nsfw) add(Filters.eq("nsfw", false))
}
val query = directory.find(Filters.and(filters))
.toList() .toList()
.map { documentToSimpleAnimeEntity(it) } .map { documentToSimpleAnimeEntity(it) }

Loading…
Cancel
Save