Newer
Older
bremer / src / main / kotlin / controller / api / AudioApiController.kt
/*
 * Copyright (c) 2023. yo-saito. All Rights Reserved.
 */

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.*

@RestController("bremer.controller.AudioApiController")
@RequestMapping("bremer/api/audio")
class AudioApiController(
    @Qualifier("bremer.service.AudioService")
    private val audioService: AudioService
) {
    companion object {
        private const val PAGE_LIMIT = 200
        private fun splitKeywords(keywords: String?): List<String>? {
            return if (keywords?.isNotEmpty() == true) {
                keywords?.split("\\s".toRegex())?.toList()
            } else {
                null
            }
        }
    }

    @GetMapping
    fun getAudioList(
        @RequestParam("audio", required = false) audioName: String?,
        @RequestParam("artist", required = false) artistName: String?,
        @RequestParam("album", required = false) albumName: String?,
        @RequestParam("tag", required = false) tagName: String?
    ): ResponseEntity<AudioListResponse> =
        ResponseEntity.ok(
            audioService.getByKeywords(
                splitKeywords(audioName),
                splitKeywords(artistName),
                splitKeywords(albumName),
                splitKeywords(tagName),
                PAGE_LIMIT
            )
        )

    @GetMapping("history")
    fun getLeastRecentlyPlayedList(): ResponseEntity<AudioListResponse> =
        ResponseEntity.ok(audioService.getLeastRecentlyAccessedAudio(PAGE_LIMIT))

    @PostMapping("history/{slug}")
    fun updateHistory(
        @PathVariable("slug") slug: String
    ): ResponseEntity<Void> {
        audioService.updateHistory(slug, PAGE_LIMIT)
        return ResponseEntity.ok(null)
    }

    @PutMapping("{slug}")
    fun updateAudio(
        @PathVariable("slug") slug: String,
        @Valid @RequestBody request: AudioRequest
    ): ResponseEntity<Void> {
        audioService.update(slug, request)
        return ResponseEntity.ok(null)
    }

    @DeleteMapping("{slug}")
    fun deleteAudio(
        @PathVariable("slug") slug: String
    ): ResponseEntity<Void> {
        audioService.delete(slug)
        return ResponseEntity.ok(null)
    }
}