Skip to content

Commit 19604c9

Browse files
committed
feat: create SearchService
1 parent a629966 commit 19604c9

18 files changed

Lines changed: 345 additions & 17 deletions

File tree

bruno-collection/search/search-album.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ info:
55

66
http:
77
method: GET
8-
url: "{{api-host}}/search/album?q=eminem&strinct=on&order=DURATION_DESC&limit=1&index=0"
8+
url: "{{api-host}}/search/album?q=eminem&strict=on&order=DURATION_DESC&limit=1&index=0"
99
params:
1010
- name: q
1111
value: eminem
1212
type: query
13-
- name: strinct
13+
- name: strict
1414
value: on
1515
type: query
1616
- name: order

bruno-collection/search/search-artist.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ info:
55

66
http:
77
method: GET
8-
url: "{{api-host}}/search/artist?q=eminem&strinct=on&order=DURATION_DESC&limit=1&index=0"
8+
url: "{{api-host}}/search/artist?q=eminem&strict=on&order=DURATION_DESC&limit=1&index=0"
99
params:
1010
- name: q
1111
value: eminem
1212
type: query
13-
- name: strinct
13+
- name: strict
1414
value: on
1515
type: query
1616
- name: order

bruno-collection/search/search-playlist.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ info:
55

66
http:
77
method: GET
8-
url: "{{api-host}}/search/playlist?limit=1&index=0&q=eminem&strinct=on&order=DURATION_DESC"
8+
url: "{{api-host}}/search/playlist?limit=1&index=0&q=eminem&strict=on&order=DURATION_DESC"
99
params:
1010
- name: limit
1111
value: "1"
@@ -16,7 +16,7 @@ http:
1616
- name: q
1717
value: eminem
1818
type: query
19-
- name: strinct
19+
- name: strict
2020
value: on
2121
type: query
2222
- name: order

bruno-collection/search/search-radio.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ info:
55

66
http:
77
method: GET
8-
url: "{{api-host}}/search/radio?q=eminem&strinct=on&order=DURATION_DESC&limit=1&index=0"
8+
url: "{{api-host}}/search/radio?q=eminem&strict=on&order=DURATION_DESC&limit=1&index=0"
99
params:
1010
- name: q
1111
value: eminem
1212
type: query
13-
- name: strinct
13+
- name: strict
1414
value: on
1515
type: query
1616
- name: order

bruno-collection/search/search-track.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ info:
55

66
http:
77
method: GET
8-
url: "{{api-host}}/search/track?q=eminem&strinct=on&order=DURATION_DESC&limit=1&index=0"
8+
url: "{{api-host}}/search/track?q=eminem&strict=on&order=DURATION_DESC&limit=1&index=0"
99
params:
1010
- name: q
1111
value: eminem
1212
type: query
13-
- name: strinct
13+
- name: strict
1414
value: on
1515
type: query
1616
- name: order

bruno-collection/search/search.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ info:
55

66
http:
77
method: GET
8-
url: "{{api-host}}/search?q=eminem&strinct=on&order=DURATION_DESC&limit=1&index=0"
8+
url: "{{api-host}}/search?q=eminem&strict=on&order=DURATION_DESC&limit=1&index=0"
99
params:
1010
- name: q
1111
value: eminem
1212
type: query
13-
- name: strinct
13+
- name: strict
1414
value: on
1515
type: query
1616
- name: order
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.yvasyliev.deezer.databind.util;
2+
3+
import tools.jackson.databind.util.StdConverter;
4+
5+
public class QuotingStringConverter extends StdConverter<String, String> {
6+
private static final String QUOTE = "\"";
7+
8+
@Override
9+
public String convert(String value) {
10+
return QUOTE + value + QUOTE;
11+
}
12+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.github.yvasyliev.deezer.feign;
2+
3+
import feign.Contract;
4+
import feign.MethodMetadata;
5+
import feign.Param;
6+
import lombok.RequiredArgsConstructor;
7+
8+
import java.lang.reflect.Method;
9+
import java.util.Map;
10+
import java.util.Optional;
11+
12+
@RequiredArgsConstructor
13+
public class DeezerContract extends Contract.Default {
14+
private final Map<Class<? extends Param.Expander>, Param.Expander> expanders;
15+
16+
17+
18+
@Override
19+
protected MethodMetadata parseAndValidateMetadata(Class<?> targetType, Method method) {
20+
var methodMetadata = super.parseAndValidateMetadata(targetType, method);
21+
22+
setExpanders(methodMetadata);
23+
24+
return methodMetadata;
25+
}
26+
27+
private void setExpanders(MethodMetadata methodMetadata) {
28+
var indexToExpander = methodMetadata.indexToExpander();
29+
30+
methodMetadata.indexToExpanderClass().forEach(
31+
(index, expanderClass) -> Optional.ofNullable(expanders.get(expanderClass))
32+
.ifPresent(expander -> indexToExpander.put(index, expander))
33+
);
34+
}
35+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package io.github.yvasyliev.deezer.feign;
2+
3+
import feign.Param;
4+
import io.github.yvasyliev.deezer.model.AdvancedQuery;
5+
import io.github.yvasyliev.deezer.model.Query;
6+
import io.github.yvasyliev.deezer.model.SimpleQuery;
7+
import lombok.RequiredArgsConstructor;
8+
import tools.jackson.core.type.TypeReference;
9+
import tools.jackson.databind.json.JsonMapper;
10+
11+
import java.util.Map;
12+
import java.util.stream.Collectors;
13+
14+
@RequiredArgsConstructor
15+
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+
);
20+
private static final TypeReference<Map<String, String>> QUERY_MAP_TYPE = new TypeReference<>() {};
21+
private final JsonMapper jsonMapper;
22+
23+
@Override
24+
public String expand(Object value) {
25+
if (value instanceof SimpleQuery query) {
26+
return query.query();
27+
}
28+
29+
if (value instanceof AdvancedQuery query) {
30+
return expand(query);
31+
}
32+
33+
throw new IllegalArgumentException(MESSAGE_TEMPLATE.formatted(value.getClass()));
34+
}
35+
36+
private String expand(AdvancedQuery query) {
37+
return jsonMapper.convertValue(query, QUERY_MAP_TYPE)
38+
.entrySet()
39+
.stream()
40+
.map(entry -> entry.getKey() + ":" + entry.getValue())
41+
.collect(Collectors.joining(" "));
42+
}
43+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.github.yvasyliev.deezer.feign;
2+
3+
import feign.Param;
4+
5+
public class StrictExpander implements Param.Expander {
6+
@Override
7+
public String expand(Object value) {
8+
return Boolean.TRUE.equals(value) ? "on" : null;
9+
}
10+
}

0 commit comments

Comments
 (0)