diff --git a/src/main/java/aplp/backend/core/common/exception/DomainException.java b/src/main/java/aplp/backend/core/common/exception/DomainException.java new file mode 100644 index 0000000..8d63959 --- /dev/null +++ b/src/main/java/aplp/backend/core/common/exception/DomainException.java @@ -0,0 +1,15 @@ +package aplp.backend.core.common.exception; + +public class DomainException extends RuntimeException { + + private final ErrorCode code; + + public DomainException(ErrorCode code, String message) { + super(message); + this.code = code; + } + + public ErrorCode code() { + return code; + } +} \ No newline at end of file diff --git a/src/main/java/aplp/backend/core/common/exception/ErrorCode.java b/src/main/java/aplp/backend/core/common/exception/ErrorCode.java new file mode 100644 index 0000000..82d3702 --- /dev/null +++ b/src/main/java/aplp/backend/core/common/exception/ErrorCode.java @@ -0,0 +1,26 @@ +package aplp.backend.core.common.exception; + +public enum ErrorCode { + + INVALID_ARGUMENT(400), + VALIDATION_FAILED(400), + MALFORMED_REQUEST(400), + UNAUTHENTICATED(401), + INVALID_CREDENTIALS(401), + INVALID_REFRESH_TOKEN(401), + ACCESS_DENIED(403), + EMAIL_ALREADY_EXISTS(409), + USER_NOT_FOUND(404), + LEARNER_NOT_FOUND(404), + INTERNAL_ERROR(500); + + private final int status; + + ErrorCode(int status) { + this.status = status; + } + + public int status() { + return status; + } +} \ No newline at end of file diff --git a/src/main/java/aplp/backend/core/common/response/ApiError.java b/src/main/java/aplp/backend/core/common/response/ApiError.java new file mode 100644 index 0000000..b075558 --- /dev/null +++ b/src/main/java/aplp/backend/core/common/response/ApiError.java @@ -0,0 +1,17 @@ +package aplp.backend.core.common.response; + +import java.time.Instant; + +public record ApiError( + Instant timestamp, + int status, + String error, + String code, + String message, + String traceId +) { + + public static ApiError of(int status, String error, String code, String message, String traceId) { + return new ApiError(Instant.now(), status, error, code, message, traceId); + } +} \ No newline at end of file diff --git a/src/main/java/aplp/backend/core/common/util/TokenHasher.java b/src/main/java/aplp/backend/core/common/util/TokenHasher.java new file mode 100644 index 0000000..562e87b --- /dev/null +++ b/src/main/java/aplp/backend/core/common/util/TokenHasher.java @@ -0,0 +1,21 @@ +package aplp.backend.core.common.util; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HexFormat; + +public final class TokenHasher { + + private TokenHasher() { + } + + public static String sha256Hex(String value) { + try { + byte[] digest = MessageDigest.getInstance("SHA-256").digest(value.getBytes(StandardCharsets.UTF_8)); + return HexFormat.of().formatHex(digest); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("SHA-256 not available", e); + } + } +} \ No newline at end of file