From db22874f063bae0c9e7f0c99a20cdf1b16addd89 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 21 Dec 2024 00:25:26 +0100 Subject: [PATCH] feat: Make some announcements schema fields nullable --- .../revanced/api/configuration/APISchema.kt | 8 +-- .../repository/AnnouncementRepository.kt | 50 ++++++++++--------- .../services/AnnouncementServiceTest.kt | 4 +- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/main/kotlin/app/revanced/api/configuration/APISchema.kt b/src/main/kotlin/app/revanced/api/configuration/APISchema.kt index 4e50729..74bd854 100644 --- a/src/main/kotlin/app/revanced/api/configuration/APISchema.kt +++ b/src/main/kotlin/app/revanced/api/configuration/APISchema.kt @@ -63,9 +63,9 @@ class ApiAnnouncement( val title: String, val content: String? = null, // Using a list instead of a set because set semantics are unnecessary here. - val attachments: List = emptyList(), + val attachments: List? = null, // Using a list instead of a set because set semantics are unnecessary here. - val tags: List = emptyList(), + val tags: List? = null, val createdAt: LocalDateTime = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()), val archivedAt: LocalDateTime? = null, val level: Int = 0, @@ -78,9 +78,9 @@ class ApiResponseAnnouncement( val title: String, val content: String? = null, // Using a list instead of a set because set semantics are unnecessary here. - val attachments: List = emptyList(), + val attachments: List? = null, // Using a list instead of a set because set semantics are unnecessary here. - val tags: List = emptyList(), + val tags: List? = null, val createdAt: LocalDateTime, val archivedAt: LocalDateTime? = null, val level: Int = 0, diff --git a/src/main/kotlin/app/revanced/api/configuration/repository/AnnouncementRepository.kt b/src/main/kotlin/app/revanced/api/configuration/repository/AnnouncementRepository.kt index 45942f1..f4e4dbf 100644 --- a/src/main/kotlin/app/revanced/api/configuration/repository/AnnouncementRepository.kt +++ b/src/main/kotlin/app/revanced/api/configuration/repository/AnnouncementRepository.kt @@ -69,8 +69,7 @@ internal class AnnouncementRepository(private val database: Database) { fun latestId() = latestAnnouncement?.id?.value.toApiResponseAnnouncementId() - fun latestId(tags: Set) = - tags.map { tag -> latestAnnouncementByTag[tag]?.id?.value }.toApiResponseAnnouncementId() + fun latestId(tags: Set) = tags.map { tag -> latestAnnouncementByTag[tag]?.id?.value }.toApiResponseAnnouncementId() suspend fun paged(cursor: Int, count: Int, tags: Set?) = transaction { Announcement.find { @@ -103,11 +102,13 @@ internal class AnnouncementRepository(private val database: Database) { createdAt = new.createdAt archivedAt = new.archivedAt level = new.level - tags = SizedCollection( - new.tags.map { tag -> Tag.find { Tags.name eq tag }.firstOrNull() ?: Tag.new { name = tag } }, - ) + if (new.tags != null) { + tags = SizedCollection( + new.tags.map { tag -> Tag.find { Tags.name eq tag }.firstOrNull() ?: Tag.new { name = tag } }, + ) + } }.apply { - new.attachments.map { attachmentUrl -> + new.attachments?.map { attachmentUrl -> Attachment.new { url = attachmentUrl announcement = this@apply @@ -125,24 +126,28 @@ internal class AnnouncementRepository(private val database: Database) { it.archivedAt = new.archivedAt it.level = new.level - // Get the old tags, create new tags if they don't exist, - // and delete tags that are not in the new tags, after updating the announcement. - val oldTags = it.tags.toList() - val updatedTags = new.tags.map { name -> - Tag.find { Tags.name eq name }.firstOrNull() ?: Tag.new { this.name = name } - } - it.tags = SizedCollection(updatedTags) - oldTags.forEach { tag -> - if (tag in updatedTags || !tag.announcements.empty()) return@forEach - tag.delete() + if (new.tags != null) { + // Get the old tags, create new tags if they don't exist, + // and delete tags that are not in the new tags, after updating the announcement. + val oldTags = it.tags.toList() + val updatedTags = new.tags.map { name -> + Tag.find { Tags.name eq name }.firstOrNull() ?: Tag.new { this.name = name } + } + it.tags = SizedCollection(updatedTags) + oldTags.forEach { tag -> + if (tag in updatedTags || !tag.announcements.empty()) return@forEach + tag.delete() + } } // Delete old attachments and create new attachments. - it.attachments.forEach { attachment -> attachment.delete() } - new.attachments.map { attachment -> - Attachment.new { - url = attachment - announcement = it + if (new.attachments != null) { + it.attachments.forEach { attachment -> attachment.delete() } + new.attachments.map { attachment -> + Attachment.new { + url = attachment + announcement = it + } } } }?.let(::updateLatestAnnouncement) ?: Unit @@ -175,8 +180,7 @@ internal class AnnouncementRepository(private val database: Database) { Tag.all().toList().toApiTag() } - private suspend fun transaction(statement: suspend Transaction.() -> T) = - newSuspendedTransaction(Dispatchers.IO, database, statement = statement) + private suspend fun transaction(statement: suspend Transaction.() -> T) = newSuspendedTransaction(Dispatchers.IO, database, statement = statement) private object Announcements : IntIdTable() { val author = varchar("author", 32).nullable() diff --git a/src/test/kotlin/app/revanced/api/configuration/services/AnnouncementServiceTest.kt b/src/test/kotlin/app/revanced/api/configuration/services/AnnouncementServiceTest.kt index b2007a7..120d290 100644 --- a/src/test/kotlin/app/revanced/api/configuration/services/AnnouncementServiceTest.kt +++ b/src/test/kotlin/app/revanced/api/configuration/services/AnnouncementServiceTest.kt @@ -135,7 +135,7 @@ private object AnnouncementServiceTest { val latestAnnouncement = announcementService.latest()!! val latestId = latestAnnouncement.id - val attachments = latestAnnouncement.attachments + val attachments = latestAnnouncement.attachments!! assertEquals(2, attachments.size) assert(attachments.any { it == "attachment1" }) assert(attachments.any { it == "attachment2" }) @@ -144,7 +144,7 @@ private object AnnouncementServiceTest { latestId, ApiAnnouncement(title = "title", attachments = listOf("attachment1", "attachment3")), ) - assert(announcementService.get(latestId)!!.attachments.any { it == "attachment3" }) + assert(announcementService.get(latestId)!!.attachments!!.any { it == "attachment3" }) } @Test