From 86315c32f1321004f1aef76f4806000446b9000a Mon Sep 17 00:00:00 2001 From: Malgorzata Talaga Date: Thu, 8 Feb 2024 18:25:13 +0100 Subject: [PATCH 1/8] issue 58 - add get playlist songs endpoint --- .gitignore | 6 ++++++ .../akai/fillist/web/handlers/PlaylistHandler.kt | 7 ++++++- .../pl/akai/fillist/web/models/Playlist.kt | 2 ++ .../akai/fillist/web/routers/PlaylistRouter.kt | 1 + .../playlists/SpotifyPlaylistsService.kt | 7 +++++++ .../pl/akai/fillist/web/utils/PlaylistUtils.kt | 16 ++++++++++++++++ .../web/spotifywrapper/SpotifyPlaylistsTests.kt | 10 ++++++++++ 7 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 485dee6..09a129b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,7 @@ .idea + +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt b/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt index cba6304..83e32da 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt @@ -5,7 +5,6 @@ import org.springframework.stereotype.Component import org.springframework.web.reactive.function.server.ServerRequest import org.springframework.web.reactive.function.server.ServerResponse import org.springframework.web.reactive.function.server.body -import org.springframework.web.reactive.function.server.bodyToMono import pl.akai.fillist.web.spotifywrapper.playlists.SpotifyPlaylistsService import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyCreatePlaylistRequestBody import pl.akai.fillist.web.spotifywrapper.user.SpotifyUserService @@ -63,4 +62,10 @@ class PlaylistHandler( } return ServerResponse.ok().body(responseBody) } + + fun getPlaylistTracks(serverRequest: ServerRequest): Mono { + val playlistId = serverRequest.pathVariable("playlist-id") + val playlistTracks = spotifyPlaylistsService.getSpotifyPlaylistTracks(playlistId).flatMap(PlaylistUtils.toSpotifyPlaylistTracks) + return ServerResponse.ok().body(playlistTracks) + } } diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt b/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt index 7101ba2..e6d9418 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt @@ -11,3 +11,5 @@ data class Playlist( val description: String?, val public: Boolean, ) + + diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt b/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt index 9f08b87..51d5a16 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt @@ -14,5 +14,6 @@ class PlaylistRouter { POST("/playlists", playlistHandler::createPlaylist) GET("/playlists/{playlist-id}/details", playlistHandler::getPlaylistDetails) PUT("/playlists/{playlist-id}", playlistHandler::updatePlaylistDetails) + GET("/playlists/{playlistId}/tracks", playlistHandler::getPlaylistTracks) } } diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt index 69e26a6..86b3eaf 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service import org.springframework.web.reactive.function.client.WebClient import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyCreatePlaylistRequestBody import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylist +import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylistTracks import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylistsResponseBody import reactor.core.publisher.Mono @@ -36,4 +37,10 @@ class SpotifyPlaylistsService @Autowired constructor( .bodyToMono(SpotifyPlaylist::class.java) .then(getPlaylist(playlistId)) } + + fun getSpotifyPlaylistTracks(playlistId: String): Mono { + return spotifyClient.get().uri("/playlists/$playlistId/tracks").retrieve() + .bodyToMono(SpotifyPlaylistTracks::class.java) + } + } diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt index 1ac9a8c..8109b88 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt @@ -5,6 +5,7 @@ import pl.akai.fillist.web.models.PlaylistDetails import pl.akai.fillist.web.models.PlaylistsResponseBody import pl.akai.fillist.web.spotifywrapper.models.OwnerDetails import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylist +import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylistTracks import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylistsResponseBody import reactor.core.publisher.Mono @@ -69,4 +70,19 @@ object PlaylistUtils { } return name } + + val toSpotifyPlaylistTracks: (SpotifyPlaylistTracks) -> Mono = { spotifyPlaylistTracks -> + Mono.just(spotifyPlaylistTracks). + map { + SpotifyPlaylistTracks ( + href = spotifyPlaylistTracks.href, + limit = spotifyPlaylistTracks.limit, + next = spotifyPlaylistTracks.next, + offset = spotifyPlaylistTracks.offset, + previous = spotifyPlaylistTracks.previous, + total = spotifyPlaylistTracks.total, + items = spotifyPlaylistTracks.items + ) + } + } } diff --git a/backend/src/test/kotlin/pl/akai/fillist/web/spotifywrapper/SpotifyPlaylistsTests.kt b/backend/src/test/kotlin/pl/akai/fillist/web/spotifywrapper/SpotifyPlaylistsTests.kt index da8beb2..60ac3d2 100644 --- a/backend/src/test/kotlin/pl/akai/fillist/web/spotifywrapper/SpotifyPlaylistsTests.kt +++ b/backend/src/test/kotlin/pl/akai/fillist/web/spotifywrapper/SpotifyPlaylistsTests.kt @@ -85,4 +85,14 @@ class SpotifyPlaylistsTests { assertEquals(updatedPlaylistBody.name, updatedPlaylist.name) assertEquals(updatedPlaylistBody.public, updatedPlaylist.public) } + + @Test + fun getPlaylistTracks() { + val playlistId = "3cEYpjA9oz9GiPac4AsH4n" + val playlistTracks = spotifyPlaylistsService.getSpotifyPlaylistTracks(playlistId).block()!! + assertNotNull(playlistTracks.href) + assertNotNull(playlistTracks.limit) + assertNotNull(playlistTracks.items) + assertNotNull(playlistTracks.total) + } } From b6f1813b0e71dc6ec1cb12d2d95fd1951502b99f Mon Sep 17 00:00:00 2001 From: Malgorzata Talaga Date: Mon, 4 Mar 2024 14:14:05 +0100 Subject: [PATCH 2/8] issue 58 - add get playlist songs endpoint --- .../akai/fillist/web/utils/PlaylistUtils.kt | 21 ++++++++++--------- .../web/playlists/PlaylistsRouterTests.kt | 9 ++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt index 8109b88..a3bff8f 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt @@ -2,6 +2,7 @@ package pl.akai.fillist.web.utils import pl.akai.fillist.web.models.Playlist import pl.akai.fillist.web.models.PlaylistDetails +import pl.akai.fillist.web.models.PlaylistTracks import pl.akai.fillist.web.models.PlaylistsResponseBody import pl.akai.fillist.web.spotifywrapper.models.OwnerDetails import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylist @@ -71,17 +72,17 @@ object PlaylistUtils { return name } - val toSpotifyPlaylistTracks: (SpotifyPlaylistTracks) -> Mono = { spotifyPlaylistTracks -> - Mono.just(spotifyPlaylistTracks). + val toSpotifyPlaylistTracks: (SpotifyPlaylistTracks) -> Mono = { playlistTracks -> + Mono.just(playlistTracks). map { - SpotifyPlaylistTracks ( - href = spotifyPlaylistTracks.href, - limit = spotifyPlaylistTracks.limit, - next = spotifyPlaylistTracks.next, - offset = spotifyPlaylistTracks.offset, - previous = spotifyPlaylistTracks.previous, - total = spotifyPlaylistTracks.total, - items = spotifyPlaylistTracks.items + PlaylistTracks ( + href = playlistTracks.href, + limit = playlistTracks.limit, + next = playlistTracks.next, + offset = playlistTracks.offset, + previous = playlistTracks.previous, + total = playlistTracks.total, + items = playlistTracks.items ) } } diff --git a/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt b/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt index ce0df79..bf30c9c 100644 --- a/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt +++ b/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt @@ -19,6 +19,7 @@ import pl.akai.fillist.configurations.SpotifyClientConfig import pl.akai.fillist.configurations.WebTestClientConfig import pl.akai.fillist.web.models.Playlist import pl.akai.fillist.web.models.PlaylistDetails +import pl.akai.fillist.web.models.PlaylistTracks import pl.akai.fillist.web.models.PlaylistsResponseBody import pl.akai.fillist.web.spotifywrapper.models.ExternalUrls import pl.akai.fillist.web.spotifywrapper.models.Image @@ -197,4 +198,12 @@ class PlaylistsRouterTests { assertEquals(it.public, updatePlaylistRequestBody.public) } } + + @Test + fun getPlaylistTracks() { + webTestClient.get().uri("/playlists/37i9dQZF1EIUFF8VNSAZXh/tracks").exchange() + .expectStatus().isOk.expectBody(PlaylistTracks::class.java).value{ + assertNotNull(it.items); + } + } } From 1fcdc8de9142391cfe49cbba528074ef755b48eb Mon Sep 17 00:00:00 2001 From: Malgorzata Talaga Date: Mon, 4 Mar 2024 14:17:15 +0100 Subject: [PATCH 3/8] issue 58 - add get playlist songs endpoint --- .../playlists/models/SpotifyPlaylistTracks.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt new file mode 100644 index 0000000..5a0a321 --- /dev/null +++ b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt @@ -0,0 +1,15 @@ +package pl.akai.fillist.web.spotifywrapper.playlists.models + +import kotlinx.serialization.Serializable +import pl.akai.fillist.web.spotifywrapper.models.Track + +@Serializable +data class SpotifyPlaylistTracks( + val href: String, + val limit: Int, + val next: String?, + val offset: Int, + val previous: String?, + val total: Int, + val items: List +) From b73f52a6018e5761fd36a015f49403ef5eddaaab Mon Sep 17 00:00:00 2001 From: Malgorzata Talaga Date: Mon, 4 Mar 2024 14:33:03 +0100 Subject: [PATCH 4/8] issue 58 - add get playlist songs endpoint --- .../pl/akai/fillist/web/models/PlaylistTracks.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt b/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt new file mode 100644 index 0000000..8f42731 --- /dev/null +++ b/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt @@ -0,0 +1,15 @@ +package pl.akai.fillist.web.models + +import kotlinx.serialization.Serializable +import pl.akai.fillist.web.spotifywrapper.models.Track + +@Serializable +data class PlaylistTracks ( + val href: String, + val limit: Int, + val next: String?, + val offset: Int, + val previous: String?, + val total: Int, + val items: List +) From 5ee72168d4327a62e9f194109bb902f1a0d3f226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kar=C5=82owski?= Date: Mon, 4 Mar 2024 22:50:54 +0100 Subject: [PATCH 5/8] some fixes --- .../kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt | 2 +- .../playlists/models/SpotifyPlaylistTracks.kt | 8 +++++++- .../kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt | 2 +- .../pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt b/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt index a486b33..e757918 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/routers/PlaylistRouter.kt @@ -15,6 +15,6 @@ class PlaylistRouter { GET("/playlists/name", playlistHandler::getCurrentPlaylistsByName) GET("/playlists/{playlist-id}/details", playlistHandler::getPlaylistDetails) PUT("/playlists/{playlist-id}", playlistHandler::updatePlaylistDetails) - GET("/playlists/{playlistId}/tracks", playlistHandler::getPlaylistTracks) + GET("/playlists/{playlist-id}/tracks", playlistHandler::getPlaylistTracks) } } diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt index 5a0a321..0a81038 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt @@ -3,6 +3,12 @@ package pl.akai.fillist.web.spotifywrapper.playlists.models import kotlinx.serialization.Serializable import pl.akai.fillist.web.spotifywrapper.models.Track + +@Serializable +data class SpotifyTrackWrapper( + val track: Track +) + @Serializable data class SpotifyPlaylistTracks( val href: String, @@ -11,5 +17,5 @@ data class SpotifyPlaylistTracks( val offset: Int, val previous: String?, val total: Int, - val items: List + val items: List ) diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt index a3bff8f..74e5f59 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt @@ -82,7 +82,7 @@ object PlaylistUtils { offset = playlistTracks.offset, previous = playlistTracks.previous, total = playlistTracks.total, - items = playlistTracks.items + items = playlistTracks.items.map { it.track } ) } } diff --git a/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt b/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt index bf30c9c..ec41c93 100644 --- a/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt +++ b/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt @@ -201,7 +201,7 @@ class PlaylistsRouterTests { @Test fun getPlaylistTracks() { - webTestClient.get().uri("/playlists/37i9dQZF1EIUFF8VNSAZXh/tracks").exchange() + webTestClient.get().uri("/playlists/1WiIsyGhDQ0ZAD4vnEjOm3/tracks").exchange() .expectStatus().isOk.expectBody(PlaylistTracks::class.java).value{ assertNotNull(it.items); } From 32c3f7bab3a70cd4432c017e79b761ad0fa1c6b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kar=C5=82owski?= Date: Wed, 6 Mar 2024 19:01:56 +0100 Subject: [PATCH 6/8] Ktlint format --- .../fillist/web/handlers/PlaylistHandler.kt | 76 +++++++++---------- .../pl/akai/fillist/web/models/Playlist.kt | 2 - .../akai/fillist/web/models/PlaylistTracks.kt | 4 +- .../playlists/SpotifyPlaylistsService.kt | 3 - .../playlists/models/SpotifyPlaylistTracks.kt | 5 +- .../akai/fillist/web/utils/PlaylistUtils.kt | 8 +- 6 files changed, 46 insertions(+), 52 deletions(-) diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt b/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt index 0eb082d..e0b7678 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/handlers/PlaylistHandler.kt @@ -14,29 +14,29 @@ import reactor.core.publisher.Mono @Component class PlaylistHandler( - private val spotifyPlaylistsService: SpotifyPlaylistsService, - private val spotifyUserService: SpotifyUserService, + private val spotifyPlaylistsService: SpotifyPlaylistsService, + private val spotifyUserService: SpotifyUserService, ) { fun getCurrentPlaylists(serverRequest: ServerRequest): Mono { val limit = serverRequest.queryParam("limit").orElse("20").toInt() val offset = serverRequest.queryParam("offset").orElse("0").toInt() val body = - spotifyPlaylistsService - .getCurrentPlaylists(offset, limit) - .flatMap(PlaylistUtils.toPlaylists) + spotifyPlaylistsService + .getCurrentPlaylists(offset, limit) + .flatMap(PlaylistUtils.toPlaylists) return ServerResponse.ok().body(body) } fun createPlaylist(serverRequest: ServerRequest): Mono { val requestBody = serverRequest.bodyToMono(SpotifyCreatePlaylistRequestBody::class.java) val userId = - ReactiveSecurityContextHolder.getContext().map { - it.authentication.principal.toString() - } + ReactiveSecurityContextHolder.getContext().map { + it.authentication.principal.toString() + } val responseBody = - Mono.zip(requestBody, userId) - .flatMap { spotifyPlaylistsService.createPlaylist(it.t2, it.t1) } - .map { PlaylistUtils.toPlaylist(it) } + Mono.zip(requestBody, userId) + .flatMap { spotifyPlaylistsService.createPlaylist(it.t2, it.t1) } + .map { PlaylistUtils.toPlaylist(it) } return ServerResponse.ok().body(responseBody) } @@ -44,35 +44,35 @@ class PlaylistHandler( val name = serverRequest.queryParam("name").orElse("") val body = - spotifyPlaylistsService - .getCurrentPlaylists(limit = 999) - .map { it -> - SpotifyPlaylistsResponseBody( - it.total, - it.limit, - it.offset, - it.items.filter { it.name.matches(name.toSearchableRegex()) }, - ) - } - .flatMap(PlaylistUtils.toPlaylists) + spotifyPlaylistsService + .getCurrentPlaylists(limit = 999) + .map { it -> + SpotifyPlaylistsResponseBody( + it.total, + it.limit, + it.offset, + it.items.filter { it.name.matches(name.toSearchableRegex()) }, + ) + } + .flatMap(PlaylistUtils.toPlaylists) return ServerResponse.ok().body(body) } fun getPlaylistDetails(serverRequest: ServerRequest): Mono { val playlistId = serverRequest.pathVariable("playlist-id") val playlistDetails = - spotifyPlaylistsService - .getPlaylist(playlistId) - .flatMap(PlaylistUtils.toPlaylistDetails) + spotifyPlaylistsService + .getPlaylist(playlistId) + .flatMap(PlaylistUtils.toPlaylistDetails) val userDetails = - playlistDetails.flatMap { spotifyUserService.getExternalUserProfile(it.owner.id) } + playlistDetails.flatMap { spotifyUserService.getExternalUserProfile(it.owner.id) } return playlistDetails.zipWith(userDetails).flatMap { val picture = - if (it.t2.images.isNotEmpty()) { - it.t2.images[0].url - } else { - null - } + if (it.t2.images.isNotEmpty()) { + it.t2.images[0].url + } else { + null + } it.t1.owner.picture = picture ServerResponse.ok().body(Mono.just(it.t1)) } @@ -82,18 +82,18 @@ class PlaylistHandler( val playlistId = serverRequest.pathVariable("playlist-id") val requestBody = serverRequest.bodyToMono(SpotifyCreatePlaylistRequestBody::class.java) val responseBody = - Mono.zip(requestBody, Mono.just(playlistId)) - .flatMap { spotifyPlaylistsService.updatePlaylistDetails(it.t2, it.t1) } - .map { PlaylistUtils.toPlaylist(it) } + Mono.zip(requestBody, Mono.just(playlistId)) + .flatMap { spotifyPlaylistsService.updatePlaylistDetails(it.t2, it.t1) } + .map { PlaylistUtils.toPlaylist(it) } return ServerResponse.ok().body(responseBody) } fun getPlaylistTracks(serverRequest: ServerRequest): Mono { val playlistId = serverRequest.pathVariable("playlist-id") val playlistTracks = - spotifyPlaylistsService - .getSpotifyPlaylistTracks(playlistId) - .flatMap(PlaylistUtils.toSpotifyPlaylistTracks) + spotifyPlaylistsService + .getSpotifyPlaylistTracks(playlistId) + .flatMap(PlaylistUtils.toSpotifyPlaylistTracks) return ServerResponse.ok().body(playlistTracks) } fun changePlaylistCover(serverRequest: ServerRequest): Mono { @@ -101,7 +101,7 @@ class PlaylistHandler( val requestBody = serverRequest.bodyToMono(String::class.java) val operation = - requestBody.flatMap { spotifyPlaylistsService.changePlaylistCover(playlistId, it) } + requestBody.flatMap { spotifyPlaylistsService.changePlaylistCover(playlistId, it) } return operation.then(ServerResponse.ok().build()) } } diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt b/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt index e6d9418..7101ba2 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/models/Playlist.kt @@ -11,5 +11,3 @@ data class Playlist( val description: String?, val public: Boolean, ) - - diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt b/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt index 8f42731..27d4b7a 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/models/PlaylistTracks.kt @@ -4,12 +4,12 @@ import kotlinx.serialization.Serializable import pl.akai.fillist.web.spotifywrapper.models.Track @Serializable -data class PlaylistTracks ( +data class PlaylistTracks( val href: String, val limit: Int, val next: String?, val offset: Int, val previous: String?, val total: Int, - val items: List + val items: List, ) diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt index 8ddeed5..1995bad 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/SpotifyPlaylistsService.kt @@ -38,13 +38,11 @@ class SpotifyPlaylistsService @Autowired constructor( .then(getPlaylist(playlistId)) } -<<<<<<< HEAD fun getSpotifyPlaylistTracks(playlistId: String): Mono { return spotifyClient.get().uri("/playlists/$playlistId/tracks").retrieve() .bodyToMono(SpotifyPlaylistTracks::class.java) } -======= fun changePlaylistCover(playlistId: String, imageData: String): Mono { return spotifyClient.put().uri("/playlists/$playlistId/images") .bodyValue(imageData) @@ -52,5 +50,4 @@ class SpotifyPlaylistsService @Autowired constructor( .toBodilessEntity() .then() } ->>>>>>> main } diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt index 0a81038..da79721 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/spotifywrapper/playlists/models/SpotifyPlaylistTracks.kt @@ -3,10 +3,9 @@ package pl.akai.fillist.web.spotifywrapper.playlists.models import kotlinx.serialization.Serializable import pl.akai.fillist.web.spotifywrapper.models.Track - @Serializable data class SpotifyTrackWrapper( - val track: Track + val track: Track, ) @Serializable @@ -17,5 +16,5 @@ data class SpotifyPlaylistTracks( val offset: Int, val previous: String?, val total: Int, - val items: List + val items: List, ) diff --git a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt index 1b8f458..5aed6be 100644 --- a/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt +++ b/backend/src/main/kotlin/pl/akai/fillist/web/utils/PlaylistUtils.kt @@ -73,16 +73,16 @@ object PlaylistUtils { } val toSpotifyPlaylistTracks: (SpotifyPlaylistTracks) -> Mono = { playlistTracks -> - Mono.just(playlistTracks). - map { - PlaylistTracks ( + Mono.just(playlistTracks) + .map { + PlaylistTracks( href = playlistTracks.href, limit = playlistTracks.limit, next = playlistTracks.next, offset = playlistTracks.offset, previous = playlistTracks.previous, total = playlistTracks.total, - items = playlistTracks.items.map { it.track } + items = playlistTracks.items.map { it.track }, ) } } From 699df0aa1c89f403c6b5bb7f8e4eb9c9906762b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kar=C5=82owski?= Date: Wed, 6 Mar 2024 19:02:17 +0100 Subject: [PATCH 7/8] Add mock to test getPlaylistTracks --- .../web/playlists/PlaylistsRouterTests.kt | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt b/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt index e06257f..0152b9a 100644 --- a/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt +++ b/backend/src/test/kotlin/pl/akai/fillist/web/playlists/PlaylistsRouterTests.kt @@ -21,13 +21,9 @@ import pl.akai.fillist.web.models.Playlist import pl.akai.fillist.web.models.PlaylistDetails import pl.akai.fillist.web.models.PlaylistTracks import pl.akai.fillist.web.models.PlaylistsResponseBody -import pl.akai.fillist.web.spotifywrapper.models.ExternalUrls -import pl.akai.fillist.web.spotifywrapper.models.Image -import pl.akai.fillist.web.spotifywrapper.models.Owner +import pl.akai.fillist.web.spotifywrapper.models.* import pl.akai.fillist.web.spotifywrapper.playlists.SpotifyPlaylistsService -import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyCreatePlaylistRequestBody -import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylist -import pl.akai.fillist.web.spotifywrapper.playlists.models.SpotifyPlaylistsResponseBody +import pl.akai.fillist.web.spotifywrapper.playlists.models.* import reactor.core.publisher.Mono @SpringBootTest() @@ -202,9 +198,44 @@ class PlaylistsRouterTests { @Test fun getPlaylistTracks() { + `when`(playlistsService.getSpotifyPlaylistTracks(anyOrNull())).thenReturn( + Mono.just( + SpotifyPlaylistTracks( + href = "href", + limit = 1, + offset = 0, + total = 1, + next = "", + previous = "", + items = listOf( + SpotifyTrackWrapper( + track = Track( + id = "1WiIsyGhDQ0ZAD4vnEjOm3", + name = "name", + uri = "uri", + album = Album( + id = "id", + name = "name", + artists = listOf(), + href = "", + uri = "", + ), + artists = listOf(), + ), + ), + ), + ), + ), + ) webTestClient.get().uri("/playlists/1WiIsyGhDQ0ZAD4vnEjOm3/tracks").exchange() - .expectStatus().isOk.expectBody(PlaylistTracks::class.java).value{ - assertNotNull(it.items); + .expectStatus().isOk.expectBody(PlaylistTracks::class.java).value { + assertNotNull(it.items) + assertEquals(it.items.size, 1) + assertEquals(it.items[0].id, "1WiIsyGhDQ0ZAD4vnEjOm3") + assertEquals(it.items[0].name, "name") + assertEquals(it.items[0].uri, "uri") + assertEquals(it.items[0].album.name, "name") + assertEquals(it.items[0].album.id, "id") } } From c8a6ce59e2245a855d35aef1a715807a5512443a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kar=C5=82owski?= Date: Thu, 7 Mar 2024 13:36:09 +0100 Subject: [PATCH 8/8] Bump github actions versions --- .github/workflows/backend-ci.yml | 10 +++++----- .github/workflows/frontend-cd.yml | 8 ++++---- .github/workflows/frontend-ci.yml | 18 +++++++++--------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index c405b8b..8633f45 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -13,9 +13,9 @@ jobs: run: working-directory: backend steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' @@ -33,9 +33,9 @@ jobs: run: working-directory: backend steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' @@ -44,7 +44,7 @@ jobs: run: gradle ktlintScanning - name: Upload analysis results to GitHub if: always() - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v3 with: sarif_file: backend/report.sarif wait-for-processing: true diff --git a/.github/workflows/frontend-cd.yml b/.github/workflows/frontend-cd.yml index 6223ddd..b685909 100644 --- a/.github/workflows/frontend-cd.yml +++ b/.github/workflows/frontend-cd.yml @@ -15,11 +15,11 @@ jobs: security-events: write actions: write steps: - - uses: actions/checkout@v3 - - name: Use Node.js 18.x - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - name: Use Node.js 20.x + uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20.x cache: 'yarn' cache-dependency-path: 'frontend/yarn.lock' - name: Install dependencies diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml index 7c555ee..17c6203 100644 --- a/.github/workflows/frontend-ci.yml +++ b/.github/workflows/frontend-ci.yml @@ -13,11 +13,11 @@ jobs: run: working-directory: frontend steps: - - uses: actions/checkout@v3 - - name: Use Node.js 18.x - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - name: Use Node.js 20.x + uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20.x cache: 'yarn' cache-dependency-path: 'frontend/yarn.lock' - name: Install dependencies @@ -32,11 +32,11 @@ jobs: run: working-directory: frontend steps: - - uses: actions/checkout@v3 - - name: Use Node.js 18.x - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - name: Use Node.js 20.x + uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20.x cache: 'yarn' cache-dependency-path: 'frontend/yarn.lock' - name: Install dependencies @@ -51,7 +51,7 @@ jobs: --ignore-path .gitignore continue-on-error: true - name: Upload analysis results to GitHub - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v3 with: sarif_file: frontend/eslint-results.sarif wait-for-processing: true