Skip to content

Commit

Permalink
YEL-163 [feat] 어드민 투표 API 구현
Browse files Browse the repository at this point in the history
YEL-163 [feat] 어드민 투표 API 구현
  • Loading branch information
euije authored Sep 17, 2023
2 parents 012ee73 + 8574781 commit a6cb48a
Show file tree
Hide file tree
Showing 18 changed files with 327 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
package com.yello.server.domain.admin.controller;

import static com.yello.server.global.common.SuccessCode.CREATE_VOTE_SUCCESS;
import static com.yello.server.global.common.SuccessCode.DELETE_COOLDOWN_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.DELETE_QUESTION_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.DELETE_USER_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.LOGIN_USER_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_COOLDOWN_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_QUESTION_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_QUESTION_DETAIL_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_USER_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_USER_DETAIL_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.UPDATE_USER_DETAIL_ADMIN_SUCCESS;
import static com.yello.server.global.common.factory.PaginationFactory.createPageable;
import static com.yello.server.global.common.factory.PaginationFactory.createPageableLimitTen;

import com.yello.server.domain.admin.dto.request.AdminLoginRequest;
import com.yello.server.domain.admin.dto.request.AdminQuestionVoteRequest;
import com.yello.server.domain.admin.dto.request.AdminUserDetailRequest;
import com.yello.server.domain.admin.dto.response.AdminCooldownResponse;
import com.yello.server.domain.admin.dto.response.AdminLoginResponse;
import com.yello.server.domain.admin.dto.response.AdminQuestionDetailResponse;
import com.yello.server.domain.admin.dto.response.AdminQuestionResponse;
import com.yello.server.domain.admin.dto.response.AdminUserDetailResponse;
import com.yello.server.domain.admin.dto.response.AdminUserResponse;
import com.yello.server.domain.admin.service.AdminService;
import com.yello.server.domain.user.entity.User;
import com.yello.server.global.common.annotation.AccessTokenUser;
import com.yello.server.global.common.dto.BaseResponse;
import com.yello.server.global.common.dto.EmptyObject;
import com.yello.server.global.common.factory.PaginationFactory;
import com.yello.server.infrastructure.firebase.service.NotificationService;
import javax.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import lombok.val;
Expand All @@ -38,6 +47,7 @@
public class AdminController {

private final AdminService adminService;
private final NotificationService notificationService;

@PostMapping("/login")
public BaseResponse<AdminLoginResponse> postAdminLogin(@RequestBody AdminLoginRequest request) {
Expand All @@ -50,8 +60,8 @@ public BaseResponse<AdminUserResponse> getUserAdmin(@AccessTokenUser User user,
@Nullable @RequestParam String field,
@Nullable @RequestParam String value) {
val data = (field == null && value == null)
? adminService.findUser(user.getId(), PaginationFactory.createPageableLimitTen(page))
: adminService.findUserContaining(user.getId(), PaginationFactory.createPageableLimitTen(page),
? adminService.findUser(user.getId(), createPageableLimitTen(page))
: adminService.findUserContaining(user.getId(), createPageableLimitTen(page),
field, value);
return BaseResponse.success(READ_USER_ADMIN_SUCCESS, data);
}
Expand Down Expand Up @@ -79,8 +89,8 @@ public BaseResponse deleteUser(@AccessTokenUser User user, @RequestParam Long us
public BaseResponse<AdminCooldownResponse> getCooldownAdmin(@AccessTokenUser User user, @RequestParam Integer page,
@Nullable @RequestParam String yelloId) {
val data = yelloId == null
? adminService.findCooldown(user.getId(), PaginationFactory.createPageableLimitTen(page))
: adminService.findCooldownContaining(user.getId(), PaginationFactory.createPageableLimitTen(page),
? adminService.findCooldown(user.getId(), createPageableLimitTen(page))
: adminService.findCooldownContaining(user.getId(), createPageableLimitTen(page),
yelloId);
return BaseResponse.success(READ_COOLDOWN_ADMIN_SUCCESS, data);
}
Expand All @@ -90,4 +100,33 @@ public BaseResponse deleteCooldown(@AccessTokenUser User user, @RequestParam Lon
adminService.deleteCooldown(user.getId(), cooldownId);
return BaseResponse.success(DELETE_COOLDOWN_ADMIN_SUCCESS);
}

@GetMapping("/question")
public BaseResponse<AdminQuestionResponse> getQuestionAdmin(@AccessTokenUser User user,
@RequestParam Integer page) {
val data = adminService.findQuestion(user.getId(), createPageable(page, 20));
return BaseResponse.success(READ_QUESTION_ADMIN_SUCCESS, data);
}

@GetMapping("/question/{id}")
public BaseResponse<AdminQuestionDetailResponse> getQuestionDetailAdmin(@AccessTokenUser User user,
@PathVariable Long id) {
val data = adminService.findQuestionDetail(user.getId(), id);
return BaseResponse.success(READ_QUESTION_DETAIL_ADMIN_SUCCESS, data);
}

@PostMapping("/question/{id}")
public BaseResponse<EmptyObject> postQuestionSendAdmin(@AccessTokenUser User user,
@PathVariable Long id, @RequestBody AdminQuestionVoteRequest request) {
val data = adminService.createVote(user.getId(), id, request);
data.forEach(notificationService::sendYelloNotification);

return BaseResponse.success(CREATE_VOTE_SUCCESS, EmptyObject.builder().build());
}

@DeleteMapping("/question")
public BaseResponse deleteQuestion(@AccessTokenUser User user, @RequestParam Long questionId) {
adminService.deleteQuestion(user.getId(), questionId);
return BaseResponse.success(DELETE_QUESTION_ADMIN_SUCCESS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.yello.server.domain.admin.dto.request;

import lombok.Builder;

@Builder
public record AdminQuestionVoteContentVO(
Long senderId,
Long receiverId,
String keyword,
Integer colorIndex
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.yello.server.domain.admin.dto.request;

import java.util.List;
import lombok.Builder;

@Builder
public record AdminQuestionVoteRequest(
List<AdminQuestionVoteContentVO> voteContentList
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.yello.server.domain.admin.dto.response;

import com.yello.server.domain.question.entity.Question;
import lombok.Builder;

@Builder
public record AdminQuestionContentVO(
Long id,
String nameHead,
String nameFoot,
String keywordHead,
String keywordFoot
) {

public static AdminQuestionContentVO of(Question question) {

return AdminQuestionContentVO.builder()
.id(question.getId())
.nameHead(question.getNameHead())
.nameFoot(question.getNameFoot())
.keywordHead(question.getKeywordHead())
.keywordFoot(question.getKeywordFoot())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.yello.server.domain.admin.dto.response;

import com.yello.server.domain.keyword.entity.Keyword;
import com.yello.server.domain.question.entity.Question;
import java.util.List;
import lombok.Builder;

@Builder
public record AdminQuestionDetailResponse(
Long id,
String nameHead,
String nameFoot,
String keywordHead,
String keywordFoot,
List<String> keywordList
) {

public static AdminQuestionDetailResponse of(Question question) {
return AdminQuestionDetailResponse.builder()
.id(question.getId())
.nameHead(question.getNameHead())
.nameFoot(question.getNameFoot())
.keywordHead(question.getKeywordHead())
.keywordFoot(question.getKeywordFoot())
.keywordList(question.getKeywordList()
.stream()
.map((Keyword::getKeywordName))
.toList())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.yello.server.domain.admin.dto.response;

import java.util.List;
import lombok.Builder;

@Builder
public record AdminQuestionResponse(
Long pageCount,
Long totalCount,
List<AdminQuestionContentVO> questionList
) {

public static AdminQuestionResponse of(Long totalCount, List<AdminQuestionContentVO> questionList) {
return AdminQuestionResponse.builder()
.pageCount(totalCount % 20 == 0 ? totalCount / 20 : totalCount / 20 + 1)
.totalCount(totalCount)
.questionList(questionList)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public record AdminUserContentVO(
String name,
String yelloId,
String group,
String imageUrl,
String createdAt,
String deletedAt
) {
Expand All @@ -24,6 +25,7 @@ public static AdminUserContentVO of(User user) {
.name(user.getName())
.yelloId(user.getYelloId())
.group(userGroup == null ? "" : userGroup.toString())
.imageUrl(user.getProfileImage())
.createdAt(toDateFormattedString(user.getCreatedAt()))
.deletedAt(toDateFormattedString(user.getDeletedAt()))
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@
import static com.yello.server.global.common.ErrorCode.YELLOID_CONFLICT_USER_EXCEPTION;

import com.yello.server.domain.admin.dto.request.AdminLoginRequest;
import com.yello.server.domain.admin.dto.request.AdminQuestionVoteRequest;
import com.yello.server.domain.admin.dto.request.AdminUserDetailRequest;
import com.yello.server.domain.admin.dto.response.AdminCooldownContentVO;
import com.yello.server.domain.admin.dto.response.AdminCooldownResponse;
import com.yello.server.domain.admin.dto.response.AdminLoginResponse;
import com.yello.server.domain.admin.dto.response.AdminQuestionContentVO;
import com.yello.server.domain.admin.dto.response.AdminQuestionDetailResponse;
import com.yello.server.domain.admin.dto.response.AdminQuestionResponse;
import com.yello.server.domain.admin.dto.response.AdminUserContentVO;
import com.yello.server.domain.admin.dto.response.AdminUserDetailResponse;
import com.yello.server.domain.admin.dto.response.AdminUserResponse;
Expand All @@ -20,15 +24,20 @@
import com.yello.server.domain.authorization.service.TokenProvider;
import com.yello.server.domain.cooldown.entity.Cooldown;
import com.yello.server.domain.cooldown.repository.CooldownRepository;
import com.yello.server.domain.question.entity.Question;
import com.yello.server.domain.question.repository.QuestionRepository;
import com.yello.server.domain.user.entity.Gender;
import com.yello.server.domain.user.entity.User;
import com.yello.server.domain.user.exception.UserConflictException;
import com.yello.server.domain.user.repository.UserRepository;
import com.yello.server.domain.user.service.UserManager;
import com.yello.server.domain.vote.entity.Vote;
import com.yello.server.domain.vote.repository.VoteRepository;
import com.yello.server.global.common.dto.EmptyObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Pageable;
Expand All @@ -44,6 +53,8 @@ public class AdminService {
private final UserManager userManager;
private final TokenProvider tokenProvider;
private final CooldownRepository cooldownRepository;
private final QuestionRepository questionRepository;
private final VoteRepository voteRepository;
private final UserAdminRepository userAdminRepository;

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

// logic
final User user = userRepository.getById(userId);
final User user = userRepository.getByIdNotFiltered(userId);

userRepository.findByUuidNotFiltered(request.uuid())
.ifPresent(action -> {
Expand Down Expand Up @@ -154,7 +165,7 @@ public void deleteUser(Long adminId, Long userId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);
final User user = userRepository.getById(userId);
final User user = userRepository.getByIdNotFiltered(userId);

// logic
userRepository.delete(user);
Expand Down Expand Up @@ -198,4 +209,70 @@ public void deleteCooldown(Long adminId, Long cooldownId) {
// logic
cooldownRepository.delete(cooldown);
}

public AdminQuestionResponse findQuestion(Long adminId, Pageable page) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);

// logic
final Long totalCount = questionRepository.count();
final List<AdminQuestionContentVO> list = questionRepository.findAll(page).stream()
.map(AdminQuestionContentVO::of)
.toList();

return AdminQuestionResponse.of(totalCount, list);
}

public AdminQuestionDetailResponse findQuestionDetail(Long adminId, Long questionId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);
final Question question = questionRepository.getById(questionId);

// logic

return AdminQuestionDetailResponse.of(question);
}

@Transactional
public List<Vote> createVote(Long adminId, Long questionId, AdminQuestionVoteRequest request) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);
final Question question = questionRepository.getById(questionId);

// logic
final List<Vote> result = new ArrayList<>();
request.voteContentList().forEach((voteContent -> {
final Optional<User> sender = userRepository.findByIdNotFiltered(voteContent.senderId());
final Optional<User> receiver = userRepository.findByIdNotFiltered(voteContent.receiverId());

if (sender.isPresent() && receiver.isPresent()) {
final Vote vote = Vote.createVote(
voteContent.keyword(),
sender.get(),
receiver.get(),
question,
voteContent.colorIndex()
);

voteRepository.save(vote);
result.add(vote);
}
}));

return result;
}

@Transactional
public void deleteQuestion(Long adminId, Long questionId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);
final Question question = questionRepository.getById(questionId);

// logic
questionRepository.delete(question);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,24 @@
import com.yello.server.domain.question.entity.Question;
import java.util.List;
import java.util.Optional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface QuestionRepository {

Long count();

List<Question> findAll();

Question findById(Long id);
Page<Question> findAll(Pageable page);

Question getById(Long id);

Optional<Question> findById(Long id);

Question save(Question question);

Optional<Question> findByQuestionContent(String nameHead, String nameFoot, String keywordHead, String keywordFoot);

void delete(Question question);
}
Loading

0 comments on commit a6cb48a

Please sign in to comment.