Skip to content

Commit 6d4e9d5

Browse files
committed
refractor paging objects into their own utility file
fix paging object iteration Signed-off-by: Adam Ratzman <adam@adamratzman.com>
1 parent 4ccbbd9 commit 6d4e9d5

File tree

15 files changed

+83
-55
lines changed

15 files changed

+83
-55
lines changed

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientFollowingAPI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.adamratzman.spotify.endpoints.public.FollowingAPI
55
import com.adamratzman.spotify.main.SpotifyAPI
66
import com.adamratzman.spotify.main.SpotifyClientAPI
77
import com.adamratzman.spotify.main.SpotifyRestAction
8+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
89
import com.adamratzman.spotify.utils.Artist
910
import com.adamratzman.spotify.utils.ArtistURI
1011
import com.adamratzman.spotify.utils.CursorBasedPagingObject
@@ -108,8 +109,8 @@ class ClientFollowingAPI(api: SpotifyAPI) : FollowingAPI(api) {
108109
fun getFollowedArtists(
109110
limit: Int? = null,
110111
after: String? = null
111-
): SpotifyRestAction<CursorBasedPagingObject<Artist>> {
112-
return toAction(Supplier {
112+
): SpotifyRestActionPaging<Artist,CursorBasedPagingObject<Artist>> {
113+
return toActionPaging(Supplier {
113114
get(
114115
EndpointBuilder("/me/following").with("type", "artist").with("limit", limit).with(
115116
"after",

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientLibraryAPI.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.adamratzman.spotify.endpoints.client
33

44
import com.adamratzman.spotify.main.SpotifyAPI
55
import com.adamratzman.spotify.main.SpotifyRestAction
6+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
67
import com.adamratzman.spotify.utils.AlbumURI
78
import com.adamratzman.spotify.utils.EndpointBuilder
89
import com.adamratzman.spotify.utils.Market
@@ -29,8 +30,8 @@ class ClientLibraryAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
2930
limit: Int? = null,
3031
offset: Int? = null,
3132
market: Market? = null
32-
): SpotifyRestAction<PagingObject<SavedTrack>> {
33-
return toAction(Supplier {
33+
): SpotifyRestActionPaging<SavedTrack,PagingObject<SavedTrack>> {
34+
return toActionPaging(Supplier {
3435
get(
3536
EndpointBuilder("/me/tracks").with("limit", limit).with("offset", offset).with("market", market?.code)
3637
.toString()
@@ -47,8 +48,8 @@ class ClientLibraryAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
4748
limit: Int? = null,
4849
offset: Int? = null,
4950
market: Market? = null
50-
): SpotifyRestAction<PagingObject<SavedAlbum>> {
51-
return toAction(Supplier {
51+
): SpotifyRestActionPaging<SavedAlbum,PagingObject<SavedAlbum>> {
52+
return toActionPaging(Supplier {
5253
get(
5354
EndpointBuilder("/me/albums").with("limit", limit).with("offset", offset).with("market", market?.code)
5455
.toString()

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientPersonalizationAPI.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package com.adamratzman.spotify.endpoints.client
33

44
import com.adamratzman.spotify.main.SpotifyAPI
5-
import com.adamratzman.spotify.main.SpotifyRestAction
5+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
66
import com.adamratzman.spotify.utils.Artist
77
import com.adamratzman.spotify.utils.EndpointBuilder
88
import com.adamratzman.spotify.utils.PagingObject
@@ -37,8 +37,8 @@ class ClientPersonalizationAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
3737
limit: Int? = null,
3838
offset: Int? = null,
3939
timeRange: TimeRange? = null
40-
): SpotifyRestAction<PagingObject<Artist>> {
41-
return toAction(Supplier {
40+
): SpotifyRestActionPaging<Artist, PagingObject<Artist>> {
41+
return toActionPaging(Supplier {
4242
get(
4343
EndpointBuilder("/me/top/artists").with("limit", limit).with("offset", offset)
4444
.with("time_range", timeRange).toString()
@@ -63,8 +63,8 @@ class ClientPersonalizationAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
6363
limit: Int? = null,
6464
offset: Int? = null,
6565
timeRange: TimeRange? = null
66-
): SpotifyRestAction<PagingObject<Track>> {
67-
return toAction(Supplier {
66+
): SpotifyRestActionPaging<Track,PagingObject<Track>> {
67+
return toActionPaging(Supplier {
6868
get(
6969
EndpointBuilder("/me/top/tracks").with("limit", limit).with("offset", offset)
7070
.with("time_range", timeRange).toString()

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientPlayerAPI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.adamratzman.spotify.endpoints.client
33

44
import com.adamratzman.spotify.main.SpotifyAPI
55
import com.adamratzman.spotify.main.SpotifyRestAction
6+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
67
import com.adamratzman.spotify.utils.AlbumURI
78
import com.adamratzman.spotify.utils.ArtistURI
89
import com.adamratzman.spotify.utils.BadRequestException
@@ -46,8 +47,8 @@ class ClientPlayerAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
4647
})
4748
}
4849

49-
fun getRecentlyPlayed(): SpotifyRestAction<CursorBasedPagingObject<PlayHistory>> {
50-
return toAction(Supplier {
50+
fun getRecentlyPlayed(): SpotifyRestActionPaging<PlayHistory,CursorBasedPagingObject<PlayHistory>> {
51+
return toActionPaging(Supplier {
5152
get(EndpointBuilder("/me/player/recently-played").toString()).toCursorBasedPagingObject<PlayHistory>(
5253
endpoint = this
5354
)

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientPlaylistAPI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.adamratzman.spotify.endpoints.public.PlaylistsAPI
55
import com.adamratzman.spotify.main.SpotifyAPI
66
import com.adamratzman.spotify.main.SpotifyClientAPI
77
import com.adamratzman.spotify.main.SpotifyRestAction
8+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
89
import com.adamratzman.spotify.utils.BadRequestException
910
import com.adamratzman.spotify.utils.EndpointBuilder
1011
import com.adamratzman.spotify.utils.ErrorObject
@@ -129,10 +130,10 @@ class ClientPlaylistAPI(api: SpotifyAPI) : PlaylistsAPI(api) {
129130
fun getClientPlaylists(
130131
limit: Int? = null,
131132
offset: Int? = null
132-
): SpotifyRestAction<PagingObject<SimplePlaylist>> {
133+
): SpotifyRestActionPaging<SimplePlaylist,PagingObject<SimplePlaylist>> {
133134
if (limit != null && limit !in 1..50) throw IllegalArgumentException("Limit must be between 1 and 50. Provided $limit")
134135
if (offset != null && offset !in 0..100000) throw IllegalArgumentException("Offset must be between 0 and 100,000. Provided $limit")
135-
return toAction(Supplier {
136+
return toActionPaging(Supplier {
136137
get(EndpointBuilder("/me/playlists").with("limit", limit).with("offset", offset).toString())
137138
.toPagingObject<SimplePlaylist>(endpoint = this)
138139
})

src/main/kotlin/com/adamratzman/spotify/endpoints/public/AlbumAPI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.adamratzman.spotify.endpoints.public
33

44
import com.adamratzman.spotify.main.SpotifyAPI
55
import com.adamratzman.spotify.main.SpotifyRestAction
6+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
67
import com.adamratzman.spotify.utils.Album
78
import com.adamratzman.spotify.utils.AlbumURI
89
import com.adamratzman.spotify.utils.AlbumsResponse
@@ -66,8 +67,8 @@ class AlbumAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
6667
limit: Int? = null,
6768
offset: Int? = null,
6869
market: Market? = null
69-
): SpotifyRestAction<PagingObject<SimpleTrack>> {
70-
return toAction(Supplier {
70+
): SpotifyRestActionPaging<SimpleTrack, PagingObject<SimpleTrack>> {
71+
return toActionPaging(Supplier {
7172
get(
7273
EndpointBuilder("/albums/${AlbumURI(album).id.encode()}/tracks").with("limit", limit).with(
7374
"offset",

src/main/kotlin/com/adamratzman/spotify/endpoints/public/BrowseAPI.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.adamratzman.spotify.endpoints.public
33

44
import com.adamratzman.spotify.main.SpotifyAPI
55
import com.adamratzman.spotify.main.SpotifyRestAction
6+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
67
import com.adamratzman.spotify.utils.ArtistURI
78
import com.adamratzman.spotify.utils.BadRequestException
89
import com.adamratzman.spotify.utils.EndpointBuilder
@@ -59,8 +60,8 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5960
limit: Int? = null,
6061
offset: Int? = null,
6162
market: Market? = null
62-
): SpotifyRestAction<PagingObject<SimpleAlbum>> {
63-
return toAction(Supplier {
63+
): SpotifyRestActionPaging<SimpleAlbum,PagingObject<SimpleAlbum>> {
64+
return toActionPaging(Supplier {
6465
get(
6566
EndpointBuilder("/browse/new-releases").with("limit", limit).with("offset", offset).with(
6667
"country",
@@ -129,8 +130,8 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
129130
offset: Int? = null,
130131
locale: String? = null,
131132
market: Market? = null
132-
): SpotifyRestAction<PagingObject<SpotifyCategory>> {
133-
return toAction(Supplier {
133+
): SpotifyRestActionPaging<SpotifyCategory,PagingObject<SpotifyCategory>> {
134+
return toActionPaging(Supplier {
134135
get(
135136
EndpointBuilder("/browse/categories").with("limit", limit).with("offset", offset).with(
136137
"market",
@@ -184,8 +185,8 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
184185
limit: Int? = null,
185186
offset: Int? = null,
186187
market: Market? = null
187-
): SpotifyRestAction<PagingObject<SimplePlaylist>> {
188-
return toAction(Supplier {
188+
): SpotifyRestActionPaging<SimplePlaylist,PagingObject<SimplePlaylist>> {
189+
return toActionPaging(Supplier {
189190
get(
190191
EndpointBuilder("/browse/categories/${categoryId.encode()}/playlists").with(
191192
"limit",

src/main/kotlin/com/adamratzman/spotify/endpoints/public/PlaylistsAPI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.adamratzman.spotify.endpoints.public
33

44
import com.adamratzman.spotify.main.SpotifyAPI
55
import com.adamratzman.spotify.main.SpotifyRestAction
6+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
67
import com.adamratzman.spotify.utils.BadRequestException
78
import com.adamratzman.spotify.utils.EndpointBuilder
89
import com.adamratzman.spotify.utils.LinkedResult
@@ -43,8 +44,8 @@ open class PlaylistsAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
4344
user: String,
4445
limit: Int? = null,
4546
offset: Int? = null
46-
): SpotifyRestAction<PagingObject<SimplePlaylist>> {
47-
return toAction(Supplier {
47+
): SpotifyRestActionPaging<SimplePlaylist,PagingObject<SimplePlaylist>> {
48+
return toActionPaging(Supplier {
4849
get(
4950
EndpointBuilder("/users/${UserURI(user).id.encode()}/playlists").with("limit", limit).with(
5051
"offset", offset

src/main/kotlin/com/adamratzman/spotify/endpoints/public/SearchAPI.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package com.adamratzman.spotify.endpoints.public
33

44
import com.adamratzman.spotify.main.SpotifyAPI
5-
import com.adamratzman.spotify.main.SpotifyRestAction
5+
import com.adamratzman.spotify.main.SpotifyRestActionPaging
66
import com.adamratzman.spotify.utils.Artist
77
import com.adamratzman.spotify.utils.BadRequestException
88
import com.adamratzman.spotify.utils.EndpointBuilder
@@ -43,8 +43,8 @@ class SearchAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
4343
limit: Int? = null,
4444
offset: Int? = null,
4545
market: Market? = null
46-
): SpotifyRestAction<PagingObject<SimplePlaylist>> {
47-
return toAction(Supplier {
46+
): SpotifyRestActionPaging<SimplePlaylist, PagingObject<SimplePlaylist>> {
47+
return toActionPaging(Supplier {
4848
get(build(SearchType.PLAYLIST, query, limit, offset, market)).toPagingObject<SimplePlaylist>(
4949
"playlists", this
5050
)
@@ -68,8 +68,8 @@ class SearchAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
6868
limit: Int? = null,
6969
offset: Int? = null,
7070
market: Market? = null
71-
): SpotifyRestAction<PagingObject<Artist>> {
72-
return toAction(Supplier {
71+
): SpotifyRestActionPaging<Artist, PagingObject<Artist>> {
72+
return toActionPaging(Supplier {
7373
get(build(SearchType.ARTIST, query, limit, offset, market)).toPagingObject<Artist>(
7474
"artists", this
7575
)
@@ -93,8 +93,8 @@ class SearchAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
9393
limit: Int? = null,
9494
offset: Int? = null,
9595
market: Market? = null
96-
): SpotifyRestAction<PagingObject<SimpleAlbum>> {
97-
return toAction(Supplier {
96+
): SpotifyRestActionPaging<SimpleAlbum, PagingObject<SimpleAlbum>> {
97+
return toActionPaging(Supplier {
9898
get(build(SearchType.ALBUM, query, limit, offset, market)).toPagingObject<SimpleAlbum>(
9999
"albums", this
100100
)
@@ -118,8 +118,8 @@ class SearchAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
118118
limit: Int? = null,
119119
offset: Int? = null,
120120
market: Market? = null
121-
): SpotifyRestAction<PagingObject<Track>> {
122-
return toAction(Supplier {
121+
): SpotifyRestActionPaging<Track, PagingObject<Track>> {
122+
return toActionPaging(Supplier {
123123
get(build(SearchType.TRACK, query, limit, offset, market)).toPagingObject<Track>(
124124
"tracks", this
125125
)

src/main/kotlin/com/adamratzman/spotify/main/SpotifyRestAction.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22
package com.adamratzman.spotify.main
33

44
import com.adamratzman.spotify.utils.AbstractPagingObject
5-
import com.adamratzman.spotify.utils.PagingObject
65
import java.util.concurrent.CompletableFuture
76
import java.util.concurrent.TimeUnit
87
import java.util.function.Supplier
98

10-
class SpotifyRestAction<T>(private val api: SpotifyAPI, private val supplier: Supplier<T>) {
9+
open class SpotifyRestAction<T>(protected val api: SpotifyAPI, private val supplier: Supplier<T>) {
1110
fun complete(): T {
1211
return try {
1312
supplier.get()
@@ -41,4 +40,10 @@ class SpotifyRestAction<T>(private val api: SpotifyAPI, private val supplier: Su
4140
}
4241

4342
override fun toString() = complete().toString()
43+
}
44+
45+
class SpotifyRestActionPaging<Z, T:AbstractPagingObject<Z>>(api: SpotifyAPI, supplier: Supplier<T>) :
46+
SpotifyRestAction<T>(api, supplier) {
47+
fun getAll() = api.tracks.toAction(Supplier { complete().getAllImpl() })
48+
fun getAllItems() = api.tracks.toAction(Supplier { complete().getAllImpl().toList().map { it.items }.flatten() })
4449
}

0 commit comments

Comments
 (0)