Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions docker-compose.local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
services:
mysql:
image: mysql:8.4
container_name: todayeng-mysql
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: today_eng
MYSQL_USER: todayeng
MYSQL_PASSWORD: todayeng1234
MYSQL_ROOT_PASSWORD: root1234
TZ: Asia/Seoul
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_0900_ai_ci
volumes:
- todayeng-mysql-data:/var/lib/mysql
healthcheck:
test:
[
"CMD-SHELL",
"mysqladmin ping -h localhost -uroot -proot1234 --silent"
]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s

volumes:
todayeng-mysql-data:
99 changes: 99 additions & 0 deletions src/main/java/com/example/todayEng/domain/diary/entity/Diary.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.example.todayEng.domain.diary.entity;

import com.example.todayEng.domain.diary.entity.enums.DiaryStatus;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

@Getter
@Entity
@Table(name = "diary")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Diary {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "diary_id")
private Long id;

/*
* User 엔티티 구현 후 수정
*
* @ManyToOne(fetch = FetchType.LAZY)
* @JoinColumn(name = "user_id", nullable = false)
* private User user;
*/
@Column(name = "user_id", nullable = false)
private Long userId;

@Column(name = "diary_date", nullable = false)
private LocalDate diaryDate;

@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false, length = 20)
private DiaryStatus status;

@Column(name = "memo", length = 500)
private String memo;

@CreationTimestamp
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;

@UpdateTimestamp
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;

@Column(name = "completed_at")
private LocalDateTime completedAt;

@Builder(access = AccessLevel.PRIVATE)
private Diary(
Long userId,
LocalDate diaryDate,
String memo
) {
this.userId = userId;
this.diaryDate = diaryDate;
this.memo = memo;
this.status = DiaryStatus.IN_PROGRESS;
}

public static Diary create(
Long userId,
LocalDate diaryDate,
String memo
) {
return Diary.builder()
.userId(userId)
.diaryDate(diaryDate)
.memo(memo)
.build();
}

public void updateMemo(String memo) {
this.memo = memo;
}

public void complete() {
if (this.status == DiaryStatus.COMPLETED) {
return;
}

this.status = DiaryStatus.COMPLETED;
this.completedAt = LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.example.todayEng.domain.diary.entity;

import com.example.todayEng.domain.diary.entity.enums.CorrectionStatus;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.annotations.UpdateTimestamp;
import org.hibernate.type.SqlTypes;

@Getter
@Entity
@Table(name = "diary_answer")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DiaryAnswer {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "answer_id")
private Long id;

@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(
name = "question_id",
nullable = false,
unique = true
)
private DiaryQuestion question;

@Column(name = "original_text", nullable = false, columnDefinition = "TEXT")
private String originalText;

@Column(name = "corrected_text", columnDefinition = "TEXT")
private String correctedText;

@Column(name = "correction_reason", columnDefinition = "TEXT")
private String correctionReason;

@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "alternative_expression", columnDefinition = "json")
private JsonNode alternativeExpression;

@Enumerated(EnumType.STRING)
@Column(name = "correction_status", nullable = false, length = 20)
private CorrectionStatus correctionStatus;

@CreationTimestamp
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;

@UpdateTimestamp
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;

@Builder(access = AccessLevel.PRIVATE)
private DiaryAnswer(
DiaryQuestion question,
String originalText
) {
this.question = question;
this.originalText = originalText;
this.correctionStatus = CorrectionStatus.PENDING;
}

public static DiaryAnswer create(
DiaryQuestion question,
String originalText
) {
return DiaryAnswer.builder()
.question(question)
.originalText(originalText)
.build();
}

public void updateOriginalText(String originalText) {
this.originalText = originalText;
this.correctedText = null;
this.correctionReason = null;
this.alternativeExpression = null;
this.correctionStatus = CorrectionStatus.PENDING;
}

public void startCorrection() {
this.correctionStatus = CorrectionStatus.PENDING;
}

public void completeCorrection(
String correctedText,
String correctionReason,
JsonNode alternativeExpression
) {
this.correctedText = correctedText;
this.correctionReason = correctionReason;
this.alternativeExpression = alternativeExpression;
this.correctionStatus = CorrectionStatus.SUCCEEDED;
}

public void failCorrection() {
this.correctionStatus = CorrectionStatus.FAILED;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.example.todayEng.domain.diary.entity;

import com.example.todayEng.domain.diary.entity.enums.DiaryContextType;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

@Getter
@Entity
@Table(name = "diary_context")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DiaryContext {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "context_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "diary_id", nullable = false)
private Diary diary;

@Enumerated(EnumType.STRING)
@Column(name = "context_type", nullable = false, length = 30)
private DiaryContextType contextType;

@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "context_data", columnDefinition = "json")
private JsonNode contextData;

@Column(name = "is_success", nullable = false)
private boolean success;

@CreationTimestamp
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;

@Builder(access = AccessLevel.PRIVATE)
private DiaryContext(
Diary diary,
DiaryContextType contextType,
JsonNode contextData,
boolean success
) {
this.diary = diary;
this.contextType = contextType;
this.contextData = contextData;
this.success = success;
}

public static DiaryContext success(
Diary diary,
DiaryContextType contextType,
JsonNode contextData
) {
return DiaryContext.builder()
.diary(diary)
.contextType(contextType)
.contextData(contextData)
.success(true)
.build();
}

public static DiaryContext failure(
Diary diary,
DiaryContextType contextType
) {
return DiaryContext.builder()
.diary(diary)
.contextType(contextType)
.success(false)
.build();
}

public void updateContextData(JsonNode contextData) {
this.contextData = contextData;
this.success = true;
}
}
Loading