First version of metadata on field level, probably not the final implementation

This commit is contained in:
grimsi
2025-01-01 14:08:56 +01:00
parent 1c85d4dcaa
commit 72f2e8e693
7 changed files with 54 additions and 6 deletions
@@ -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<String, FieldMetadata>): Map<String, GameMetadataDto> {
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))
)
}
@@ -18,5 +18,5 @@ class GameDto(
val perspectives: List<String>?,
val imageIds: List<Long>?,
val videoUrls: List<String>?,
val source: String?
val metadata: Map<String, GameMetadataDto>
)
@@ -0,0 +1,8 @@
package de.grimsi.gameyfin.games.dto
import java.time.Instant
class GameMetadataDto(
val source: String,
val lastUpdated: Instant
)
@@ -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())
}
@@ -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<String, FieldMetadata>
)
@@ -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<FieldMetadata, Long>
@@ -0,0 +1,2 @@
logging.level.org.hibernate.SQL: DEBUG
logging.level.org.hibernate.type: TRACE