diff --git a/src/main/java/MakeUs/Moira/config/security/UserRole.java b/src/main/java/MakeUs/Moira/config/security/UserRole.java new file mode 100644 index 0000000..92f51e6 --- /dev/null +++ b/src/main/java/MakeUs/Moira/config/security/UserRole.java @@ -0,0 +1,13 @@ +package MakeUs.Moira.config.security; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum UserRole { + USER("ROLE_USER", "로그인_사용자"); + + private final String key; + private final String title; +} diff --git a/src/main/java/MakeUs/Moira/config/swagger/SwaggerConfiguration.java b/src/main/java/MakeUs/Moira/config/swagger/SwaggerConfiguration.java new file mode 100644 index 0000000..52fbc02 --- /dev/null +++ b/src/main/java/MakeUs/Moira/config/swagger/SwaggerConfiguration.java @@ -0,0 +1,42 @@ +package MakeUs.Moira.config.swagger; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Configuration +@EnableSwagger2 +public class SwaggerConfiguration { + @Bean + public Docket swaggerApi() { + + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(swaggerInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("MakeUs.Moira.controller")) + .paths(PathSelectors.any()) + .build() + .useDefaultResponseMessages(false); // 기본으로 세팅되는 200,401,403,404 메시지를 표시 하지 않음 + } + + + private ApiInfo swaggerInfo() { + return new ApiInfoBuilder().title("Moira API Documentation") + .description("Moira 앱 개발시 사용되는 서버 API 문서입니다") + .build(); + } +} diff --git a/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmHistory.java b/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmHistory.java new file mode 100644 index 0000000..59626c2 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmHistory.java @@ -0,0 +1,72 @@ +package MakeUs.Moira.domain.alarmHistory; + +import MakeUs.Moira.controller.home.dto.AlarmReadStatusUpdateResponseDto; +import MakeUs.Moira.controller.home.dto.AlarmResponseDto; +import MakeUs.Moira.domain.AuditorEntity; +import MakeUs.Moira.domain.chat.ReadStatus; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@NoArgsConstructor +@Getter +@Entity +public class AlarmHistory extends AuditorEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long userId; + + @Enumerated(EnumType.STRING) + private AlarmType type; + + private Long alarmTargetId; + + private String alarmTargetImage; + + private String alarmContent; + + @Enumerated(EnumType.STRING) + private ReadStatus readStatus; + + @Builder + public AlarmHistory(Long userId, AlarmType type, Long alarmTargetId, String alarmTargetImage, String alarmContent) { + this.userId = userId; + this.type = type; + this.alarmTargetId = alarmTargetId; + this.alarmTargetImage = alarmTargetImage; + this.alarmContent = alarmContent; + readStatus = ReadStatus.UNREAD; + } + + public AlarmResponseDto toAlarmResponseDto() { + return AlarmResponseDto.builder() + .alarmId(id) + .alarmType(type) + .alarmTargetId(alarmTargetId) + .alarmTargetImage(alarmTargetImage) + .alarmContent(alarmContent) + .readStatus(readStatus) + .writtenTime(getCreatedDate()) + .build(); + } + + public AlarmReadStatusUpdateResponseDto toAlarmReadStatusUpdateResponseDto() { + return AlarmReadStatusUpdateResponseDto.builder() + .alarmId(id) + .read(readStatusToBoolean()) + .build(); + } + + private boolean readStatusToBoolean() { + return this.readStatus.equals(ReadStatus.READ); + } + + public void updateReadStatus() { + this.readStatus = ReadStatus.READ; + } +} \ No newline at end of file diff --git a/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmHistoryRepo.java b/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmHistoryRepo.java new file mode 100644 index 0000000..dbe3c7b --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmHistoryRepo.java @@ -0,0 +1,11 @@ +package MakeUs.Moira.domain.alarmHistory; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface AlarmHistoryRepo extends JpaRepository { + List findByUserId(Long userId); + List findByUserIdOrderByCreatedDateDesc(Long userId, Pageable pageable); +} diff --git a/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmType.java b/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmType.java new file mode 100644 index 0000000..e78488f --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/alarmHistory/AlarmType.java @@ -0,0 +1,24 @@ +package MakeUs.Moira.domain.alarmHistory; + +import lombok.Getter; + +@Getter +public enum AlarmType { + /* + 1. 나한테 쪽지옴 + 2. 내가 쓴 모집글에 지원함 + 3. 내가 쓴 모집글에 댓글담 + 4. 내 댓글에 대댓글담 + 5. 내가 지원자이고 팀장한테 초대 받음 + 6. 내가 지원자이고 팀장이 지원 거절함 + 7. 내가 팀장이고 내가 보낸 초대에 지원자가 수락함 + 8. 내가 팀장이고 내가 보낸 초대에 지원자가 거절함 + 9. 나에게 리뷰가 달림 + */ + PROJECT, + APPLY, + APPLY_ANSWER, + INVITE_ANSWER, + REVIEW, + CHATROOM +} diff --git a/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApply.java b/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApply.java new file mode 100644 index 0000000..d52f69c --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApply.java @@ -0,0 +1,57 @@ +package MakeUs.Moira.domain.projectApply; + +import MakeUs.Moira.domain.AuditorEntity; +import MakeUs.Moira.domain.position.UserPosition; +import MakeUs.Moira.domain.projectDetail.ProjectDetail; +import MakeUs.Moira.domain.user.User; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Getter +@Entity +@NoArgsConstructor +public class ProjectApply extends AuditorEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private ProjectDetail projectDetail; + + @ManyToOne + private User applicant; + + @ManyToOne + private UserPosition userPosition; + + @OneToMany(mappedBy = "projectApply", cascade = CascadeType.ALL) + private List optionalApplyInfoList = new ArrayList<>(); + + @Enumerated(EnumType.STRING) + private ProjectApplyStatus projectApplyStatus; + + @Builder + public ProjectApply(ProjectDetail projectDetail, User applicant, UserPosition userPosition, List optionalApplyInfoList, ProjectApplyStatus projectApplyStatus) { + this.projectDetail = projectDetail; + this.applicant = applicant; + this.userPosition = userPosition; + this.projectApplyStatus = projectApplyStatus; + } + + public void addOptionalApplyInfo(OptionalApplyInfo optionalApplyInfo){ + this.optionalApplyInfoList.add(optionalApplyInfo); + } + + public void updateProjectApplyStatus(ProjectApplyStatus projectApplyStatus){ + this.projectApplyStatus = projectApplyStatus; + } +} + + + diff --git a/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApplyRepo.java b/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApplyRepo.java new file mode 100644 index 0000000..0280398 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApplyRepo.java @@ -0,0 +1,10 @@ +package MakeUs.Moira.domain.projectApply; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProjectApplyRepo extends JpaRepository { + List findAllByApplicant_Id(Long applicantId); + int countByApplicant_Id(Long applicantId); +} diff --git a/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApplyStatus.java b/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApplyStatus.java new file mode 100644 index 0000000..5d587b2 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectApply/ProjectApplyStatus.java @@ -0,0 +1,11 @@ +package MakeUs.Moira.domain.projectApply; + +public enum ProjectApplyStatus { + USER_APPLIED, + + APPLY_REJECTED, + TEAM_INVITED, + + USER_ACCEPTED, + USER_REJECTED +} diff --git a/src/main/java/MakeUs/Moira/domain/projectComment/ProjectComment.java b/src/main/java/MakeUs/Moira/domain/projectComment/ProjectComment.java new file mode 100644 index 0000000..e275d41 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectComment/ProjectComment.java @@ -0,0 +1,40 @@ +package MakeUs.Moira.domain.projectComment; + +import MakeUs.Moira.domain.AuditorEntity; +import MakeUs.Moira.domain.projectDetail.ProjectDetail; +import MakeUs.Moira.domain.user.User; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class ProjectComment extends AuditorEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private ProjectDetail projectDetail; + + @ManyToOne + private User writer; + + private String comment; + + // 셀프 양방향 관계 + @ManyToOne + private ProjectComment parentComment; + + @Builder + public ProjectComment(ProjectDetail projectDetail, User writer, String comment, ProjectComment parentComment){ + this.projectDetail = projectDetail; + this.writer = writer; + this.comment = comment; + this.parentComment = parentComment; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/projectComment/ProjectCommentRepo.java b/src/main/java/MakeUs/Moira/domain/projectComment/ProjectCommentRepo.java new file mode 100644 index 0000000..9c5ce82 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectComment/ProjectCommentRepo.java @@ -0,0 +1,10 @@ +package MakeUs.Moira.domain.projectComment; + +import MakeUs.Moira.domain.projectDetail.ProjectDetail; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProjectCommentRepo extends JpaRepository { + public List findAllByProjectDetailOrderByCreatedDate(ProjectDetail projectDetail); +} diff --git a/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDetail.java b/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDetail.java new file mode 100644 index 0000000..ce1a420 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDetail.java @@ -0,0 +1,74 @@ +package MakeUs.Moira.domain.projectDetail; + +import MakeUs.Moira.domain.project.*; +import MakeUs.Moira.domain.projectApply.ProjectApply; +import MakeUs.Moira.domain.projectComment.ProjectComment; +import MakeUs.Moira.domain.projectPosition.ProjectPosition; +import lombok.*; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor +public class ProjectDetail { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne(mappedBy = "projectDetail") + private Project project; + + @OneToMany(mappedBy = "projectDetail", cascade = CascadeType.ALL) + private List projectCommentList = new ArrayList<>(); + + @OneToMany(mappedBy = "projectDetail", cascade = CascadeType.ALL) + private List projectApplyList = new ArrayList<>(); + + @OneToMany(mappedBy = "projectDetail", cascade = CascadeType.ALL) + private List projectPositionList = new ArrayList<>(); + + private String projectContent; + + @Enumerated(EnumType.STRING) + private ProjectDuration projectDuration; + + @Enumerated(EnumType.STRING) + private ProjectLocalType projectLocalType; + + @Builder + public ProjectDetail(Project project, String projectContent, ProjectDuration projectDuration, ProjectLocalType projectLocalType) { + this.project = project; + this.projectContent = projectContent; + this.projectDuration = projectDuration; + this.projectLocalType = projectLocalType; + } + + public void addProjectComment(ProjectComment projectComment){ + projectCommentList.add(projectComment); + } + + public void addProjectApply(ProjectApply projectApply){ + projectApplyList.add(projectApply); + } + + public void removeProjectComment(ProjectComment projectComment){ + projectCommentList.remove(projectComment); + } + + public void removeProjectApply(ProjectApply projectApply){ + projectApplyList.remove(projectApply); + } + + public void addProjectPosition(ProjectPosition projectPosition){ + projectPositionList.add(projectPosition); + } + + public void updateProjectContent(String projectContent){ + this.projectContent = projectContent; + } + +} diff --git a/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDetailRepo.java b/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDetailRepo.java new file mode 100644 index 0000000..aca2f0d --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDetailRepo.java @@ -0,0 +1,8 @@ +package MakeUs.Moira.domain.projectDetail; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectDetailRepo extends JpaRepository { +} diff --git a/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDuration.java b/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDuration.java new file mode 100644 index 0000000..a87b30d --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectDetail/ProjectDuration.java @@ -0,0 +1,5 @@ +package MakeUs.Moira.domain.projectDetail; + +public enum ProjectDuration { + ONE_MONTH, THREE_MONTH, SIX_MONTH, ETC +} diff --git a/src/main/java/MakeUs/Moira/domain/projectHashtag/ProjectHashtag.java b/src/main/java/MakeUs/Moira/domain/projectHashtag/ProjectHashtag.java new file mode 100644 index 0000000..3966448 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectHashtag/ProjectHashtag.java @@ -0,0 +1,35 @@ +package MakeUs.Moira.domain.projectHashtag; + +import MakeUs.Moira.domain.hashtag.Hashtag; +import MakeUs.Moira.domain.project.Project; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class ProjectHashtag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private Project project; + + @ManyToOne + private Hashtag projectHashtag; + + @Builder + public ProjectHashtag(Project project, Hashtag projectHashtag) { + this.project = project; + this.projectHashtag = projectHashtag; + } + + public void updateProject(Project project){ + this.project = project; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/projectHashtag/ProjectHashtagRepo.java b/src/main/java/MakeUs/Moira/domain/projectHashtag/ProjectHashtagRepo.java new file mode 100644 index 0000000..3af4956 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectHashtag/ProjectHashtagRepo.java @@ -0,0 +1,9 @@ +package MakeUs.Moira.domain.projectHashtag; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectHashtagRepo extends JpaRepository { + +} diff --git a/src/main/java/MakeUs/Moira/domain/projectImage/ProjectImage.java b/src/main/java/MakeUs/Moira/domain/projectImage/ProjectImage.java new file mode 100644 index 0000000..f512b92 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectImage/ProjectImage.java @@ -0,0 +1,31 @@ +package MakeUs.Moira.domain.projectImage; + +import MakeUs.Moira.domain.project.Project; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class ProjectImage { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private Project project; + + private String projectImageUrl; + + // S3에 저장할 파일 명 + private String imageKey; + + public ProjectImage(Project project, String projectImageUrl, String imageKey){ + this.project = project; + this.projectImageUrl = projectImageUrl; + this.imageKey = imageKey; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/projectImage/ProjectImageRepo.java b/src/main/java/MakeUs/Moira/domain/projectImage/ProjectImageRepo.java new file mode 100644 index 0000000..6c533f4 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectImage/ProjectImageRepo.java @@ -0,0 +1,6 @@ +package MakeUs.Moira.domain.projectImage; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectImageRepo extends JpaRepository { +} diff --git a/src/main/java/MakeUs/Moira/domain/projectLike/ProjectLike.java b/src/main/java/MakeUs/Moira/domain/projectLike/ProjectLike.java new file mode 100644 index 0000000..c8ecd83 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectLike/ProjectLike.java @@ -0,0 +1,47 @@ +package MakeUs.Moira.domain.projectLike; + +import MakeUs.Moira.domain.project.Project; +import MakeUs.Moira.domain.userHistory.UserHistory; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class ProjectLike { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private UserHistory userHistory; + + @ManyToOne + private Project project; + + private boolean isProjectLiked; + + @Builder + public ProjectLike(UserHistory userHistory, Project project){ + this.userHistory = userHistory; + this.project = project; + isProjectLiked = true; + } + + public void changeProjectLiked(){ + if(isProjectLiked){ + project.cancelLike(); + userHistory.removeProjectLike(this); + } + else{ + project.addLike(); + userHistory.addProjectLike(this); + } + isProjectLiked = !isProjectLiked; + } + +} diff --git a/src/main/java/MakeUs/Moira/domain/projectLike/ProjectLikeRepo.java b/src/main/java/MakeUs/Moira/domain/projectLike/ProjectLikeRepo.java new file mode 100644 index 0000000..0cac726 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectLike/ProjectLikeRepo.java @@ -0,0 +1,11 @@ +package MakeUs.Moira.domain.projectLike; + +import MakeUs.Moira.domain.project.Project; +import MakeUs.Moira.domain.userHistory.UserHistory; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ProjectLikeRepo extends JpaRepository { + public Optional findByUserHistoryAndProject(UserHistory userHistory, Project project); +} diff --git a/src/main/java/MakeUs/Moira/domain/projectPosition/ProjectPosition.java b/src/main/java/MakeUs/Moira/domain/projectPosition/ProjectPosition.java new file mode 100644 index 0000000..7149121 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectPosition/ProjectPosition.java @@ -0,0 +1,38 @@ +package MakeUs.Moira.domain.projectPosition; + +import MakeUs.Moira.domain.position.PositionCategory; +import MakeUs.Moira.domain.projectDetail.ProjectDetail; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class ProjectPosition { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private ProjectDetail projectDetail; + + @ManyToOne + private PositionCategory recruitUserPositionCategory; + + private int recruitPositionCount; + + @Builder + public ProjectPosition(ProjectDetail projectDetail, PositionCategory recruitUserPositionCategory, int recruitPositionCount){ + this.projectDetail = projectDetail; + this.recruitUserPositionCategory = recruitUserPositionCategory; + this.recruitPositionCount = recruitPositionCount; + } + + public String getRecruitingPositionCategoryName(){ + return this.getRecruitUserPositionCategory().getCategoryName(); + } +} diff --git a/src/main/java/MakeUs/Moira/domain/projectPosition/ProjectPositonRepo.java b/src/main/java/MakeUs/Moira/domain/projectPosition/ProjectPositonRepo.java new file mode 100644 index 0000000..08420f0 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/projectPosition/ProjectPositonRepo.java @@ -0,0 +1,6 @@ +package MakeUs.Moira.domain.projectPosition; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectPositonRepo extends JpaRepository { +} diff --git a/src/main/java/MakeUs/Moira/domain/userHashtag/UserHashtag.java b/src/main/java/MakeUs/Moira/domain/userHashtag/UserHashtag.java new file mode 100644 index 0000000..e29974d --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userHashtag/UserHashtag.java @@ -0,0 +1,40 @@ +package MakeUs.Moira.domain.userHashtag; + +import MakeUs.Moira.domain.hashtag.Hashtag; +import MakeUs.Moira.domain.userHistory.UserHistory; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@NoArgsConstructor +@Getter +@Entity +public class UserHashtag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private UserHistory userHistory; + + @ManyToOne + private Hashtag hashtag; + + public UserHashtag updateUserHistory(UserHistory userHistory) { + if (this.userHistory != null) { + this.userHistory.getUserHashtags() + .remove(this); + } + this.userHistory = userHistory; + userHistory.getUserHashtags() + .add(this); + return this; + } + + public UserHashtag updateHashtag(Hashtag hashtag) { + this.hashtag = hashtag; + return this; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/userHashtag/UserHashtagRepo.java b/src/main/java/MakeUs/Moira/domain/userHashtag/UserHashtagRepo.java new file mode 100644 index 0000000..6ad1de8 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userHashtag/UserHashtagRepo.java @@ -0,0 +1,12 @@ +package MakeUs.Moira.domain.userHashtag; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + + +public interface UserHashtagRepo extends JpaRepository { + List findAllByUserHistoryId(Long userHistoryId); + void deleteAllByUserHistoryId(Long userHistoryId); +} + diff --git a/src/main/java/MakeUs/Moira/domain/userHistory/UserHistory.java b/src/main/java/MakeUs/Moira/domain/userHistory/UserHistory.java new file mode 100644 index 0000000..4142535 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userHistory/UserHistory.java @@ -0,0 +1,95 @@ +package MakeUs.Moira.domain.userHistory; + +import MakeUs.Moira.controller.user.dto.myPage.HashtagResponseDto; +import MakeUs.Moira.controller.user.dto.myPageEdit.MyPageEditHashtagResponseDto; +import MakeUs.Moira.domain.club.ClubLike; +import MakeUs.Moira.domain.inquiry.Inquiry; +import MakeUs.Moira.domain.projectLike.ProjectLike; +import MakeUs.Moira.domain.report.Report; +import MakeUs.Moira.domain.user.User; +import MakeUs.Moira.domain.userProject.UserProject; +import MakeUs.Moira.domain.userHashtag.UserHashtag; +import MakeUs.Moira.domain.userPoolLike.UserPoolLike; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@NoArgsConstructor +@Getter +@Entity +public class UserHistory { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne(mappedBy = "userHistory") + private User user; + + @OneToMany(mappedBy = "userHistory", cascade = CascadeType.ALL, orphanRemoval = true) + private List userHashtags = new ArrayList<>(); + + @OneToMany(mappedBy = "userHistory", cascade = CascadeType.ALL, orphanRemoval = true) + private List userProjects = new ArrayList<>(); + + @OneToMany(mappedBy = "userHistory") + private List projectLikes = new ArrayList<>(); + + @OneToMany(mappedBy = "userHistory", cascade = CascadeType.ALL, orphanRemoval = true) + private List userPoolLikes = new ArrayList<>(); + + @OneToMany(mappedBy = "userHistory") + private List clubLikes = new ArrayList<>(); + + @OneToMany(mappedBy = "userHistory") + private List reports = new ArrayList<>(); + + @OneToMany(mappedBy = "userHistory") + private List inquiries = new ArrayList<>(); + + private int participationCount = 0; + + private int completionCount = 0; + + public UserHistory updateUser(User user) { + this.user = user; + return this; + } + + public void addUserProject(UserProject userProject) { + userProjects.add(userProject); + } + + public void removeUserProject(UserProject userProject) { + userProjects.remove(userProject); + } + + public void addProjectLike(ProjectLike projectLike) { + projectLikes.add(projectLike); + } + + public void removeProjectLike(ProjectLike projectLike) { + projectLikes.remove(projectLike); + } + + public MyPageEditHashtagResponseDto toMyPageEditHashtagResponseDto() { + return MyPageEditHashtagResponseDto.builder() + .userId(id) + .hashtagList(userHashtags.stream() + .map(HashtagResponseDto::new) + .collect(Collectors.toList())) + .build(); + } + + public void addParticipationCount(){ + participationCount++; + } + + public void addCompletionCount(){ + completionCount++; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/userHistory/UserHistoryRepo.java b/src/main/java/MakeUs/Moira/domain/userHistory/UserHistoryRepo.java new file mode 100644 index 0000000..3701124 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userHistory/UserHistoryRepo.java @@ -0,0 +1,9 @@ +package MakeUs.Moira.domain.userHistory; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserHistoryRepo extends JpaRepository { + public Optional findByUserId(Long userId); +} diff --git a/src/main/java/MakeUs/Moira/domain/userPoolLike/UserPoolLike.java b/src/main/java/MakeUs/Moira/domain/userPoolLike/UserPoolLike.java new file mode 100644 index 0000000..eb22157 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userPoolLike/UserPoolLike.java @@ -0,0 +1,53 @@ +package MakeUs.Moira.domain.userPoolLike; + +import MakeUs.Moira.domain.userHistory.UserHistory; +import MakeUs.Moira.domain.userPool.UserPool; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@NoArgsConstructor +@Getter +@Entity +public class UserPoolLike { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private UserHistory userHistory; + + @ManyToOne + private UserPool userPool; + + private boolean isUserPoolLiked = true; + + public UserPoolLike updateUserHistory(UserHistory userHistory) { + if (this.userHistory != null) { + this.userHistory.getUserPoolLikes() + .remove(this); + } + this.userHistory = userHistory; + userHistory.getUserPoolLikes() + .add(this); + return this; + } + + public UserPoolLike updateUserPool(UserPool userPool) { + this.userPool = userPool; + return this; + } + + public UserPoolLike switchIsLiked() { + this.isUserPoolLiked = !this.isUserPoolLiked; + + if (this.isUserPoolLiked) { + this.userPool.updateLikeCount(+1); + } else { + this.userPool.updateLikeCount(-1); + } + return this; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/userPoolLike/UserPoolLikeRepo.java b/src/main/java/MakeUs/Moira/domain/userPoolLike/UserPoolLikeRepo.java new file mode 100644 index 0000000..5cb2331 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userPoolLike/UserPoolLikeRepo.java @@ -0,0 +1,8 @@ +package MakeUs.Moira.domain.userPoolLike; + +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface UserPoolLikeRepo extends JpaRepository { + UserPoolLike findByUserHistory_IdAndUserPool_Id(Long userHistoryId, Long userPoolId); +} diff --git a/src/main/java/MakeUs/Moira/domain/userPoolOffer/UserPoolOffer.java b/src/main/java/MakeUs/Moira/domain/userPoolOffer/UserPoolOffer.java new file mode 100644 index 0000000..4962682 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userPoolOffer/UserPoolOffer.java @@ -0,0 +1,23 @@ +package MakeUs.Moira.domain.userPoolOffer; + +import MakeUs.Moira.domain.user.User; +import MakeUs.Moira.domain.userPool.UserPool; + +import javax.persistence.*; + +@Entity +public class UserPoolOffer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private UserPool userPool; + + @ManyToOne + private User suggestor; + + @Enumerated(EnumType.STRING) + private UserPoolOfferStatus userPoolOfferStatus; +} diff --git a/src/main/java/MakeUs/Moira/domain/userPoolOffer/UserPoolOfferStatus.java b/src/main/java/MakeUs/Moira/domain/userPoolOffer/UserPoolOfferStatus.java new file mode 100644 index 0000000..c133db1 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userPoolOffer/UserPoolOfferStatus.java @@ -0,0 +1,7 @@ +package MakeUs.Moira.domain.userPoolOffer; + +public enum UserPoolOfferStatus { + LEADER_OFFERED, + USER_ACCEPTED, + USER_REJECTED +} diff --git a/src/main/java/MakeUs/Moira/domain/userProject/UserProject.java b/src/main/java/MakeUs/Moira/domain/userProject/UserProject.java new file mode 100644 index 0000000..447085f --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userProject/UserProject.java @@ -0,0 +1,55 @@ +package MakeUs.Moira.domain.userProject; + +import MakeUs.Moira.domain.position.UserPosition; +import MakeUs.Moira.domain.project.Project; +import MakeUs.Moira.domain.userHistory.UserHistory; +import MakeUs.Moira.domain.userReview.UserReview; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor +public class UserProject { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private UserHistory userHistory; + + @OneToMany(mappedBy = "userProject", cascade = CascadeType.ALL, orphanRemoval = true) + private List reviews = new ArrayList<>(); + + @ManyToOne + private Project project; + + @Enumerated(EnumType.STRING) + private UserProjectRoleType roleType; + + @ManyToOne + private UserPosition userPosition; + + @Enumerated(EnumType.STRING) + private UserProjectStatus userProjectStatus; + + @Builder + public UserProject(UserHistory userHistory, Project project, UserProjectRoleType roleType, UserPosition userPosition, UserProjectStatus userProjectStatus){ + this.userHistory = userHistory; + this.project = project; + this.roleType = roleType; + this.userPosition = userPosition; + this.userProjectStatus = userProjectStatus; + } + + public void updateUserProjectStatus(UserProjectStatus userProjectStatus){ + this.userProjectStatus = userProjectStatus; + } + +} diff --git a/src/main/java/MakeUs/Moira/domain/userProject/UserProjectRepo.java b/src/main/java/MakeUs/Moira/domain/userProject/UserProjectRepo.java new file mode 100644 index 0000000..e3e48b3 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userProject/UserProjectRepo.java @@ -0,0 +1,13 @@ +package MakeUs.Moira.domain.userProject; + + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface UserProjectRepo extends JpaRepository { + Optional findByUserHistoryIdAndProjectId(Long userHistoryId, Long projectId); + + List findAllByProject_Id(Long projectId); +} diff --git a/src/main/java/MakeUs/Moira/domain/userProject/UserProjectRoleType.java b/src/main/java/MakeUs/Moira/domain/userProject/UserProjectRoleType.java new file mode 100644 index 0000000..3940be6 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userProject/UserProjectRoleType.java @@ -0,0 +1,5 @@ +package MakeUs.Moira.domain.userProject; + +public enum UserProjectRoleType { + LEADER, MEMBER +} diff --git a/src/main/java/MakeUs/Moira/domain/userProject/UserProjectStatus.java b/src/main/java/MakeUs/Moira/domain/userProject/UserProjectStatus.java new file mode 100644 index 0000000..72cba0f --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userProject/UserProjectStatus.java @@ -0,0 +1,5 @@ +package MakeUs.Moira.domain.userProject; + +public enum UserProjectStatus { + PROGRESSING, DROPPED, COMPLETED +} diff --git a/src/main/java/MakeUs/Moira/domain/userReviewComplimentMark/UserReviewComplimentMark.java b/src/main/java/MakeUs/Moira/domain/userReviewComplimentMark/UserReviewComplimentMark.java new file mode 100644 index 0000000..a97b028 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userReviewComplimentMark/UserReviewComplimentMark.java @@ -0,0 +1,42 @@ +package MakeUs.Moira.domain.userReviewComplimentMark; + +import MakeUs.Moira.domain.AuditorEntity; +import MakeUs.Moira.domain.complimentMark.ComplimentMarkInfo; +import MakeUs.Moira.domain.userReview.UserReview; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@NoArgsConstructor +@Getter +@Entity +public class UserReviewComplimentMark extends AuditorEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private UserReview userReview; + + @ManyToOne + private ComplimentMarkInfo complimentMarkInfo; + + + public UserReviewComplimentMark updateUserReview(UserReview userReview) { + if (this.userReview != null) { + this.userReview.getUserReviewComplimentMarkList() + .remove(this); + } + this.userReview = userReview; + userReview.getUserReviewComplimentMarkList() + .add(this); + return this; + } + + public UserReviewComplimentMark updateComplimentMarkInfo(ComplimentMarkInfo complimentMarkInfo) { + this.complimentMarkInfo = complimentMarkInfo; + return this; + } +} diff --git a/src/main/java/MakeUs/Moira/domain/userReviewComplimentMark/UserReviewComplimentMarkRepo.java b/src/main/java/MakeUs/Moira/domain/userReviewComplimentMark/UserReviewComplimentMarkRepo.java new file mode 100644 index 0000000..9e5cd83 --- /dev/null +++ b/src/main/java/MakeUs/Moira/domain/userReviewComplimentMark/UserReviewComplimentMarkRepo.java @@ -0,0 +1,6 @@ +package MakeUs.Moira.domain.userReviewComplimentMark; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserReviewComplimentMarkRepo extends JpaRepository { +} diff --git a/src/main/java/MakeUs/Moira/exception/CustomException.java b/src/main/java/MakeUs/Moira/exception/CustomException.java new file mode 100644 index 0000000..9e351b0 --- /dev/null +++ b/src/main/java/MakeUs/Moira/exception/CustomException.java @@ -0,0 +1,15 @@ +package MakeUs.Moira.exception; + +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException{ + + private final ErrorCode errorCode; + + public CustomException(ErrorCode errorCode) + { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } +} diff --git a/src/main/java/MakeUs/Moira/exception/ErrorCode.java b/src/main/java/MakeUs/Moira/exception/ErrorCode.java new file mode 100644 index 0000000..75e2e0b --- /dev/null +++ b/src/main/java/MakeUs/Moira/exception/ErrorCode.java @@ -0,0 +1,68 @@ +package MakeUs.Moira.exception; + +public enum ErrorCode { + + NOT_NULL(400, ""), + NOT_BLANK(401, ""), + MIN(402, ""), + MAX(403, ""), + + // 410 : HttpMessageNotReadableException -> enum 에러 + // 411 : HttpClientErrorException -> 잘못된 kakao 토큰 + + + INVALID_USER(420, "유효하지 않은 유저 혹은 유저 ID"), + INVALID_PROJECT(421, "유효하지 않은 프로젝트 혹은 프로젝트 ID"), + INVALID_COMMENT(422, "유효하지 않은 댓글 혹은 댓글 ID"), + INVALID_PROJECT_APPLY(423, "유효하지 않은 지원서 혹은 지원서 ID"), + INVALID_USER_POOL(424, "유효하지 않은 유저풀 혹은 유저풀 ID"), + INVALID_USER_PROJECT(425, "유효하지 않은 유저 프로젝트 혹은 유저 프로젝트 ID"), + INVALID_PROJECT_APPLY_OPTIONAL_INFO(426, "유효하지 않은 지원서 선택사항 정보"), + INVALID_SCHOOL(427, "유효하지 않은 학교 혹은 학교 ID"), + INVALID_MAJOR(428, "유효하지 않은 전공 혹은 전공 ID"), + INVALID_POSITION(429, "유효하지 않은 포지션 혹은 포지션 ID"), + INVALID_POSITION_CATEGORY(430, "유효하지 않은 포지션 카테고리 혹은 ID"), + INVALID_HASHTAG(431, "유효하지 않은 태그 이름 혹은 ID"), + INVALID_SORT(432, "유효하지 않은 정렬 방식"), + INVALID_FILE_IO(433, "유효하지 않은 파일 입출력"), + INVALID_TOKEN_PROVIDER(434, "유효하지 않은 토큰 제공자(kakao)"), + INVALID_JWT_TOKEN(435, "유효하지 않은 JWT 토큰"), + INVALID_MESSAGE_TYPE(436, "유효하지 않은 쪽지 타입"), + INVALID_CHAT_ROOM(437, "유효하지 않은 채팅방"), + INVALID_USER_PORTFOLIO(438, "유효하지 않은 유저선택정보"), + INVALID_PROJECT_APPLY_STATUS_CHANGE(439, "유효하지 않은 프로젝트 지원 상태 변경"), + INVALID_ALARM(441, "유효하지 않은 알람"), + + + ALREADY_REGISTERED_USER(450, "이미 가입된 유저"), + ALREADY_REGISTERED_NICKNAME(451, "이미 존재하는 닉네임"), + ALREADY_EXIST_PARENT_COMMENT(452, "이미 대댓글인 부모 댓글"), + ALREADY_REGISTERED_PROJECT_IMAGE(453, "이미 등록된 프로젝트 이미지"), + ALREADY_REGISTERED_PROJECT_APPLICANT(454, "이미 지원한 유저"), + + UNAUTHORIZED_USER(460, "권한이 없는 유저"), + UNAUTHORIZED_JWT(461, "해당 리소스에 접근 권한이 없는 JWT"), + UNAUTHORIZED_REPORT_PROJECT(462, "자신 게시글에 신고할 수 없음"), + UNAUTHORIZED_REPORT_COMMENT(463, "자신 댓글에 신고할 수 없음"), + + NON_EXIST_FILE_NAME(470, "존재하지 않는 파일 이름"), + NON_EXIST_PROJECT_LEADER(471, "존재하지 않는 팀장"), + NON_EXIST_PROJECT_APPLY(472, "존재하지 않는 지원서") + + + private final int code; + private final String message; + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + ErrorCode(final int code, final String message) { + this.message = message; + this.code = code; + } +} \ No newline at end of file diff --git a/src/main/java/MakeUs/Moira/exception/ExceptionAdvice.java b/src/main/java/MakeUs/Moira/exception/ExceptionAdvice.java new file mode 100644 index 0000000..dee38ba --- /dev/null +++ b/src/main/java/MakeUs/Moira/exception/ExceptionAdvice.java @@ -0,0 +1,107 @@ +package MakeUs.Moira.exception; + +import MakeUs.Moira.util.response.ResponseService; +import MakeUs.Moira.util.response.model.CommonResult; +import io.jsonwebtoken.JwtException; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.client.HttpClientErrorException; + +import javax.servlet.http.HttpServletRequest; + +@RequiredArgsConstructor +@RestControllerAdvice // 예외 발생 시, JSON으로 반환 +public class ExceptionAdvice { + + private final ResponseService responseService; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + protected CommonResult defaultException(HttpServletRequest request, Exception e) { + System.out.println(e.getClass()); + // 아무데서도 안 거르면, 여기서 거른다. -> 데이터가 없는 리스폰스 + logger.info("code : 500 " + e.getMessage()); + return responseService.mappingFailCommonResultOnly(500, e.getMessage()); + } + + + @ExceptionHandler(CustomException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + protected CommonResult CustomException(CustomException e) { + logger.info("code : " + e.getErrorCode().getCode() + " " + e.getMessage()); + return responseService.mappingFailCommonResultOnly(e.getErrorCode().getCode(), e.getMessage()); + } + + + // 잘못된 KAKAO TOKEN + @ExceptionHandler(HttpClientErrorException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResult HttpClientErrorException(HttpServletRequest request, HttpClientErrorException e) { + logger.info("code : 411 " + e.getMessage()); + return responseService.mappingFailCommonResultOnly(411, e.getMessage()); + } + + // @Valid에 의한 검증 + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResult MethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException e) { + int code = 400; + String message = ""; + BindingResult bindingResult = e.getBindingResult(); + + //에러가 있다면 + if(bindingResult.hasErrors()) { + //DTO에 설정한 meaasge값을 가져온다 + message = bindingResult.getFieldError() + .getDefaultMessage(); + + //DTO에 유효성체크를 걸어놓은 어노테이션명을 가져온다. + String bindResultCode = bindingResult.getFieldError() + .getCode(); + + switch (bindResultCode) { + case "NotNull": + code = ErrorCode.NOT_NULL.getCode(); + break; + case "NotBlank": + code = ErrorCode.NOT_BLANK.getCode(); + break; + case "Min": + code = ErrorCode.MIN.getCode(); + break; + case "Max": + code = ErrorCode.MAX.getCode(); + break; + } + } + logger.info("code : " + code + " " + e.getMessage()); + return responseService.mappingFailCommonResultOnly(code, message); + } + + + // 잘못된 enum RequestDTO + @ExceptionHandler(HttpMessageNotReadableException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResult HttpMessageNotReadableException(HttpServletRequest request, HttpMessageNotReadableException e) { + logger.info("code : 410 " + e.getMessage()); + return responseService.mappingFailCommonResultOnly(410, e.getMessage()); + } + + + @ExceptionHandler(JwtException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResult JWTException(HttpServletRequest request, JwtException e) { + logger.info("code : 435 " + e.getMessage()); + return responseService.mappingFailCommonResultOnly(435, e.getMessage()); + } + +} diff --git a/src/main/java/MakeUs/Moira/util/response/ResponseService.java b/src/main/java/MakeUs/Moira/util/response/ResponseService.java new file mode 100644 index 0000000..85f4ccb --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/response/ResponseService.java @@ -0,0 +1,47 @@ +package MakeUs.Moira.util.response; + +import MakeUs.Moira.util.response.model.CommonResult; +import MakeUs.Moira.util.response.model.ListResult; +import MakeUs.Moira.util.response.model.SingleResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ResponseService { + + // 공통 결과를 처리하는 메소드 + private void setCommonResult(CommonResult result, boolean isSuccess, int code, String msg) { + result.setSucceed(isSuccess); + result.setCode(code); + result.setMsg(msg); + } + + // 단일건 결과를 처리하는 메소드 + public SingleResult mappingSingleResult(T data, String msg) { + SingleResult result = new SingleResult<>(); + result.setData(data); + setCommonResult(result, true, 200, msg); + return result; + } + // 다중건 결과를 처리하는 메소드 + public ListResult mappingListResult(List list, String msg) { + ListResult result = new ListResult<>(); + result.setList(list); + setCommonResult(result, true, 200, msg); + return result; + } + // 결과만 처리하는 메소드 - 성공 + public CommonResult mappingSuccessCommonResultOnly(String msg) { + CommonResult result = new CommonResult(); + setCommonResult(result, true, 200, msg); + return result; + } + + // 결과만 처리하는 메소드 - 실패 + public CommonResult mappingFailCommonResultOnly(int errorcode, String msg) { + CommonResult result = new CommonResult(); + setCommonResult(result, false, errorcode, msg); + return result; + } +} diff --git a/src/main/java/MakeUs/Moira/util/response/model/CommonResult.java b/src/main/java/MakeUs/Moira/util/response/model/CommonResult.java new file mode 100644 index 0000000..deb3afd --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/response/model/CommonResult.java @@ -0,0 +1,21 @@ +package MakeUs.Moira.util.response.model; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class CommonResult { + + @ApiModelProperty(value = "응답 성공여부 : true/false") + private boolean isSucceed; + + @ApiModelProperty(value = "성공 : 200 / 실패 : errorcode(음수)") + private int code; + + @ApiModelProperty(value = "응답 메시지") + private String msg; +} \ No newline at end of file diff --git a/src/main/java/MakeUs/Moira/util/response/model/ListResult.java b/src/main/java/MakeUs/Moira/util/response/model/ListResult.java new file mode 100644 index 0000000..5a3de63 --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/response/model/ListResult.java @@ -0,0 +1,12 @@ +package MakeUs.Moira.util.response.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ListResult extends CommonResult { + private List list; +} diff --git a/src/main/java/MakeUs/Moira/util/response/model/SingleResult.java b/src/main/java/MakeUs/Moira/util/response/model/SingleResult.java new file mode 100644 index 0000000..ae2cd1f --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/response/model/SingleResult.java @@ -0,0 +1,10 @@ +package MakeUs.Moira.util.response.model; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SingleResult extends CommonResult { + private T data; +} diff --git a/src/main/java/MakeUs/Moira/util/token/TokenProvider.java b/src/main/java/MakeUs/Moira/util/token/TokenProvider.java new file mode 100644 index 0000000..22e1629 --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/token/TokenProvider.java @@ -0,0 +1,6 @@ +package MakeUs.Moira.util.token; + +public interface TokenProvider { + String getProviderName(); + String getUserSocialId(String accessToken); +} diff --git a/src/main/java/MakeUs/Moira/util/token/TokenProviderFactory.java b/src/main/java/MakeUs/Moira/util/token/TokenProviderFactory.java new file mode 100644 index 0000000..7867a0f --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/token/TokenProviderFactory.java @@ -0,0 +1,22 @@ +package MakeUs.Moira.util.token; + +import MakeUs.Moira.exception.CustomException; +import MakeUs.Moira.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class TokenProviderFactory { + + private final List tokenProviderList; + + public TokenProvider getTokenProvider(String providerName) { + return tokenProviderList.stream() + .filter(tokenProvider -> tokenProvider.getProviderName().equals(providerName)) + .findFirst() + .orElseThrow(() -> new CustomException(ErrorCode.INVALID_TOKEN_PROVIDER)); + } +} diff --git a/src/main/java/MakeUs/Moira/util/token/kakaoTokenProvider.java b/src/main/java/MakeUs/Moira/util/token/kakaoTokenProvider.java new file mode 100644 index 0000000..0c94dd5 --- /dev/null +++ b/src/main/java/MakeUs/Moira/util/token/kakaoTokenProvider.java @@ -0,0 +1,41 @@ +package MakeUs.Moira.util.token; + + +import org.json.JSONObject; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + + +@Component +public class kakaoTokenProvider implements TokenProvider{ + + private String providerName = "kakao"; + + @Override + public String getProviderName() { + return this.providerName; + } + + @Override + public String getUserSocialId(String accessToken) { + + ResponseEntity responseHttpEntity = requestByAccessToken(accessToken); + + String response = responseHttpEntity.getBody(); + JSONObject jObject = new JSONObject(response); + + return String.valueOf(jObject.getInt("id")); + } + + private ResponseEntity requestByAccessToken(String accessToken){ + RestTemplate rest = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.add("Authorization", "Bearer " + accessToken); + String body = ""; + + HttpEntity requestEntity = new HttpEntity<>(body, headers); + ResponseEntity responseEntity = rest.exchange("https://kapi.kakao.com/v1/user/access_token_info", HttpMethod.GET, requestEntity, String.class); + return responseEntity; + } +}