From 72f2e8e693d735904efd0174d0cad2015dfae7ae Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Wed, 1 Jan 2025 14:08:56 +0100 Subject: [PATCH] First version of metadata on field level, probably not the final implementation --- .../de/grimsi/gameyfin/games/GameService.kt | 18 ++++++++++++++++-- .../de/grimsi/gameyfin/games/dto/GameDto.kt | 2 +- .../gameyfin/games/dto/GameMetadataDto.kt | 8 ++++++++ .../gameyfin/games/entities/FieldMetadata.kt | 19 +++++++++++++++++++ .../de/grimsi/gameyfin/games/entities/Game.kt | 5 ++--- .../repositories/FieldMetadataRepository.kt | 6 ++++++ .../src/main/resources/application-dev.yml | 2 ++ 7 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameMetadataDto.kt create mode 100644 gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/FieldMetadata.kt create mode 100644 gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/repositories/FieldMetadataRepository.kt create mode 100644 gameyfin/src/main/resources/application-dev.yml diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt index ec2f489..f2318e0 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt @@ -2,6 +2,7 @@ package de.grimsi.gameyfin.games import de.grimsi.gameyfin.core.plugins.management.PluginManagementService import de.grimsi.gameyfin.games.dto.GameDto +import de.grimsi.gameyfin.games.dto.GameMetadataDto import de.grimsi.gameyfin.games.entities.* import de.grimsi.gameyfin.games.repositories.CompanyRepository import de.grimsi.gameyfin.games.repositories.GameRepository @@ -102,11 +103,24 @@ class GameService( perspectives = game.perspectives.map { it.name }, imageIds = game.images.mapNotNull { it.id }, videoUrls = game.videoUrls.map { it.toString() }, - source = game.source.pluginId + metadata = toDto(game.metadata) + ) + } + + private fun toDto(metadata: Map): Map { + return metadata.mapValues { toDto(it.value) } + } + + private fun toDto(metadata: FieldMetadata): GameMetadataDto { + return GameMetadataDto( + source = metadata.source.pluginId, + lastUpdated = metadata.lastUpdated ) } private fun toEntity(metadata: GameMetadata, path: Path, source: GameMetadataProvider): Game { + val sourcePlugin = pluginManagementService.getPluginManagementEntry(source.javaClass) + return Game( title = metadata.title, summary = metadata.description, @@ -122,7 +136,7 @@ class GameService( images = metadata.screenshotUrls.map { downloadAndPersist(it, ImageType.SCREENSHOT) }.toSet(), videoUrls = metadata.videoUrls, path = path.toString(), - source = pluginManagementService.getPluginManagementEntry(source.javaClass) + metadata = mapOf("title" to FieldMetadata(sourcePlugin)) ) } diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt index f679b65..f529a7b 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameDto.kt @@ -18,5 +18,5 @@ class GameDto( val perspectives: List?, val imageIds: List?, val videoUrls: List?, - val source: String? + val metadata: Map ) \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameMetadataDto.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameMetadataDto.kt new file mode 100644 index 0000000..e5f9035 --- /dev/null +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/dto/GameMetadataDto.kt @@ -0,0 +1,8 @@ +package de.grimsi.gameyfin.games.dto + +import java.time.Instant + +class GameMetadataDto( + val source: String, + val lastUpdated: Instant +) \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/FieldMetadata.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/FieldMetadata.kt new file mode 100644 index 0000000..ea5c2cd --- /dev/null +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/FieldMetadata.kt @@ -0,0 +1,19 @@ +package de.grimsi.gameyfin.games.entities + +import de.grimsi.gameyfin.core.plugins.management.PluginManagementEntry +import jakarta.persistence.* +import java.time.Instant + +@Entity +class FieldMetadata( + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + var id: Long? = null, + + @ManyToOne + val source: PluginManagementEntry, + + val lastUpdated: Instant +) { + constructor(source: PluginManagementEntry) : this(null, source, Instant.now()) +} diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt index 479418b..7d3494c 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/entities/Game.kt @@ -1,6 +1,5 @@ package de.grimsi.gameyfin.games.entities -import de.grimsi.gameyfin.core.plugins.management.PluginManagementEntry import de.grimsi.gameyfin.pluginapi.gamemetadata.GameFeature import de.grimsi.gameyfin.pluginapi.gamemetadata.Genre import de.grimsi.gameyfin.pluginapi.gamemetadata.PlayerPerspective @@ -60,6 +59,6 @@ class Game( @Column(unique = true) val path: String, - @ManyToOne - val source: PluginManagementEntry + @OneToMany(cascade = [CascadeType.ALL], orphanRemoval = true) + val metadata: Map ) \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/repositories/FieldMetadataRepository.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/repositories/FieldMetadataRepository.kt new file mode 100644 index 0000000..41af584 --- /dev/null +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/repositories/FieldMetadataRepository.kt @@ -0,0 +1,6 @@ +package de.grimsi.gameyfin.games.repositories + +import de.grimsi.gameyfin.games.entities.FieldMetadata +import org.springframework.data.jpa.repository.JpaRepository + +interface FieldMetadataRepository : JpaRepository \ No newline at end of file diff --git a/gameyfin/src/main/resources/application-dev.yml b/gameyfin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..3eec445 --- /dev/null +++ b/gameyfin/src/main/resources/application-dev.yml @@ -0,0 +1,2 @@ +logging.level.org.hibernate.SQL: DEBUG +logging.level.org.hibernate.type: TRACE \ No newline at end of file