fix: Finish DB Model to API model transformation inside transaction

This commit is contained in:
oSumAtrIX 2024-07-08 05:16:59 +02:00
parent 1ca9952de8
commit 89a577e91a
No known key found for this signature in database
GPG Key ID: A9B3094ACDB604B4
2 changed files with 28 additions and 27 deletions

View File

@ -1,6 +1,8 @@
package app.revanced.api.configuration.repository package app.revanced.api.configuration.repository
import app.revanced.api.configuration.schema.APIAnnouncement import app.revanced.api.configuration.schema.APIAnnouncement
import app.revanced.api.configuration.schema.APIResponseAnnouncement
import app.revanced.api.configuration.schema.APIResponseAnnouncementId
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -41,11 +43,11 @@ internal class AnnouncementRepository {
} }
suspend fun all() = transaction { suspend fun all() = transaction {
Announcement.all() Announcement.all().map { it.toApi() }
} }
suspend fun all(channel: String) = transaction { suspend fun all(channel: String) = transaction {
Announcement.find { Announcements.channel eq channel } Announcement.find { Announcements.channel eq channel }.map { it.toApi() }
} }
suspend fun delete(id: Int) = transaction { suspend fun delete(id: Int) = transaction {
@ -66,13 +68,13 @@ internal class AnnouncementRepository {
} }
} }
fun latest() = latestAnnouncement fun latest() = latestAnnouncement?.toApi()
fun latest(channel: String) = latestAnnouncementByChannel[channel] fun latest(channel: String) = latestAnnouncementByChannel[channel]?.toApi()
fun latestId() = latest()?.id?.value fun latestId() = latest()?.id?.toApi()
fun latestId(channel: String) = latest(channel)?.id?.value fun latestId(channel: String) = latest(channel)?.id?.toApi()
suspend fun archive( suspend fun archive(
id: Int, id: Int,
@ -172,4 +174,18 @@ internal class AnnouncementRepository {
var url by Attachments.url var url by Attachments.url
var announcement by Announcement referencedOn Attachments.announcement var announcement by Announcement referencedOn Attachments.announcement
} }
private fun Announcement.toApi() = APIResponseAnnouncement(
id.value,
author,
title,
content,
attachments.map { it.url },
channel,
createdAt,
archivedAt,
level,
)
private fun Int.toApi() = APIResponseAnnouncementId(this)
} }

View File

@ -2,21 +2,20 @@ package app.revanced.api.configuration.services
import app.revanced.api.configuration.repository.AnnouncementRepository import app.revanced.api.configuration.repository.AnnouncementRepository
import app.revanced.api.configuration.schema.APIAnnouncement import app.revanced.api.configuration.schema.APIAnnouncement
import app.revanced.api.configuration.schema.APIResponseAnnouncement
import app.revanced.api.configuration.schema.APIResponseAnnouncementId import app.revanced.api.configuration.schema.APIResponseAnnouncementId
import kotlinx.datetime.LocalDateTime import kotlinx.datetime.LocalDateTime
internal class AnnouncementService( internal class AnnouncementService(
private val announcementRepository: AnnouncementRepository, private val announcementRepository: AnnouncementRepository,
) { ) {
fun latestId(channel: String): APIResponseAnnouncementId? = announcementRepository.latestId(channel)?.toApi() fun latestId(channel: String): APIResponseAnnouncementId? = announcementRepository.latestId(channel)
fun latestId(): APIResponseAnnouncementId? = announcementRepository.latestId()?.toApi() fun latestId(): APIResponseAnnouncementId? = announcementRepository.latestId()
fun latest(channel: String) = announcementRepository.latest(channel)?.toApi() fun latest(channel: String) = announcementRepository.latest(channel)
fun latest() = announcementRepository.latest()?.toApi() fun latest() = announcementRepository.latest()
suspend fun all(channel: String) = announcementRepository.all(channel).map { it.toApi() } suspend fun all(channel: String) = announcementRepository.all(channel)
suspend fun all() = announcementRepository.all().map { it.toApi() } suspend fun all() = announcementRepository.all()
suspend fun new(new: APIAnnouncement) { suspend fun new(new: APIAnnouncement) {
announcementRepository.new(new) announcementRepository.new(new)
@ -33,18 +32,4 @@ internal class AnnouncementService(
suspend fun delete(id: Int) { suspend fun delete(id: Int) {
announcementRepository.delete(id) announcementRepository.delete(id)
} }
private fun AnnouncementRepository.Announcement.toApi() = APIResponseAnnouncement(
id.value,
author,
title,
content,
attachments.map { it.url },
channel,
createdAt,
archivedAt,
level,
)
private fun Int.toApi() = APIResponseAnnouncementId(this)
} }