Skip to content

Commit 423971d

Browse files
Merge pull request #62 from DevKor-github/develop
운영 배포
2 parents 27a7b4a + f69e000 commit 423971d

18 files changed

Lines changed: 1551 additions & 23 deletions

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ dependencies {
2929
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
3030
implementation 'org.springframework.boot:spring-boot-starter-web'
3131
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
32-
compileOnly 'org.projectlombok:lombok'
32+
implementation 'org.springframework.boot:spring-boot-starter-validation'
33+
compileOnly 'org.projectlombok:lombok'
3334
developmentOnly 'org.springframework.boot:spring-boot-devtools'
3435
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
3536
annotationProcessor 'org.projectlombok:lombok'
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package apu.saerok_admin.infra.announcement;
2+
3+
import apu.saerok_admin.infra.SaerokApiProps;
4+
import apu.saerok_admin.infra.announcement.dto.AdminAnnouncementDetailResponse;
5+
import apu.saerok_admin.infra.announcement.dto.AdminAnnouncementImagePresignRequest;
6+
import apu.saerok_admin.infra.announcement.dto.AdminAnnouncementListResponse;
7+
import apu.saerok_admin.infra.announcement.dto.AdminCreateAnnouncementRequest;
8+
import apu.saerok_admin.infra.announcement.dto.AdminUpdateAnnouncementRequest;
9+
import apu.saerok_admin.infra.announcement.dto.AnnouncementImagePresignResponse;
10+
import java.net.URI;
11+
import java.util.List;
12+
import org.springframework.http.HttpMethod;
13+
import org.springframework.stereotype.Component;
14+
import org.springframework.web.client.RestClient;
15+
import org.springframework.web.util.UriBuilder;
16+
17+
@Component
18+
public class AdminAnnouncementClient {
19+
20+
private static final String[] ADMIN_ANNOUNCEMENT_SEGMENTS = {"admin", "announcement"};
21+
22+
private final RestClient saerokRestClient;
23+
private final String[] missingPrefixSegments;
24+
25+
public AdminAnnouncementClient(RestClient saerokRestClient, SaerokApiProps saerokApiProps) {
26+
this.saerokRestClient = saerokRestClient;
27+
List<String> missing = saerokApiProps.missingPrefixSegments();
28+
this.missingPrefixSegments = missing.toArray(new String[0]);
29+
}
30+
31+
public AdminAnnouncementListResponse listAnnouncements() {
32+
return get(AdminAnnouncementListResponse.class);
33+
}
34+
35+
public AdminAnnouncementDetailResponse getAnnouncement(Long announcementId) {
36+
return get(AdminAnnouncementDetailResponse.class, announcementId.toString());
37+
}
38+
39+
public AdminAnnouncementDetailResponse createAnnouncement(AdminCreateAnnouncementRequest request) {
40+
return post(AdminAnnouncementDetailResponse.class, request);
41+
}
42+
43+
public AdminAnnouncementDetailResponse updateAnnouncement(Long announcementId, AdminUpdateAnnouncementRequest request) {
44+
return put(AdminAnnouncementDetailResponse.class, request, announcementId.toString());
45+
}
46+
47+
public void deleteAnnouncement(Long announcementId) {
48+
delete(announcementId.toString());
49+
}
50+
51+
public AnnouncementImagePresignResponse generateImagePresignUrl(AdminAnnouncementImagePresignRequest request) {
52+
return post(AnnouncementImagePresignResponse.class, request, "image", "presign");
53+
}
54+
55+
private <T> T get(Class<T> responseType, String... segments) {
56+
T response = saerokRestClient.get()
57+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
58+
.retrieve()
59+
.body(responseType);
60+
61+
if (response == null) {
62+
throw new IllegalStateException("Empty response from admin announcement API");
63+
}
64+
return response;
65+
}
66+
67+
private <T> T post(Class<T> responseType, Object body, String... segments) {
68+
T response = saerokRestClient.post()
69+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
70+
.body(body)
71+
.retrieve()
72+
.body(responseType);
73+
74+
if (response == null) {
75+
throw new IllegalStateException("Empty response from admin announcement API");
76+
}
77+
return response;
78+
}
79+
80+
private <T> T put(Class<T> responseType, Object body, String... segments) {
81+
T response = saerokRestClient.method(HttpMethod.PUT)
82+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
83+
.body(body)
84+
.retrieve()
85+
.body(responseType);
86+
87+
if (response == null) {
88+
throw new IllegalStateException("Empty response from admin announcement API");
89+
}
90+
return response;
91+
}
92+
93+
private void delete(String... segments) {
94+
saerokRestClient.delete()
95+
.uri(uriBuilder -> buildUri(uriBuilder, segments))
96+
.retrieve()
97+
.toBodilessEntity();
98+
}
99+
100+
private URI buildUri(UriBuilder builder, String... segments) {
101+
if (missingPrefixSegments.length > 0) {
102+
builder.pathSegment(missingPrefixSegments);
103+
}
104+
builder.pathSegment(ADMIN_ANNOUNCEMENT_SEGMENTS);
105+
if (segments != null && segments.length > 0) {
106+
builder.pathSegment(segments);
107+
}
108+
return builder.build();
109+
}
110+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import java.time.OffsetDateTime;
5+
import java.util.List;
6+
7+
@JsonIgnoreProperties(ignoreUnknown = true)
8+
public record AdminAnnouncementDetailResponse(
9+
Long id,
10+
String title,
11+
String content,
12+
String status,
13+
OffsetDateTime scheduledAt,
14+
OffsetDateTime publishedAt,
15+
Boolean sendNotification,
16+
String pushTitle,
17+
String pushBody,
18+
String inAppBody,
19+
String adminName,
20+
List<Image> images
21+
) {
22+
23+
@JsonIgnoreProperties(ignoreUnknown = true)
24+
public record Image(
25+
String objectKey,
26+
String contentType,
27+
String imageUrl
28+
) {
29+
}
30+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
public record AdminAnnouncementImagePresignRequest(
4+
String contentType
5+
) {
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
public record AdminAnnouncementImageRequest(
4+
String objectKey,
5+
String contentType
6+
) {
7+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import java.time.OffsetDateTime;
5+
import java.util.List;
6+
7+
@JsonIgnoreProperties(ignoreUnknown = true)
8+
public record AdminAnnouncementListResponse(
9+
List<Item> announcements
10+
) {
11+
12+
@JsonIgnoreProperties(ignoreUnknown = true)
13+
public record Item(
14+
Long id,
15+
String title,
16+
String status,
17+
OffsetDateTime scheduledAt,
18+
OffsetDateTime publishedAt,
19+
String adminName
20+
) {
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
import jakarta.validation.Valid;
4+
import java.time.LocalDateTime;
5+
import java.util.List;
6+
7+
public record AdminCreateAnnouncementRequest(
8+
String title,
9+
String content,
10+
LocalDateTime scheduledAt,
11+
Boolean publishNow,
12+
Boolean sendNotification,
13+
String pushTitle,
14+
String pushBody,
15+
String inAppBody,
16+
@Valid
17+
List<AdminAnnouncementImageRequest> images
18+
) {
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
import jakarta.validation.Valid;
4+
import java.time.LocalDateTime;
5+
import java.util.List;
6+
7+
public record AdminUpdateAnnouncementRequest(
8+
String title,
9+
String content,
10+
LocalDateTime scheduledAt,
11+
Boolean publishNow,
12+
Boolean sendNotification,
13+
String pushTitle,
14+
String pushBody,
15+
String inAppBody,
16+
@Valid
17+
List<AdminAnnouncementImageRequest> images
18+
) {
19+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package apu.saerok_admin.infra.announcement.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
5+
@JsonIgnoreProperties(ignoreUnknown = true)
6+
public record AnnouncementImagePresignResponse(
7+
String presignedUrl,
8+
String objectKey,
9+
String imageUrl
10+
) {
11+
}

src/main/java/apu/saerok_admin/infra/role/AdminRoleClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package apu.saerok_admin.infra.role;
22

33
import apu.saerok_admin.infra.SaerokApiProps;
4+
import apu.saerok_admin.infra.role.dto.AdminPermissionListResponse;
45
import apu.saerok_admin.infra.role.dto.AdminMyRoleResponse;
56
import apu.saerok_admin.infra.role.dto.AdminRoleListResponse;
67
import apu.saerok_admin.infra.role.dto.AdminRoleUserListResponse;
@@ -42,6 +43,10 @@ public AdminRoleListResponse listRoles() {
4243
return get(AdminRoleListResponse.class);
4344
}
4445

46+
public AdminPermissionListResponse listPermissions() {
47+
return get(AdminPermissionListResponse.class, "permissions");
48+
}
49+
4550
public RoleDetailResponse createRole(CreateRoleRequest request) {
4651
return post(RoleDetailResponse.class, request);
4752
}

0 commit comments

Comments
 (0)