Include random endpoint

This commit is contained in:
Jéluchu 2025-07-07 13:43:11 +02:00
parent 937d5c6ab3
commit 05227eca80
4 changed files with 56 additions and 11 deletions

View File

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

View File

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

View File

@ -1,6 +1,8 @@
package com.jeluchu.features.anime.services
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.parseAnimeStatusType
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.documentToMoreInfoEntity
import com.mongodb.client.MongoDatabase
import com.mongodb.client.model.Aggregates
import com.mongodb.client.model.Filters
import com.mongodb.client.model.Sorts
import io.ktor.http.*
@ -95,6 +98,39 @@ class AnimeService(
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 {
val dayOfWeek = LocalDate.now()
.dayOfWeek

View File

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