mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 08:06:25 +00:00
Event Service 엔티티와 DDL 형상 일치화 작업
Critical 및 High 우선순위 이슈 수정: 1. Event 엔티티 nullable 필드 변경 - eventName: nullable로 변경 (AI 추천 후 설정) - startDate, endDate: nullable로 변경 (AI 추천 후 설정) 2. Event.publish() 검증 로직 강화 - eventName 필수 검증 추가 - startDate, endDate 필수 검증 추가 - 기간 유효성 검증 추가 (시작일 <= 종료일) 3. DDL 스키마 수정 - event_name NOT NULL 제거 - start_date, end_date NOT NULL 제거 - chk_event_period 제약조건 수정 (NULL 허용) 4. jobs 테이블 외래키 추가 - event_id에 대한 외래키 제약조건 추가 - ON DELETE CASCADE 설정으로 데이터 무결성 보장 영향: - 이벤트 생성 시 eventName, startDate, endDate를 NULL로 허용 - 배포(publish) 시점에 필수 필드 검증으로 데이터 무결성 보장 - 이벤트 삭제 시 관련 Job 자동 삭제로 고아 레코드 방지 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
7b76e573ed
commit
c63cf950eb
@ -22,11 +22,11 @@ CREATE TABLE IF NOT EXISTS events (
|
||||
event_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
user_id UUID NOT NULL,
|
||||
store_id UUID NOT NULL,
|
||||
event_name VARCHAR(200) NOT NULL,
|
||||
event_name VARCHAR(200),
|
||||
description TEXT,
|
||||
objective VARCHAR(100) NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'DRAFT',
|
||||
selected_image_id UUID,
|
||||
selected_image_url VARCHAR(500),
|
||||
@ -34,7 +34,7 @@ CREATE TABLE IF NOT EXISTS events (
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- 제약조건
|
||||
CONSTRAINT chk_event_period CHECK (start_date <= end_date),
|
||||
CONSTRAINT chk_event_period CHECK (start_date IS NULL OR end_date IS NULL OR start_date <= end_date),
|
||||
CONSTRAINT chk_event_status CHECK (status IN ('DRAFT', 'PUBLISHED', 'ENDED'))
|
||||
);
|
||||
|
||||
@ -185,6 +185,8 @@ CREATE TABLE IF NOT EXISTS jobs (
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- 제약조건
|
||||
CONSTRAINT fk_jobs_event FOREIGN KEY (event_id)
|
||||
REFERENCES events(event_id) ON DELETE CASCADE,
|
||||
CONSTRAINT chk_job_type CHECK (job_type IN ('AI_RECOMMENDATION', 'IMAGE_GENERATION')),
|
||||
CONSTRAINT chk_job_status CHECK (status IN ('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED')),
|
||||
CONSTRAINT chk_job_progress CHECK (progress >= 0 AND progress <= 100)
|
||||
|
||||
@ -43,7 +43,7 @@ public class Event extends BaseTimeEntity {
|
||||
@Column(name = "store_id", nullable = false, columnDefinition = "uuid")
|
||||
private UUID storeId;
|
||||
|
||||
@Column(name = "event_name", nullable = false, length = 200)
|
||||
@Column(name = "event_name", length = 200)
|
||||
private String eventName;
|
||||
|
||||
@Column(name = "description", columnDefinition = "TEXT")
|
||||
@ -52,10 +52,10 @@ public class Event extends BaseTimeEntity {
|
||||
@Column(name = "objective", nullable = false, length = 100)
|
||||
private String objective;
|
||||
|
||||
@Column(name = "start_date", nullable = false)
|
||||
@Column(name = "start_date")
|
||||
private LocalDate startDate;
|
||||
|
||||
@Column(name = "end_date", nullable = false)
|
||||
@Column(name = "end_date")
|
||||
private LocalDate endDate;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@ -147,6 +147,15 @@ public class Event extends BaseTimeEntity {
|
||||
}
|
||||
|
||||
// 필수 데이터 검증
|
||||
if (eventName == null || eventName.trim().isEmpty()) {
|
||||
throw new IllegalStateException("이벤트명을 입력해야 합니다.");
|
||||
}
|
||||
if (startDate == null || endDate == null) {
|
||||
throw new IllegalStateException("이벤트 기간을 설정해야 합니다.");
|
||||
}
|
||||
if (startDate.isAfter(endDate)) {
|
||||
throw new IllegalStateException("시작일은 종료일보다 이전이어야 합니다.");
|
||||
}
|
||||
if (selectedImageId == null) {
|
||||
throw new IllegalStateException("이미지를 선택해야 합니다.");
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user