Skip to content

Commit b2af11f

Browse files
committed
feat: create ArtistRequestFactory
1 parent fe5af10 commit b2af11f

8 files changed

Lines changed: 135 additions & 30 deletions

File tree

src/main/java/io/github/yvasyliev/deezer/factory/AlbumRequestFactory.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import io.github.yvasyliev.deezer.model.Album;
44
import io.github.yvasyliev.deezer.model.Track;
55
import io.github.yvasyliev.deezer.model.User;
6-
import io.github.yvasyliev.deezer.request.DeezerPagingRequest;
76
import io.github.yvasyliev.deezer.request.DeezerRequest;
8-
import io.github.yvasyliev.deezer.request.SimpleDeezerRequest;
7+
import io.github.yvasyliev.deezer.request.GetByIdDeezerRequest;
8+
import io.github.yvasyliev.deezer.request.GetByIdPagingDeezerRequest;
99
import io.github.yvasyliev.deezer.service.AlbumService;
1010
import lombok.RequiredArgsConstructor;
1111

@@ -22,8 +22,8 @@ public class AlbumRequestFactory {
2222
* @param albumId album ID
2323
* @return album
2424
*/
25-
public DeezerRequest<Album> getAlbum(int albumId) {
26-
return new SimpleDeezerRequest<>(() -> albumService.getAlbum(albumId));
25+
public DeezerRequest<Album> getAlbum(long albumId) {
26+
return new GetByIdDeezerRequest<>(albumId, albumService::getAlbum);
2727
}
2828

2929
/**
@@ -32,8 +32,8 @@ public DeezerRequest<Album> getAlbum(int albumId) {
3232
* @param albumId album ID
3333
* @return list of album's fans
3434
*/
35-
public DeezerPagingRequest<User> getAlbumFans(int albumId) {
36-
return new DeezerPagingRequest<>((index, limit) -> albumService.getAlbumFans(albumId, index, limit));
35+
public GetByIdPagingDeezerRequest<User> getAlbumFans(long albumId) {
36+
return new GetByIdPagingDeezerRequest<>(albumId, albumService::getAlbumFans);
3737
}
3838

3939
/**
@@ -42,7 +42,7 @@ public DeezerPagingRequest<User> getAlbumFans(int albumId) {
4242
* @param albumId album ID
4343
* @return list of album's tracks
4444
*/
45-
public DeezerPagingRequest<Track> getAlbumTracks(int albumId) {
46-
return new DeezerPagingRequest<>((index, limit) -> albumService.getAlbumTracks(albumId, index, limit));
45+
public GetByIdPagingDeezerRequest<Track> getAlbumTracks(long albumId) {
46+
return new GetByIdPagingDeezerRequest<>(albumId, albumService::getAlbumTracks);
4747
}
4848
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.github.yvasyliev.deezer.factory;
2+
3+
import io.github.yvasyliev.deezer.model.Album;
4+
import io.github.yvasyliev.deezer.model.Artist;
5+
import io.github.yvasyliev.deezer.model.Playlist;
6+
import io.github.yvasyliev.deezer.model.Track;
7+
import io.github.yvasyliev.deezer.model.User;
8+
import io.github.yvasyliev.deezer.request.DeezerRequest;
9+
import io.github.yvasyliev.deezer.request.GetByIdDeezerRequest;
10+
import io.github.yvasyliev.deezer.request.GetByIdPagingDeezerRequest;
11+
import io.github.yvasyliev.deezer.service.ArtistService;
12+
import lombok.RequiredArgsConstructor;
13+
14+
/**
15+
* Factory for creating requests related to artists.
16+
*/
17+
@RequiredArgsConstructor
18+
public class ArtistRequestFactory {
19+
private final ArtistService artistService;
20+
21+
/**
22+
* Returns a list of artist's albums.
23+
*
24+
* @param artistId artist ID
25+
* @return list of artist's albums
26+
*/
27+
public GetByIdPagingDeezerRequest<Album> getAlbums(long artistId) {
28+
return new GetByIdPagingDeezerRequest<>(artistId, artistService::getAlbums);
29+
}
30+
31+
/**
32+
* Returns an artist.
33+
*
34+
* @param artistId artist ID
35+
* @return artist
36+
*/
37+
public DeezerRequest<Artist> getArtist(long artistId) {
38+
return new GetByIdDeezerRequest<>(artistId, artistService::getArtist);
39+
}
40+
41+
/**
42+
* Returns a list of artist's fans.
43+
*
44+
* @param artistId artist ID
45+
* @return list of artist's fans
46+
*/
47+
public GetByIdPagingDeezerRequest<User> getFans(long artistId) {
48+
return new GetByIdPagingDeezerRequest<>(artistId, artistService::getFans);
49+
}
50+
51+
/**
52+
* Returns a list of artist's playlists.
53+
*
54+
* @param artistId artist ID
55+
* @return list of artist's playlists
56+
*/
57+
public GetByIdPagingDeezerRequest<Playlist> getPlaylists(long artistId) {
58+
return new GetByIdPagingDeezerRequest<>(artistId, artistService::getPlaylists);
59+
}
60+
61+
/**
62+
* Returns a list of tracks.
63+
*
64+
* @param artistId artist ID
65+
* @return list of tracks
66+
*/
67+
public GetByIdPagingDeezerRequest<Track> getRadio(long artistId) {
68+
return new GetByIdPagingDeezerRequest<>(artistId, artistService::getRadio);
69+
}
70+
71+
/**
72+
* Returns a list of related artists.
73+
*
74+
* @param artistId artist ID
75+
* @return list of related artists
76+
*/
77+
public GetByIdPagingDeezerRequest<Artist> getRelated(long artistId) {
78+
return new GetByIdPagingDeezerRequest<>(artistId, artistService::getRelated);
79+
}
80+
81+
/**
82+
* Returns a list of artist's top tracks.
83+
*
84+
* @param artistId artist ID
85+
* @return list of artist's top tracks
86+
*/
87+
public GetByIdPagingDeezerRequest<Track> getTop(long artistId) {
88+
return new GetByIdPagingDeezerRequest<>(artistId, artistService::getTop);
89+
}
90+
}

src/main/java/io/github/yvasyliev/deezer/feign/AccessTokenExpander.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,16 @@
55
import io.github.yvasyliev.deezer.model.AccessToken;
66

77
public class AccessTokenExpander implements Param.Expander {
8-
private static final String MESSAGE_TEMPLATE = "%s expects %s type, but got: %%s".formatted(
9-
AccessTokenExpander.class.getSimpleName(),
10-
AccessToken.class.getName()
11-
);
12-
138
@Override
149
public String expand(Object value) {
15-
if (value instanceof AccessToken accessToken) {
16-
if (accessToken.isExpired()) {
17-
throw new DeezerException("Access token is expired");
18-
}
10+
return value instanceof AccessToken accessToken ? expand(accessToken) : null;
11+
}
1912

20-
return accessToken.token();
13+
private String expand(AccessToken accessToken) {
14+
if (accessToken.isExpired()) {
15+
throw new DeezerException("Access token is expired");
2116
}
2217

23-
throw new DeezerException(MESSAGE_TEMPLATE.formatted(value));
18+
return accessToken.token();
2419
}
2520
}

src/main/java/io/github/yvasyliev/deezer/feign/QueryExpander.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import feign.Param;
44
import io.github.yvasyliev.deezer.request.search.AdvancedQuery;
5-
import io.github.yvasyliev.deezer.request.search.Query;
65
import io.github.yvasyliev.deezer.request.search.SimpleQuery;
76
import lombok.RequiredArgsConstructor;
87
import tools.jackson.core.type.TypeReference;
@@ -13,10 +12,6 @@
1312

1413
@RequiredArgsConstructor
1514
public class QueryExpander implements Param.Expander {
16-
private static final String MESSAGE_TEMPLATE = "%s expects %s type, but got: %%s".formatted(
17-
QueryExpander.class.getSimpleName(),
18-
Query.class.getName()
19-
);
2015
private static final TypeReference<Map<String, String>> QUERY_MAP_TYPE = new TypeReference<>() {};
2116
private final JsonMapper jsonMapper;
2217

@@ -30,7 +25,7 @@ public String expand(Object value) {
3025
return expand(query);
3126
}
3227

33-
throw new IllegalArgumentException(MESSAGE_TEMPLATE.formatted(value.getClass()));
28+
return null;
3429
}
3530

3631
private String expand(AdvancedQuery query) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.github.yvasyliev.deezer.request;
2+
3+
import lombok.RequiredArgsConstructor;
4+
5+
import java.util.concurrent.CompletableFuture;
6+
import java.util.function.Function;
7+
8+
@RequiredArgsConstructor
9+
public class GetByIdDeezerRequest<T> extends AbstractDeezerRequest<T> {
10+
private final long objectId;
11+
private final Function<Long, CompletableFuture<T>> asyncMethod;
12+
13+
@Override
14+
protected CompletableFuture<T> doExecuteAsync() {
15+
return asyncMethod.apply(objectId);
16+
}
17+
}

src/main/java/io/github/yvasyliev/deezer/request/DeezerPagingRequest.java renamed to src/main/java/io/github/yvasyliev/deezer/request/GetByIdPagingDeezerRequest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
package io.github.yvasyliev.deezer.request;
22

33
import io.github.yvasyliev.deezer.model.Page;
4+
import io.github.yvasyliev.deezer.util.TriFunction;
45
import lombok.RequiredArgsConstructor;
56
import lombok.Setter;
67
import lombok.experimental.Accessors;
78

89
import java.util.concurrent.CompletableFuture;
9-
import java.util.function.BiFunction;
1010

1111
@RequiredArgsConstructor
1212
@Setter
1313
@Accessors(fluent = true)
14-
public class DeezerPagingRequest<T> extends AbstractDeezerRequest<Page<T>> {
15-
private final BiFunction<Integer, Integer, CompletableFuture<Page<T>>> asyncMethod;
14+
public class GetByIdPagingDeezerRequest<T> extends AbstractDeezerRequest<Page<T>> {
15+
private final long objectId;
16+
private final TriFunction<Long, Integer, Integer, CompletableFuture<Page<T>>> asyncMethod;
1617
private Integer index;
1718
private Integer limit;
1819

1920
@Override
2021
protected CompletableFuture<Page<T>> doExecuteAsync() {
21-
return asyncMethod.apply(index, limit);
22+
return asyncMethod.apply(objectId, index, limit);
2223
}
2324
}

src/main/java/io/github/yvasyliev/deezer/service/ArtistService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.github.yvasyliev.deezer.model.Page;
99
import io.github.yvasyliev.deezer.model.Playlist;
1010
import io.github.yvasyliev.deezer.model.Track;
11+
import io.github.yvasyliev.deezer.model.User;
1112

1213
import java.util.concurrent.CompletableFuture;
1314

@@ -46,7 +47,7 @@ CompletableFuture<Page<Album>> getAlbums(
4647
* @return list of artist's fans
4748
*/
4849
@RequestLine("GET /artist/{artistId}/fans?index={index}&limit={limit}")
49-
CompletableFuture<Page<Artist>> getFans(
50+
CompletableFuture<Page<User>> getFans(
5051
@Param("artistId") long artistId,
5152
@Param("index") Integer index,
5253
@Param("limit") Integer limit
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.github.yvasyliev.deezer.util;
2+
3+
@FunctionalInterface
4+
public interface TriFunction<T, U, V, R> {
5+
R apply(T t, U u, V v);
6+
}

0 commit comments

Comments
 (0)