diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/src/main/kotlin/config/BremerConfig.kt b/src/main/kotlin/config/BremerConfig.kt index 5aab926..c420f26 100644 --- a/src/main/kotlin/config/BremerConfig.kt +++ b/src/main/kotlin/config/BremerConfig.kt @@ -4,7 +4,7 @@ package net.piedpiper.bremer.config -import net.piedpiper.bremer.service.app.LoginAppService +import net.piedpiper.bremer.service.LoginService import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger import org.springframework.beans.factory.annotation.Qualifier @@ -30,8 +30,8 @@ @Configuration @EnableWebSecurity class WebSecurityConfig( - @Qualifier("bremer.service.LoginAppService") - private val loginAppService: LoginAppService + @Qualifier("bremer.service.LoginService") + private val loginService: LoginService ) { @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { @@ -57,7 +57,7 @@ .logoutSuccessUrl("/bremer/login.html?logout") } .csrf { it.disable() } - .userDetailsService(loginAppService) + .userDetailsService(loginService) return http.build() } } diff --git a/src/main/kotlin/controller/api/AudioApiController.kt b/src/main/kotlin/controller/api/AudioApiController.kt index c3ada9e..53cb909 100644 --- a/src/main/kotlin/controller/api/AudioApiController.kt +++ b/src/main/kotlin/controller/api/AudioApiController.kt @@ -5,7 +5,7 @@ package net.piedpiper.bremer.controller.api import net.piedpiper.bremer.model.api.AudioListResponse -import net.piedpiper.bremer.service.app.AudioAppService +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 @@ -13,21 +13,27 @@ import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController -@RestController +@RestController("bremer.controller.AudioApiController") @RequestMapping("bremer/api/audio") class AudioApiController( - @Qualifier("bremer.service.AudioAppService") - private val audioAppService: AudioAppService + @Qualifier("bremer.service.AudioService") + private val audioService: AudioService ) { + companion object { + private const val PAGE_LIMIT = 50 + } + @GetMapping fun getAudioList( @RequestParam("audio", required = false) audioName: String?, @RequestParam("artist", required = false) artistName: String?, - @RequestParam("album", required = false) albumName: String? + @RequestParam("album", required = false) albumName: String?, + @RequestParam("tag", required = false) tagName: String? ): ResponseEntity = - ResponseEntity.ok(audioAppService.getByKeywords(audioName, artistName, albumName)) + ResponseEntity.ok(audioService.getByKeywords( + audioName, artistName, albumName, tagName, PAGE_LIMIT)) @GetMapping("history") fun getLeastRecentlyPlayedList(): ResponseEntity = - ResponseEntity.ok(audioAppService.getLeastRecentlyAccessedAudio()) + ResponseEntity.ok(audioService.getLeastRecentlyAccessedAudio(PAGE_LIMIT)) } \ No newline at end of file diff --git a/src/main/kotlin/controller/api/PlaylistApiController.kt b/src/main/kotlin/controller/api/PlaylistApiController.kt index 5e4b8ad..bc26301 100644 --- a/src/main/kotlin/controller/api/PlaylistApiController.kt +++ b/src/main/kotlin/controller/api/PlaylistApiController.kt @@ -5,11 +5,11 @@ package net.piedpiper.bremer.controller.api import jakarta.validation.Valid -import net.piedpiper.bremer.entity.AudioEntity -import net.piedpiper.bremer.model.PlaylistAudioResponse -import net.piedpiper.bremer.model.PlaylistListResponse -import net.piedpiper.bremer.model.PlaylistRequest -import net.piedpiper.bremer.service.app.PlaylistAppService +import net.piedpiper.bremer.model.api.PlaylistAudioResponse +import net.piedpiper.bremer.model.api.AllPlaylistResponse +import net.piedpiper.bremer.model.api.PlaylistRequest +import net.piedpiper.bremer.model.api.PlaylistAudioRequest +import net.piedpiper.bremer.service.PlaylistService import org.springframework.beans.factory.annotation.Qualifier import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping @@ -18,34 +18,45 @@ import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController -import java.util.UUID -@RestController +@RestController("bremer.controller.PlaylistApiController") @RequestMapping("bremer/api/playlist") class PlaylistApiController( - @Qualifier("bremer.service.PlaylistAppService") - private val playlistAppService: PlaylistAppService, + @Qualifier("bremer.service.PlaylistService") + private val playlistService: PlaylistService, ) { @GetMapping - fun getAll(): ResponseEntity = - ResponseEntity.ok(playlistAppService.getAllPlaylists()) - - @GetMapping("{slug}") - fun get(@PathVariable("slug") slug: String): ResponseEntity = - ResponseEntity.ok(playlistAppService.getPlaylist(slug)) + fun getAllPlaylists(): ResponseEntity = + ResponseEntity.ok(playlistService.getAllPlaylists()) @PostMapping - fun create( + fun createPlaylist( @Valid @RequestBody request: PlaylistRequest - ): ResponseEntity = - ResponseEntity.ok(playlistAppService.createPlaylist(request)) + ): ResponseEntity { + playlistService.createPlaylist(request) + return ResponseEntity.ok(null) + } @PutMapping("{slug}") - fun update( + fun updatePlaylist( @PathVariable("slug") slug: String, @Valid @RequestBody request: PlaylistRequest - ): ResponseEntity = - ResponseEntity.ok(playlistAppService.updatePlaylist(slug, request)) + ): ResponseEntity { + playlistService.updatePlaylist(slug, request) + return ResponseEntity.ok(null) + } + + @GetMapping("{slug}") + fun getAudioList(@PathVariable("slug") slug: String): ResponseEntity = + ResponseEntity.ok(playlistService.getPlaylist(slug)) + + @PutMapping("audio/{slug}") + fun updateAudioList( + @PathVariable("slug") slug: String, + @Valid @RequestBody request: PlaylistAudioRequest + ): ResponseEntity { + playlistService.updatePlaylistAudioList(slug, request) + return ResponseEntity.ok(null) + } } diff --git a/src/main/kotlin/controller/api/TagApiController.kt b/src/main/kotlin/controller/api/TagApiController.kt new file mode 100644 index 0000000..406fd85 --- /dev/null +++ b/src/main/kotlin/controller/api/TagApiController.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2023. yo-saito. All Rights Reserved. + */ + +package net.piedpiper.bremer.controller.api + +import jakarta.validation.Valid +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 net.piedpiper.bremer.service.TagService +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.* + +@RestController("bremer.controller.TagApiController") +@RequestMapping("bremer/api/tag") +class TagApiController( + @Qualifier("bremer.service.TagService") + private val tagService: TagService +) { + @GetMapping + fun getAllTags(): ResponseEntity = ResponseEntity.ok(tagService.getAllTags()) + + @PostMapping + fun createTag(@Valid @RequestBody request: TagRequest): ResponseEntity { + tagService.createTag(request) + return ResponseEntity.ok(null) + } + + @GetMapping("{slug}") + fun getAudioList(@PathVariable("slug") slug: String): ResponseEntity = + ResponseEntity.ok(tagService.getAudioListByTagSlug(slug)) + + @PostMapping("{slug}") + fun updateTag( + @PathVariable("slug") slug: String, + @Valid @RequestBody request: TagRequest + ): ResponseEntity { + tagService.updateTag(slug, request) + return ResponseEntity.ok(null) + } + + @PutMapping("audio/{slug}") + fun addAudioList( + @PathVariable("slug") slug: String, + @Valid @RequestBody request: TagAudioRequest + ): ResponseEntity { + tagService.addTagToAudioList(slug, request) + return ResponseEntity.ok(null) + } + + @DeleteMapping("audio/{slug}") + fun deleteAudioList( + @PathVariable("slug") slug: String, + @Valid @RequestBody request: TagAudioRequest + ): ResponseEntity { + tagService.deleteTagFromAudioList(slug, request) + return ResponseEntity.ok(null) + } +} \ No newline at end of file diff --git a/src/main/kotlin/controller/view/AudioViewController.kt b/src/main/kotlin/controller/view/AudioViewController.kt index 13a9a62..c1768de 100644 --- a/src/main/kotlin/controller/view/AudioViewController.kt +++ b/src/main/kotlin/controller/view/AudioViewController.kt @@ -5,7 +5,7 @@ package net.piedpiper.bremer.controller.view import jakarta.servlet.http.HttpServletResponse -import net.piedpiper.bremer.service.app.AudioAppService +import net.piedpiper.bremer.service.AudioService import org.springframework.beans.factory.annotation.Qualifier import org.springframework.http.MediaType import org.springframework.stereotype.Controller @@ -17,8 +17,8 @@ @Controller("bremer.controller.AudioController") @RequestMapping("bremer/audio") class AudioViewController( - @Qualifier("bremer.service.AudioAppService") - private val audioAppService: AudioAppService + @Qualifier("bremer.service.AudioService") + private val audioService: AudioService ) { @GetMapping("{slug}") @@ -26,7 +26,7 @@ @PathVariable("slug") slug: String, response: HttpServletResponse ) { - val file = audioAppService.getAudioFile(slug) + val file = audioService.getAudioFile(slug) response.outputStream.use { response.setContentLengthLong(file.length()) response.contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE diff --git a/src/main/kotlin/dao/AudioDao.kt b/src/main/kotlin/dao/AudioDao.kt index a306032..cebd621 100644 --- a/src/main/kotlin/dao/AudioDao.kt +++ b/src/main/kotlin/dao/AudioDao.kt @@ -4,10 +4,7 @@ package net.piedpiper.bremer.dao -import net.piedpiper.bremer.entity.AlbumEntity -import net.piedpiper.bremer.entity.ArtistEntity -import net.piedpiper.bremer.entity.AudioEntity -import net.piedpiper.bremer.entity.AudioNameEntity +import net.piedpiper.bremer.entity.* import net.piedpiper.bremer.utils.SelectSQLBuilder import net.piedpiper.bremer.utils.WHERE_IN import org.apache.ibatis.annotations.* @@ -30,6 +27,10 @@ fun findAllByAlbumIdIn(@Param("albumIds") albumIds: List): List @ResultMap("net.piedpiper.bremer.AudioEntity") + @SelectProvider(type = Sql::class, method = "findAllByTagIdIn") + fun findAllByTagIdIn(@Param("tagIds") tagIds: List): List + + @ResultMap("net.piedpiper.bremer.AudioEntity") @SelectProvider(type = Sql::class, method = "findAllByIdIn") fun findAllByIdIn(@Param("ids") ids: List): List @@ -72,6 +73,7 @@ .leftOuterJoin(AudioNameEntity::class, "audio.id = audio_name.audio_id") .toSql() .WHERE_IN("audio.album_id", "albumIds", albumIds.size) + .ORDER_BY("audio.album_id, audio.sequence") .toString() @JvmStatic @@ -82,6 +84,7 @@ .leftOuterJoin(AudioNameEntity::class, "audio.id = audio_name.audio_id") .toSql() .WHERE_IN("audio.id", "ids", ids.size) + .ORDER_BY("audio.album_id, audio.sequence") .toString() @JvmStatic @@ -92,6 +95,19 @@ .leftOuterJoin(AudioNameEntity::class, "audio.id = audio_name.audio_id") .toSql() .WHERE_IN("audio.slug", "slugs", slugs.size) + .ORDER_BY("audio.album_id, audio.sequence") + .toString() + + @JvmStatic + fun findAllByTagIdIn(@Param("tagIds") tagIds: List): String = + SelectSQLBuilder(AudioEntity::class) + .leftOuterJoin(AlbumEntity::class, "audio.album_id = album.id") + .leftOuterJoin(ArtistEntity::class, "album.artist_id = artist.id", AlbumEntity::class) + .leftOuterJoin(AudioNameEntity::class, "audio.id = audio_name.audio_id") + .leftOuterJoin(AudioTagEntity::class, "audio.id = audio_tag.audio_id") + .toSql() + .WHERE_IN("audio_tag.tag_id", "tagIds", tagIds.size) + .ORDER_BY("audio.album_id, audio.sequence") .toString() @JvmStatic diff --git a/src/main/kotlin/dao/AudioTagDao.kt b/src/main/kotlin/dao/AudioTagDao.kt new file mode 100644 index 0000000..c85688b --- /dev/null +++ b/src/main/kotlin/dao/AudioTagDao.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023. yo-saito. All Rights Reserved. + */ + +package net.piedpiper.bremer.dao + +import net.piedpiper.bremer.entity.AudioTagEntity +import net.piedpiper.bremer.utils.DaoUtils +import org.apache.ibatis.annotations.* +import org.springframework.stereotype.Repository + +@Repository("bremer.dao.AudioTagDao") +@Mapper +interface AudioTagDao { + + @ResultMap("net.piedpiper.bremer.AudioTagEntity") + @Select("SELECT * FROM audio_tag WHERE audio_id = #{audioId} AND tag_id = #{tagId}") + fun findByAudioIdAndTagId( + @Param("audioId") audioId: Long, + @Param("tagId") tagId: Long + ): AudioTagEntity? + + @UpdateProvider(type = Sql::class, method = "insertOne") + fun insertOne(@Param("entity") entity: AudioTagEntity): Boolean + + @Delete("DELETE FROM audio_tag WHERE audio_id = #{audioId} AND tag_id = #{tagId}") + fun deleteOneByAudioIdAndTagId( + @Param("audioId") audioId: Long, + @Param("tagId") tagId: Long + ): Boolean + + class Sql { + companion object { + @JvmStatic + @Options(useGeneratedKeys = true, keyColumn = "id") + fun insertOne(@Param("entity") entity: AudioTagEntity): String = + DaoUtils.insertOne(entity) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/dao/PlaylistDao.kt b/src/main/kotlin/dao/PlaylistDao.kt index 5c024d1..83310b1 100644 --- a/src/main/kotlin/dao/PlaylistDao.kt +++ b/src/main/kotlin/dao/PlaylistDao.kt @@ -20,17 +20,24 @@ fun findOneById(@Param("id") id: Long): PlaylistEntity? @ResultMap("net.piedpiper.bremer.PlaylistEntity") + @Select("SELECT * FROM playlist where slug = #{slug} FOR UPDATE") + fun findOneBySlugWithLock(@Param("slug") slug: String): PlaylistEntity? + + @ResultMap("net.piedpiper.bremer.PlaylistEntity") @SelectProvider(type = Sql::class, method = "findOneBySlug") fun findOneBySlug(@Param("slug") slug: String): PlaylistEntity? @ResultMap("net.piedpiper.bremer.PlaylistEntity") - @Select("SELECT * FROM playlist") - fun findAll(): List + @Select("SELECT * FROM playlist ORDER BY sequence ASC") + fun findAllOrderBySequence(): List @InsertProvider(type = Sql::class, method = "insertOne") @Options(useGeneratedKeys = true, keyProperty = "id") fun insertOne(@Param("entity") entity: PlaylistEntity): Boolean + @Delete("DELETE FROM playlist WHERE slug = #{slug}") + fun deleteBySlug(@Param("slug") slug: String): Boolean + @UpdateProvider(type = Sql::class, method = "updateOne") fun updateOne(@Param("entity") entity: PlaylistEntity) diff --git a/src/main/kotlin/dao/TagDao.kt b/src/main/kotlin/dao/TagDao.kt new file mode 100644 index 0000000..9d314b8 --- /dev/null +++ b/src/main/kotlin/dao/TagDao.kt @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023. yo-saito. All Rights Reserved. + */ + +package net.piedpiper.bremer.dao + +import net.piedpiper.bremer.entity.TagEntity +import net.piedpiper.bremer.utils.DaoUtils +import org.apache.ibatis.annotations.* +import org.springframework.stereotype.Repository + +@Repository("bremer.dao.TagDao") +@Mapper +interface TagDao { + + @ResultMap("net.piedpiper.bremer.TagEntity") + @Select("SELECT * FROM tag WHERE slug = #{slug}") + fun findOneBySlug(@Param("slug") slug: String): TagEntity? + + @ResultMap("net.piedpiper.bremer.TagEntity") + @Select("SELECT * FROM tag WHERE slug = #{slug} FOR UPDATE") + fun findOneBySlugWithLock(@Param("slug") slug: String): TagEntity? + + @ResultMap("net.piedpiper.bremer.TagEntity") + @Select("SELECT * FROM tag") + fun findAll(): List + + @ResultMap("net.piedpiper.bremer.TagEntity") + @Select("SELECT * FROM tag WHERE name LIKE CONCAT('%', #{nameLike}, '%') LIMIT #{limit}") + fun findAllByNameLikeLimit( + @Param("nameLike") nameLike: String, + @Param("limit") limit: Int + ): List + + @InsertProvider(type = Sql::class, method = "insertOne") + @Options(useGeneratedKeys = true, keyProperty = "id") + fun insertOne(@Param("entity") entity: TagEntity): Boolean + + @UpdateProvider(type = Sql::class, method = "updateOne") + fun updateOne(@Param("entity") entity: TagEntity) + + @Delete("DELETE FROM tag WHERE id = #{id}") + fun deleteById(@Param("id") id: Long): Boolean + + class Sql { + companion object { + @JvmStatic + @Options(useGeneratedKeys = true, keyColumn = "id") + fun insertOne(@Param("entity") entity: TagEntity): String = + DaoUtils.insertOne(entity) + + @JvmStatic + fun updateOne(@Param("entity") entity: TagEntity): String = + DaoUtils.updateOne(entity) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/dao/UserDao.kt b/src/main/kotlin/dao/UserDao.kt index 6c12a5c..3e2d8d7 100644 --- a/src/main/kotlin/dao/UserDao.kt +++ b/src/main/kotlin/dao/UserDao.kt @@ -17,5 +17,5 @@ @ResultMap("net.piedpiper.bremer.UserEntity") @Select("SELECT * FROM user WHERE account_id = #{accountId}") - fun findByName(@Param("accountId") accountId: String): UserEntity? + fun findOneByName(@Param("accountId") accountId: String): UserEntity? } \ No newline at end of file diff --git a/src/main/kotlin/entity/Audio.kt b/src/main/kotlin/entity/Audio.kt deleted file mode 100644 index f8f9f72..0000000 --- a/src/main/kotlin/entity/Audio.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023. yo-saito. All Rights Reserved. - */ - -package net.piedpiper.bremer.entity - -import net.piedpiper.bremer.utils.sql.Column -import net.piedpiper.bremer.utils.sql.Table -import java.time.LocalDateTime - -@Table("audio") -data class AudioEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("slug") - var slug: String = "", - @property:Column("name") - var name: String = "", - @property:Column("album_id") - var albumId: Long = 0L, - @property:Column("sequence") - var sequence: Int = 0, - @property:Column("path") - var path: String = "", - // join - var album: AlbumEntity? = null, - var aliasNames: List? = null -) - -@Table("audio_name") -data class AudioNameEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("audio_id") - var audioId: Long = 0L, - @property:Column("name") - var name: String = "" -) - -@Table("album") -data class AlbumEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("artist_id") - var artistId: Long = 0L, - @property:Column("name") - var name: String = "", - // join - var artist: ArtistEntity? = null -) - -@Table("artist") -data class ArtistEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("name") - var name: String = "", -) - -@Table("audio_play_history") -data class AudioPlayHistoryEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("audio_id") - var audioId: Long = 0L, - @property:Column("last_played_at") - var lastPlayedAt: LocalDateTime = LocalDateTime.MIN -) diff --git a/src/main/kotlin/entity/Entity.kt b/src/main/kotlin/entity/Entity.kt new file mode 100644 index 0000000..28836cf --- /dev/null +++ b/src/main/kotlin/entity/Entity.kt @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2023. yo-saito. All Rights Reserved. + */ + +package net.piedpiper.bremer.entity + +import net.piedpiper.bremer.utils.sql.Column +import net.piedpiper.bremer.utils.sql.Table +import java.time.LocalDateTime + +@Table("audio") +data class AudioEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("slug") + var slug: String = "", + @property:Column("name") + var name: String = "", + @property:Column("album_id") + var albumId: Long = 0L, + @property:Column("sequence") + var sequence: Int = 0, + @property:Column("path") + var path: String = "", + // join + var album: AlbumEntity? = null, + var aliasNames: List? = null +) + +@Table("audio_name") +data class AudioNameEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("audio_id") + var audioId: Long = 0L, + @property:Column("name") + var name: String = "" +) + +@Table("album") +data class AlbumEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("artist_id") + var artistId: Long = 0L, + @property:Column("name") + var name: String = "", + // join + var artist: ArtistEntity? = null +) + +@Table("artist") +data class ArtistEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("name") + var name: String = "", +) + +@Table("audio_tag") +data class AudioTagEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("audio_id") + var audioId: Long = 0L, + @property:Column("tag_id") + var tagId: Long = 0L +) + +@Table("user") +data class UserEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("account_id") + var accountId: String = "", + @property:Column("secret") + var secret: String = "", +) + +@Table("audio_play_history") +data class AudioPlayHistoryEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("audio_id") + var audioId: Long = 0L, + @property:Column("last_played_at") + var lastPlayedAt: LocalDateTime = LocalDateTime.MIN +) + +@Table("playlist") +data class PlaylistEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("slug") + var slug: String = "", + @property:Column("name") + var name: String = "", + @property:Column("sequence") + var sequence: Int = 0, + // join + var playlistAudio: List = mutableListOf() +) + +@Table("playlist_audio") +data class PlaylistAudioEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("playlist_id") + var playlistId: Long = 0L, + @property:Column("sequence") + var sequence: Int = 0, + @property:Column("audio_id") + var audioId: Long = 0L +) + +@Table("tag") +data class TagEntity( + @property:Column("id", insertable = false, updatable = false) + var id: Long = 0L, + @property:Column("slug") + var slug: String = "", + @property:Column("name") + var name: String = "", +) diff --git a/src/main/kotlin/entity/Playlist.kt b/src/main/kotlin/entity/Playlist.kt deleted file mode 100644 index e9680a2..0000000 --- a/src/main/kotlin/entity/Playlist.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2023. yo-saito. All Rights Reserved. - */ - -package net.piedpiper.bremer.entity - -import net.piedpiper.bremer.utils.sql.Column -import net.piedpiper.bremer.utils.sql.Table - - -@Table("playlist") -data class PlaylistEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("slug") - var slug: String = "", - @property:Column("name") - var name: String = "", - // join - var playlistAudio: List = mutableListOf() -) - -@Table("playlist_audio") -data class PlaylistAudioEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("playlist_id") - var playlistId: Long = 0L, - @property:Column("sequence") - var sequence: Int = 0, - @property:Column("audio_id") - var audioId: Long = 0L -) diff --git a/src/main/kotlin/entity/User.kt b/src/main/kotlin/entity/User.kt deleted file mode 100644 index 90f2d5c..0000000 --- a/src/main/kotlin/entity/User.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2023. yo-saito. All Rights Reserved. - */ - -package net.piedpiper.bremer.entity - -import net.piedpiper.bremer.utils.sql.Column -import net.piedpiper.bremer.utils.sql.Table - -@Table("user") -data class UserEntity( - @property:Column("id", insertable = false, updatable = false) - var id: Long = 0L, - @property:Column("account_id") - var accountId: String = "", - @property:Column("secret") - var secret: String = "", -) \ No newline at end of file diff --git a/src/main/kotlin/model/BremerUser.kt b/src/main/kotlin/model/BremerUser.kt new file mode 100644 index 0000000..bb1da09 --- /dev/null +++ b/src/main/kotlin/model/BremerUser.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023. yo-saito. All Rights Reserved. + */ + +package net.piedpiper.bremer.model + +import net.piedpiper.bremer.entity.UserEntity +import org.springframework.security.core.GrantedAuthority +import org.springframework.security.core.userdetails.UserDetails + +class BremerUser( + private val user: UserEntity +) : UserDetails { + override fun getAuthorities(): MutableCollection = mutableListOf() + override fun getUsername(): String = user.accountId + override fun getPassword(): String = user.secret + override fun isAccountNonExpired(): Boolean = true + override fun isAccountNonLocked(): Boolean = true + override fun isCredentialsNonExpired(): Boolean = true + override fun isEnabled(): Boolean = true +} diff --git a/src/main/kotlin/model/api/Audio.kt b/src/main/kotlin/model/api/Audio.kt deleted file mode 100644 index 61171c8..0000000 --- a/src/main/kotlin/model/api/Audio.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2023. yo-saito. All Rights Reserved. - */ - -package net.piedpiper.bremer.model.api - -import net.piedpiper.bremer.entity.AudioEntity - -data class AudioListResponse( - private val entities: List -) { - val audio: List