using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using Microsoft.EntityFrameworkCore;
using bitforum.Constants;
using bitforum.Models.Log;
///
/// 사용자단 일반 회원 정보
///
namespace bitforum.Models.Account
{
[Table("Member")]
[Comment("회원 정보")]
[Index(nameof(SID), Name = "IX_Member_SID", IsUnique = true)]
[Index(nameof(Email), Name = "IX_Member_Email", IsUnique = true)]
[Index(nameof(Name), Name = "IX_Member_Name", IsUnique = true)]
[Index(nameof(FullName), Name = "IX_Member_FullName")]
[Index(nameof(Gender), Name = "IX_Member_Gender")]
[Index(nameof(Phone), Name = "IX_Member_Phone")]
[Index(nameof(IsEmailVerified), Name = "IX_Member_IsEmailVerified")]
[Index(nameof(IsAuthCertified), Name = "IX_Member_IsAuthCertified")]
[Index(nameof(IsDenied), Name = "IX_Member_IsDenied")]
[Index(nameof(IsAdmin), Name = "IX_Member_IsAdmin")]
[Index(nameof(IsWithdraw), Name = "IX_Member_IsWithdraw")]
[Index(nameof(CreatedAt), Name = "IX_Member_CreatedAt")]
[Index(nameof(DeletedAt), Name = "IX_Member_DeletedAt")]
public class Member
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Comment("PK")]
public int ID { get; set; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 1:1 관계
[ForeignKey("GradeID")]
public virtual MemberGrade? MemberGrade { get; set; } // 회원 등급 정보
public virtual MemberApprove? MemberApprove { get; set; } // 알림/약관 동의 여부
// 1:N 관계
public virtual ICollection? LoginLog { get; set; } // 로그인 기록
public virtual ICollection? EmailLog { get; set; } // 이메일 발송 기록
public virtual ICollection? NameChangeLog { get; set; } // 별명 변경 기록
public virtual ICollection? EmailChangeLog { get; set; } // 이메일 변경 기록
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[DisplayName("회원등급 ID")]
[Comment("회원등급 ID")]
public int? GradeID { get; set; } = null;
[Required]
[DisplayName("SID")]
[Comment("SID")]
[StringLength(20)]
public string SID { get; set; } = Guid.NewGuid().ToString().Substring(0, 20); // 무작위 문자열
[Required]
[DisplayName("이메일")]
[Comment("이메일")]
[DataType(DataType.EmailAddress)]
[StringLength(60)]
public string Email { get; set; } = null!;
[DisplayName("별명")]
[Comment("별명")]
[StringLength(20)]
public string? Name { get; set; } = null;
[DisplayName("본명")]
[Comment("본명")]
[StringLength(40)]
public string? FullName { get; set; } = null;
[DisplayName("본명(성)")]
[Comment("본명(성)")]
[StringLength(20)]
public string? FirstName { get; set; } = null;
[DisplayName("본명(이름)")]
[Comment("본명(이름)")]
[StringLength(40)]
public string? LastName { get; set; } = null;
[DisplayName("비밀번호")]
[Comment("비밀번호")]
[StringLength(255)]
[DataType(DataType.Password)]
public string? Password { get; set; } = string.Empty; // 관리자 수정 시 필요
[DisplayName("자기소개")]
[Comment("자기소개")]
[StringLength(1000)]
public string? Intro { get; set; } = null;
[DisplayName("한마디")]
[Comment("한마디")]
[StringLength(50)]
public string? Summary { get; set; } = null;
[DisplayName("코인")]
[Comment("코인")]
public long Coin { get; set; } = 0;
[DisplayName("경험치")]
[Comment("경험치")]
public int Exp { get; set; } = 0;
[DisplayName("연락처")]
[Comment("연락처")]
[StringLength(15)]
[RegularExpression(@"^010-\d{4}-\d{4}$", ErrorMessage = "전화번호 형식은 010-0000-0000 이어야 합니다.")]
public string? Phone { get; set; } = null;
[DisplayName("생년월일")]
[Comment("생년월일")]
public DateOnly? Birthday { get; set; } = null;
[DisplayName("성별")]
[Comment("성별")]
[EnumDataType(typeof(Gender))]
public Gender? Gender { get; set; } = null;
[DisplayName("사진")]
[Comment("사진")]
[StringLength(255)]
public string? Photo { get; set; } = null;
[DisplayName("아이콘")]
[Comment("아이콘")]
[StringLength(255)]
public string? Icon { get; set; } = null;
[DisplayName("이메일 인증 여부")]
[Comment("이메일 인증 여부")]
public bool IsEmailVerified { get; set; } = false;
[DisplayName("본인 인증 여부")]
[Comment("본인 인증 여부")]
public bool IsAuthCertified { get; set; } = false;
[DisplayName("차단 여부")]
[Comment("차단 여부")]
public bool IsDenied { get; set; } = false;
[DisplayName("운영진 여부")]
[Comment("운영진 여부")]
public bool IsAdmin { get; set; } = false;
[DisplayName("탈퇴 여부")]
[Comment("탈퇴 여부")]
public bool IsWithdraw { get; set; } = false;
[DisplayName("구독 중")]
[Comment("구독 중")]
public int Following { get; set; } = 0;
[DisplayName("구독자")]
[Comment("구독자")]
public int Followed { get; set; } = 0;
[DisplayName("로그인 단말기 정보")]
[Comment("로그인 단말기 정보")]
[StringLength(400)]
public string? DeviceInfo { get; set; } = null;
[DisplayName("회원가입 시 IP")]
[Comment("회원가입 시 IP")]
[StringLength(15)]
public string SignupIP { get; set; } = string.Empty;
[DisplayName("마지막 로그인 IP")]
[Comment("마지막 로그인 IP")]
[StringLength(15)]
public string? LastLoginIp { get; set; } = null;
[DisplayName("마지막 로그인 일시")]
[Comment("마지막 로그인 일시")]
public DateTime? LastLoginAt { get; set; } = null;
[DisplayName("마지막 이메일 변경 일시")]
[Comment("마지막 이메일 변경 일시")]
public DateTime? LastEmailChangedAt { get; set; } = null;
[DisplayName("마지막 별명 변경 일시")]
[Comment("마지막 별명 변경 일시")]
public DateTime? LastNameChangedAt { get; set; } = null;
[DisplayName("이메일 인증 일시")]
[Comment("이메일 인증 일시")]
public DateTime? EmailVerifiedAt { get; set; } = null;
[DisplayName("본인인증 일시")]
[Comment("본인인증 일시")]
public DateTime? AuthCertifiedAt { get; set; } = null;
[DisplayName("비밀번호 변경 일시")]
[Comment("비밀번호 변경 일시")]
public DateTime PasswordUpdatedAt { get; set; }
[DisplayName("가입 일시")]
[Comment("가입 일시")]
public DateTime CreatedAt { get; set; }
[DisplayName("수정 일시")]
[Comment("수정 일시")]
public DateTime? UpdatedAt { get; set; } = null;
[DisplayName("탈퇴 일시")]
[Comment("탈퇴 일시")]
public DateTime? DeletedAt { get; set; } = null;
}
}