diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/controller/ProjectController.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/controller/ProjectController.java index a4c9045..6de5c75 100644 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/controller/ProjectController.java +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/controller/ProjectController.java @@ -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 @@ -38,4 +37,10 @@ public ApiResponse getMyPuzzles(@PathVariable Long public ApiResponse 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 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()); + } } diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/dto/request/ProjectRegisterRequestDto.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/dto/request/ProjectRegisterRequestDto.java new file mode 100644 index 0000000..f408346 --- /dev/null +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/dto/request/ProjectRegisterRequestDto.java @@ -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; +} diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/dto/response/ProjectRegisterResponseDto.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/dto/response/ProjectRegisterResponseDto.java new file mode 100644 index 0000000..6f428f2 --- /dev/null +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/dto/response/ProjectRegisterResponseDto.java @@ -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); + } +} diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/Impl/ProjectServiceImpl.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/Impl/ProjectServiceImpl.java index 44fd56f..7d951a0 100644 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/Impl/ProjectServiceImpl.java +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/Impl/ProjectServiceImpl.java @@ -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; @@ -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; @@ -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; @@ -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) { + return ""; + } + 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(); + } } diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/ProjectService.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/ProjectService.java index f356d85..02aada6 100644 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/ProjectService.java +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/project/service/ProjectService.java @@ -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; @@ -21,4 +19,7 @@ public interface ProjectService { //* 팀 대시보드 퍼즐 조회 ProjectTeamPuzzleResponseDto getTeamPuzzles(Principal principal, Long projectId, String today); + + //* 프로젝트 생성 + ProjectRegisterResponseDto createProject(Long memberId, ProjectRegisterRequestDto projectRegisterRequestDto); } diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/review/service/Impl/ReviewServiceImpl.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/review/service/Impl/ReviewServiceImpl.java index eecc318..4e37590 100644 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/review/service/Impl/ReviewServiceImpl.java +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/review/service/Impl/ReviewServiceImpl.java @@ -12,7 +12,14 @@ import com.puzzling.puzzlingServer.api.review.dto.request.ReviewTILRequestDto; 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.ReviewAARRepository; +import com.puzzling.puzzlingServer.api.template.Repository.ReviewTILRepository; +import com.puzzling.puzzlingServer.api.template.Repository.ReviewTemplateRepository; + import com.puzzling.puzzlingServer.api.template.Repository.*; + import com.puzzling.puzzlingServer.api.template.domain.Review5F; import com.puzzling.puzzlingServer.api.template.domain.ReviewAAR; import com.puzzling.puzzlingServer.api.template.domain.ReviewTIL; @@ -38,7 +45,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 ReviewAARRepository reviewAARRepository; private final ReviewRepository reviewRepository; diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewAARRepository.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewAARRepository.java index 72ce5f8..349432f 100644 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewAARRepository.java +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewAARRepository.java @@ -4,5 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface ReviewAARRepository extends JpaRepository { + ReviewAAR findByReviewId(Long reviewId); -} \ No newline at end of file +} + diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewARRRepository.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewARRRepository.java deleted file mode 100644 index 5c2b355..0000000 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/api/template/Repository/ReviewARRRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.puzzling.puzzlingServer.api.template.Repository; - -import com.puzzling.puzzlingServer.api.template.domain.ReviewAAR; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ReviewARRRepository extends JpaRepository { -} diff --git a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/common/response/SuccessStatus.java b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/common/response/SuccessStatus.java index deb0902..e452b9d 100644 --- a/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/common/response/SuccessStatus.java +++ b/puzzlingServer/src/main/java/com/puzzling/puzzlingServer/common/response/SuccessStatus.java @@ -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