Skip to content

Commit 595a2bb

Browse files
authored
[Merge] #200 - 단어, 퀴즈, 매너 수정 API 구현
[Feature] #200 - 단어, 퀴즈, 매너 수정 API 구현
2 parents aa670eb + 8a97f5d commit 595a2bb

File tree

8 files changed

+128
-22
lines changed

8 files changed

+128
-22
lines changed

src/main/java/dgu/sw/domain/admin/controller/AdminController.java

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminUserResponse;
1111
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminVocaResponse;
1212
import dgu.sw.domain.admin.service.AdminService;
13+
import dgu.sw.global.ApiResponse;
1314
import io.swagger.v3.oas.annotations.tags.Tag;
1415
import lombok.RequiredArgsConstructor;
1516
import org.springframework.security.core.Authentication;
@@ -27,66 +28,94 @@ public class AdminController {
2728

2829
// 관리자 로그인
2930
@PostMapping("/login")
30-
public AdminLoginResponse login(@RequestBody AdminLoginRequest request) {
31-
return adminService.login(request);
31+
public ApiResponse<AdminLoginResponse> login(@RequestBody AdminLoginRequest request) {
32+
return ApiResponse.onSuccess(adminService.login(request));
3233
}
34+
3335
// 사용자 전체 조회
3436
@GetMapping("/users")
35-
public List<AdminUserResponse> getAllUsers(Authentication authentication) {
36-
return adminService.getAllUsers(authentication.getName());
37+
public ApiResponse<List<AdminUserResponse>> getAllUsers(Authentication authentication) {
38+
return ApiResponse.onSuccess(adminService.getAllUsers(authentication.getName()));
3739
}
3840

3941
// 매너 전체 조회
4042
@GetMapping("/manners")
41-
public List<AdminMannerResponse> getAllManners(Authentication authentication) {
42-
return adminService.getAllManners(authentication.getName());
43+
public ApiResponse<List<AdminMannerResponse>> getAllManners(Authentication authentication) {
44+
return ApiResponse.onSuccess(adminService.getAllManners(authentication.getName()));
4345
}
4446

4547
// 매너 등록
4648
@PostMapping("/manners")
47-
public void saveManner(@RequestBody AdminMannerRequest request, Authentication authentication) {
49+
public ApiResponse<String> saveManner(@RequestBody AdminMannerRequest request, Authentication authentication) {
4850
adminService.saveManner(request, authentication.getName());
51+
return ApiResponse.onSuccess("매너가 등록되었습니다.");
52+
}
53+
54+
// 매너 수정
55+
@PatchMapping("/manners/{mannerId}")
56+
public ApiResponse<String> updateManner(@PathVariable Long mannerId, @RequestBody AdminMannerRequest request, Authentication authentication) {
57+
adminService.updateManner(mannerId, request, authentication.getName());
58+
return ApiResponse.onSuccess("매너가 수정되었습니다.");
4959
}
5060

5161
// 매너 삭제
5262
@DeleteMapping("/manners/{mannerId}")
53-
public void deleteManner(@PathVariable Long mannerId, Authentication authentication) {
63+
public ApiResponse<String> deleteManner(@PathVariable Long mannerId, Authentication authentication) {
5464
adminService.deleteManner(mannerId, authentication.getName());
65+
return ApiResponse.onSuccess("매너가 삭제되었습니다.");
5566
}
5667

5768
// 퀴즈 전체 조회
5869
@GetMapping("/quizzes")
59-
public List<AdminQuizResponse> getAllQuizzes(Authentication authentication) {
60-
return adminService.getAllQuizzes(authentication.getName());
70+
public ApiResponse<List<AdminQuizResponse>> getAllQuizzes(Authentication authentication) {
71+
return ApiResponse.onSuccess(adminService.getAllQuizzes(authentication.getName()));
6172
}
6273

6374
// 퀴즈 등록
6475
@PostMapping("/quizzes")
65-
public void saveQuiz(@RequestBody AdminQuizRequest request, Authentication authentication) {
76+
public ApiResponse<String> saveQuiz(@RequestBody AdminQuizRequest request, Authentication authentication) {
6677
adminService.saveQuiz(request, authentication.getName());
78+
return ApiResponse.onSuccess("퀴즈가 등록되었습니다.");
79+
}
80+
81+
// 퀴즈 수정
82+
@PatchMapping("/quizzes/{quizId}")
83+
public ApiResponse<String> updateQuiz(@PathVariable Long quizId, @RequestBody AdminQuizRequest request, Authentication authentication) {
84+
adminService.updateQuiz(quizId, request, authentication.getName());
85+
return ApiResponse.onSuccess("퀴즈가 수정되었습니다.");
6786
}
6887

6988
// 퀴즈 삭제
7089
@DeleteMapping("/quizzes/{quizId}")
71-
public void deleteQuiz(@PathVariable Long quizId, Authentication authentication) {
90+
public ApiResponse<String> deleteQuiz(@PathVariable Long quizId, Authentication authentication) {
7291
adminService.deleteQuiz(quizId, authentication.getName());
92+
return ApiResponse.onSuccess("퀴즈가 삭제되었습니다.");
7393
}
7494

7595
// 단어 전체 조회
7696
@GetMapping("/vocas")
77-
public List<AdminVocaResponse> getAllVocas(Authentication authentication) {
78-
return adminService.getAllVocas(authentication.getName());
97+
public ApiResponse<List<AdminVocaResponse>> getAllVocas(Authentication authentication) {
98+
return ApiResponse.onSuccess(adminService.getAllVocas(authentication.getName()));
7999
}
80100

81101
// 단어 등록
82102
@PostMapping("/vocas")
83-
public void saveVoca(@RequestBody AdminVocaRequest request, Authentication authentication) {
103+
public ApiResponse<String> saveVoca(@RequestBody AdminVocaRequest request, Authentication authentication) {
84104
adminService.saveVoca(request, authentication.getName());
105+
return ApiResponse.onSuccess("단어가 등록되었습니다.");
106+
}
107+
108+
// 단어 수정
109+
@PatchMapping("/vocas/{vocaId}")
110+
public ApiResponse<String> updateVoca(@PathVariable Long vocaId, @RequestBody AdminVocaRequest request, Authentication authentication) {
111+
adminService.updateVoca(vocaId, request, authentication.getName());
112+
return ApiResponse.onSuccess("단어가 수정되었습니다.");
85113
}
86114

87115
// 단어 삭제
88116
@DeleteMapping("/vocas/{vocaId}")
89-
public void deleteVoca(@PathVariable Long vocaId, Authentication authentication) {
117+
public ApiResponse<String> deleteVoca(@PathVariable Long vocaId, Authentication authentication) {
90118
adminService.deleteVoca(vocaId, authentication.getName());
119+
return ApiResponse.onSuccess("단어가 삭제되었습니다.");
91120
}
92121
}

src/main/java/dgu/sw/domain/admin/converter/AdminConverter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public static AdminQuizResponse toAdminQuizResponse(Quiz quiz) {
6363
.answer(quiz.getAnswer())
6464
.description(quiz.getDescription())
6565
.questionDetail(quiz.getQuestionDetail())
66+
.quizLevel(quiz.getQuizLevel())
6667
.build();
6768
}
6869

src/main/java/dgu/sw/domain/admin/dto/AdminDTO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dgu.sw.domain.admin.dto;
22

3+
import dgu.sw.domain.quiz.entity.QuizLevel;
34
import dgu.sw.global.security.OAuthProvider;
45
import lombok.*;
56

@@ -39,6 +40,7 @@ public static class AdminQuizRequest {
3940
private String answer;
4041
private String description;
4142
private String questionDetail;
43+
private QuizLevel quizLevel;
4244
}
4345

4446
@Getter
@@ -97,6 +99,7 @@ public static class AdminQuizResponse {
9799
private String answer;
98100
private String description;
99101
private String questionDetail;
102+
private QuizLevel quizLevel;
100103
}
101104

102105
@Getter

src/main/java/dgu/sw/domain/admin/service/AdminService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ public interface AdminService {
1818
List<AdminMannerResponse> getAllManners(String userId);
1919
void deleteManner(Long mannerId, String userId);
2020
void saveManner(AdminMannerRequest request, String userId);
21+
void updateManner(Long mannerId, AdminMannerRequest request, String userId);
2122
List<AdminQuizResponse> getAllQuizzes(String userId);
2223
void saveQuiz(AdminQuizRequest request, String userId);
24+
void updateQuiz(Long quizId, AdminQuizRequest request, String userId);
2325
void deleteQuiz(Long quizId, String userId);
2426
List<AdminVocaResponse> getAllVocas(String userId);
2527
void saveVoca(AdminVocaRequest request, String userId);
28+
void updateVoca(Long vocaId, AdminVocaRequest request, String userId);
2629
void deleteVoca(Long vocaId, String userId);
2730
}

src/main/java/dgu/sw/domain/admin/service/AdminServiceImpl.java

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package dgu.sw.domain.admin.service;
22

3-
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminLoginResponse;
4-
import dgu.sw.domain.admin.dto.AdminDTO.AdminRequest.AdminLoginRequest;
53
import dgu.sw.domain.admin.converter.AdminConverter;
4+
import dgu.sw.domain.admin.dto.AdminDTO.AdminRequest.AdminLoginRequest;
65
import dgu.sw.domain.admin.dto.AdminDTO.AdminRequest.AdminMannerRequest;
76
import dgu.sw.domain.admin.dto.AdminDTO.AdminRequest.AdminQuizRequest;
87
import dgu.sw.domain.admin.dto.AdminDTO.AdminRequest.AdminVocaRequest;
9-
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminMannerResponse;
10-
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminQuizResponse;
11-
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminUserResponse;
12-
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.AdminVocaResponse;
8+
import dgu.sw.domain.admin.dto.AdminDTO.AdminResponse.*;
139
import dgu.sw.domain.manner.entity.Manner;
1410
import dgu.sw.domain.manner.repository.MannerRepository;
1511
import dgu.sw.domain.quiz.entity.Quiz;
1612
import dgu.sw.domain.quiz.repository.QuizRepository;
1713
import dgu.sw.domain.user.entity.Role;
1814
import dgu.sw.domain.user.entity.User;
1915
import dgu.sw.domain.user.repository.UserRepository;
16+
import dgu.sw.domain.voca.entity.Voca;
2017
import dgu.sw.domain.voca.repository.VocaRepository;
2118
import dgu.sw.global.config.redis.RedisUtil;
19+
import dgu.sw.global.exception.MannerException;
20+
import dgu.sw.global.exception.QuizException;
2221
import dgu.sw.global.exception.UserException;
22+
import dgu.sw.global.exception.VocaException;
2323
import dgu.sw.global.security.JwtTokenProvider;
2424
import dgu.sw.global.security.JwtUtil;
2525
import dgu.sw.global.status.ErrorStatus;
@@ -109,6 +109,21 @@ public void saveManner(AdminMannerRequest request, String userId) {
109109
mannerRepository.save(manner);
110110
}
111111

112+
@Override
113+
@Transactional
114+
public void updateManner(Long mannerId, AdminMannerRequest request, String userId) {
115+
checkAdminRole(userId);
116+
Manner existingManner = mannerRepository.findById(mannerId)
117+
.orElseThrow(() -> new MannerException(ErrorStatus.MANNER_NOT_FOUND));
118+
119+
existingManner.updateManner(
120+
request.getCategory(),
121+
request.getTitle(),
122+
request.getContent(),
123+
request.getImageUrl()
124+
);
125+
}
126+
112127
@Override
113128
public List<AdminQuizResponse> getAllQuizzes(String userId) {
114129
checkAdminRole(userId); // 권한 확인
@@ -125,6 +140,23 @@ public void saveQuiz(AdminQuizRequest request, String userId) {
125140
quizRepository.save(quiz);
126141
}
127142

143+
@Override
144+
@Transactional
145+
public void updateQuiz(Long quizId, AdminQuizRequest request, String userId) {
146+
checkAdminRole(userId);
147+
Quiz existingQuiz = quizRepository.findById(quizId)
148+
.orElseThrow(() -> new QuizException(ErrorStatus.QUIZ_NOT_FOUND));
149+
150+
existingQuiz.updateQuiz(
151+
request.getCategory(),
152+
request.getQuestion(),
153+
request.getAnswer(),
154+
request.getDescription(),
155+
request.getQuestionDetail(),
156+
request.getQuizLevel()
157+
);
158+
}
159+
128160
@Override
129161
@Transactional
130162
public void deleteQuiz(Long quizId, String userId) {
@@ -147,6 +179,21 @@ public void saveVoca(AdminVocaRequest request, String userId) {
147179
vocaRepository.save(AdminConverter.toVoca(request));
148180
}
149181

182+
@Override
183+
@Transactional
184+
public void updateVoca(Long vocaId, AdminVocaRequest request, String userId) {
185+
checkAdminRole(userId);
186+
Voca existingVoca = vocaRepository.findById(vocaId)
187+
.orElseThrow(() -> new VocaException(ErrorStatus.VOCA_NOT_FOUND));
188+
189+
existingVoca.updateVoca(
190+
request.getCategory(),
191+
request.getTerm(),
192+
request.getDescription(),
193+
request.getExample()
194+
);
195+
}
196+
150197
@Override
151198
@Transactional
152199
public void deleteVoca(Long vocaId, String userId) {

src/main/java/dgu/sw/domain/manner/entity/Manner.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,11 @@ public class Manner {
2525

2626
@OneToMany(mappedBy = "manner", cascade = CascadeType.ALL)
2727
private List<FavoriteManner> favoriteManner;
28+
29+
public void updateManner(String category, String title, String content, String imageUrl) {
30+
this.category = category;
31+
this.title = title;
32+
this.content = content;
33+
this.imageUrl = imageUrl;
34+
}
2835
}

src/main/java/dgu/sw/domain/quiz/entity/Quiz.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,13 @@ public class Quiz {
3535
@Enumerated(EnumType.STRING)
3636
@Column(nullable = false)
3737
private QuizLevel quizLevel = QuizLevel.MEDIUM;
38+
39+
public void updateQuiz(String category, String question, String answer, String description, String questionDetail, QuizLevel quizLevel) {
40+
this.category = category;
41+
this.question = question;
42+
this.answer = answer;
43+
this.description = description;
44+
this.questionDetail = questionDetail;
45+
this.quizLevel = quizLevel;
46+
}
3847
}

src/main/java/dgu/sw/domain/voca/entity/Voca.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,11 @@ public class Voca {
2323

2424
@OneToMany(mappedBy = "voca", cascade = CascadeType.ALL)
2525
private List<FavoriteVoca> favoriteVocas;
26+
27+
public void updateVoca(String category, String term, String description, String example) {
28+
this.category = category;
29+
this.term = term;
30+
this.description = description;
31+
this.example = example;
32+
}
2633
}

0 commit comments

Comments
 (0)