Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#27 [FEAT] 프로젝트 등록 API 개발 #31

Merged
merged 2 commits into from
Jul 17, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.puzzling.puzzlingServer.api.project.controller;

import com.puzzling.puzzlingServer.api.project.dto.response.ProjectOwnPuzzleResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.response.ProjectResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.response.ProjectTeamPuzzleResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.response.ProjectVerifyResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.request.*;
import com.puzzling.puzzlingServer.api.project.dto.response.*;
import com.puzzling.puzzlingServer.api.project.service.ProjectService;
import com.puzzling.puzzlingServer.common.response.ApiResponse;
import com.puzzling.puzzlingServer.common.response.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.security.Principal;

@RestController
Expand Down Expand Up @@ -38,4 +37,10 @@ public ApiResponse<ProjectOwnPuzzleResponseDto> getMyPuzzles(@PathVariable Long
public ApiResponse<ProjectTeamPuzzleResponseDto> getTeamPuzzles(Principal principal, @PathVariable Long projectId, @RequestParam String today) {
return ApiResponse.success(SuccessStatus.GET_PROJECT_TEAM_PUZZLE_SUCCESS, projectService.getTeamPuzzles(principal, projectId, today));
}

@PostMapping("member/{memberId}/project")
public ApiResponse<ProjectRegisterResponseDto> createProject(@PathVariable("memberId") Long memberId, @Valid @RequestBody ProjectRegisterRequestDto projectRegisterRequestDto) {
projectService.createProject(memberId, projectRegisterRequestDto);
return ApiResponse.success(SuccessStatus.POST_PROJECT_SUCCESS.getStatusCode(), SuccessStatus.POST_PROJECT_SUCCESS.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.puzzling.puzzlingServer.api.project.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;

import java.lang.reflect.Array;
import java.util.List;

import static lombok.AccessLevel.PROTECTED;

@Getter
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor
public class ProjectRegisterRequestDto {
@NotBlank
private String projectName;
@NotBlank
private String projectIntro;
@NotBlank
private String projectStartDate;
@NotBlank
private String memberProjectRole;
@NotBlank
private String memberProjectNickname;
@NotEmpty
private String[] reviewCycle;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.puzzling.puzzlingServer.api.project.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static lombok.AccessLevel.PRIVATE;

@Getter
@NoArgsConstructor(access = PRIVATE)
@AllArgsConstructor
public class ProjectRegisterResponseDto {
private String projectCode;

public static ProjectRegisterResponseDto of(String projectCode){
return new ProjectRegisterResponseDto(projectCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.puzzling.puzzlingServer.api.member.domain.Member;
import com.puzzling.puzzlingServer.api.member.repository.MemberRepository;
import com.puzzling.puzzlingServer.api.project.domain.UserProject;
import com.puzzling.puzzlingServer.api.project.dto.request.ProjectRegisterRequestDto;
import com.puzzling.puzzlingServer.api.project.dto.response.*;
import com.puzzling.puzzlingServer.api.project.repository.ProjectRepository;
import com.puzzling.puzzlingServer.api.project.domain.Project;
Expand All @@ -15,13 +16,16 @@
import com.puzzling.puzzlingServer.common.response.ErrorStatus;
import com.puzzling.puzzlingServer.common.util.MemberUtil;
import lombok.RequiredArgsConstructor;
import org.apache.catalina.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.nio.ByteBuffer;
import java.security.Principal;
import java.security.SecureRandom;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
Expand Down Expand Up @@ -131,6 +135,36 @@ public ProjectTeamPuzzleResponseDto getTeamPuzzles(Principal principal, Long pro
isReviewDay, hasTodayReview);
}

@Override
@Transactional
public ProjectRegisterResponseDto createProject(Long memberId, ProjectRegisterRequestDto projectRegisterRequestDto){
String inviteCode = makeShortUUID();
String cycle = convertReviewCycleToString(projectRegisterRequestDto.getReviewCycle());

Project project = Project.builder()
.name(projectRegisterRequestDto.getProjectName())
.intro(projectRegisterRequestDto.getProjectIntro())
.startDate(projectRegisterRequestDto.getProjectStartDate())
.code(inviteCode)
.createUserId(memberId)
.reviewCycle(cycle)
.build();
Project savedProject = projectRepository.save(project);

Member member = findMemberById(memberId);

UserProject userProject = UserProject.builder()
.role(projectRegisterRequestDto.getMemberProjectRole())
.nickname(projectRegisterRequestDto.getMemberProjectNickname())
.leaderOrNot(Boolean.TRUE)
.reviewTemplateId(0L)
.member(member)
.project(savedProject)
.build();
userProjectRepository.save(userProject);
return new ProjectRegisterResponseDto(cycle);
}

private String getReviewMemberPercent(Long projectId, int reviewCount) {
int totalProjectMember = userProjectRepository.findAllByProjectId(projectId).size();
float percent = (float) reviewCount/totalProjectMember;
Expand Down Expand Up @@ -173,4 +207,29 @@ private ProjectMyPuzzleObjectDto mapperMyPuzzleObject(Long memberId, Long projec
return ProjectMyPuzzleObjectDto.of(findMember.getName(), puzzleCount);
}

// 10자리의 UUID 생성
public static String makeShortUUID() {
UUID uuid = UUID.randomUUID();
return parseToShortUUID(uuid.toString());
}

// 파라미터로 받은 값을 10자리의 UUID로 변환
public static String parseToShortUUID(String uuid) {
int l = ByteBuffer.wrap(uuid.getBytes()).getInt();
return Integer.toString(l, 9);
}

public String convertReviewCycleToString(String[] array) {
if (array == null || array.length == 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p4;

array.isEmpty()로 하면 더 깔끔할 것 같습니다 !

return "";
Copy link
Member

@yeseul106 yeseul106 Jul 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p4;

사실 dto 단에서 @NotEmpty 어노테이션으로 validation을 하기 때문에 이 배열이 비어있을 경우, 거기서 에러가 던져지므로 이 if문은 없어도 될 것 같아요 ~

}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.length; i++) {
sb.append(array[i]);
if (i < array.length - 1) {
sb.append(",");
}
}
return sb.toString();
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.puzzling.puzzlingServer.api.project.service;

import com.puzzling.puzzlingServer.api.project.dto.response.ProjectOwnPuzzleResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.response.ProjectResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.response.ProjectTeamPuzzleResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.response.ProjectVerifyResponseDto;
import com.puzzling.puzzlingServer.api.project.dto.request.ProjectRegisterRequestDto;
import com.puzzling.puzzlingServer.api.project.dto.response.*;

import java.security.Principal;
import java.util.List;
Expand All @@ -21,4 +19,7 @@ public interface ProjectService {

//* 팀 대시보드 퍼즐 조회
ProjectTeamPuzzleResponseDto getTeamPuzzles(Principal principal, Long projectId, String today);

//* 프로젝트 생성
ProjectRegisterResponseDto createProject(Long memberId, ProjectRegisterRequestDto projectRegisterRequestDto);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import com.puzzling.puzzlingServer.api.review.repository.ReviewRepository;
import com.puzzling.puzzlingServer.api.review.service.ReviewService;
import com.puzzling.puzzlingServer.api.template.Repository.Review5FRepository;
import com.puzzling.puzzlingServer.api.template.Repository.ReviewARRRepository;
import com.puzzling.puzzlingServer.api.template.Repository.ReviewAARRepository;
import com.puzzling.puzzlingServer.api.template.Repository.ReviewTILRepository;
import com.puzzling.puzzlingServer.api.template.Repository.ReviewTemplateRepository;
import com.puzzling.puzzlingServer.api.template.domain.Review5F;
Expand All @@ -35,7 +35,7 @@ public class ReviewServiceImpl implements ReviewService {
private final ReviewTemplateRepository reviewTemplateRepository;
private final UserProjectRepository userProjectRepository;
private final ReviewTILRepository reviewTILRepository;
private final ReviewARRRepository reviewARRRepository;
private final ReviewAARRepository reviewARRRepository;
private final Review5FRepository review5FRepository;
private final ReviewRepository reviewRepository;
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
import com.puzzling.puzzlingServer.api.template.domain.ReviewAAR;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ReviewARRRepository extends JpaRepository<ReviewAAR, Long> {
public interface ReviewAARRepository extends JpaRepository<ReviewAAR, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public enum SuccessStatus {
GET_PROJECT_ALL_SUCCESS(HttpStatus.OK, "진행 중인 프로젝트 리스트 조회 성공"),
GET_PROJECT_MY_PUZZLE_SUCCESS(HttpStatus.OK, "개인 대시보드 퍼즐 조회 성공"),
GET_PROJECT_TEAM_PUZZLE_SUCCESS(HttpStatus.OK, "팀 대시보드 퍼즐 조회 성공"),
POST_PROJECT_SUCCESS(HttpStatus.OK, "프로젝트 등록 성공"),

/**
* review
Expand Down