Skip to content

Commit 64977b8

Browse files
author
Lee Euije
authored
YEL-163 [deploy] v1.197
YEL-163 [deploy] v1.197
2 parents 8890aea + beb9030 commit 64977b8

18 files changed

+327
-23
lines changed

src/main/java/com/yello/server/domain/admin/controller/AdminController.java

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
11
package com.yello.server.domain.admin.controller;
22

3+
import static com.yello.server.global.common.SuccessCode.CREATE_VOTE_SUCCESS;
34
import static com.yello.server.global.common.SuccessCode.DELETE_COOLDOWN_ADMIN_SUCCESS;
5+
import static com.yello.server.global.common.SuccessCode.DELETE_QUESTION_ADMIN_SUCCESS;
46
import static com.yello.server.global.common.SuccessCode.DELETE_USER_ADMIN_SUCCESS;
57
import static com.yello.server.global.common.SuccessCode.LOGIN_USER_ADMIN_SUCCESS;
68
import static com.yello.server.global.common.SuccessCode.READ_COOLDOWN_ADMIN_SUCCESS;
9+
import static com.yello.server.global.common.SuccessCode.READ_QUESTION_ADMIN_SUCCESS;
10+
import static com.yello.server.global.common.SuccessCode.READ_QUESTION_DETAIL_ADMIN_SUCCESS;
711
import static com.yello.server.global.common.SuccessCode.READ_USER_ADMIN_SUCCESS;
812
import static com.yello.server.global.common.SuccessCode.READ_USER_DETAIL_ADMIN_SUCCESS;
913
import static com.yello.server.global.common.SuccessCode.UPDATE_USER_DETAIL_ADMIN_SUCCESS;
14+
import static com.yello.server.global.common.factory.PaginationFactory.createPageable;
15+
import static com.yello.server.global.common.factory.PaginationFactory.createPageableLimitTen;
1016

1117
import com.yello.server.domain.admin.dto.request.AdminLoginRequest;
18+
import com.yello.server.domain.admin.dto.request.AdminQuestionVoteRequest;
1219
import com.yello.server.domain.admin.dto.request.AdminUserDetailRequest;
1320
import com.yello.server.domain.admin.dto.response.AdminCooldownResponse;
1421
import com.yello.server.domain.admin.dto.response.AdminLoginResponse;
22+
import com.yello.server.domain.admin.dto.response.AdminQuestionDetailResponse;
23+
import com.yello.server.domain.admin.dto.response.AdminQuestionResponse;
1524
import com.yello.server.domain.admin.dto.response.AdminUserDetailResponse;
1625
import com.yello.server.domain.admin.dto.response.AdminUserResponse;
1726
import com.yello.server.domain.admin.service.AdminService;
1827
import com.yello.server.domain.user.entity.User;
1928
import com.yello.server.global.common.annotation.AccessTokenUser;
2029
import com.yello.server.global.common.dto.BaseResponse;
2130
import com.yello.server.global.common.dto.EmptyObject;
22-
import com.yello.server.global.common.factory.PaginationFactory;
31+
import com.yello.server.infrastructure.firebase.service.NotificationService;
2332
import javax.annotation.Nullable;
2433
import lombok.RequiredArgsConstructor;
2534
import lombok.val;
@@ -38,6 +47,7 @@
3847
public class AdminController {
3948

4049
private final AdminService adminService;
50+
private final NotificationService notificationService;
4151

4252
@PostMapping("/login")
4353
public BaseResponse<AdminLoginResponse> postAdminLogin(@RequestBody AdminLoginRequest request) {
@@ -50,8 +60,8 @@ public BaseResponse<AdminUserResponse> getUserAdmin(@AccessTokenUser User user,
5060
@Nullable @RequestParam String field,
5161
@Nullable @RequestParam String value) {
5262
val data = (field == null && value == null)
53-
? adminService.findUser(user.getId(), PaginationFactory.createPageableLimitTen(page))
54-
: adminService.findUserContaining(user.getId(), PaginationFactory.createPageableLimitTen(page),
63+
? adminService.findUser(user.getId(), createPageableLimitTen(page))
64+
: adminService.findUserContaining(user.getId(), createPageableLimitTen(page),
5565
field, value);
5666
return BaseResponse.success(READ_USER_ADMIN_SUCCESS, data);
5767
}
@@ -79,8 +89,8 @@ public BaseResponse deleteUser(@AccessTokenUser User user, @RequestParam Long us
7989
public BaseResponse<AdminCooldownResponse> getCooldownAdmin(@AccessTokenUser User user, @RequestParam Integer page,
8090
@Nullable @RequestParam String yelloId) {
8191
val data = yelloId == null
82-
? adminService.findCooldown(user.getId(), PaginationFactory.createPageableLimitTen(page))
83-
: adminService.findCooldownContaining(user.getId(), PaginationFactory.createPageableLimitTen(page),
92+
? adminService.findCooldown(user.getId(), createPageableLimitTen(page))
93+
: adminService.findCooldownContaining(user.getId(), createPageableLimitTen(page),
8494
yelloId);
8595
return BaseResponse.success(READ_COOLDOWN_ADMIN_SUCCESS, data);
8696
}
@@ -90,4 +100,33 @@ public BaseResponse deleteCooldown(@AccessTokenUser User user, @RequestParam Lon
90100
adminService.deleteCooldown(user.getId(), cooldownId);
91101
return BaseResponse.success(DELETE_COOLDOWN_ADMIN_SUCCESS);
92102
}
103+
104+
@GetMapping("/question")
105+
public BaseResponse<AdminQuestionResponse> getQuestionAdmin(@AccessTokenUser User user,
106+
@RequestParam Integer page) {
107+
val data = adminService.findQuestion(user.getId(), createPageable(page, 20));
108+
return BaseResponse.success(READ_QUESTION_ADMIN_SUCCESS, data);
109+
}
110+
111+
@GetMapping("/question/{id}")
112+
public BaseResponse<AdminQuestionDetailResponse> getQuestionDetailAdmin(@AccessTokenUser User user,
113+
@PathVariable Long id) {
114+
val data = adminService.findQuestionDetail(user.getId(), id);
115+
return BaseResponse.success(READ_QUESTION_DETAIL_ADMIN_SUCCESS, data);
116+
}
117+
118+
@PostMapping("/question/{id}")
119+
public BaseResponse<EmptyObject> postQuestionSendAdmin(@AccessTokenUser User user,
120+
@PathVariable Long id, @RequestBody AdminQuestionVoteRequest request) {
121+
val data = adminService.createVote(user.getId(), id, request);
122+
data.forEach(notificationService::sendYelloNotification);
123+
124+
return BaseResponse.success(CREATE_VOTE_SUCCESS, EmptyObject.builder().build());
125+
}
126+
127+
@DeleteMapping("/question")
128+
public BaseResponse deleteQuestion(@AccessTokenUser User user, @RequestParam Long questionId) {
129+
adminService.deleteQuestion(user.getId(), questionId);
130+
return BaseResponse.success(DELETE_QUESTION_ADMIN_SUCCESS);
131+
}
93132
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.yello.server.domain.admin.dto.request;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public record AdminQuestionVoteContentVO(
7+
Long senderId,
8+
Long receiverId,
9+
String keyword,
10+
Integer colorIndex
11+
) {
12+
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.yello.server.domain.admin.dto.request;
2+
3+
import java.util.List;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record AdminQuestionVoteRequest(
8+
List<AdminQuestionVoteContentVO> voteContentList
9+
) {
10+
11+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.yello.server.domain.admin.dto.response;
2+
3+
import com.yello.server.domain.question.entity.Question;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record AdminQuestionContentVO(
8+
Long id,
9+
String nameHead,
10+
String nameFoot,
11+
String keywordHead,
12+
String keywordFoot
13+
) {
14+
15+
public static AdminQuestionContentVO of(Question question) {
16+
17+
return AdminQuestionContentVO.builder()
18+
.id(question.getId())
19+
.nameHead(question.getNameHead())
20+
.nameFoot(question.getNameFoot())
21+
.keywordHead(question.getKeywordHead())
22+
.keywordFoot(question.getKeywordFoot())
23+
.build();
24+
}
25+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.yello.server.domain.admin.dto.response;
2+
3+
import com.yello.server.domain.keyword.entity.Keyword;
4+
import com.yello.server.domain.question.entity.Question;
5+
import java.util.List;
6+
import lombok.Builder;
7+
8+
@Builder
9+
public record AdminQuestionDetailResponse(
10+
Long id,
11+
String nameHead,
12+
String nameFoot,
13+
String keywordHead,
14+
String keywordFoot,
15+
List<String> keywordList
16+
) {
17+
18+
public static AdminQuestionDetailResponse of(Question question) {
19+
return AdminQuestionDetailResponse.builder()
20+
.id(question.getId())
21+
.nameHead(question.getNameHead())
22+
.nameFoot(question.getNameFoot())
23+
.keywordHead(question.getKeywordHead())
24+
.keywordFoot(question.getKeywordFoot())
25+
.keywordList(question.getKeywordList()
26+
.stream()
27+
.map((Keyword::getKeywordName))
28+
.toList())
29+
.build();
30+
}
31+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.yello.server.domain.admin.dto.response;
2+
3+
import java.util.List;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record AdminQuestionResponse(
8+
Long pageCount,
9+
Long totalCount,
10+
List<AdminQuestionContentVO> questionList
11+
) {
12+
13+
public static AdminQuestionResponse of(Long totalCount, List<AdminQuestionContentVO> questionList) {
14+
return AdminQuestionResponse.builder()
15+
.pageCount(totalCount % 20 == 0 ? totalCount / 20 : totalCount / 20 + 1)
16+
.totalCount(totalCount)
17+
.questionList(questionList)
18+
.build();
19+
}
20+
}

src/main/java/com/yello/server/domain/admin/dto/response/AdminUserContentVO.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public record AdminUserContentVO(
1212
String name,
1313
String yelloId,
1414
String group,
15+
String imageUrl,
1516
String createdAt,
1617
String deletedAt
1718
) {
@@ -24,6 +25,7 @@ public static AdminUserContentVO of(User user) {
2425
.name(user.getName())
2526
.yelloId(user.getYelloId())
2627
.group(userGroup == null ? "" : userGroup.toString())
28+
.imageUrl(user.getProfileImage())
2729
.createdAt(toDateFormattedString(user.getCreatedAt()))
2830
.deletedAt(toDateFormattedString(user.getDeletedAt()))
2931
.build();

src/main/java/com/yello/server/domain/admin/service/AdminService.java

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@
77
import static com.yello.server.global.common.ErrorCode.YELLOID_CONFLICT_USER_EXCEPTION;
88

99
import com.yello.server.domain.admin.dto.request.AdminLoginRequest;
10+
import com.yello.server.domain.admin.dto.request.AdminQuestionVoteRequest;
1011
import com.yello.server.domain.admin.dto.request.AdminUserDetailRequest;
1112
import com.yello.server.domain.admin.dto.response.AdminCooldownContentVO;
1213
import com.yello.server.domain.admin.dto.response.AdminCooldownResponse;
1314
import com.yello.server.domain.admin.dto.response.AdminLoginResponse;
15+
import com.yello.server.domain.admin.dto.response.AdminQuestionContentVO;
16+
import com.yello.server.domain.admin.dto.response.AdminQuestionDetailResponse;
17+
import com.yello.server.domain.admin.dto.response.AdminQuestionResponse;
1418
import com.yello.server.domain.admin.dto.response.AdminUserContentVO;
1519
import com.yello.server.domain.admin.dto.response.AdminUserDetailResponse;
1620
import com.yello.server.domain.admin.dto.response.AdminUserResponse;
@@ -20,15 +24,20 @@
2024
import com.yello.server.domain.authorization.service.TokenProvider;
2125
import com.yello.server.domain.cooldown.entity.Cooldown;
2226
import com.yello.server.domain.cooldown.repository.CooldownRepository;
27+
import com.yello.server.domain.question.entity.Question;
28+
import com.yello.server.domain.question.repository.QuestionRepository;
2329
import com.yello.server.domain.user.entity.Gender;
2430
import com.yello.server.domain.user.entity.User;
2531
import com.yello.server.domain.user.exception.UserConflictException;
2632
import com.yello.server.domain.user.repository.UserRepository;
2733
import com.yello.server.domain.user.service.UserManager;
34+
import com.yello.server.domain.vote.entity.Vote;
35+
import com.yello.server.domain.vote.repository.VoteRepository;
2836
import com.yello.server.global.common.dto.EmptyObject;
2937
import java.util.ArrayList;
3038
import java.util.List;
3139
import java.util.Objects;
40+
import java.util.Optional;
3241
import lombok.RequiredArgsConstructor;
3342
import org.springframework.beans.factory.annotation.Value;
3443
import org.springframework.data.domain.Pageable;
@@ -44,6 +53,8 @@ public class AdminService {
4453
private final UserManager userManager;
4554
private final TokenProvider tokenProvider;
4655
private final CooldownRepository cooldownRepository;
56+
private final QuestionRepository questionRepository;
57+
private final VoteRepository voteRepository;
4758
private final UserAdminRepository userAdminRepository;
4859

4960
@Value("${admin.password}")
@@ -123,7 +134,7 @@ public EmptyObject updateUserDetail(Long adminId, Long userId, AdminUserDetailRe
123134
userAdminRepository.getByUser(admin);
124135

125136
// logic
126-
final User user = userRepository.getById(userId);
137+
final User user = userRepository.getByIdNotFiltered(userId);
127138

128139
userRepository.findByUuidNotFiltered(request.uuid())
129140
.ifPresent(action -> {
@@ -154,7 +165,7 @@ public void deleteUser(Long adminId, Long userId) {
154165
// exception
155166
final User admin = userRepository.getById(adminId);
156167
userAdminRepository.getByUser(admin);
157-
final User user = userRepository.getById(userId);
168+
final User user = userRepository.getByIdNotFiltered(userId);
158169

159170
// logic
160171
userRepository.delete(user);
@@ -198,4 +209,70 @@ public void deleteCooldown(Long adminId, Long cooldownId) {
198209
// logic
199210
cooldownRepository.delete(cooldown);
200211
}
212+
213+
public AdminQuestionResponse findQuestion(Long adminId, Pageable page) {
214+
// exception
215+
final User admin = userRepository.getById(adminId);
216+
userAdminRepository.getByUser(admin);
217+
218+
// logic
219+
final Long totalCount = questionRepository.count();
220+
final List<AdminQuestionContentVO> list = questionRepository.findAll(page).stream()
221+
.map(AdminQuestionContentVO::of)
222+
.toList();
223+
224+
return AdminQuestionResponse.of(totalCount, list);
225+
}
226+
227+
public AdminQuestionDetailResponse findQuestionDetail(Long adminId, Long questionId) {
228+
// exception
229+
final User admin = userRepository.getById(adminId);
230+
userAdminRepository.getByUser(admin);
231+
final Question question = questionRepository.getById(questionId);
232+
233+
// logic
234+
235+
return AdminQuestionDetailResponse.of(question);
236+
}
237+
238+
@Transactional
239+
public List<Vote> createVote(Long adminId, Long questionId, AdminQuestionVoteRequest request) {
240+
// exception
241+
final User admin = userRepository.getById(adminId);
242+
userAdminRepository.getByUser(admin);
243+
final Question question = questionRepository.getById(questionId);
244+
245+
// logic
246+
final List<Vote> result = new ArrayList<>();
247+
request.voteContentList().forEach((voteContent -> {
248+
final Optional<User> sender = userRepository.findByIdNotFiltered(voteContent.senderId());
249+
final Optional<User> receiver = userRepository.findByIdNotFiltered(voteContent.receiverId());
250+
251+
if (sender.isPresent() && receiver.isPresent()) {
252+
final Vote vote = Vote.createVote(
253+
voteContent.keyword(),
254+
sender.get(),
255+
receiver.get(),
256+
question,
257+
voteContent.colorIndex()
258+
);
259+
260+
voteRepository.save(vote);
261+
result.add(vote);
262+
}
263+
}));
264+
265+
return result;
266+
}
267+
268+
@Transactional
269+
public void deleteQuestion(Long adminId, Long questionId) {
270+
// exception
271+
final User admin = userRepository.getById(adminId);
272+
userAdminRepository.getByUser(admin);
273+
final Question question = questionRepository.getById(questionId);
274+
275+
// logic
276+
questionRepository.delete(question);
277+
}
201278
}

src/main/java/com/yello/server/domain/question/repository/QuestionRepository.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,24 @@
33
import com.yello.server.domain.question.entity.Question;
44
import java.util.List;
55
import java.util.Optional;
6+
import org.springframework.data.domain.Page;
7+
import org.springframework.data.domain.Pageable;
68

79
public interface QuestionRepository {
810

11+
Long count();
12+
913
List<Question> findAll();
1014

11-
Question findById(Long id);
15+
Page<Question> findAll(Pageable page);
16+
17+
Question getById(Long id);
18+
19+
Optional<Question> findById(Long id);
1220

1321
Question save(Question question);
1422

1523
Optional<Question> findByQuestionContent(String nameHead, String nameFoot, String keywordHead, String keywordFoot);
24+
25+
void delete(Question question);
1626
}

0 commit comments

Comments
 (0)