ErrorCode.java

package com.newbit.common.exception;

import org.springframework.http.HttpStatus;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor(access = AccessLevel.PACKAGE)
public enum ErrorCode {

    /*--------------- 회원 ------------------*/
    //회원
    ALREADY_REGISTERED_EMAIL("10001", "이미 가입한 아이디입니다.", HttpStatus.CONFLICT),
    FIND_EMAIL_BY_NAME_AND_PHONE_ERROR("10002", "이름 혹은 핸드폰번호를 잘못 입력하셨습니다.", HttpStatus.BAD_REQUEST),
    MAIL_SEND_FAIL("10003", "메일 전송에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    USER_NOT_FOUND("10004", "사용자를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    MENTOR_NOT_FOUND("10005", "해당 멘토를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    USER_INFO_NOT_FOUND("10006", "정보 조회에 실패했습니다.", HttpStatus.NOT_FOUND),
    ALREADY_REGISTERED_PHONENUMBER("10007", "이미 존재하는 핸드폰 번호입니다.", HttpStatus.BAD_REQUEST),
    ALREADY_REGISTERED_NICKNAME("10008", "이미 존재하는 닉네임입니다.", HttpStatus.BAD_REQUEST),
    INVALID_PASSWORD_FORMAT("10009", "최소 8자, 영문자, 숫자, 특수문자 포함해야합니다.", HttpStatus.BAD_REQUEST),
    INVALID_CURRENT_PASSWORD("10010", "비밀번호가 올바르지 않습니다.", HttpStatus.BAD_REQUEST),
    //인증
    JWT_INVALID("10011", "유효하지 않은 JWT 토큰입니다.", HttpStatus.UNAUTHORIZED),
    JWT_EXPIRED("10012", "만료된 JWT 토큰입니다.", HttpStatus.UNAUTHORIZED),
    JWT_UNSUPPORTED("10013", "지원하지 않는 JWT 토큰입니다.", HttpStatus.BAD_REQUEST),
    JWT_CLAIMS_EMPTY("10014", "JWT 클레임이 비어 있습니다.", HttpStatus.BAD_REQUEST),
    INTERNAL_SERVER_ERROR("10015", "내부 서버 오류입니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    // 입력 값 검증 오류
    VALIDATION_ERROR("11001", "입력 값 검증 오류입니다.", HttpStatus.BAD_REQUEST),

    /*--------------- 게시판 ------------------*/
    //게시글
    POST_NOT_FOUND("20001", "해당 게시글이 존재하지 않습니다.", HttpStatus.NOT_FOUND),
    UNAUTHORIZED_TO_UPDATE_POST("20002", "게시글은 작성자만 수정할 수 있습니다.", HttpStatus.FORBIDDEN),
    ONLY_USER_CAN_CREATE_POST("20003", "게시글은 회원만 작성할 수 있습니다.", HttpStatus.FORBIDDEN),
    UNAUTHORIZED_TO_DELETE_POST("20004", "게시글은 작성자만 삭제할 수 있습니다.", HttpStatus.FORBIDDEN),
    ONLY_ADMIN_CAN_CREATE_NOTICE("20005", "공지사항은 관리자만 등록할 수 있습니다.", HttpStatus.FORBIDDEN),
    ONLY_ADMIN_CAN_UPDATE_NOTICE("20006", "공지사항은 관리자만 수정할 수 있습니다.", HttpStatus.FORBIDDEN),
    ONLY_ADMIN_CAN_DELETE_NOTICE("20007", "공지사항은 관리자만 삭제할 수 있습니다.", HttpStatus.FORBIDDEN),
    NOT_A_NOTICE("20008", "해당 게시글은 공지사항이 아닙니다.", HttpStatus.BAD_REQUEST),
    POST_LIKE_NOT_FOUND("20009", "해당 게시글 좋아요를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    LIKE_PROCESSING_ERROR("20010", "좋아요 처리 중 오류가 발생했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    FILE_SAVE_ERROR("20011", "파일 저장에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    FILE_DELETE_ERROR("20012", "파일 삭제에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    //댓글
    COMMENT_NOT_FOUND("20013", "해당 댓글이 존재하지 않습니다.", HttpStatus.NOT_FOUND),
    UNAUTHORIZED_TO_DELETE_COMMENT("20014", "댓글은 작성자만 삭제할 수 있습니다.", HttpStatus.FORBIDDEN),
    UNAUTHORIZED_TO_CREATE_COMMENT("20015", "댓글 작성은 회원만 가능합니다.", HttpStatus.FORBIDDEN),
    COMMENT_POST_MISMATCH("20016", "해당 댓글은 게시글과 매칭되지 않습니다.", HttpStatus.BAD_REQUEST),

    /*--------------- 칼럼 ------------------*/
    // 칼럼
    COLUMN_NOT_FOUND("21001", "해당 칼럼을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    COLUMN_NOT_OWNED("21002", "해당 칼럼에 대한 권한이 없습니다.", HttpStatus.FORBIDDEN),
    COLUMN_ALREADY_IN_SERIES("21003", "해당 칼럼은 이미 다른 시리즈에 속해있습니다.", HttpStatus.BAD_REQUEST),
    COLUMN_REQUEST_NOT_FOUND("21004", "해당 칼럼 요청을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    INVALID_REQUEST_TYPE("21005", "잘못된 요청 타입 입니다.", HttpStatus.BAD_REQUEST),
    COLUMN_LIKE_NOT_FOUND("21006", "해당 칼럼 좋아요를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    // 시리즈
    SERIES_CREATION_REQUIRES_COLUMNS("21007", "시리즈는 최소 1개 이상의 칼럼으로 생성되어야 합니다.", HttpStatus.BAD_REQUEST),
    SERIES_NOT_FOUND("21008", "해당 시리즈를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    SUBSCRIPTION_NOT_FOUND("21009", "해당 구독 정보를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    SUBSCRIPTION_PROCESSING_ERROR("21010", "구독 처리 중 오류가 발생했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),

    /*--------------- 커피챗 ------------------*/
    // 커피챗
    COFFEECHAT_NOT_FOUND("30001", "해당 커피챗을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    REQUEST_TIME_NOT_FOUND("30002", "해당 커피챗 시간 요청내역을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    COFFEECHAT_ALREADY_EXIST("30003", "해당 멘토와의 커피챗이 이미 존재합니다.", HttpStatus.CONFLICT),
    REQUEST_DATE_IN_PAST("30004", "시작 날짜가 오늘보다 이전입니다.", HttpStatus.UNPROCESSABLE_ENTITY),
    COFFEECHAT_CANCEL_NOT_ALLOWED("30005", "본인의 커피챗만 취소 가능합니다.", HttpStatus.FORBIDDEN),
    COFFEECHAT_NOT_REFUNDABLE("30006", "커피챗이 환불 가능한 상태가 아닙니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    INVALID_COFFEECHAT_STATUS_CANCEL("30007", "커피챗이 취소 가능한 상태가 아닙니다.", HttpStatus.BAD_REQUEST),
    //리뷰
    INVALID_COFFEECHAT_STATUS_COMPLETE("30008", "커피챗이 리뷰를 장성할 수 있는 상태가 아닙니다.", HttpStatus.BAD_REQUEST),
    REVIEW_ALREADY_EXIST("30009", "해당 커피챗에 대한 리뷰가 이미 존재합니다.", HttpStatus.CONFLICT),
    REVIEW_CREATE_NOT_ALLOWED("30010", "본인이 멘티인 커피챗만 리뷰 작성 가능합니다.", HttpStatus.FORBIDDEN),
    REVIEW_CANCEL_NOT_ALLOWED("30011", "본인의 리뷰만 취소 가능합니다.", HttpStatus.FORBIDDEN),
    REVIEW_NOT_FOUND("30012", "해당 리뷰를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),

    /*--------------- 커피레터 ------------------*/
    COFFEELETTER_NOT_FOUND("31001", "해당 커피레터를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    COFFEELETTER_ROOM_NOT_FOUND("31002", "해당 룸을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    COFFEELETTER_INVALID_ACCESS("31003", "커피레터에 접근 권한이 없습니다.", HttpStatus.FORBIDDEN),
    COFFEELETTER_ALREADY_EXIST("31004", "커피레터가 이미 존재합니다.", HttpStatus.CONFLICT),

    /*--------------- 구매 ------------------*/
    COLUMN_ALREADY_PURCHASED("60001", "이미 구매한 칼럼입니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    INSUFFICIENT_DIAMOND("60002", "보유한 다이아가 부족합니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    COLUMN_FREE_CANNOT_PURCHASE("60003", "무료 칼럼은 구매할 수 없습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    COLUMN_NOT_PURCHASED("60004", "칼럼을 구매한 사용자만 조회할 수 있습니다.", HttpStatus.FORBIDDEN),
    COFFEECHAT_NOT_PURCHASABLE("60005", "커피챗이 구매할 수 없는 상태입니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    ALREADY_MENTOR("60006", "이미 멘토인 회원입니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    INSUFFICIENT_POINT("60007", "보유한 포인트가 부족합니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    INVALID_PURCHASE_TYPE("60008", "알수없는 재화 타입", HttpStatus.INTERNAL_SERVER_ERROR),
    POINT_TYPE_NOT_FOUND("60009", "포인트 유형이 잘못 되었습니다.", HttpStatus.NOT_FOUND),
    INVALID_TIP_AMOUNT("60010", "잘못된 팁 제공량 입니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    COFFEECHAT_PURCHASE_NOT_ALLOWED("60011", "본인의 커피챗만 구매 가능합니다.", HttpStatus.FORBIDDEN),

    /*--------------- 결제 ------------------*/
    PAYMENT_NOT_FOUND("61001", "결제 정보를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    PAYMENT_AMOUNT_MISMATCH("61002", "결제 금액이 일치하지 않습니다.", HttpStatus.BAD_REQUEST),
    PAYMENT_ALREADY_PROCESSED("61003", "이미 처리된 결제입니다.", HttpStatus.BAD_REQUEST),
    PAYMENT_APPROVAL_FAILED("61004", "결제 승인에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    PAYMENT_REFUND_FAILED("61005", "결제 환불에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    PAYMENT_NOT_REFUNDABLE("61006", "환불 가능한 결제가 아닙니다.", HttpStatus.BAD_REQUEST),
    PAYMENT_DETAILS_NOT_FOUND("61007", "결제 상세 정보를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    VIRTUAL_ACCOUNT_ISSUANCE_FAILED("61008", "가상계좌 발급에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
    PAYMENT_REFUND_NOT_FOUND("61009", "환불 내역을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    PAYMENT_CANNOT_BE_CANCELLED("61010", "결제를 취소할 수 없는 상태입니다.", HttpStatus.BAD_REQUEST),
    PAYMENT_NOT_PARTIAL_CANCELABLE("61011", "부분 취소가 불가능한 결제입니다.", HttpStatus.BAD_REQUEST),
    REFUND_AMOUNT_EXCEEDS_BALANCE("61012", "환불 금액이 잔액을 초과합니다.", HttpStatus.BAD_REQUEST),
    PAYMENT_CANCEL_FAILED("61013", "결제 취소 처리 중 오류가 발생했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),

    /*--------------- 정산 ------------------*/
    SETTLEMENT_NOT_FOUND("62001", "정산 내역을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),

    /*--------------- 상품 ------------------*/
    PRODUCT_NOT_FOUND("70001", "해당 상품을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    PRODUCT_INACTIVE("70002", "비활성화된 상품입니다.", HttpStatus.BAD_REQUEST),
    PRODUCT_PRICE_MISMATCH("70003", "상품 가격이 일치하지 않습니다.", HttpStatus.BAD_REQUEST),
    PRODUCT_INVALID_DIAMOND_AMOUNT("70004", "올바르지 않은 다이아몬드 수량입니다.", HttpStatus.BAD_REQUEST),
    PRODUCT_NAME_DUPLICATE("70005", "이미 존재하는 상품명입니다.", HttpStatus.CONFLICT),
    PRODUCT_ORDER_INVALID("70006", "주문 정보를 찾을 수 없습니다.", HttpStatus.BAD_REQUEST),
    PRODUCT_PURCHASE_UNAUTHORIZED("70007", "상품 구매 권한이 없습니다.", HttpStatus.FORBIDDEN),

    /*--------------- 신고 ------------------*/
    REPORT_NOT_FOUND("80001", "해당 신고를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    REPORT_TYPE_NOT_FOUND("80002", "해당 신고 유형을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    REPORT_ALREADY_PROCESSED("80003", "이미 처리된 신고입니다.", HttpStatus.BAD_REQUEST),
    REPORT_CONTENT_NOT_FOUND("80004", "신고된 컨텐츠를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    SELF_REPORT_NOT_ALLOWED("80005", "자신의 컨텐츠는 신고할 수 없습니다.", HttpStatus.BAD_REQUEST),
    DUPLICATE_REPORT("80006", "이미 신고한 컨텐츠입니다.", HttpStatus.CONFLICT),
    UNAUTHORIZED_REPORT_ACCESS("80007", "신고 정보에 접근 권한이 없습니다.", HttpStatus.FORBIDDEN),
    INVALID_REPORT_STATUS_CHANGE("80008", "유효하지 않은 신고 상태 변경입니다.", HttpStatus.BAD_REQUEST),
    MAXIMUM_REPORTS_REACHED("80009", "최대 신고 횟수를 초과했습니다.", HttpStatus.TOO_MANY_REQUESTS),
    REPORT_PROCESS_ERROR("80010", "신고 처리 중 오류가 발생했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),

    /*--------------- 알림 ------------------*/
    NOTIFICATION_TYPE_NOT_FOUND("90001", "잘못된 알림 유형 입니다.", HttpStatus.NOT_FOUND),
    NOTIFICATION_NOT_FOUND("90002", "알림을 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
    UNAUTHORIZED_ACCESS("90003", "인증되지 않은 접근", HttpStatus.UNAUTHORIZED);

    /*--------------- 기타 ------------------*/

    /*--------------- 추가 결제 에러 코드 ------------------*/

    private final String code;
    private final String message;
    private final HttpStatus httpStatus;
}