Newer
Older
bremer / src / main / kotlin / repository / PlaylistRepository.kt
yhornisse on 2 Jul 2023 1 KB add project
/*
 * Copyright (c) 2023. yo-saito. All Rights Reserved.
 */

package net.piedpiper.bremer.repository

import net.piedpiper.bremer.dao.PlaylistAudioDao
import net.piedpiper.bremer.dao.PlaylistDao
import net.piedpiper.bremer.entity.PlaylistEntity
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.stereotype.Repository
import org.springframework.transaction.annotation.Transactional

@Repository("bremer.repository.PlaylistRepository")
class PlaylistRepository(
    @Qualifier("bremer.dao.PlaylistDao")
    private val playlistDao: PlaylistDao,
    @Qualifier("bremer.dao.PlaylistAudioDao")
    private val playlistAudioDao: PlaylistAudioDao
) {

    fun findOneById(id: Long): PlaylistEntity? = playlistDao.findOneById(id)

    fun findBySlug(slug: String): PlaylistEntity? = playlistDao.findOneBySlug(slug)

    fun findAll(): List<PlaylistEntity> = playlistDao.findAll()

    fun insertOne(playlist: PlaylistEntity): Long {
        playlistDao.insertOne(playlist)
        playlist.playlistAudio?.forEach {
            it.playlistId = playlist.id
            playlistAudioDao.insertOne(it)
        }
        return playlist.id
    }

    fun updateOne(playlist: PlaylistEntity) {
        // playlist
        playlistDao.updateOne(playlist)
        // playlist_audio
        val oldAudio = playlistDao.findOneById(playlist.id)
            ?.playlistAudio
            ?.associate { it.id to it }
            ?.toMutableMap()
            ?: mutableMapOf()
        val oldSize = oldAudio?.size ?: 0
        playlist?.playlistAudio?.forEachIndexed { idx, entity ->
            if (idx >= oldSize) {
                playlistAudioDao.insertOne(entity)
            } else {
                playlistAudioDao.updateOne(entity)
                oldAudio.remove(entity.id)
            }
        }
        deleteAllByIds(oldAudio.keys.toList())
    }

    fun deleteAllByIds(ids: List<Long>) {
        if (ids.isNotEmpty()) {
            playlistAudioDao.deleteAllByIds(ids)
        }
    }
}