mirror of https://github.com/aruppi/aruppi-api
Include random endpoint
This commit is contained in:
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…
Reference in New Issue