Skip to content

Commit

Permalink
Merge pull request #61 from gutanbug/dev
Browse files Browse the repository at this point in the history
feat #38 : 관리자 권한의 미승인 인증글 조회 기능 추가
  • Loading branch information
kjungw1025 authored Mar 17, 2024
2 parents ea1180e + df64d1e commit 77bb604
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,15 @@
import com.renew.sw.mentoring.domain.excel.TeamParser;
import com.renew.sw.mentoring.domain.excel.dto.RequestMissionExcelDto;
import com.renew.sw.mentoring.domain.excel.dto.RequestTeamExcelDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedMissionBoardDto;
import com.renew.sw.mentoring.global.auth.jwt.AppAuthentication;
import com.renew.sw.mentoring.global.auth.role.AdminAuth;
import com.renew.sw.mentoring.global.model.dto.ResponsePage;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

Expand Down Expand Up @@ -50,4 +57,16 @@ public void parseMissions(@Valid @ModelAttribute RequestMissionExcelDto dto) {
public void createAdmin(@RequestBody RequestCreateAdminDto dto) {
adminService.createAdmin(dto);
}

/**
* 미승인된 글 전체 조회 (관리자용)
*/
@GetMapping("/unapproved/mission")
@AdminAuth
public ResponsePage<SummarizedMissionBoardDto> unapprovedList(AppAuthentication auth,
@RequestParam(defaultValue = "10") int bodySize,
@ParameterObject Pageable pageable) {
Page<SummarizedMissionBoardDto> unapprovedList = adminService.unapprovedList(auth.getUserRole(), pageable, bodySize);
return new ResponsePage<>(unapprovedList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,37 @@

import com.renew.sw.mentoring.domain.admin.exception.AlreadyStudentIdException;
import com.renew.sw.mentoring.domain.admin.request.RequestCreateAdminDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.type.MissionBoard;
import com.renew.sw.mentoring.domain.post.repository.MissionBoardRepository;
import com.renew.sw.mentoring.domain.team.exception.TeamNotFoundException;
import com.renew.sw.mentoring.domain.team.model.entity.Team;
import com.renew.sw.mentoring.domain.team.repository.TeamRepository;
import com.renew.sw.mentoring.domain.user.model.UserRole;
import com.renew.sw.mentoring.domain.user.model.entity.User;
import com.renew.sw.mentoring.domain.user.repository.UserRepository;
import com.renew.sw.mentoring.global.error.exception.NotGrantedException;
import com.renew.sw.mentoring.infra.s3.service.AWSObjectStorageService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Slf4j
@Transactional(readOnly = true)
public class AdminService {

private final TeamRepository teamRepository;
private final UserRepository userRepository;
private final MissionBoardRepository missionBoardRepository;

private final AWSObjectStorageService s3service;

private final PasswordEncoder passwordEncoder;

Expand Down Expand Up @@ -60,6 +72,29 @@ public void createAdmin(RequestCreateAdminDto dto) {
}
}

/**
* 미승인된 미션 인증글 조회
*/
public Page<SummarizedMissionBoardDto> unapprovedList(UserRole userRole, Pageable pageable, int bodySize) {
if (!userRole.isAdmin()) {
throw new NotGrantedException();
}
pageable = makeToAsc(pageable);
Page<MissionBoard> unapprovedList = missionBoardRepository.findAllProgressPosts(pageable);
return unapprovedList.map((missionBoard) -> makeListDto(bodySize, missionBoard));
}

private SummarizedMissionBoardDto makeListDto(int bodySize, MissionBoard missionBoard) {
return new SummarizedMissionBoardDto(s3service, bodySize, missionBoard);
}

/**
* 오름차순으로 페이징 방식 변경
*/
private static PageRequest makeToAsc(Pageable pageable) {
return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort().ascending());
}

private void checkAlreadyNickname(String nickname) {
if (userRepository.findByNickname(nickname).isPresent()) {
throw new AlreadyStudentIdException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void parseMission(MultipartFile file) {

//미션 이름
if(c == 1 && cell.getStringCellValue().contains(".")) {
name = cell.getStringCellValue().trim();
name = cell.getStringCellValue().substring(cell.getStringCellValue().indexOf(".") + 1).trim();
//미션 설명
} else if (c == 2 && cell.getStringCellValue().length() >= 2) {
description = cell.getStringCellValue().trim();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ public interface BonusMissionRepository extends JpaRepository<BonusMission, Long

@Query("select bm from BonusMission bm where bm.mission.id = :missionId")
List<BonusMission> findAllByMissionId(@Param("missionId") Long missionId);


}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.renew.sw.mentoring.domain.post.controller;

import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedGenericPostDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.request.RequestCreateMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.request.RequestUpdateMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.response.ResponseMissionBoardDto;
import com.renew.sw.mentoring.domain.post.repository.MissionBoardRepository;
import com.renew.sw.mentoring.domain.post.service.GenericPostService;
import com.renew.sw.mentoring.domain.post.service.MissionBoardService;
import com.renew.sw.mentoring.global.auth.jwt.AppAuthentication;
import com.renew.sw.mentoring.global.auth.role.MentorAuth;
Expand Down Expand Up @@ -52,10 +50,10 @@ public ResponseIdDto create(AppAuthentication auth,
* @return 페이징된 미션 인증 게시글 목록
*/
@GetMapping
public ResponsePage<SummarizedGenericPostDto> list(@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "10") int bodySize,
@ParameterObject Pageable pageable) {
Page<SummarizedGenericPostDto> list = missionBoardService.list(keyword, pageable, bodySize);
public ResponsePage<SummarizedMissionBoardDto> list(@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "10") int bodySize,
@ParameterObject Pageable pageable) {
Page<SummarizedMissionBoardDto> list = missionBoardService.list(keyword, pageable, bodySize);
return new ResponsePage<>(list);
}

Expand All @@ -82,10 +80,10 @@ public ResponseMissionBoardDto findOne(AppAuthentication auth,
*/
@GetMapping("/my")
@MentorAuth
public ResponsePage<SummarizedGenericPostDto> listMyPosts(AppAuthentication auth,
public ResponsePage<SummarizedMissionBoardDto> listMyPosts(AppAuthentication auth,
@ParameterObject Pageable pageable,
@RequestParam(defaultValue = "10") int bodySize) {
Page<SummarizedGenericPostDto> posts = missionBoardService.listMyPosts(auth.getUserId(), pageable, bodySize);
Page<SummarizedMissionBoardDto> posts = missionBoardService.listMyPosts(auth.getUserId(), pageable, bodySize);
return new ResponsePage<>(posts);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.renew.sw.mentoring.domain.post.model.entity.dto.list;

import com.renew.sw.mentoring.domain.post.model.entity.RegisterStatus;
import com.renew.sw.mentoring.domain.post.model.entity.type.MissionBoard;
import com.renew.sw.mentoring.infra.s3.service.AWSObjectStorageService;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;

@Getter
public class SummarizedMissionBoardDto extends SummarizedGenericPostDto {

@Schema(description = "미션 아이디", example = "1")
private final Long missionId;

@Schema(description = "보너스 미션 성공 여부", example = "false")
private final boolean isBonusMissionSuccessful;

@Schema(description = "등록 상태", example = "IN_PROGRESS")
private final RegisterStatus registerStatus;

public SummarizedMissionBoardDto(AWSObjectStorageService s3service, int bodySize, MissionBoard missionBoard) {
super(s3service, bodySize, missionBoard);
this.missionId = missionBoard.getMissionId();
this.isBonusMissionSuccessful = missionBoard.isBonusMissionSuccessful();
this.registerStatus = missionBoard.getRegisterStatus();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,7 @@
public interface MissionBoardRepository extends GenericPostRepository<MissionBoard> {
@Query("select m from MissionBoard m where m.user.id = :userId and m.registerStatus = 'IN_PROGRESS' ")
Page<MissionBoard> findAllByUserId(@Param("userId") Long userId, Pageable pageable);

@Query("select m from MissionBoard m where m.registerStatus = 'IN_PROGRESS' ")
Page<MissionBoard> findAllProgressPosts(Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.renew.sw.mentoring.domain.post.exception.PostNotFoundException;
import com.renew.sw.mentoring.domain.post.model.entity.Post;
import com.renew.sw.mentoring.domain.post.model.entity.PostFile;
import com.renew.sw.mentoring.domain.post.model.entity.PostImage;
import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedGenericPostDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.request.RequestCreateGenericPostDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.request.RequestUpdateGenericPostDto;
Expand Down Expand Up @@ -101,16 +102,16 @@ private void attachImages(List<MultipartFile> dtoImages, E post) {
ImageRequest.ofList(dtoImages)
);

List<PostFile> postImages = new ArrayList<>();
List<PostImage> postImages = new ArrayList<>();
for (UploadedImage image : images) {
PostFile.PostFileBuilder builder = PostFile.builder()
.fileName(image.getOriginalImageName())
PostImage.PostImageBuilder builder = PostImage.builder()
.imageName(image.getOriginalImageName())
.contentType(image.getMimeType().toString())
.fileId(image.getFileId());
.imageId(image.getFileId());

postImages.add(builder.build());
}
for (PostFile file : postImages) {
for (PostImage file : postImages) {
file.changePost(post);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.renew.sw.mentoring.domain.post.service;

import com.renew.sw.mentoring.domain.mission.exception.MissionNotFoundException;
import com.renew.sw.mentoring.domain.mission.repository.MissionRepository;
import com.renew.sw.mentoring.domain.post.exception.PostNotFoundException;
import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedGenericPostDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.list.SummarizedMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.request.RequestCreateMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.request.RequestUpdateMissionBoardDto;
import com.renew.sw.mentoring.domain.post.model.entity.dto.response.ResponseMissionBoardDto;
Expand All @@ -11,6 +14,7 @@
import com.renew.sw.mentoring.domain.post.repository.spec.PostSpec;
import com.renew.sw.mentoring.domain.user.model.UserRole;
import com.renew.sw.mentoring.global.error.exception.NotGrantedException;
import com.renew.sw.mentoring.infra.s3.service.AWSObjectStorageService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -22,6 +26,8 @@
@RequiredArgsConstructor
public class MissionBoardService {
private final GenericPostService<MissionBoard> postService;
private final AWSObjectStorageService s3service;

private final MissionBoardRepository repository;

public Long create(Long userId, RequestCreateMissionBoardDto dto) {
Expand All @@ -32,15 +38,16 @@ public ResponseMissionBoardDto findOne(Long id, Long userId, UserRole role) {
return postService.findOne(repository, id, userId, role, ResponseMissionBoardDto::new);
}

public Page<SummarizedGenericPostDto> list(String keyword, Pageable pageable, int bodySize) {
public Page<SummarizedMissionBoardDto> list(String keyword, Pageable pageable, int bodySize) {
Specification<MissionBoard> spec = PostSpec.withTitleOrBody(keyword);
return postService.list(repository, spec, pageable, bodySize);
return postService.list(repository, spec, pageable, bodySize, (dto, post) ->
new SummarizedMissionBoardDto(s3service, bodySize, post));
}

@Transactional(readOnly = true)
public Page<SummarizedGenericPostDto> listMyPosts(Long userId, Pageable pageable, int bodySize) {
public Page<SummarizedMissionBoardDto> listMyPosts(Long userId, Pageable pageable, int bodySize) {
return repository.findAllByUserId(userId, pageable)
.map(post -> postService.makeListDto(bodySize, post));
.map(post -> new SummarizedMissionBoardDto(s3service, bodySize, post));
}

@Transactional
Expand All @@ -51,7 +58,7 @@ public void update(Long userId, Long id, RequestUpdateMissionBoardDto dto) {
@Transactional
public void delete(Long userId, Long id, UserRole role) {
MissionBoard missionBoard = repository.findById(id).orElseThrow(PostNotFoundException::new);
if ((!missionBoard.getUser().getId().equals(userId)) || (role != UserRole.ADMIN)){
if ((!missionBoard.getUser().getId().equals(userId)) || (role != UserRole.MENTOR)){
throw new NotGrantedException();
}
repository.delete(missionBoard);
Expand Down

0 comments on commit 77bb604

Please sign in to comment.