/* * 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() } }