Newer
Older
bremer / src / main / kotlin / service / TagService.kt
/*
 * 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()
    }
}