using Domain.Entities.Forum.Boards; using Microsoft.EntityFrameworkCore; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Domain.Entities.Forum.Posts { [Table("PostFile")] [Index(nameof(BoardID))] [Index(nameof(PostID))] [Index(nameof(UUID), IsUnique = true)] [Index(nameof(PostID), nameof(HashedName))] [Index(nameof(PostID), nameof(HashedName), nameof(IsDisabled))] public class PostFile { [ForeignKey(nameof(BoardID))] public Board Board { get; set; } = null!; [ForeignKey(nameof(PostID))] public Post Post { get; set; } = null!; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DisplayName("PK")] [Comment("PK")] public int ID { get; set; } [DisplayName("게시판 ID")] [Comment("게시판 ID")] public int BoardID { get; set; } [DisplayName("게시글 ID")] [Comment("게시글 ID")] public int PostID { get; set; } [DisplayName("파일 ID")] [Comment("파일 ID")] public Guid UUID { get; set; } [DisplayName("원본 파일명")] [Comment("원본 파일명")] [StringLength(255, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")] public string FileName { get; set; } = null!; [DisplayName("저장 파일명")] [Comment("저장 파일명")] [StringLength(255, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")] public string HashedName { get; set; } = null!; [DisplayName("저장 경로")] [Comment("저장 경로")] [StringLength(500, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")] public string Path { get; set; } = null!; [DisplayName("URL")] [Comment("URL")] [DataType(DataType.Url)] [Url(ErrorMessage = "올바른 URL 형식이 아닙니다.")] [StringLength(1000, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")] public string Url { get; set; } = null!; [DisplayName("확장자")] [Comment("확장자")] [StringLength(10, ErrorMessage = "{0}는 {1}자 이하로 입력하세요.")] public string? Extension { get; set; } = null; [DisplayName("MINE 타입")] [Comment("MIME 타입")] [StringLength(100, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")] public string? ContentType { get; set; } = null; [DisplayName("용량(byte)")] [Comment("용량(byte)")] public long? Size { get; set; } = null; [DisplayName("다운로드 수")] [Comment("다운로드 수")] [Range(0, int.MaxValue, ErrorMessage = "{0}은 {2}자 이상, {1}자 이하로 입력하세요.")] public int Downloads { get; set; } = 0; [DisplayName("비활성 여부")] [Comment("비활성 여부")] public bool IsDisabled { get; set; } = false; [DisplayName("비활성 일시")] [Comment("비활성 일시")] [DataType(DataType.DateTime)] public DateTime? DisabledAt { get; set; } = null; [DisplayName("등록 일시")] [Comment("등록 일시")] [DataType(DataType.DateTime)] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; } }