Skip to content

Commit 46432f6

Browse files
authored
Merge pull request #335 from MT-TEAM-Org/epic/adminImprovement
epic/adminImprovement: 관리자 문의, 개선사항 시스템
2 parents cd68797 + 74d3f49 commit 46432f6

22 files changed

+1734
-2
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.myteam.server.admin.controller;
2+
3+
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.media.Content;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
8+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
10+
import jakarta.validation.Valid;
11+
import lombok.RequiredArgsConstructor;
12+
import org.myteam.server.admin.service.AdminImprovementService;
13+
import org.myteam.server.global.exception.ErrorResponse;
14+
import org.myteam.server.global.web.response.ResponseDto;
15+
import org.myteam.server.global.web.response.ResponseStatus;
16+
import org.springframework.data.domain.Page;
17+
import org.springframework.http.ResponseEntity;
18+
import org.springframework.validation.BindingResult;
19+
import org.springframework.web.bind.annotation.PostMapping;
20+
import org.springframework.web.bind.annotation.RequestBody;
21+
import org.springframework.web.bind.annotation.RequestMapping;
22+
import org.springframework.web.bind.annotation.RestController;
23+
24+
import static org.myteam.server.admin.dto.AdminMemoRequestDto.AdminMemoImprovementRequest;
25+
import static org.myteam.server.admin.dto.ImprovementResponseDto.*;
26+
import static org.myteam.server.admin.dto.RequestImprovementDto.*;
27+
28+
@RestController
29+
@RequestMapping("/api/admin/improve")
30+
@RequiredArgsConstructor
31+
@Tag(name = "관리자 개선 요청 관리", description = "관리자가 개선요청을 관리할수있는 api")
32+
public class AdminImprovementController {
33+
34+
private final AdminImprovementService improvementService;
35+
36+
@Operation(summary = "조건에 따른 개선요청들 조회",
37+
description = "관리자가 개선요청을 조건에 따라서 여러개 가져옵니다.")
38+
@ApiResponses(value = {
39+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
40+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
41+
})
42+
@PostMapping("/list")
43+
public ResponseEntity<ResponseDto<Page<ResponseImprovement>>> getImproveListCond(
44+
@RequestBody @Valid RequestImprovementList requestImprovementList, BindingResult bindingResult) {
45+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(),
46+
"ok", improvementService.getImproveListCond(requestImprovementList)));
47+
}
48+
49+
@Operation(summary = "회원이 만든 개선요청 사항을 가져옵니다.",
50+
description = "특정 회원이 작성한 개선요청들을 가져옵니다.")
51+
@ApiResponses(value = {
52+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
53+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
54+
})
55+
@PostMapping("/member/list")
56+
public ResponseEntity<ResponseDto<Page<ResponseMemberImproveList>>> getImproveList(
57+
@RequestBody @Valid RequestMemberImproveList requestMemberImproveList, BindingResult bindingResult) {
58+
59+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(),
60+
"ok", improvementService.getImproveListMember(requestMemberImproveList)));
61+
}
62+
63+
@Operation(summary = "개선 요청 상세조회",
64+
description = "해당 개선 요청에 대한 상세한 정보들을 가져옵니다.")
65+
@ApiResponses(value = {
66+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
67+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
68+
})
69+
@PostMapping("/detail")
70+
public ResponseEntity<ResponseDto<ResponseImprovementDetail>> getImproveDetail(
71+
@RequestBody @Valid RequestImprovementDetail requestImprovementDetail, BindingResult bindingResult) {
72+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(),
73+
"ok", improvementService.getImproveDetail(requestImprovementDetail)));
74+
}
75+
76+
@Operation(summary = "관리자 메모 추가.",
77+
description = "개선 요청에 대한 관리자 메모를 추가 및 상태를 변경할수있습니다.")
78+
@ApiResponses(value = {
79+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
80+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
81+
})
82+
@PostMapping("/add/memo")
83+
public ResponseEntity<ResponseDto<String>> requestAddAdminMemo(
84+
@RequestBody @Valid AdminMemoImprovementRequest adminMemoRequest, BindingResult bindingResult) {
85+
improvementService.addAdminMemo(adminMemoRequest);
86+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(),
87+
"ok", "성공"));
88+
}
89+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.myteam.server.admin.controller;
2+
3+
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.media.Content;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
8+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
10+
import jakarta.validation.Valid;
11+
import lombok.RequiredArgsConstructor;
12+
import org.myteam.server.admin.service.AdminInquiryService;
13+
import org.myteam.server.global.exception.ErrorResponse;
14+
import org.myteam.server.global.web.response.ResponseDto;
15+
import org.myteam.server.global.web.response.ResponseStatus;
16+
import org.springframework.data.domain.Page;
17+
import org.springframework.http.ResponseEntity;
18+
import org.springframework.validation.BindingResult;
19+
import org.springframework.web.bind.annotation.PostMapping;
20+
import org.springframework.web.bind.annotation.RequestBody;
21+
import org.springframework.web.bind.annotation.RequestMapping;
22+
import org.springframework.web.bind.annotation.RestController;
23+
24+
import static org.myteam.server.admin.dto.AdminMemoRequestDto.AdminMemoInquiryRequest;
25+
import static org.myteam.server.admin.dto.InquiryResponseDto.ResponseInquiryList;
26+
import static org.myteam.server.admin.dto.InquiryResponseDto.ResponseInquiryListCond;
27+
import static org.myteam.server.admin.dto.RequestInquiryDto.*;
28+
29+
@RestController
30+
@RequiredArgsConstructor
31+
@RequestMapping("/api/admin/inquiry")
32+
@Tag(name = "관리자 문의 관리", description = "관리자가 문의를 관리할수있는 api")
33+
public class AdminInquiryController {
34+
35+
private final AdminInquiryService adminInquiryService;
36+
37+
@Operation(summary = "조건에 따른 문의들 조회",
38+
description = "관리자가 문의들을 조건에 따라서 여러개 가져옵니다.")
39+
@ApiResponses(value = {
40+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
41+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
42+
})
43+
@PostMapping("/list")
44+
public ResponseEntity<ResponseDto<Page<ResponseInquiryListCond>>> getInquiryListCond(
45+
@RequestBody @Valid RequestInquiryListCond requestInquiryListCond, BindingResult bindingResult) {
46+
47+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(), "ok",
48+
adminInquiryService.getInquiryListCond(requestInquiryListCond)
49+
));
50+
}
51+
52+
@Operation(summary = "회원이 작성한 문의 조회",
53+
description = "회원이 작성한 문의들을 조회합니다.")
54+
@ApiResponses(value = {
55+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
56+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
57+
})
58+
@PostMapping("/member/list")
59+
public ResponseEntity<ResponseDto<Page<ResponseInquiryList>>> getInquiryListMember(
60+
@RequestBody @Valid RequestInquiryList requestInquiryList, BindingResult bindingResult) {
61+
62+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(), "ok",
63+
adminInquiryService.getInquiryListMember(requestInquiryList)
64+
));
65+
}
66+
67+
@Operation(summary = "문의 상세조회",
68+
description = "회원이 작성한 문의에 대한 상세한 조회를 합니다.")
69+
@ApiResponses(value = {
70+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
71+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
72+
})
73+
@PostMapping("/detail")
74+
public ResponseEntity<ResponseDto<ResponseInquiryDetail>> getInquiryDetail(
75+
@RequestBody @Valid RequestInquiryDetail requestInquiryDetail, BindingResult bindingResult) {
76+
77+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(), "ok",
78+
adminInquiryService.getInquiryDetail(requestInquiryDetail)
79+
));
80+
}
81+
82+
@Operation(summary = "관리자 매모 추가.",
83+
description = "문의에 대한 관리자 메모 추가 및 답변이 메일로 전송됩니다.")
84+
@ApiResponses(value = {
85+
@ApiResponse(responseCode = "200", description = "정보 조회 성공", useReturnTypeSchema = true),
86+
@ApiResponse(responseCode = "400", description = "잘못된 요청 형식", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
87+
})
88+
@PostMapping("/add/memo")
89+
public ResponseEntity<ResponseDto<String>> requestAddAdminMemo(
90+
@RequestBody @Valid AdminMemoInquiryRequest adminMemoRequest, BindingResult bindingResult) {
91+
adminInquiryService.sendInquiryAnswer(adminMemoRequest);
92+
return ResponseEntity.ok(new ResponseDto<>(ResponseStatus.SUCCESS.name(), "ok",
93+
"성공"));
94+
}
95+
96+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.myteam.server.admin.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
import org.myteam.server.admin.utill.AdminControlType;
9+
import org.myteam.server.admin.utill.StaticDataType;
10+
import org.myteam.server.improvement.domain.ImportantStatus;
11+
import org.myteam.server.improvement.domain.ImprovementStatus;
12+
13+
public record AdminMemoRequestDto() {
14+
15+
@Getter
16+
@NoArgsConstructor
17+
@Schema(description = "개선 요청 메모 작성 요청시 쓰이는 값입니다.")
18+
public static class AdminMemoImprovementRequest {
19+
@NotNull
20+
private Long contentId;
21+
@NotNull
22+
@Schema(description = "수정이 없다면 기존값을 수정했다면 수정값을 주세요", example = "PENDING RECEIVED COMPLETED")
23+
private ImprovementStatus improvementStatus;
24+
@NotNull
25+
@Schema(description = "수정이 없다면 기존값을 수정했다면 수정값을 주세요", example = "LOW NORMAL HIGH")
26+
private ImportantStatus importantStatus;
27+
@Schema(description = "내용이 없다면 null로 주세요")
28+
private String content;
29+
30+
@Builder
31+
public AdminMemoImprovementRequest(Long contentId, String content
32+
, ImprovementStatus improvementStatus, ImportantStatus importantStatus) {
33+
this.contentId = contentId;
34+
this.importantStatus = importantStatus;
35+
this.improvementStatus = improvementStatus;
36+
this.content = content;
37+
}
38+
}
39+
40+
@Getter
41+
@NoArgsConstructor
42+
@Schema(description = "문의 메모 작성 요청시 쓰이는 값입니다.")
43+
public static class AdminMemoInquiryRequest {
44+
@NotNull
45+
private Long contentId;
46+
@Schema(description = "내용이 없다면 null로 주세요")
47+
private String content;
48+
@NotNull
49+
@Schema(description = "문의 작성자의 이메일 입니다.")
50+
private String email;
51+
52+
@Builder
53+
public AdminMemoInquiryRequest(Long contentId
54+
, String content, String email) {
55+
this.contentId = contentId;
56+
this.content = content;
57+
this.email = email;
58+
}
59+
}
60+
61+
@Getter
62+
@NoArgsConstructor
63+
@Schema(description = "댓글 게시글 메모 작성 요청시 쓰이는 값입니다.")
64+
public static class AdminMemoContentRequest {
65+
@NotNull
66+
private Long contentId;
67+
@NotNull
68+
@Schema(description = "댓글이면 COMMENT 게시글이면 BOARD")
69+
private StaticDataType staticDataType;
70+
@NotNull
71+
@Schema(description = "수정이 없다면 기존값을 수정했다면 수정값을 주세요", example = "SHOW,PENDING,HIDDEN")
72+
private AdminControlType adminControlType;
73+
@Schema(description = "내용이 없다면 null로 주세요")
74+
private String content;
75+
76+
@Builder
77+
public AdminMemoContentRequest(Long contentId, StaticDataType staticDataType, String content
78+
, AdminControlType adminControlType) {
79+
this.contentId = contentId;
80+
this.staticDataType = staticDataType;
81+
this.adminControlType = adminControlType;
82+
this.content = content;
83+
}
84+
}
85+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.myteam.server.admin.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
public record CommonResponseDto() {
8+
@Getter
9+
@AllArgsConstructor
10+
public static class AdminMemoResponse{
11+
private String writerName;
12+
@Schema(example = "2025.06.06")
13+
private String createDate;
14+
private String content;
15+
public void updateCreateDate(String date) {
16+
this.createDate = date;
17+
}
18+
}
19+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.myteam.server.admin.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
import java.util.UUID;
8+
9+
public record ImprovementResponseDto() {
10+
11+
@Getter
12+
@AllArgsConstructor
13+
public final static class ResponseImprovement {
14+
private Long improvementId;
15+
private UUID publicId;
16+
private String importantStatus;
17+
private String processStatus;
18+
private Integer recommendCount;
19+
private String nickName;
20+
private String title;
21+
private String content;
22+
private String createDate;
23+
24+
public void updateCreateDate(String date) {
25+
this.createDate = date;
26+
}
27+
}
28+
29+
@Getter
30+
public final static class ResponseImprovementDetail {
31+
private String nickName;
32+
private String createDate;
33+
private String ip;
34+
private String title;
35+
private String content;
36+
private String improvementStatus;
37+
private String importantStatus;
38+
private List<CommonResponseDto.AdminMemoResponse> adminMemoResponseList;
39+
40+
public ResponseImprovementDetail(String nickName, String createDate, String ip, String title,
41+
String content,
42+
String improvementStatus, String importantStatus) {
43+
this.nickName = nickName;
44+
this.createDate = createDate;
45+
this.ip = ip;
46+
this.title = title;
47+
this.content = content;
48+
this.improvementStatus = improvementStatus;
49+
this.importantStatus = importantStatus;
50+
}
51+
52+
public void updateAdminMemoList(List<CommonResponseDto.AdminMemoResponse> adminMemoResponseList) {
53+
this.adminMemoResponseList = adminMemoResponseList;
54+
}
55+
56+
public void updateCreateDate(String date) {
57+
this.createDate = date;
58+
}
59+
}
60+
61+
@Getter
62+
@AllArgsConstructor
63+
public final static class ResponseMemberImproveList {
64+
private Long id;
65+
private String improvementStatus;
66+
private String importantDegree;
67+
private Integer recommendCount;
68+
private String nickName;
69+
private String title;
70+
private String content;
71+
private String createDate;
72+
73+
public void updateCreateDate(String date) {
74+
this.createDate = date;
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)