package com.goldenchart.entity; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; /** * 사용자 차트 워크스페이스. * 멀티차트 레이아웃 및 슬롯 집합을 관리한다. */ @Entity @Table(name = "gc_chart_workspace") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder public class GcChartWorkspace { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** 소유 사용자 ID (users.id 논리 참조) */ @Column(name = "user_id") private Long userId; /** 비회원 기기 식별자 */ @Column(name = "device_id", length = 100) private String deviceId; /** 현재 적용된 레이아웃 ID (frontend layoutTypes.ts 의 LayoutDef.id 와 일치: "1","2v","2h",...) */ @Column(name = "layout_id", length = 20, nullable = false) private String layoutId; /** 차트 슬롯 설정 목록 (1:N) */ @OneToMany(mappedBy = "workspace", cascade = CascadeType.ALL, orphanRemoval = true) @OrderBy("slotIndex ASC") @Builder.Default private List slots = new ArrayList<>(); /** 차트 간 동기화 옵션 JSON {"symbol":true,"timeframe":false,"crosshair":true} */ @Column(name = "sync_options_json", columnDefinition = "JSON") @JdbcTypeCode(SqlTypes.JSON) private String syncOptionsJson; @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt; @Column(name = "updated_at") private LocalDateTime updatedAt; @PrePersist protected void onCreate() { createdAt = LocalDateTime.now(); updatedAt = LocalDateTime.now(); } @PreUpdate protected void onUpdate() { updatedAt = LocalDateTime.now(); } }