Skip to content

Commit 4c44f5b

Browse files
authored
[DEV-10] Fix Zone API 리팩토링 및 Fix Zone Comment API 개발 (#60)
1 parent 70ff3a8 commit 4c44f5b

31 files changed

+729
-398
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ddingdong.ddingdongBE.common.converter;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import java.lang.reflect.Type;
5+
import org.springframework.http.MediaType;
6+
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
7+
import org.springframework.stereotype.Component;
8+
9+
@Component
10+
public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
11+
12+
public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
13+
super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
14+
}
15+
16+
@Override
17+
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
18+
return false;
19+
}
20+
21+
@Override
22+
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
23+
return false;
24+
}
25+
26+
@Override
27+
protected boolean canWrite(MediaType mediaType) {
28+
return false;
29+
}
30+
31+
}

src/main/java/ddingdong/ddingdongBE/common/exception/ErrorMessage.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@Getter
77
@RequiredArgsConstructor
88
public enum ErrorMessage {
9+
AUTHENTICATION_ERROR("알 수 없는 인증 관련 오류가 발생하였습니다."),
910
INTERNAL_SERVER_ERROR("서버에 문제가 발생했습니다."),
1011
ILLEGAL_CLUB_LOCATION_PATTERN("올바르지 않은 동아리 위치 양식입니다."),
1112
ILLEGAL_CLUB_PHONE_NUMBER_PATTERN("올바르지 않은 동아리 전화번호 양식입니다."),
@@ -21,9 +22,10 @@ public enum ErrorMessage {
2122
INVALID_STAMP_COUNT_FOR_APPLY("스탬프를 모두 모아야 이벤트에 참여할 수 있어요!"),
2223
ACCESS_DENIED("접근권한이 없습니다."),
2324
UNREGISTER_ID("등록되지 않은 ID입니다."),
24-
NO_SUCH_BANNER("해당 배너가 존재하지 않습니다."),
2525
NON_VALIDATED_TOKEN("유효하지 않은 토큰입니다."),
26+
NO_SUCH_BANNER("해당 배너가 존재하지 않습니다."),
2627
NO_SUCH_FIX("해당 수리 신청서가 존재하지 않습니다."),
28+
NO_SUCH_FIX_ZONE_COMMENT("존재하지 않는 픽스존 댓글입니다."),
2729
NO_SUCH_DOCUMENT("해당 자료가 존재하지 않습니다.");
2830

2931
private final String text;

src/main/java/ddingdong/ddingdongBE/domain/activityreport/api/AdminActivityReportApi.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ddingdong.ddingdongBE.domain.activityreport.api;
22

3-
import ddingdong.ddingdongBE.auth.PrincipalDetails;
43
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.CreateActivityTermInfoRequest;
54
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportTermInfoResponse;
65
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.AllActivityReportResponse;
@@ -9,7 +8,6 @@
98
import io.swagger.v3.oas.annotations.tags.Tag;
109
import java.util.List;
1110
import org.springframework.http.HttpStatus;
12-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1311
import org.springframework.web.bind.annotation.GetMapping;
1412
import org.springframework.web.bind.annotation.PostMapping;
1513
import org.springframework.web.bind.annotation.RequestBody;
@@ -29,16 +27,12 @@ public interface AdminActivityReportApi {
2927
@GetMapping("/term")
3028
@ResponseStatus(HttpStatus.OK)
3129
@SecurityRequirement(name = "AccessToken")
32-
List<ActivityReportTermInfoResponse> getActivityTermInfos(
33-
@AuthenticationPrincipal PrincipalDetails principalDetails);
30+
List<ActivityReportTermInfoResponse> getActivityTermInfos();
3431

3532
@Operation(summary = "활동 보고서 회차별 기간 설정 API")
3633
@PostMapping("/term")
3734
@ResponseStatus(HttpStatus.CREATED)
3835
@SecurityRequirement(name = "AccessToken")
39-
void createActivityTermInfo(
40-
@AuthenticationPrincipal PrincipalDetails principalDetails,
41-
@RequestBody CreateActivityTermInfoRequest request
42-
);
36+
void createActivityTermInfo(@RequestBody CreateActivityTermInfoRequest request);
4337

4438
}

src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/AdminActivityReportApiController.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ddingdong.ddingdongBE.domain.activityreport.controller;
22

3-
import ddingdong.ddingdongBE.auth.PrincipalDetails;
43
import ddingdong.ddingdongBE.domain.activityreport.api.AdminActivityReportApi;
54
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.CreateActivityTermInfoRequest;
65
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportTermInfoResponse;
@@ -9,7 +8,6 @@
98
import ddingdong.ddingdongBE.domain.activityreport.service.ActivityReportTermInfoService;
109
import java.util.List;
1110
import lombok.RequiredArgsConstructor;
12-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1311
import org.springframework.web.bind.annotation.GetMapping;
1412
import org.springframework.web.bind.annotation.RestController;
1513

@@ -26,16 +24,12 @@ public List<AllActivityReportResponse> getActivityReports() {
2624
}
2725

2826
@Override
29-
public List<ActivityReportTermInfoResponse> getActivityTermInfos(
30-
@AuthenticationPrincipal PrincipalDetails principalDetails) {
27+
public List<ActivityReportTermInfoResponse> getActivityTermInfos() {
3128
return activityReportTermInfoService.getAll();
3229
}
3330

3431
@Override
35-
public void createActivityTermInfo(
36-
@AuthenticationPrincipal PrincipalDetails principalDetails,
37-
CreateActivityTermInfoRequest request
38-
) {
32+
public void createActivityTermInfo(CreateActivityTermInfoRequest request) {
3933
activityReportTermInfoService.create(request.startDate(), request.totalTermCount());
4034
}
4135

src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/response/CurrentTermResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public CurrentTermResponse(String term) {
1111
this.term = term;
1212
}
1313

14-
public static CurrentTermResponse of(String term) {
14+
public static CurrentTermResponse from(String term) {
1515
return new CurrentTermResponse(term);
1616
}
1717
}

src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/response/DetailActivityReportResponse.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package ddingdong.ddingdongBE.domain.activityreport.controller.dto.response;
22

3-
import java.time.LocalDateTime;
4-
import java.util.List;
5-
63
import com.fasterxml.jackson.annotation.JsonFormat;
7-
84
import ddingdong.ddingdongBE.domain.activityreport.domain.ActivityReport;
95
import ddingdong.ddingdongBE.domain.activityreport.domain.Participant;
6+
import java.time.LocalDateTime;
7+
import java.util.List;
108
import lombok.Getter;
119

1210
@Getter
@@ -38,7 +36,7 @@ public DetailActivityReportResponse(Long id, String name, String content, String
3836
this.createdAt = createdAt;
3937
}
4038

41-
public static DetailActivityReportResponse from(ActivityReport activityReport, List<String> imageUrls) {
39+
public static DetailActivityReportResponse of(ActivityReport activityReport, List<String> imageUrls) {
4240
return new DetailActivityReportResponse(
4341
activityReport.getId(),
4442
activityReport.getClub().getName(),

src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public List<DetailActivityReportResponse> getActivityReport(final String term,
6666
return activityReports.stream().map(activityReport -> {
6767
List<String> imageUrls = fileInformationService.getImageUrls(
6868
IMAGE.getFileType() + ACTIVITY_REPORT.getFileDomain() + activityReport.getId());
69-
return DetailActivityReportResponse.from(activityReport, imageUrls);
69+
return DetailActivityReportResponse.of(activityReport, imageUrls);
7070
}).collect(Collectors.toList());
7171
}
7272

@@ -112,7 +112,7 @@ public CurrentTermResponse getCurrentTerm() {
112112
LocalDate currentDate = LocalDate.now();
113113

114114
int gapOfDays = calculateGapOfDays(startDate, currentDate);
115-
return CurrentTermResponse.of(calculateCurrentTerm(gapOfDays));
115+
return CurrentTermResponse.from(calculateCurrentTerm(gapOfDays));
116116
}
117117

118118
private int calculateGapOfDays(final LocalDate startDate, final LocalDate currentDate) {

src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package ddingdong.ddingdongBE.domain.club.service;
22

3-
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.*;
4-
import static ddingdong.ddingdongBE.domain.club.entity.RecruitmentStatus.*;
3+
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.NO_SUCH_CLUB;
4+
import static ddingdong.ddingdongBE.domain.club.entity.RecruitmentStatus.BEFORE_RECRUIT;
5+
import static ddingdong.ddingdongBE.domain.club.entity.RecruitmentStatus.END_RECRUIT;
6+
import static ddingdong.ddingdongBE.domain.club.entity.RecruitmentStatus.RECRUITING;
57
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.CLUB_INTRODUCE;
68
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.CLUB_PROFILE;
79
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE;
@@ -15,16 +17,17 @@
1517
import ddingdong.ddingdongBE.domain.club.controller.dto.response.DetailClubResponse;
1618
import ddingdong.ddingdongBE.domain.club.entity.Club;
1719
import ddingdong.ddingdongBE.domain.club.entity.RecruitmentStatus;
18-
import ddingdong.ddingdongBE.domain.scorehistory.entity.Score;
1920
import ddingdong.ddingdongBE.domain.club.repository.ClubRepository;
2021
import ddingdong.ddingdongBE.domain.fileinformation.entity.FileInformation;
2122
import ddingdong.ddingdongBE.domain.fileinformation.repository.FileInformationRepository;
2223
import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService;
24+
import ddingdong.ddingdongBE.domain.scorehistory.entity.Score;
2325
import ddingdong.ddingdongBE.domain.user.entity.User;
26+
import ddingdong.ddingdongBE.file.FileStore;
2427
import java.time.LocalDateTime;
2528
import java.util.List;
2629
import java.util.NoSuchElementException;
27-
import ddingdong.ddingdongBE.file.FileStore;
30+
import java.util.Optional;
2831
import lombok.RequiredArgsConstructor;
2932
import org.springframework.stereotype.Service;
3033
import org.springframework.transaction.annotation.Transactional;
@@ -66,7 +69,7 @@ public List<AdminClubResponse> getAllForAdmin() {
6669

6770
@Transactional(readOnly = true)
6871
public DetailClubResponse getClub(Long clubId) {
69-
Club club = findClubByClubId(clubId);
72+
Club club = getByClubId(clubId);
7073

7174
List<String> profileImageUrl = fileInformationService.getImageUrls(
7275
IMAGE.getFileType() + CLUB_PROFILE.getFileDomain() + clubId);
@@ -83,7 +86,7 @@ public DetailClubResponse getClub(Long clubId) {
8386

8487
@Transactional(readOnly = true)
8588
public DetailClubResponse getMyClub(Long userId) {
86-
Club club = findClubByUserId(userId);
89+
Club club = getByUserId(userId);
8790

8891
List<String> profileImageUrl = fileInformationService.getImageUrls(
8992
IMAGE.getFileType() + CLUB_PROFILE.getFileDomain() + club.getId());
@@ -99,32 +102,36 @@ public DetailClubResponse getMyClub(Long userId) {
99102
}
100103

101104
public void delete(Long clubId) {
102-
Club club = findClubByClubId(clubId);
105+
Club club = getByClubId(clubId);
103106

104107
clubRepository.delete(club);
105108
}
106109

107110
public float editClubScore(Long clubId, float score) {
108-
Club club = findClubByClubId(clubId);
111+
Club club = getByClubId(clubId);
109112

110113
return club.editScore(generateNewScore(club.getScore(), score));
111114
}
112115

113116
public Long update(Long userId, UpdateClubRequest request) {
114-
Club club = findClubByUserId(userId);
117+
Club club = getByUserId(userId);
115118
updateIntroduceImageInformation(request, club);
116119
updateProfileImageInformation(request, club);
117120

118121
club.updateClubInfo(request);
119122
return club.getId();
120123
}
121124

122-
public Club findClubByUserId(final Long userId) {
125+
public Optional<Club> findByUserId(final Long userId) {
126+
return clubRepository.findByUserId(userId);
127+
}
128+
129+
public Club getByUserId(final Long userId) {
123130
return clubRepository.findByUserId(userId)
124131
.orElseThrow(() -> new NoSuchElementException(NO_SUCH_CLUB.getText()));
125132
}
126133

127-
public Club findClubByClubId(final Long clubId) {
134+
public Club getByClubId(final Long clubId) {
128135
return clubRepository.findById(clubId)
129136
.orElseThrow(() -> new NoSuchElementException(NO_SUCH_CLUB.getText()));
130137
}
@@ -175,4 +182,5 @@ private RecruitmentStatus checkRecruit(LocalDateTime now, Club club) {
175182

176183
return club.getEndRecruitPeriod().isAfter(now) ? RECRUITING : END_RECRUIT;
177184
}
185+
178186
}
Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,69 @@
11
package ddingdong.ddingdongBE.domain.fixzone.controller;
22

3-
import java.util.List;
4-
5-
import org.springframework.web.bind.annotation.GetMapping;
6-
import org.springframework.web.bind.annotation.ModelAttribute;
7-
import org.springframework.web.bind.annotation.PatchMapping;
8-
import org.springframework.web.bind.annotation.PathVariable;
9-
import org.springframework.web.bind.annotation.RequestBody;
10-
import org.springframework.web.bind.annotation.RequestMapping;
11-
import org.springframework.web.bind.annotation.RestController;
12-
13-
import ddingdong.ddingdongBE.domain.fixzone.controller.dto.request.UpdateFiXCompletionRequest;
14-
import ddingdong.ddingdongBE.domain.fixzone.controller.dto.request.UpdateFixRequest;
15-
import ddingdong.ddingdongBE.domain.fixzone.controller.dto.response.AdminDetailFixResponse;
16-
import ddingdong.ddingdongBE.domain.fixzone.controller.dto.response.AdminFixResponse;
3+
import ddingdong.ddingdongBE.auth.PrincipalDetails;
4+
import ddingdong.ddingdongBE.domain.club.entity.Club;
5+
import ddingdong.ddingdongBE.domain.club.service.ClubService;
6+
import ddingdong.ddingdongBE.domain.fixzone.controller.api.AdminFixZoneApi;
7+
import ddingdong.ddingdongBE.domain.fixzone.controller.dto.request.CreateFixZoneCommentRequest;
8+
import ddingdong.ddingdongBE.domain.fixzone.controller.dto.response.GetFixZoneResponse;
9+
import ddingdong.ddingdongBE.domain.fixzone.entity.FixZone;
10+
import ddingdong.ddingdongBE.domain.fixzone.service.FixZoneCommentService;
1711
import ddingdong.ddingdongBE.domain.fixzone.service.FixZoneService;
12+
import java.util.List;
1813
import lombok.RequiredArgsConstructor;
14+
import org.springframework.web.bind.annotation.RestController;
1915

2016
@RestController
21-
@RequestMapping("/server/admin/fix")
2217
@RequiredArgsConstructor
23-
public class AdminFixZoneController {
18+
public class AdminFixZoneController implements AdminFixZoneApi {
2419

2520
private final FixZoneService fixZoneService;
21+
private final FixZoneCommentService fixZoneCommentService;
22+
private final ClubService clubService;
23+
24+
@Override
25+
public List<GetFixZoneResponse> getFixZones() {
26+
return fixZoneService.getAll();
27+
}
28+
29+
@Override
30+
public void updateFixZoneToComplete(Long fixZoneId) {
31+
fixZoneService.updateToComplete(fixZoneId);
32+
}
33+
34+
@Override
35+
public void createFixZoneComment(
36+
PrincipalDetails principalDetails,
37+
CreateFixZoneCommentRequest request,
38+
Long fixZoneId
39+
) {
40+
FixZone fixZone = fixZoneService.getById(fixZoneId);
41+
Club club = clubService.getByClubId(principalDetails.getUser().getId());
42+
43+
fixZoneCommentService.create(fixZone, club, request);
44+
}
45+
46+
@Override
47+
public void updateFixZoneComment(
48+
PrincipalDetails principalDetails,
49+
CreateFixZoneCommentRequest request,
50+
Long fixZoneId,
51+
Long commentId
52+
) {
53+
Club club = clubService.getByClubId(principalDetails.getUser().getId());
54+
55+
fixZoneCommentService.update(club.getId(), commentId, request);
56+
}
2657

27-
@GetMapping
28-
public List<AdminFixResponse> getAllFixForAdmin() {
29-
return fixZoneService.getAllForAdmin();
30-
}
58+
@Override
59+
public void deleteFixZoneComment(
60+
PrincipalDetails principalDetails,
61+
Long fixZoneId,
62+
Long commentId
63+
) {
64+
Club club = clubService.getByClubId(principalDetails.getUser().getId());
3165

32-
@GetMapping("/{fixId}")
33-
public AdminDetailFixResponse getFixForAdmin(@PathVariable Long fixId) {
34-
return fixZoneService.getForAdmin(fixId);
35-
}
66+
fixZoneCommentService.delete(commentId);
67+
}
3668

37-
@PatchMapping("/{fixId}")
38-
public void updateFix(@PathVariable Long fixId, @RequestBody UpdateFiXCompletionRequest request) {
39-
fixZoneService.updateIsCompleted(fixId, request);
40-
}
4169
}

0 commit comments

Comments
 (0)