Skip to content

Commit

Permalink
Merge pull request #335 from Shikkanime/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
Ziedelth committed Apr 4, 2024
2 parents a7d1a65 + bc3825f commit 1d8fdb9
Show file tree
Hide file tree
Showing 34 changed files with 262 additions and 111 deletions.
4 changes: 4 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ val h2Version = "2.2.224"

plugins {
kotlin("jvm") version "2.0.0-Beta5"
kotlin("kapt") version "1.9.23"
id("io.ktor.plugin") version "2.3.9"
jacoco
id("org.sonarqube") version "5.0.0.4638"
Expand Down Expand Up @@ -95,6 +96,9 @@ dependencies {
implementation("org.twitter4j:twitter4j-core:$twitter4jVersion")
implementation("io.github.takke:jp.takke.twitter4j-v2:$twitter4jV2Version")

kapt("org.hibernate.orm:hibernate-jpamodelgen:$hibernateCoreVersion")
compileOnly("org.hibernate.orm:hibernate-jpamodelgen:$hibernateCoreVersion")

testImplementation("io.ktor:ktor-server-tests-jvm:$ktorVersion")
testImplementation("io.ktor:ktor-client-mock:$ktorVersion")
testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package fr.shikkanime.controllers.admin

import com.google.inject.Inject
import fr.shikkanime.converters.AbstractConverter
import fr.shikkanime.dtos.AnimeDto
import fr.shikkanime.dtos.animes.AnimeDto
import fr.shikkanime.entities.enums.Link
import fr.shikkanime.services.AnimeService
import fr.shikkanime.utils.routes.AdminSessionAuthenticated
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.shikkanime.controllers.site

import com.google.inject.Inject
import fr.shikkanime.dtos.AnimeDto
import fr.shikkanime.dtos.animes.AnimeDto
import fr.shikkanime.entities.SortParameter
import fr.shikkanime.entities.enums.ConfigPropertyKey
import fr.shikkanime.entities.enums.CountryCode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package fr.shikkanime.converters.anime

import com.google.inject.Inject
import fr.shikkanime.converters.AbstractConverter
import fr.shikkanime.dtos.AnimeDto
import fr.shikkanime.dtos.animes.AnimeDto
import fr.shikkanime.entities.Anime
import fr.shikkanime.entities.Simulcast
import fr.shikkanime.services.AnimeService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,11 @@ package fr.shikkanime.converters.anime

import com.google.inject.Inject
import fr.shikkanime.converters.AbstractConverter
import fr.shikkanime.dtos.AnimeDto
import fr.shikkanime.dtos.SimulcastDto
import fr.shikkanime.dtos.animes.AnimeDto
import fr.shikkanime.dtos.animes.AnimeNoStatusDto
import fr.shikkanime.dtos.enums.Status
import fr.shikkanime.entities.Anime
import fr.shikkanime.services.SimulcastService.Companion.sortBySeasonAndYear
import fr.shikkanime.services.caches.LanguageCacheService
import fr.shikkanime.utils.StringUtils
import fr.shikkanime.utils.withUTC
import org.hibernate.Hibernate
import java.time.format.DateTimeFormatter

class AnimeToAnimeDtoConverter : AbstractConverter<Anime, AnimeDto>() {
@Inject
Expand All @@ -26,24 +21,10 @@ class AnimeToAnimeDtoConverter : AbstractConverter<Anime, AnimeDto>() {
languageCacheService.detectLanguage(from.description) != from.countryCode!!.name.lowercase()
) Status.INVALID else Status.VALID

return AnimeDto(
uuid = from.uuid,
releaseDateTime = from.releaseDateTime.withUTC()
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME),
image = from.image,
banner = from.banner,
countryCode = from.countryCode!!,
name = from.name!!,
shortName = StringUtils.getShortName(from.name!!),
description = from.description,
simulcasts = if (Hibernate.isInitialized(from.simulcasts)) convert(
from.simulcasts.sortBySeasonAndYear(),
SimulcastDto::class.java
) else null,
status = status,
slug = from.slug,
lastReleaseDateTime = from.lastReleaseDateTime.withUTC()
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)

return AnimeDto.from(
convert(from, AnimeNoStatusDto::class.java),
status
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package fr.shikkanime.converters.anime

import fr.shikkanime.converters.AbstractConverter
import fr.shikkanime.dtos.SimulcastDto
import fr.shikkanime.dtos.animes.AnimeNoStatusDto
import fr.shikkanime.entities.Anime
import fr.shikkanime.services.SimulcastService.Companion.sortBySeasonAndYear
import fr.shikkanime.utils.StringUtils
import fr.shikkanime.utils.withUTC
import org.hibernate.Hibernate
import java.time.format.DateTimeFormatter

class AnimeToAnimeNoStatusDtoConverter : AbstractConverter<Anime, AnimeNoStatusDto>() {
override fun convert(from: Anime): AnimeNoStatusDto {
return AnimeNoStatusDto(
uuid = from.uuid,
releaseDateTime = from.releaseDateTime.withUTC()
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME),
image = from.image,
banner = from.banner,
countryCode = from.countryCode!!,
name = from.name!!,
shortName = StringUtils.getShortName(from.name!!),
description = from.description,
simulcasts = if (Hibernate.isInitialized(from.simulcasts)) convert(
from.simulcasts.sortBySeasonAndYear(),
SimulcastDto::class.java
) else null,
slug = from.slug,
lastReleaseDateTime = from.lastReleaseDateTime.withUTC()
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package fr.shikkanime.converters.episode

import com.google.inject.Inject
import fr.shikkanime.converters.AbstractConverter
import fr.shikkanime.dtos.AnimeDto
import fr.shikkanime.dtos.EpisodeDto
import fr.shikkanime.dtos.PlatformDto
import fr.shikkanime.dtos.animes.AnimeDto
import fr.shikkanime.dtos.enums.Status
import fr.shikkanime.entities.Episode
import fr.shikkanime.services.caches.LanguageCacheService
Expand Down
20 changes: 0 additions & 20 deletions src/main/kotlin/fr/shikkanime/dtos/AnimeDto.kt

This file was deleted.

1 change: 1 addition & 0 deletions src/main/kotlin/fr/shikkanime/dtos/EpisodeDto.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.shikkanime.dtos

import fr.shikkanime.dtos.animes.AnimeDto
import fr.shikkanime.dtos.enums.Status
import fr.shikkanime.entities.enums.EpisodeType
import fr.shikkanime.entities.enums.LangType
Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/fr/shikkanime/dtos/WeeklyAnimeDto.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.shikkanime.dtos

import fr.shikkanime.dtos.animes.AnimeDto

data class WeeklyAnimeDto(
val anime: AnimeDto,
val releaseDateTime: String,
Expand Down
52 changes: 52 additions & 0 deletions src/main/kotlin/fr/shikkanime/dtos/animes/AnimeDto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package fr.shikkanime.dtos.animes

import fr.shikkanime.dtos.SimulcastDto
import fr.shikkanime.dtos.enums.Status
import fr.shikkanime.entities.enums.CountryCode
import java.util.*

data class AnimeDto(
override val uuid: UUID?,
override val countryCode: CountryCode,
override var name: String,
override var shortName: String,
override var releaseDateTime: String,
override val image: String? = null,
override val banner: String? = null,
override val description: String?,
override val simulcasts: List<SimulcastDto>?,
override val slug: String? = null,
override val lastReleaseDateTime: String? = null,
val status: Status? = null,
) : AnimeNoStatusDto(
uuid,
countryCode,
name,
shortName,
releaseDateTime,
image,
banner,
description,
simulcasts,
slug,
lastReleaseDateTime
) {
companion object {
fun from(animeNoStatusDto: AnimeNoStatusDto, status: Status?): AnimeDto {
return AnimeDto(
animeNoStatusDto.uuid,
animeNoStatusDto.countryCode,
animeNoStatusDto.name,
animeNoStatusDto.shortName,
animeNoStatusDto.releaseDateTime,
animeNoStatusDto.image,
animeNoStatusDto.banner,
animeNoStatusDto.description,
animeNoStatusDto.simulcasts,
animeNoStatusDto.slug,
animeNoStatusDto.lastReleaseDateTime,
status,
)
}
}
}
32 changes: 32 additions & 0 deletions src/main/kotlin/fr/shikkanime/dtos/animes/AnimeNoStatusDto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package fr.shikkanime.dtos.animes

import fr.shikkanime.dtos.SimulcastDto
import fr.shikkanime.entities.enums.CountryCode
import java.util.*

open class AnimeNoStatusDto(
@Transient
open val uuid: UUID?,
@Transient
open val countryCode: CountryCode,
@Transient
open var name: String,
@Transient
open var shortName: String,
@Transient
open var releaseDateTime: String,
@Transient
open val image: String? = null,
@Transient
open val banner: String? = null,
@Transient
open val description: String?,
@Transient
open val simulcasts: List<SimulcastDto>?,
@Transient
open val slug: String? = null,
@Transient
open val lastReleaseDateTime: String? = null
) {
fun toAnimeDto() = AnimeDto.from(this, null)
}
3 changes: 2 additions & 1 deletion src/main/kotlin/fr/shikkanime/entities/Anime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import java.util.*
name = "anime",
indexes = [
Index(name = "idx_anime_country_code", columnList = "country_code"),
Index(name = "idx_anime_slug", columnList = "slug"),
]
)
@Indexed
Expand Down Expand Up @@ -44,7 +45,7 @@ class Anime(
)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
var simulcasts: MutableSet<Simulcast> = mutableSetOf(),
@Column(nullable = true)
@Column(nullable = false, unique = true)
var slug: String? = null,
@Column(nullable = false, name = "last_release_date_time")
var lastReleaseDateTime: ZonedDateTime = releaseDateTime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import fr.shikkanime.entities.ShikkEntity
import fr.shikkanime.utils.Database
import jakarta.persistence.EntityManager
import jakarta.persistence.TypedQuery
import jakarta.persistence.criteria.CriteriaQuery
import org.hibernate.ScrollMode
import org.hibernate.jpa.AvailableHints
import org.hibernate.query.Query
Expand Down Expand Up @@ -41,6 +42,11 @@ abstract class AbstractRepository<E : ShikkEntity> {
.setHint(AvailableHints.HINT_READ_ONLY, true)
}

fun <T> createReadOnlyQuery(entityManager: EntityManager, criteriaQuery: CriteriaQuery<T>): TypedQuery<T> {
return entityManager.createQuery(criteriaQuery)
.setHint(AvailableHints.HINT_READ_ONLY, true)
}

fun buildPageableQuery(query: TypedQuery<E>, page: Int, limit: Int): Pageable<E> {
val scrollableResults = query.unwrap(Query::class.java)
.setReadOnly(true)
Expand Down
13 changes: 10 additions & 3 deletions src/main/kotlin/fr/shikkanime/repositories/AnimeRepository.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.shikkanime.repositories

import fr.shikkanime.entities.Anime
import fr.shikkanime.entities.Anime_
import fr.shikkanime.entities.Pageable
import fr.shikkanime.entities.SortParameter
import fr.shikkanime.entities.enums.CountryCode
Expand Down Expand Up @@ -139,9 +140,15 @@ class AnimeRepository : AbstractRepository<Anime>() {
}

fun findBySlug(slug: String): Anime? {
return inTransaction {
createReadOnlyQuery(it, "FROM Anime WHERE slug = :slug", getEntityClass())
.setParameter("slug", slug)
return inTransaction { entityManager ->
val cb = entityManager.criteriaBuilder
val query = cb.createQuery(getEntityClass())
val root = query.from(getEntityClass())

query.select(root)
.where(cb.equal(root[Anime_.slug], slug))

createReadOnlyQuery(entityManager, query)
.resultList
.firstOrNull()
?.initialize()
Expand Down
26 changes: 11 additions & 15 deletions src/main/kotlin/fr/shikkanime/repositories/EpisodeRepository.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package fr.shikkanime.repositories

import fr.shikkanime.entities.Episode
import fr.shikkanime.entities.Pageable
import fr.shikkanime.entities.SortParameter
import fr.shikkanime.entities.*
import fr.shikkanime.entities.enums.CountryCode
import fr.shikkanime.entities.enums.EpisodeType
import fr.shikkanime.entities.enums.LangType
Expand Down Expand Up @@ -164,19 +162,17 @@ class EpisodeRepository : AbstractRepository<Episode>() {
end: ZonedDateTime,
): List<Episode> {
return inTransaction { entityManager ->
createReadOnlyQuery(
entityManager,
"""
FROM Episode e
WHERE e.anime.countryCode = :countryCode AND e.releaseDateTime BETWEEN :start AND :end
""".trimIndent(),
getEntityClass()
)
.setParameter("countryCode", countryCode)
.setParameter("start", start)
.setParameter("end", end)
val cb = entityManager.criteriaBuilder
val query = cb.createQuery(getEntityClass())
val root = query.from(getEntityClass())

val countryPredicate = cb.equal(root[Episode_.anime][Anime_.countryCode], countryCode)
val datePredicate = cb.between(root[Episode_.releaseDateTime], start, end)

query.select(root).where(cb.and(countryPredicate, datePredicate))

createReadOnlyQuery(entityManager, query)
.resultList
.initialize()
}
}
}
Loading

0 comments on commit 1d8fdb9

Please sign in to comment.