/*
* Copyright (c) 2023. yo-saito. All Rights Reserved.
*/
package net.piedpiper.bremer.service
import net.piedpiper.bremer.dao.AudioDao
import net.piedpiper.bremer.dao.AudioTagDao
import net.piedpiper.bremer.dao.TagDao
import net.piedpiper.bremer.entity.AudioTagEntity
import net.piedpiper.bremer.entity.TagEntity
import net.piedpiper.bremer.exception.NotFoundException
import net.piedpiper.bremer.model.api.TagAudioRequest
import net.piedpiper.bremer.model.api.TagAudioResponse
import net.piedpiper.bremer.model.api.TagRequest
import net.piedpiper.bremer.model.api.AllTagsResponse
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.stereotype.Service
import java.util.*
@Service("bremer.service.TagService")
class TagService(
@Qualifier("bremer.dao.AudioDao")
private val audioDao: AudioDao,
@Qualifier("bremer.dao.AudioTagDao")
private val audioTagDao: AudioTagDao,
@Qualifier("bremer.dao.TagDao")
private val tagDao: TagDao
) {
fun getAllTags(): AllTagsResponse = AllTagsResponse(tagDao.findAll())
fun createTag(request: TagRequest) {
tagDao.insertOne(TagEntity(slug = UUID.randomUUID().toString(), name = request.name))
}
fun updateTag(tagSlug: String, request: TagRequest) {
tagDao.findOneBySlugWithLock(tagSlug)
?.let {
it.name = request.name
tagDao.updateOne(it)
} ?: throw NotFoundException()
}
fun getAudioListByTagSlug(tagSlug: String): TagAudioResponse =
tagDao.findOneBySlug(tagSlug)
?.let { tag ->
TagAudioResponse(
tag,
audioDao.findAllByTagIdIn(listOf(tag.id))
)
} ?: throw NotFoundException()
fun addTagToAudioList(tagSlug: String, request: TagAudioRequest) {
tagDao.findOneBySlug(tagSlug)
?.let { tag ->
audioDao.findAllBySlugIn(request.audioSlugs)
.forEach { audio ->
if (audioTagDao.findByAudioIdAndTagId(audio.id, tag.id) != null) {
return@forEach
}
audioTagDao.insertOne(
AudioTagEntity(
audioId = audio.id,
tagId = tag.id
)
)
}
} ?: throw NotFoundException()
}
fun deleteTagFromAudioList(tagSlug: String, request: TagAudioRequest) {
tagDao.findOneBySlug(tagSlug)
?.let { tag ->
audioDao.findAllBySlugIn(request.audioSlugs)
.forEach { audio ->
audioTagDao.deleteOneByAudioIdAndTagId(audio.id, tag.id)
}
} ?: throw NotFoundException()
}
}