Skip to content

Commit 2b399a9

Browse files
Merge pull request #55 from DevKor-github/develop
운영 서버 배포
2 parents f43ddc7 + 3401ade commit 2b399a9

32 files changed

Lines changed: 2847 additions & 25 deletions

src/main/java/apu/saerok_admin/infra/CurrentAdminClient.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414
import org.springframework.stereotype.Component;
15+
import org.springframework.util.StringUtils;
1516
import org.springframework.web.client.RestClient;
1617
import org.springframework.web.client.RestClientException;
1718
import org.springframework.web.client.RestClientResponseException;
1819
import org.springframework.web.util.UriBuilder;
19-
import org.springframework.util.StringUtils;
2020

2121
@Component
2222
public class CurrentAdminClient {
@@ -57,11 +57,14 @@ public Optional<CurrentAdminProfile> fetchCurrentAdminProfile() {
5757
return Optional.empty();
5858
}
5959

60+
List<String> roles = response.roles() != null ? List.copyOf(response.roles()) : List.of();
61+
6062
return Optional.of(new CurrentAdminProfile(
6163
response.nickname(),
6264
response.email(),
6365
response.profileImageUrl(),
64-
toRoleDescriptions(response.roles())
66+
toRoleDescriptions(roles),
67+
normalizeRoleCodes(roles)
6568
));
6669
} catch (RestClientResponseException exception) {
6770
log.warn(
@@ -118,4 +121,21 @@ private List<String> toRoleDescriptions(List<String> roles) {
118121

119122
return descriptions.isEmpty() ? List.of() : List.copyOf(descriptions);
120123
}
124+
125+
private List<String> normalizeRoleCodes(List<String> roles) {
126+
if (roles == null || roles.isEmpty()) {
127+
return List.of();
128+
}
129+
Set<String> normalized = new LinkedHashSet<>();
130+
for (String role : roles) {
131+
if (!StringUtils.hasText(role)) {
132+
continue;
133+
}
134+
normalized.add(role.toUpperCase(Locale.ROOT));
135+
}
136+
if (normalized.isEmpty()) {
137+
return List.of();
138+
}
139+
return List.copyOf(normalized);
140+
}
121141
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package apu.saerok_admin.infra.ad;
2+
3+
import apu.saerok_admin.infra.SaerokApiProps;
4+
import apu.saerok_admin.infra.ad.dto.AdImagePresignResponse;
5+
import apu.saerok_admin.infra.ad.dto.AdminAdImagePresignRequest;
6+
import apu.saerok_admin.infra.ad.dto.AdminAdListResponse;
7+
import apu.saerok_admin.infra.ad.dto.AdminAdPlacementListResponse;
8+
import apu.saerok_admin.infra.ad.dto.AdminCreateAdPlacementRequest;
9+
import apu.saerok_admin.infra.ad.dto.AdminCreateAdRequest;
10+
import apu.saerok_admin.infra.ad.dto.AdminCreateSlotRequest;
11+
import apu.saerok_admin.infra.ad.dto.AdminSlotListResponse;
12+
import apu.saerok_admin.infra.ad.dto.AdminUpdateAdPlacementRequest;
13+
import apu.saerok_admin.infra.ad.dto.AdminUpdateAdRequest;
14+
import apu.saerok_admin.infra.ad.dto.AdminUpdateSlotRequest;
15+
import java.net.URI;
16+
import java.util.List;
17+
import org.springframework.http.HttpMethod;
18+
import org.springframework.stereotype.Component;
19+
import org.springframework.web.client.RestClient;
20+
import org.springframework.web.util.UriBuilder;
21+
22+
@Component
23+
public class AdminAdClient {
24+
25+
private static final String[] ADMIN_AD_SEGMENTS = {"admin", "ad"};
26+
27+
private final RestClient saerokRestClient;
28+
private final String[] missingPrefixSegments;
29+
30+
public AdminAdClient(RestClient saerokRestClient, SaerokApiProps saerokApiProps) {
31+
this.saerokRestClient = saerokRestClient;
32+
List<String> missing = saerokApiProps.missingPrefixSegments();
33+
this.missingPrefixSegments = missing.toArray(new String[0]);
34+
}
35+
36+
public AdminAdListResponse listAds() {
37+
return get(AdminAdListResponse.class, "list");
38+
}
39+
40+
public AdminAdListResponse.Item createAd(AdminCreateAdRequest request) {
41+
return post(AdminAdListResponse.Item.class, request, "create");
42+
}
43+
44+
public AdminAdListResponse.Item updateAd(Long adId, AdminUpdateAdRequest request) {
45+
return put(AdminAdListResponse.Item.class, request, adId.toString());
46+
}
47+
48+
public void deleteAd(Long adId) {
49+
delete(adId.toString());
50+
}
51+
52+
public AdImagePresignResponse generateAdImagePresignUrl(AdminAdImagePresignRequest request) {
53+
return post(AdImagePresignResponse.class, request, "image", "presign");
54+
}
55+
56+
public AdminSlotListResponse listSlots() {
57+
return get(AdminSlotListResponse.class, "slot");
58+
}
59+
60+
public AdminSlotListResponse.Item createSlot(AdminCreateSlotRequest request) {
61+
return post(AdminSlotListResponse.Item.class, request, "slot");
62+
}
63+
64+
public AdminSlotListResponse.Item updateSlot(Long slotId, AdminUpdateSlotRequest request) {
65+
return put(AdminSlotListResponse.Item.class, request, "slot", slotId.toString());
66+
}
67+
68+
public void deleteSlot(Long slotId) {
69+
delete("slot", slotId.toString());
70+
}
71+
72+
public AdminAdPlacementListResponse listPlacements() {
73+
return get(AdminAdPlacementListResponse.class, "placement");
74+
}
75+
76+
public AdminAdPlacementListResponse.Item createPlacement(AdminCreateAdPlacementRequest request) {
77+
return post(AdminAdPlacementListResponse.Item.class, request, "placement");
78+
}
79+
80+
public AdminAdPlacementListResponse.Item updatePlacement(Long placementId, AdminUpdateAdPlacementRequest request) {
81+
return put(AdminAdPlacementListResponse.Item.class, request, "placement", placementId.toString());
82+
}
83+
84+
public void deletePlacement(Long placementId) {
85+
delete("placement", placementId.toString());
86+
}
87+
88+
private <T> T get(Class<T> responseType, String... segments) {
89+
T response = saerokRestClient.get()
90+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
91+
.retrieve()
92+
.body(responseType);
93+
if (response == null) {
94+
throw new IllegalStateException("Empty response from admin ad API");
95+
}
96+
return response;
97+
}
98+
99+
private <T> T post(Class<T> responseType, Object body, String... segments) {
100+
T response = saerokRestClient.post()
101+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
102+
.body(body)
103+
.retrieve()
104+
.body(responseType);
105+
if (response == null) {
106+
throw new IllegalStateException("Empty response from admin ad API");
107+
}
108+
return response;
109+
}
110+
111+
private <T> T put(Class<T> responseType, Object body, String... segments) {
112+
T response = saerokRestClient.method(HttpMethod.PUT)
113+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
114+
.body(body)
115+
.retrieve()
116+
.body(responseType);
117+
if (response == null) {
118+
throw new IllegalStateException("Empty response from admin ad API");
119+
}
120+
return response;
121+
}
122+
123+
private void delete(String... segments) {
124+
saerokRestClient.delete()
125+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
126+
.retrieve()
127+
.toBodilessEntity();
128+
}
129+
130+
private URI buildUri(UriBuilder builder, String... segments) {
131+
if (missingPrefixSegments.length > 0) {
132+
builder.pathSegment(missingPrefixSegments);
133+
}
134+
builder.pathSegment(ADMIN_AD_SEGMENTS);
135+
builder.pathSegment(segments);
136+
return builder.build();
137+
}
138+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
public record AdImagePresignResponse(
4+
String presignedUrl,
5+
String objectKey
6+
) {
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
public record AdminAdImagePresignRequest(String contentType) {
4+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
import java.time.OffsetDateTime;
4+
import java.util.List;
5+
6+
public record AdminAdListResponse(List<Item> items) {
7+
8+
public record Item(
9+
Long id,
10+
String name,
11+
String memo,
12+
String imageUrl,
13+
String contentType,
14+
String targetUrl,
15+
OffsetDateTime createdAt,
16+
OffsetDateTime updatedAt
17+
) {
18+
}
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
import java.time.LocalDate;
4+
import java.time.OffsetDateTime;
5+
import java.util.List;
6+
7+
public record AdminAdPlacementListResponse(List<Item> items) {
8+
9+
public record Item(
10+
Long id,
11+
Long adId,
12+
String adName,
13+
String adImageUrl,
14+
Long slotId,
15+
String slotName,
16+
LocalDate startDate,
17+
LocalDate endDate,
18+
Short weight,
19+
Boolean enabled,
20+
OffsetDateTime createdAt,
21+
OffsetDateTime updatedAt
22+
) {
23+
}
24+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
import java.time.LocalDate;
4+
5+
public record AdminCreateAdPlacementRequest(
6+
Long adId,
7+
Long slotId,
8+
LocalDate startDate,
9+
LocalDate endDate,
10+
Short weight,
11+
Boolean enabled
12+
) {
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
public record AdminCreateAdRequest(
4+
String name,
5+
String memo,
6+
String objectKey,
7+
String contentType,
8+
String targetUrl
9+
) {
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
public record AdminCreateSlotRequest(
4+
String name,
5+
String memo,
6+
Double fallbackRatio,
7+
Integer ttlSeconds
8+
) {
9+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package apu.saerok_admin.infra.ad.dto;
2+
3+
import java.time.OffsetDateTime;
4+
import java.util.List;
5+
6+
public record AdminSlotListResponse(List<Item> items) {
7+
8+
public record Item(
9+
Long id,
10+
String name,
11+
String memo,
12+
Double fallbackRatio,
13+
Integer ttlSeconds,
14+
OffsetDateTime createdAt,
15+
OffsetDateTime updatedAt
16+
) {
17+
}
18+
}

0 commit comments

Comments
 (0)