diff --git a/src/main/kotlin/controller/api/AudioApiController.kt b/src/main/kotlin/controller/api/AudioApiController.kt index 53cb909..46b1817 100644 --- a/src/main/kotlin/controller/api/AudioApiController.kt +++ b/src/main/kotlin/controller/api/AudioApiController.kt @@ -4,14 +4,13 @@ package net.piedpiper.bremer.controller.api +import jakarta.validation.Valid import net.piedpiper.bremer.model.api.AudioListResponse +import net.piedpiper.bremer.model.api.AudioRequest import net.piedpiper.bremer.service.AudioService import org.springframework.beans.factory.annotation.Qualifier import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.* @RestController("bremer.controller.AudioApiController") @RequestMapping("bremer/api/audio") @@ -23,6 +22,7 @@ private const val PAGE_LIMIT = 50 } + // TODO 複数キーワード対応 @GetMapping fun getAudioList( @RequestParam("audio", required = false) audioName: String?, @@ -36,4 +36,13 @@ @GetMapping("history") fun getLeastRecentlyPlayedList(): ResponseEntity = ResponseEntity.ok(audioService.getLeastRecentlyAccessedAudio(PAGE_LIMIT)) + + @PutMapping("{slug}") + fun updateAudio( + @PathVariable("slug") slug: String, + @Valid @RequestBody request: AudioRequest + ): ResponseEntity { + audioService.update(slug, request) + return ResponseEntity.ok(null) + } } \ No newline at end of file diff --git a/src/main/kotlin/dao/AudioDao.kt b/src/main/kotlin/dao/AudioDao.kt index cebd621..6fe3f82 100644 --- a/src/main/kotlin/dao/AudioDao.kt +++ b/src/main/kotlin/dao/AudioDao.kt @@ -5,6 +5,7 @@ package net.piedpiper.bremer.dao import net.piedpiper.bremer.entity.* +import net.piedpiper.bremer.utils.DaoUtils import net.piedpiper.bremer.utils.SelectSQLBuilder import net.piedpiper.bremer.utils.WHERE_IN import org.apache.ibatis.annotations.* @@ -23,6 +24,10 @@ fun findOneBySlug(@Param("slug") slug: String): AudioEntity? @ResultMap("net.piedpiper.bremer.AudioEntity") + @Select("SELECT * FROM audio WHERE slug = #{slug} FOR UPDATE") + fun findOneBySlugWithLock(@Param("slug") slug: String): AudioEntity? + + @ResultMap("net.piedpiper.bremer.AudioEntity") @SelectProvider(type = Sql::class, method = "findAllByAlbumIdIn") fun findAllByAlbumIdIn(@Param("albumIds") albumIds: List): List @@ -45,6 +50,9 @@ @Param("limit") limit: Int ): List + @UpdateProvider(type = Sql::class, method = "updateOne") + fun updateOne(@Param("entity") entity: AudioEntity) + class Sql { companion object { @JvmStatic @@ -127,6 +135,10 @@ .ORDER_BY("audio.album_id, audio.sequence") .LIMIT("#{limit}") .toString() + + @JvmStatic + fun updateOne(@Param("entity") entity: AudioEntity): String = + DaoUtils.updateOne(entity) } } } \ No newline at end of file diff --git a/src/main/kotlin/dao/PlaylistDao.kt b/src/main/kotlin/dao/PlaylistDao.kt index 83310b1..c616ec7 100644 --- a/src/main/kotlin/dao/PlaylistDao.kt +++ b/src/main/kotlin/dao/PlaylistDao.kt @@ -20,7 +20,7 @@ fun findOneById(@Param("id") id: Long): PlaylistEntity? @ResultMap("net.piedpiper.bremer.PlaylistEntity") - @Select("SELECT * FROM playlist where slug = #{slug} FOR UPDATE") + @Select("SELECT * FROM playlist WHERE slug = #{slug} FOR UPDATE") fun findOneBySlugWithLock(@Param("slug") slug: String): PlaylistEntity? @ResultMap("net.piedpiper.bremer.PlaylistEntity") diff --git a/src/main/kotlin/model/api/Request.kt b/src/main/kotlin/model/api/Request.kt index 13292be..63509e9 100644 --- a/src/main/kotlin/model/api/Request.kt +++ b/src/main/kotlin/model/api/Request.kt @@ -7,6 +7,12 @@ import com.fasterxml.jackson.annotation.JsonProperty import jakarta.validation.constraints.NotBlank +data class AudioRequest( + val name: String? = null, + val artist: String? = null, + val album: String? = null +) + data class PlaylistRequest( @field:NotBlank val name: String = "", diff --git a/src/main/kotlin/service/AudioService.kt b/src/main/kotlin/service/AudioService.kt index b7cd607..3cf4e78 100644 --- a/src/main/kotlin/service/AudioService.kt +++ b/src/main/kotlin/service/AudioService.kt @@ -9,6 +9,7 @@ import net.piedpiper.bremer.entity.AudioPlayHistoryEntity import net.piedpiper.bremer.exception.NotFoundException import net.piedpiper.bremer.model.api.AudioListResponse +import net.piedpiper.bremer.model.api.AudioRequest import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -91,6 +92,16 @@ else AudioListResponse() } + @Transactional + fun update(slug: String, request: AudioRequest) + = audioDao.findOneBySlugWithLock(slug) + ?.let { + request?.name?.apply { + it.name = request.name + audioDao.updateOne(it) + } + } ?: throw NotFoundException() + private fun findAllByArtistNameLikeLimit( artistNameLike: String, limit: Int