From 37dd5bf937b308a792717562d3103f2442cce325 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Sun, 4 Jan 2026 14:35:35 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20Config=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DatasourceProxyConfig.java | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 app-main/src/main/java/net/causw/app/main/core/datasourceProxy/DatasourceProxyConfig.java diff --git a/app-main/src/main/java/net/causw/app/main/core/datasourceProxy/DatasourceProxyConfig.java b/app-main/src/main/java/net/causw/app/main/core/datasourceProxy/DatasourceProxyConfig.java deleted file mode 100644 index d5e0475ca..000000000 --- a/app-main/src/main/java/net/causw/app/main/core/datasourceProxy/DatasourceProxyConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.causw.app.main.core.datasourceProxy; - -import javax.sql.DataSource; - -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder; - -import com.zaxxer.hikari.HikariDataSource; - -@Configuration -public class DatasourceProxyConfig { - - @Bean - @Primary - // 기본 HikaridataSource를 Proxy로 감싸서 Datasource 생성 - public DataSource dataSource(DataSourceProperties properties, ApiQueryCountListener listener) { - HikariDataSource hikari = properties.initializeDataSourceBuilder() - .type(HikariDataSource.class) - .build(); - - return ProxyDataSourceBuilder.create(hikari) - .listener(listener) - .build(); - } -} From 84d76def894e6b84e1ff306fff458ba15baedfd6 Mon Sep 17 00:00:00 2001 From: KEEKE132 Date: Sun, 4 Jan 2026 15:14:45 +0900 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/board/BoardOfCircleResponseDto.java | 124 ++++---- .../dto/circle/CircleBoardsResponseDto.java | 68 ++--- .../dto/circle/CircleMemberResponseDto.java | 60 ++-- .../api/dto/circle/CirclesResponseDto.java | 110 +++---- .../duplicate/DuplicatedCheckResponseDto.java | 36 +-- .../api/dto/user/UserFindIdRequestDto.java | 28 +- .../dto/user/UserFindPasswordRequestDto.java | 48 +-- ...eUserCouncilFeeWithFakeUserRequestDto.java | 116 ++++---- .../domain/campus/circle/entity/Circle.java | 242 +++++++-------- .../domain/user/account/enums/user/Role.java | 170 +++++------ .../util/PhoneNumberFormatValidator.java | 74 ++--- .../user/account/util/UserRoleValidator.java | 86 +++--- .../causw/app/main/shared/StatusPolicy.java | 278 +++++++++--------- 13 files changed, 720 insertions(+), 720 deletions(-) diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/board/BoardOfCircleResponseDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/board/BoardOfCircleResponseDto.java index 547466988..8c9d3e296 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/board/BoardOfCircleResponseDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/board/BoardOfCircleResponseDto.java @@ -1,62 +1,62 @@ -package net.causw.app.main.api.dto.board; - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import net.causw.app.main.domain.community.board.entity.Board; -import net.causw.app.main.domain.user.account.enums.user.Role; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BoardOfCircleResponseDto { - - @Schema(description = "게시판 id 값", example = "uuid 형식의 String 값입니다.") - private String id; - - @Schema(description = "게시판 이름", example = "board_example") - private String name; - - @Schema(description = "작성 가능 여부", example = "true") - private Boolean writable; - - @Schema(description = "삭제 여부", example = "false") - private Boolean isDeleted; - - @Schema(description = "게시글 id", example = "uuid 형식의 String 값입니다.") - private String postId; - - @Schema(description = "게시글 제목", example = "post_title_example") - private String postTitle; - - @Schema(description = "게시글 작성자 이름", example = "post_writer_example") - private String postWriterName; - - @Schema(description = "게시글 작성자 id", example = "uuid 형식의 String 값입니다.") - private String postWriterStudentId; - - @Schema(description = "게시글 생성 시간", example = "2024-01-26T18:40:40.643Z") - private LocalDateTime postCreatedAt; - - @Schema(description = "게시글 댓글 개수", example = "12") - private Long postNumComment; - - // Board의 CreateRoles는 List가 ","로 이어진 형태로 존재. "," 기준으로 split해서 List으로 변환 후 userRole과 비교 - public static Boolean isWriteable(Board board, Set userRoles) { - List createRolesList = Arrays.asList(board.getCreateRoles().split(",")); - return userRoles.stream() - .map(Role::getValue) - .anyMatch(createRolesList::contains); - } -} +package net.causw.app.main.api.dto.board; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import net.causw.app.main.domain.community.board.entity.Board; +import net.causw.app.main.domain.user.account.enums.user.Role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BoardOfCircleResponseDto { + + @Schema(description = "게시판 id 값", example = "uuid 형식의 String 값입니다.") + private String id; + + @Schema(description = "게시판 이름", example = "board_example") + private String name; + + @Schema(description = "작성 가능 여부", example = "true") + private Boolean writable; + + @Schema(description = "삭제 여부", example = "false") + private Boolean isDeleted; + + @Schema(description = "게시글 id", example = "uuid 형식의 String 값입니다.") + private String postId; + + @Schema(description = "게시글 제목", example = "post_title_example") + private String postTitle; + + @Schema(description = "게시글 작성자 이름", example = "post_writer_example") + private String postWriterName; + + @Schema(description = "게시글 작성자 id", example = "uuid 형식의 String 값입니다.") + private String postWriterStudentId; + + @Schema(description = "게시글 생성 시간", example = "2024-01-26T18:40:40.643Z") + private LocalDateTime postCreatedAt; + + @Schema(description = "게시글 댓글 개수", example = "12") + private Long postNumComment; + + // Board의 CreateRoles는 List가 ","로 이어진 형태로 존재. "," 기준으로 split해서 List으로 변환 후 userRole과 비교 + public static Boolean isWriteable(Board board, Set userRoles) { + List createRolesList = Arrays.asList(board.getCreateRoles().split(",")); + return userRoles.stream() + .map(Role::getValue) + .anyMatch(createRolesList::contains); + } +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleBoardsResponseDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleBoardsResponseDto.java index b2aeff190..d0e130a42 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleBoardsResponseDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleBoardsResponseDto.java @@ -1,34 +1,34 @@ -package net.causw.app.main.api.dto.circle; - -import java.util.List; - -import net.causw.app.main.api.dto.board.BoardOfCircleResponseDto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -public class CircleBoardsResponseDto { - - @Schema(description = "동아리 정보", example = "동아리 responseDTO 객체를 반환합니다.") - private CircleResponseDto circle; - - @Schema(description = "동아리 게시판 리스트", example = "동아리의 속한 게시판 목록을 List 객체(리스트)로 반환합니다.") - private List boardList; - - public static CircleBoardsResponseDto from( - CircleResponseDto circle, - List boardList) { - return CircleBoardsResponseDto.builder() - .circle(circle) - .boardList(boardList) - .build(); - } - -} +package net.causw.app.main.api.dto.circle; + +import java.util.List; + +import net.causw.app.main.api.dto.board.BoardOfCircleResponseDto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +@AllArgsConstructor +public class CircleBoardsResponseDto { + + @Schema(description = "동아리 정보", example = "동아리 responseDTO 객체를 반환합니다.") + private CircleResponseDto circle; + + @Schema(description = "동아리 게시판 리스트", example = "동아리의 속한 게시판 목록을 List 객체(리스트)로 반환합니다.") + private List boardList; + + public static CircleBoardsResponseDto from( + CircleResponseDto circle, + List boardList) { + return CircleBoardsResponseDto.builder() + .circle(circle) + .boardList(boardList) + .build(); + } + +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleMemberResponseDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleMemberResponseDto.java index 37909a59b..0472bcafa 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleMemberResponseDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/circle/CircleMemberResponseDto.java @@ -1,30 +1,30 @@ -package net.causw.app.main.api.dto.circle; - -import net.causw.app.main.api.dto.user.UserResponseDto; -import net.causw.app.main.domain.campus.circle.enums.CircleMemberStatus; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -public class CircleMemberResponseDto { - - @Schema(description = "동아리원 고유 ID", example = "동아리원의 UUID 형식 유저 고유 ID 값입니다.") - private String id; - - @Schema(description = "동아리원의 상태입니다.", example = "MEMBER") - private CircleMemberStatus status; - - @Schema(description = "동아리 정보") - private CircleResponseDto circle; - - @Schema(description = "유저 정보") - private UserResponseDto user; - -} +package net.causw.app.main.api.dto.circle; + +import net.causw.app.main.api.dto.user.UserResponseDto; +import net.causw.app.main.domain.campus.circle.enums.CircleMemberStatus; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +@AllArgsConstructor +public class CircleMemberResponseDto { + + @Schema(description = "동아리원 고유 ID", example = "동아리원의 UUID 형식 유저 고유 ID 값입니다.") + private String id; + + @Schema(description = "동아리원의 상태입니다.", example = "MEMBER") + private CircleMemberStatus status; + + @Schema(description = "동아리 정보") + private CircleResponseDto circle; + + @Schema(description = "유저 정보") + private UserResponseDto user; + +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/circle/CirclesResponseDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/circle/CirclesResponseDto.java index cfa7442db..73585eb3d 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/circle/CirclesResponseDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/circle/CirclesResponseDto.java @@ -1,55 +1,55 @@ -package net.causw.app.main.api.dto.circle; - -import java.time.LocalDateTime; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -public class CirclesResponseDto { - @Schema(description = "동아리 ID", example = "UUID 형식의 동아리 고유 ID String 값입니다.") - private String id; - - @Schema(description = "동아리 이름", example = "소프트웨어학부 특별기구 ICT위원회 동문 네트워크") - private String name; - - @Schema(description = "동아리 메인 이미지(nullable)", example = "String") - private String mainImage; - - @Schema(description = "동아리 설명", example = "ICT위원회는 동문 네트워크 서비스를 만드는 특별기구이자 동아리입니다.") - private String description; - - @Schema(description = "동아리장 ID", example = "UUID 형식의 동아리장 ID(PK) String 값입니다.") - private String leaderId; - - @Schema(description = "동아리장 이름", example = "정상제") - private String leaderName; - - @Schema(description = "동아리원 숫자", example = "7") - private Long numMember; - - @Schema(description = "동아리 삭제 여부", example = "false") - private Boolean isDeleted; - - @Schema(description = "유저의 동아리 가입 여부\n(User Role ADMIN 일 시 항상 true)", example = "false") - private Boolean isJoined; - - @Schema(description = "동아리 생성 일시", example = "2024-02-04T16:11:02.342644") - private LocalDateTime createdAt; - - @Schema(description = "동아리 가입 시점\n(User Role ADMIN 일 시 항상 API 호출 시점)", example = "2024-02-04T16:11:02.342644") - private LocalDateTime joinedAt; - - @Schema(description = "동아리 모집 종료 날짜", example = "2024-10-10") - private LocalDateTime recruitEndDate; - - @Schema(description = "동아리 모집 여부", example = "false") - private Boolean isRecruit; - -} +package net.causw.app.main.api.dto.circle; + +import java.time.LocalDateTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +@AllArgsConstructor +public class CirclesResponseDto { + @Schema(description = "동아리 ID", example = "UUID 형식의 동아리 고유 ID String 값입니다.") + private String id; + + @Schema(description = "동아리 이름", example = "소프트웨어학부 특별기구 ICT위원회 동문 네트워크") + private String name; + + @Schema(description = "동아리 메인 이미지(nullable)", example = "String") + private String mainImage; + + @Schema(description = "동아리 설명", example = "ICT위원회는 동문 네트워크 서비스를 만드는 특별기구이자 동아리입니다.") + private String description; + + @Schema(description = "동아리장 ID", example = "UUID 형식의 동아리장 ID(PK) String 값입니다.") + private String leaderId; + + @Schema(description = "동아리장 이름", example = "정상제") + private String leaderName; + + @Schema(description = "동아리원 숫자", example = "7") + private Long numMember; + + @Schema(description = "동아리 삭제 여부", example = "false") + private Boolean isDeleted; + + @Schema(description = "유저의 동아리 가입 여부\n(User Role ADMIN 일 시 항상 true)", example = "false") + private Boolean isJoined; + + @Schema(description = "동아리 생성 일시", example = "2024-02-04T16:11:02.342644") + private LocalDateTime createdAt; + + @Schema(description = "동아리 가입 시점\n(User Role ADMIN 일 시 항상 API 호출 시점)", example = "2024-02-04T16:11:02.342644") + private LocalDateTime joinedAt; + + @Schema(description = "동아리 모집 종료 날짜", example = "2024-10-10") + private LocalDateTime recruitEndDate; + + @Schema(description = "동아리 모집 여부", example = "false") + private Boolean isRecruit; + +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/duplicate/DuplicatedCheckResponseDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/duplicate/DuplicatedCheckResponseDto.java index 15e901815..374270a50 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/duplicate/DuplicatedCheckResponseDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/duplicate/DuplicatedCheckResponseDto.java @@ -1,18 +1,18 @@ -package net.causw.app.main.api.dto.duplicate; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -public class DuplicatedCheckResponseDto { - - @Schema(description = "중복 여부 boolean 값", example = "true") - private Boolean result; - -} +package net.causw.app.main.api.dto.duplicate; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +@AllArgsConstructor +public class DuplicatedCheckResponseDto { + + @Schema(description = "중복 여부 boolean 값", example = "true") + private Boolean result; + +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindIdRequestDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindIdRequestDto.java index 02b875f93..c21b4ec82 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindIdRequestDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindIdRequestDto.java @@ -1,14 +1,14 @@ -package net.causw.app.main.api.dto.user; - -import jakarta.validation.constraints.NotBlank; -import lombok.Getter; - -@Getter -public class UserFindIdRequestDto { - @NotBlank(message = "전화번호는 비어있을 수 없습니다.") - private String phoneNumber; - - @NotBlank(message = "이름은 비어있을 수 없습니다.") - private String name; - -} +package net.causw.app.main.api.dto.user; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; + +@Getter +public class UserFindIdRequestDto { + @NotBlank(message = "전화번호는 비어있을 수 없습니다.") + private String phoneNumber; + + @NotBlank(message = "이름은 비어있을 수 없습니다.") + private String name; + +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindPasswordRequestDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindPasswordRequestDto.java index f0859b4d3..094e6cb9a 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindPasswordRequestDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/user/UserFindPasswordRequestDto.java @@ -1,24 +1,24 @@ -package net.causw.app.main.api.dto.user; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class UserFindPasswordRequestDto { - @Email(message = "이메일 형식에 맞지 않습니다.") - @NotBlank(message = "이메일을 입력해 주세요.") - private String email; - - @NotBlank(message = "이름을 입력해 주세요.") - private String name; - - @NotBlank(message = "전화번호를 입력해 주세요.") - private String phoneNumber; -} +package net.causw.app.main.api.dto.user; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class UserFindPasswordRequestDto { + @Email(message = "이메일 형식에 맞지 않습니다.") + @NotBlank(message = "이메일을 입력해 주세요.") + private String email; + + @NotBlank(message = "이름을 입력해 주세요.") + private String name; + + @NotBlank(message = "전화번호를 입력해 주세요.") + private String phoneNumber; +} diff --git a/app-main/src/main/java/net/causw/app/main/api/dto/userCouncilFee/CreateUserCouncilFeeWithFakeUserRequestDto.java b/app-main/src/main/java/net/causw/app/main/api/dto/userCouncilFee/CreateUserCouncilFeeWithFakeUserRequestDto.java index 8ae8892fb..fc3317a4f 100644 --- a/app-main/src/main/java/net/causw/app/main/api/dto/userCouncilFee/CreateUserCouncilFeeWithFakeUserRequestDto.java +++ b/app-main/src/main/java/net/causw/app/main/api/dto/userCouncilFee/CreateUserCouncilFeeWithFakeUserRequestDto.java @@ -1,58 +1,58 @@ -package net.causw.app.main.api.dto.userCouncilFee; - -import net.causw.app.main.domain.user.academic.enums.userAcademicRecord.AcademicStatus; -import net.causw.app.main.domain.user.account.enums.user.GraduationType; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Positive; -import lombok.Getter; - -@Getter -public class CreateUserCouncilFeeWithFakeUserRequestDto { - - @Schema(description = "이름", requiredMode = Schema.RequiredMode.REQUIRED, example = "정상제") - private String userName; - - @Schema(description = "학번", requiredMode = Schema.RequiredMode.REQUIRED, example = "20191234") - private String studentId; - - @Schema(description = "입학년도", requiredMode = Schema.RequiredMode.REQUIRED, example = "2019") - private Integer admissionYear; - - @Schema(description = "전공", requiredMode = Schema.RequiredMode.REQUIRED, example = "컴퓨터공학과") - private String major; - - @Schema(description = "학적상태", requiredMode = Schema.RequiredMode.REQUIRED, example = "ENROLLED") - private AcademicStatus academicStatus; - - @Schema(description = "등록 완료 학기", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") - private Integer currentCompletedSemester; - - @Schema(description = "졸업년도", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023") - private Integer graduationYear; - - @Schema(description = "졸업 유형", requiredMode = Schema.RequiredMode.REQUIRED, example = "FEBRUARY") - private GraduationType graduationType; - - @Schema(description = "전화번호", requiredMode = Schema.RequiredMode.REQUIRED, example = "010-1234-5678") - @Pattern(regexp = "^01(?:0|1|[6-9])-(\\d{3}|\\d{4})-\\d{4}$", message = "전화번호 형식에 맞지 않습니다.") - private String phoneNumber; - - @Schema(description = "납부 시점 학기", defaultValue = "1", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @Positive(message = "납부 시점 학기는 1 이상의 자연수 값입니다.") - private Integer paidAt; - - @Schema(description = "납부한 학기 수", defaultValue = "8", requiredMode = Schema.RequiredMode.REQUIRED, example = "8") - @Positive(message = "납부한 학기 수는 1 이상의 자연수 값입니다.") - private Integer numOfPaidSemester; - - @Schema(description = "환불 여부", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "환불 여부는 필수 입력 값입니다.") - private Boolean isRefunded; - - @Schema(description = "환불 시점(isRefunded가 true일 때만 존재", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2021-01-01") - private Integer refundedAt; - -} +package net.causw.app.main.api.dto.userCouncilFee; + +import net.causw.app.main.domain.user.academic.enums.userAcademicRecord.AcademicStatus; +import net.causw.app.main.domain.user.account.enums.user.GraduationType; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; +import lombok.Getter; + +@Getter +public class CreateUserCouncilFeeWithFakeUserRequestDto { + + @Schema(description = "이름", requiredMode = Schema.RequiredMode.REQUIRED, example = "정상제") + private String userName; + + @Schema(description = "학번", requiredMode = Schema.RequiredMode.REQUIRED, example = "20191234") + private String studentId; + + @Schema(description = "입학년도", requiredMode = Schema.RequiredMode.REQUIRED, example = "2019") + private Integer admissionYear; + + @Schema(description = "전공", requiredMode = Schema.RequiredMode.REQUIRED, example = "컴퓨터공학과") + private String major; + + @Schema(description = "학적상태", requiredMode = Schema.RequiredMode.REQUIRED, example = "ENROLLED") + private AcademicStatus academicStatus; + + @Schema(description = "등록 완료 학기", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") + private Integer currentCompletedSemester; + + @Schema(description = "졸업년도", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023") + private Integer graduationYear; + + @Schema(description = "졸업 유형", requiredMode = Schema.RequiredMode.REQUIRED, example = "FEBRUARY") + private GraduationType graduationType; + + @Schema(description = "전화번호", requiredMode = Schema.RequiredMode.REQUIRED, example = "010-1234-5678") + @Pattern(regexp = "^01(?:0|1|[6-9])-(\\d{3}|\\d{4})-\\d{4}$", message = "전화번호 형식에 맞지 않습니다.") + private String phoneNumber; + + @Schema(description = "납부 시점 학기", defaultValue = "1", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @Positive(message = "납부 시점 학기는 1 이상의 자연수 값입니다.") + private Integer paidAt; + + @Schema(description = "납부한 학기 수", defaultValue = "8", requiredMode = Schema.RequiredMode.REQUIRED, example = "8") + @Positive(message = "납부한 학기 수는 1 이상의 자연수 값입니다.") + private Integer numOfPaidSemester; + + @Schema(description = "환불 여부", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "환불 여부는 필수 입력 값입니다.") + private Boolean isRefunded; + + @Schema(description = "환불 시점(isRefunded가 true일 때만 존재", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2021-01-01") + private Integer refundedAt; + +} diff --git a/app-main/src/main/java/net/causw/app/main/domain/campus/circle/entity/Circle.java b/app-main/src/main/java/net/causw/app/main/domain/campus/circle/entity/Circle.java index 922ed6188..1189c58e1 100644 --- a/app-main/src/main/java/net/causw/app/main/domain/campus/circle/entity/Circle.java +++ b/app-main/src/main/java/net/causw/app/main/domain/campus/circle/entity/Circle.java @@ -1,121 +1,121 @@ -package net.causw.app.main.domain.campus.circle.entity; - -import java.time.LocalDateTime; -import java.util.Optional; - -import org.hibernate.annotations.ColumnDefault; - -import net.causw.app.main.domain.asset.file.entity.UuidFile; -import net.causw.app.main.domain.asset.file.entity.joinEntity.CircleMainImage; -import net.causw.app.main.domain.user.account.entity.user.User; -import net.causw.app.main.shared.entity.BaseEntity; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Entity -@Builder(access = AccessLevel.PROTECTED) -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@Table(name = "tb_circle") -public class Circle extends BaseEntity { - @Column(name = "name", nullable = false) - private String name; - - @Setter(value = AccessLevel.PROTECTED) - @OneToOne(cascade = {CascadeType.REMOVE, CascadeType.PERSIST}, mappedBy = "circle") - private CircleMainImage circleMainImage; - - @Column(name = "description", nullable = true) - private String description; - - @Column(name = "is_deleted") - @ColumnDefault("false") - private Boolean isDeleted; - - @Column(name = "circle_tax") - private Integer circleTax; - - @Column(name = "recruit_members") - private Integer recruitMembers; - - @Setter - @Column(name = "recruit_end_date") - private LocalDateTime recruitEndDate; - - @Setter - @Column(name = "is_recruit") - @Builder.Default - private Boolean isRecruit = false; - - @Setter - @OneToOne - @JoinColumn(name = "leader_id") - private User leader; - - public Optional getLeader() { - return Optional.ofNullable(this.leader); - } - - public static Circle of( - String name, - UuidFile uuidFile, - String description, - Boolean isDeleted, - Integer circleTax, - Integer recruitMembers, - User leader, - LocalDateTime recruitEndDate, - Boolean isRecruit) { - Circle circle = Circle.builder() - .name(name) - .description(description) - .isDeleted(isDeleted) - .circleTax(circleTax) - .recruitMembers(recruitMembers) - .leader(leader) - .recruitEndDate(recruitEndDate) - .isRecruit(isRecruit) - .build(); - - if (uuidFile == null) { - return circle; - } - - CircleMainImage circleMainImage = CircleMainImage.of( - circle, - uuidFile); - - circle.setCircleMainImage(circleMainImage); - - return circle; - } - - public void update(String name, String description, CircleMainImage circleMainImage, Integer circleTax, - Integer recruitMembers, LocalDateTime recruitEndDate, Boolean isRecruit) { - this.description = description; - this.name = name; - this.circleMainImage = circleMainImage; - this.circleTax = circleTax; - this.recruitMembers = recruitMembers; - this.recruitEndDate = recruitEndDate; - this.isRecruit = isRecruit; - } - - public void delete() { - this.isDeleted = true; - this.leader = null; - } - -} +package net.causw.app.main.domain.campus.circle.entity; + +import java.time.LocalDateTime; +import java.util.Optional; + +import org.hibernate.annotations.ColumnDefault; + +import net.causw.app.main.domain.asset.file.entity.UuidFile; +import net.causw.app.main.domain.asset.file.entity.joinEntity.CircleMainImage; +import net.causw.app.main.domain.user.account.entity.user.User; +import net.causw.app.main.shared.entity.BaseEntity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Entity +@Builder(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Table(name = "tb_circle") +public class Circle extends BaseEntity { + @Column(name = "name", nullable = false) + private String name; + + @Setter(value = AccessLevel.PROTECTED) + @OneToOne(cascade = {CascadeType.REMOVE, CascadeType.PERSIST}, mappedBy = "circle") + private CircleMainImage circleMainImage; + + @Column(name = "description", nullable = true) + private String description; + + @Column(name = "is_deleted") + @ColumnDefault("false") + private Boolean isDeleted; + + @Column(name = "circle_tax") + private Integer circleTax; + + @Column(name = "recruit_members") + private Integer recruitMembers; + + @Setter + @Column(name = "recruit_end_date") + private LocalDateTime recruitEndDate; + + @Setter + @Column(name = "is_recruit") + @Builder.Default + private Boolean isRecruit = false; + + @Setter + @OneToOne + @JoinColumn(name = "leader_id") + private User leader; + + public Optional getLeader() { + return Optional.ofNullable(this.leader); + } + + public static Circle of( + String name, + UuidFile uuidFile, + String description, + Boolean isDeleted, + Integer circleTax, + Integer recruitMembers, + User leader, + LocalDateTime recruitEndDate, + Boolean isRecruit) { + Circle circle = Circle.builder() + .name(name) + .description(description) + .isDeleted(isDeleted) + .circleTax(circleTax) + .recruitMembers(recruitMembers) + .leader(leader) + .recruitEndDate(recruitEndDate) + .isRecruit(isRecruit) + .build(); + + if (uuidFile == null) { + return circle; + } + + CircleMainImage circleMainImage = CircleMainImage.of( + circle, + uuidFile); + + circle.setCircleMainImage(circleMainImage); + + return circle; + } + + public void update(String name, String description, CircleMainImage circleMainImage, Integer circleTax, + Integer recruitMembers, LocalDateTime recruitEndDate, Boolean isRecruit) { + this.description = description; + this.name = name; + this.circleMainImage = circleMainImage; + this.circleTax = circleTax; + this.recruitMembers = recruitMembers; + this.recruitEndDate = recruitEndDate; + this.isRecruit = isRecruit; + } + + public void delete() { + this.isDeleted = true; + this.leader = null; + } + +} diff --git a/app-main/src/main/java/net/causw/app/main/domain/user/account/enums/user/Role.java b/app-main/src/main/java/net/causw/app/main/domain/user/account/enums/user/Role.java index 2d995718d..09db12643 100644 --- a/app-main/src/main/java/net/causw/app/main/domain/user/account/enums/user/Role.java +++ b/app-main/src/main/java/net/causw/app/main/domain/user/account/enums/user/Role.java @@ -1,85 +1,85 @@ -package net.causw.app.main.domain.user.account.enums.user; - -import java.util.Arrays; -import java.util.List; - -import org.springframework.stereotype.Component; - -import net.causw.global.exception.BadRequestException; -import net.causw.global.exception.ErrorCode; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum Role { - ADMIN("ADMIN", "관리자"), - PRESIDENT("PRESIDENT", "학생회장"), - VICE_PRESIDENT("VICE_PRESIDENT", "부학생회장"), - COUNCIL("COUNCIL", "학생회"), - LEADER_1("LEADER_1", "1학년 대표"), - LEADER_2("LEADER_2", "2학년 대표"), - LEADER_3("LEADER_3", "3학년 대표"), - LEADER_4("LEADER_4", "4학년 대표"), - LEADER_ALUMNI("LEADER_ALUMNI", "동문회장"), - ALUMNI_MANAGER("ALUMNI_MANAGER", "크자회 운영자"), - COMMON("COMMON", "일반"), - NONE("NONE", "없음"), - - // Deprecated Roles - @Deprecated - LEADER_CIRCLE("LEADER_CIRCLE", "동아리장"), - @Deprecated - PROFESSOR("PROFESSOR", "교수"); - - private final String value; - private final String description; - - public static Role of(String value) { - return Arrays.stream(values()) - .filter(v -> value.equalsIgnoreCase(v.value)) - .findFirst() - .orElseThrow( - () -> new BadRequestException( - ErrorCode.INVALID_REQUEST_ROLE, - String.format("'%s' is invalid : not supported", value))); - } - - public String authority() { - return "ROLE_" + value; - } - - public static List getPrivilegedRoles() { - return List.of( - ADMIN, - PRESIDENT, - VICE_PRESIDENT, - COUNCIL, - LEADER_1, - LEADER_2, - LEADER_3, - LEADER_4, - LEADER_ALUMNI, - ALUMNI_MANAGER); - } - - @Component("Role") - public static class RoleComponent { - public static final Role ADMIN = Role.ADMIN; - public static final Role PRESIDENT = Role.PRESIDENT; - public static final Role VICE_PRESIDENT = Role.VICE_PRESIDENT; - public static final Role COUNCIL = Role.COUNCIL; - public static final Role LEADER_1 = Role.LEADER_1; - public static final Role LEADER_2 = Role.LEADER_2; - public static final Role LEADER_3 = Role.LEADER_3; - public static final Role LEADER_4 = Role.LEADER_4; - public static final Role LEADER_ALUMNI = Role.LEADER_ALUMNI; - public static final Role ALUMNI_MANAGER = Role.ALUMNI_MANAGER; - public static final Role COMMON = Role.COMMON; - public static final Role NONE = Role.NONE; - - public static final Role LEADER_CIRCLE = Role.LEADER_CIRCLE; - public static final Role PROFESSOR = Role.PROFESSOR; - } -} +package net.causw.app.main.domain.user.account.enums.user; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Component; + +import net.causw.global.exception.BadRequestException; +import net.causw.global.exception.ErrorCode; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Role { + ADMIN("ADMIN", "관리자"), + PRESIDENT("PRESIDENT", "학생회장"), + VICE_PRESIDENT("VICE_PRESIDENT", "부학생회장"), + COUNCIL("COUNCIL", "학생회"), + LEADER_1("LEADER_1", "1학년 대표"), + LEADER_2("LEADER_2", "2학년 대표"), + LEADER_3("LEADER_3", "3학년 대표"), + LEADER_4("LEADER_4", "4학년 대표"), + LEADER_ALUMNI("LEADER_ALUMNI", "동문회장"), + ALUMNI_MANAGER("ALUMNI_MANAGER", "크자회 운영자"), + COMMON("COMMON", "일반"), + NONE("NONE", "없음"), + + // Deprecated Roles + @Deprecated + LEADER_CIRCLE("LEADER_CIRCLE", "동아리장"), + @Deprecated + PROFESSOR("PROFESSOR", "교수"); + + private final String value; + private final String description; + + public static Role of(String value) { + return Arrays.stream(values()) + .filter(v -> value.equalsIgnoreCase(v.value)) + .findFirst() + .orElseThrow( + () -> new BadRequestException( + ErrorCode.INVALID_REQUEST_ROLE, + String.format("'%s' is invalid : not supported", value))); + } + + public String authority() { + return "ROLE_" + value; + } + + public static List getPrivilegedRoles() { + return List.of( + ADMIN, + PRESIDENT, + VICE_PRESIDENT, + COUNCIL, + LEADER_1, + LEADER_2, + LEADER_3, + LEADER_4, + LEADER_ALUMNI, + ALUMNI_MANAGER); + } + + @Component("Role") + public static class RoleComponent { + public static final Role ADMIN = Role.ADMIN; + public static final Role PRESIDENT = Role.PRESIDENT; + public static final Role VICE_PRESIDENT = Role.VICE_PRESIDENT; + public static final Role COUNCIL = Role.COUNCIL; + public static final Role LEADER_1 = Role.LEADER_1; + public static final Role LEADER_2 = Role.LEADER_2; + public static final Role LEADER_3 = Role.LEADER_3; + public static final Role LEADER_4 = Role.LEADER_4; + public static final Role LEADER_ALUMNI = Role.LEADER_ALUMNI; + public static final Role ALUMNI_MANAGER = Role.ALUMNI_MANAGER; + public static final Role COMMON = Role.COMMON; + public static final Role NONE = Role.NONE; + + public static final Role LEADER_CIRCLE = Role.LEADER_CIRCLE; + public static final Role PROFESSOR = Role.PROFESSOR; + } +} diff --git a/app-main/src/main/java/net/causw/app/main/domain/user/account/util/PhoneNumberFormatValidator.java b/app-main/src/main/java/net/causw/app/main/domain/user/account/util/PhoneNumberFormatValidator.java index 0ee40b849..03f56b26d 100644 --- a/app-main/src/main/java/net/causw/app/main/domain/user/account/util/PhoneNumberFormatValidator.java +++ b/app-main/src/main/java/net/causw/app/main/domain/user/account/util/PhoneNumberFormatValidator.java @@ -1,38 +1,38 @@ -package net.causw.app.main.domain.user.account.util; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.causw.app.main.shared.AbstractValidator; -import net.causw.global.exception.BadRequestException; -import net.causw.global.exception.ErrorCode; - -public class PhoneNumberFormatValidator extends AbstractValidator { - - private final String phoneNumber; - - private PhoneNumberFormatValidator(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - public static PhoneNumberFormatValidator of(String phoneNumber) { - return new PhoneNumberFormatValidator(phoneNumber); - } - - @Override - public void validate() { - if (!this.validatePhoneNumber()) { - throw new BadRequestException( - ErrorCode.INVALID_USER_DATA_REQUEST, - "전화번호 형식이 잘못되었습니다."); - } - } - - public boolean validatePhoneNumber() { - String phoneNumberPolicy = "^01(?:0|1|[6-9])-(\\d{3}|\\d{4})-\\d{4}$"; - Pattern pattern_phoneNumber = Pattern.compile(phoneNumberPolicy); - Matcher matcher_phoneNumber = pattern_phoneNumber.matcher(this.phoneNumber); - - return matcher_phoneNumber.matches(); - } +package net.causw.app.main.domain.user.account.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.causw.app.main.shared.AbstractValidator; +import net.causw.global.exception.BadRequestException; +import net.causw.global.exception.ErrorCode; + +public class PhoneNumberFormatValidator extends AbstractValidator { + + private final String phoneNumber; + + private PhoneNumberFormatValidator(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public static PhoneNumberFormatValidator of(String phoneNumber) { + return new PhoneNumberFormatValidator(phoneNumber); + } + + @Override + public void validate() { + if (!this.validatePhoneNumber()) { + throw new BadRequestException( + ErrorCode.INVALID_USER_DATA_REQUEST, + "전화번호 형식이 잘못되었습니다."); + } + } + + public boolean validatePhoneNumber() { + String phoneNumberPolicy = "^01(?:0|1|[6-9])-(\\d{3}|\\d{4})-\\d{4}$"; + Pattern pattern_phoneNumber = Pattern.compile(phoneNumberPolicy); + Matcher matcher_phoneNumber = pattern_phoneNumber.matcher(this.phoneNumber); + + return matcher_phoneNumber.matches(); + } } \ No newline at end of file diff --git a/app-main/src/main/java/net/causw/app/main/domain/user/account/util/UserRoleValidator.java b/app-main/src/main/java/net/causw/app/main/domain/user/account/util/UserRoleValidator.java index 3ac5b28f1..703d124b1 100644 --- a/app-main/src/main/java/net/causw/app/main/domain/user/account/util/UserRoleValidator.java +++ b/app-main/src/main/java/net/causw/app/main/domain/user/account/util/UserRoleValidator.java @@ -1,43 +1,43 @@ -package net.causw.app.main.domain.user.account.util; - -import java.util.EnumSet; -import java.util.Set; - -import net.causw.app.main.domain.user.account.enums.user.Role; -import net.causw.app.main.shared.AbstractValidator; -import net.causw.global.constant.MessageUtil; -import net.causw.global.exception.ErrorCode; -import net.causw.global.exception.UnauthorizedException; - -public class UserRoleValidator extends AbstractValidator { - - private final Set requestUserRoles; - - private final Set targetRoleSet; - - private UserRoleValidator(Set requestUserRoles, Set targetRoleSet) { - this.requestUserRoles = requestUserRoles; - this.targetRoleSet = targetRoleSet; - } - - public static UserRoleValidator of(Set requestUserRoles, Set targetRoleSet) { - return new UserRoleValidator(requestUserRoles, targetRoleSet); - } - - @Override - public void validate() { - - if (this.requestUserRoles.stream() - .anyMatch(role -> EnumSet.of(Role.ADMIN, Role.PRESIDENT, Role.VICE_PRESIDENT).contains(role))) { - return; - } - - if (this.requestUserRoles.stream().anyMatch(this.targetRoleSet::contains)) { - return; - } - - throw new UnauthorizedException( - ErrorCode.API_NOT_ALLOWED, - MessageUtil.API_NOT_ACCESSIBLE); - } -} +package net.causw.app.main.domain.user.account.util; + +import java.util.EnumSet; +import java.util.Set; + +import net.causw.app.main.domain.user.account.enums.user.Role; +import net.causw.app.main.shared.AbstractValidator; +import net.causw.global.constant.MessageUtil; +import net.causw.global.exception.ErrorCode; +import net.causw.global.exception.UnauthorizedException; + +public class UserRoleValidator extends AbstractValidator { + + private final Set requestUserRoles; + + private final Set targetRoleSet; + + private UserRoleValidator(Set requestUserRoles, Set targetRoleSet) { + this.requestUserRoles = requestUserRoles; + this.targetRoleSet = targetRoleSet; + } + + public static UserRoleValidator of(Set requestUserRoles, Set targetRoleSet) { + return new UserRoleValidator(requestUserRoles, targetRoleSet); + } + + @Override + public void validate() { + + if (this.requestUserRoles.stream() + .anyMatch(role -> EnumSet.of(Role.ADMIN, Role.PRESIDENT, Role.VICE_PRESIDENT).contains(role))) { + return; + } + + if (this.requestUserRoles.stream().anyMatch(this.targetRoleSet::contains)) { + return; + } + + throw new UnauthorizedException( + ErrorCode.API_NOT_ALLOWED, + MessageUtil.API_NOT_ACCESSIBLE); + } +} diff --git a/app-main/src/main/java/net/causw/app/main/shared/StatusPolicy.java b/app-main/src/main/java/net/causw/app/main/shared/StatusPolicy.java index 65e0b999c..7c4f1d420 100644 --- a/app-main/src/main/java/net/causw/app/main/shared/StatusPolicy.java +++ b/app-main/src/main/java/net/causw/app/main/shared/StatusPolicy.java @@ -1,139 +1,139 @@ -package net.causw.app.main.shared; - -import java.util.Set; - -import net.causw.app.main.domain.community.board.entity.Board; -import net.causw.app.main.domain.community.comment.entity.ChildComment; -import net.causw.app.main.domain.community.comment.entity.Comment; -import net.causw.app.main.domain.community.post.entity.Post; -import net.causw.app.main.domain.community.vote.entity.Vote; -import net.causw.app.main.domain.user.account.entity.user.User; -import net.causw.app.main.domain.user.account.enums.user.Role; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; - -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class StatusPolicy { - - public static boolean isUpdatable(Comment comment, User user) { - if (comment.getIsDeleted()) - return false; - return user.getRoles().contains(Role.ADMIN) || comment.getWriter().getId().equals(user.getId()); - } - - public static boolean isDeletable(Comment comment, User user, Board board) { - Set roles = user.getRoles(); - if (comment.getIsDeleted()) - return false; - if (roles.contains(Role.ADMIN) || roles.contains(Role.PRESIDENT) || roles.contains(Role.VICE_PRESIDENT) - || comment.getWriter().getId().equals(user.getId())) { - return true; - } - User leader = board.getCircle() != null ? board.getCircle().getLeader().orElse(null) : null; - if (leader == null) - return false; - - return roles.contains(Role.LEADER_CIRCLE) && leader.getId().equals(user.getId()); - } - - public static boolean isUpdatable(ChildComment comment, User user) { - if (comment.getIsDeleted()) - return false; - return user.getRoles().contains(Role.ADMIN) || comment.getWriter().getId().equals(user.getId()); - } - - public static boolean isDeletable(ChildComment comment, User user, Board board) { - Set roles = user.getRoles(); - if (comment.getIsDeleted()) - return false; - if (roles.contains(Role.ADMIN) || roles.contains(Role.PRESIDENT) || roles.contains(Role.VICE_PRESIDENT) - || comment.getWriter().getId().equals(user.getId())) { - return true; - } - - User leader = board.getCircle() != null ? board.getCircle().getLeader().orElse(null) : null; - if (leader == null) - return false; - - return roles.contains(Role.LEADER_CIRCLE) && leader.getId().equals(user.getId()); - } - - public static boolean isUpdatable(Post post, User user, Boolean hasComment) { - // 게시글이 삭제된 경우 업데이트 불가 - if (post.getIsDeleted()) { - return false; - } - - // 사용자가 관리자 역할을 가진 경우 업데이트 가능 - if (user.getRoles().contains(Role.ADMIN)) { - return true; - } - - // 질문글이면서 댓글을 가진 경우는 업데이트 불가능 - if (post.getIsQuestion() && hasComment) { - return false; - } - - // 작성자인 경우 업데이트 가능 - return post.getWriter().getId().equals(user.getId()); - } - - public static boolean isDeletable(Post post, User user, Board board, Boolean hasComment) { - Set roles = user.getRoles(); - - // 게시글이 삭제된 경우 삭제 불가능 - if (post.getIsDeleted()) - return false; - - // 관리자, 회장, 부회장인 경우 삭제 가능 - if (roles.contains(Role.ADMIN) || roles.contains(Role.PRESIDENT) || roles.contains(Role.VICE_PRESIDENT)) { - return true; - } - - // 동아리 리더인 경우 삭제 가능 - if (board.getCircle() != null) { - User leader = board.getCircle().getLeader().orElse(null); - if (leader != null && roles.contains(Role.LEADER_CIRCLE) && leader.getId().equals(user.getId())) { - return true; - } - } - - // 질문글이면서 댓글을 가진 경우는 삭제 불가능 - if (post.getIsQuestion() && hasComment) { - return false; - } - - // 작성자인 경우 삭제 가능 - return post.getWriter().getId().equals(user.getId()); - } - - public static boolean isAdminOrPresident(User user) { - return user.getRoles().contains(Role.ADMIN) || user.getRoles().contains(Role.PRESIDENT) || user.getRoles() - .contains(Role.VICE_PRESIDENT); - } - - public static boolean isPostVote(Post post) { - return post.getVote() != null; - } - - public static boolean isPostForm(Post post) { - return post.getForm() != null; - } - - public static boolean isVoteOwner(Vote vote, User user) { - return user.equals(vote.getPost().getWriter()); - } - - public static boolean isPostOwner(Post post, User user) { - return user.equals(post.getWriter()); - } - - public static boolean isCommentOwner(Comment comment, User user) { - return user.equals(comment.getWriter()); - } - - public static boolean isChildCommentOwner(ChildComment childComment, User user) { - return user.equals(childComment.getWriter()); - } -} +package net.causw.app.main.shared; + +import java.util.Set; + +import net.causw.app.main.domain.community.board.entity.Board; +import net.causw.app.main.domain.community.comment.entity.ChildComment; +import net.causw.app.main.domain.community.comment.entity.Comment; +import net.causw.app.main.domain.community.post.entity.Post; +import net.causw.app.main.domain.community.vote.entity.Vote; +import net.causw.app.main.domain.user.account.entity.user.User; +import net.causw.app.main.domain.user.account.enums.user.Role; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class StatusPolicy { + + public static boolean isUpdatable(Comment comment, User user) { + if (comment.getIsDeleted()) + return false; + return user.getRoles().contains(Role.ADMIN) || comment.getWriter().getId().equals(user.getId()); + } + + public static boolean isDeletable(Comment comment, User user, Board board) { + Set roles = user.getRoles(); + if (comment.getIsDeleted()) + return false; + if (roles.contains(Role.ADMIN) || roles.contains(Role.PRESIDENT) || roles.contains(Role.VICE_PRESIDENT) + || comment.getWriter().getId().equals(user.getId())) { + return true; + } + User leader = board.getCircle() != null ? board.getCircle().getLeader().orElse(null) : null; + if (leader == null) + return false; + + return roles.contains(Role.LEADER_CIRCLE) && leader.getId().equals(user.getId()); + } + + public static boolean isUpdatable(ChildComment comment, User user) { + if (comment.getIsDeleted()) + return false; + return user.getRoles().contains(Role.ADMIN) || comment.getWriter().getId().equals(user.getId()); + } + + public static boolean isDeletable(ChildComment comment, User user, Board board) { + Set roles = user.getRoles(); + if (comment.getIsDeleted()) + return false; + if (roles.contains(Role.ADMIN) || roles.contains(Role.PRESIDENT) || roles.contains(Role.VICE_PRESIDENT) + || comment.getWriter().getId().equals(user.getId())) { + return true; + } + + User leader = board.getCircle() != null ? board.getCircle().getLeader().orElse(null) : null; + if (leader == null) + return false; + + return roles.contains(Role.LEADER_CIRCLE) && leader.getId().equals(user.getId()); + } + + public static boolean isUpdatable(Post post, User user, Boolean hasComment) { + // 게시글이 삭제된 경우 업데이트 불가 + if (post.getIsDeleted()) { + return false; + } + + // 사용자가 관리자 역할을 가진 경우 업데이트 가능 + if (user.getRoles().contains(Role.ADMIN)) { + return true; + } + + // 질문글이면서 댓글을 가진 경우는 업데이트 불가능 + if (post.getIsQuestion() && hasComment) { + return false; + } + + // 작성자인 경우 업데이트 가능 + return post.getWriter().getId().equals(user.getId()); + } + + public static boolean isDeletable(Post post, User user, Board board, Boolean hasComment) { + Set roles = user.getRoles(); + + // 게시글이 삭제된 경우 삭제 불가능 + if (post.getIsDeleted()) + return false; + + // 관리자, 회장, 부회장인 경우 삭제 가능 + if (roles.contains(Role.ADMIN) || roles.contains(Role.PRESIDENT) || roles.contains(Role.VICE_PRESIDENT)) { + return true; + } + + // 동아리 리더인 경우 삭제 가능 + if (board.getCircle() != null) { + User leader = board.getCircle().getLeader().orElse(null); + if (leader != null && roles.contains(Role.LEADER_CIRCLE) && leader.getId().equals(user.getId())) { + return true; + } + } + + // 질문글이면서 댓글을 가진 경우는 삭제 불가능 + if (post.getIsQuestion() && hasComment) { + return false; + } + + // 작성자인 경우 삭제 가능 + return post.getWriter().getId().equals(user.getId()); + } + + public static boolean isAdminOrPresident(User user) { + return user.getRoles().contains(Role.ADMIN) || user.getRoles().contains(Role.PRESIDENT) || user.getRoles() + .contains(Role.VICE_PRESIDENT); + } + + public static boolean isPostVote(Post post) { + return post.getVote() != null; + } + + public static boolean isPostForm(Post post) { + return post.getForm() != null; + } + + public static boolean isVoteOwner(Vote vote, User user) { + return user.equals(vote.getPost().getWriter()); + } + + public static boolean isPostOwner(Post post, User user) { + return user.equals(post.getWriter()); + } + + public static boolean isCommentOwner(Comment comment, User user) { + return user.equals(comment.getWriter()); + } + + public static boolean isChildCommentOwner(ChildComment childComment, User user) { + return user.equals(childComment.getWriter()); + } +}