Add mutation to bind existing track record (#2045)

Makes it possible to copy a bound track record to another manga.
This is necessary during a migration to prevent spamming the actual tracker and causing 429 errors

closes #2033
This commit is contained in:
schroda
2026-06-29 20:59:53 +02:00
committed by GitHub
parent 4d7b7617a9
commit 323d58717e
2 changed files with 76 additions and 2 deletions

View File

@@ -148,6 +148,36 @@ class TrackMutation {
} }
} }
data class BindTrackRecordInput(
val clientMutationId: String? = null,
val mangaId: Int,
val trackRecordId: Int,
)
data class BindTrackRecordPayload(
val clientMutationId: String?,
val trackRecord: TrackRecordType,
)
@RequireAuth
fun bindTrackRecord(input: BindTrackRecordInput): CompletableFuture<BindTrackRecordPayload?> {
val (clientMutationId, mangaId, trackRecordId) = input
return future {
val boundTrackRecordId = Track.bindTrackRecord(mangaId, trackRecordId)
val trackRecord =
transaction {
TrackRecordTable.selectAll().where { TrackRecordTable.id eq boundTrackRecordId }.first()
}
BindTrackRecordPayload(
clientMutationId,
TrackRecordType(trackRecord),
)
}
}
data class FetchTrackInput( data class FetchTrackInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
val recordId: Int, val recordId: Int,

View File

@@ -222,6 +222,48 @@ object Track {
} }
} }
fun bindTrackRecord(
mangaId: Int,
trackRecordId: Int,
): Int {
val (trackRecord, existingTrackRecord) =
transaction {
val trackRecord =
TrackRecordTable
.selectAll()
.where {
(TrackRecordTable.id eq trackRecordId)
}.first()
.toTrackRecordDataClass()
val existingTrackRecord =
TrackRecordTable
.selectAll()
.where {
(TrackRecordTable.mangaId eq mangaId) and (TrackRecordTable.trackerId eq trackRecord.trackerId)
}.firstOrNull()
?.toTrackRecordDataClass()
trackRecord to existingTrackRecord
}
val isAlreadyBoundToManga = trackRecord.mangaId == mangaId
if (isAlreadyBoundToManga) {
return trackRecordId
}
val hasRecordForTracker = existingTrackRecord != null
if (hasRecordForTracker) {
val updatedTrack = trackRecord.copy(id = existingTrackRecord.id, mangaId = mangaId).toTrack()
return updateTrackRecord(updatedTrack)
}
val newTrack = trackRecord.copy(mangaId = mangaId).toTrack()
return insertTrackRecord(newTrack)
}
suspend fun refresh(recordId: Int) { suspend fun refresh(recordId: Int) {
val recordDb = val recordDb =
transaction { transaction {
@@ -423,9 +465,9 @@ object Track {
} }
} }
fun updateTrackRecord(track: Track) = updateTrackRecords(listOf(track)) fun updateTrackRecord(track: Track): Int = updateTrackRecords(listOf(track)).first()
fun updateTrackRecords(tracks: List<Track>) = fun updateTrackRecords(tracks: List<Track>): List<Int> =
transaction { transaction {
if (tracks.isNotEmpty()) { if (tracks.isNotEmpty()) {
BatchUpdateStatement(TrackRecordTable) BatchUpdateStatement(TrackRecordTable)
@@ -447,6 +489,8 @@ object Track {
}.toExecutable() }.toExecutable()
.execute(this@transaction) .execute(this@transaction)
} }
tracks.map { it.id!! }
} }
fun insertTrackRecord(track: Track): Int = insertTrackRecords(listOf(track)).first() fun insertTrackRecord(track: Track): Int = insertTrackRecords(listOf(track)).first()