using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Domain.Entities.Developers.ValueObject; using Domain.Entities.Members; namespace Domain.Entities.Developers; /// /// 개발자가 등록한 외부 API 앱. /// OAuth2 Client Credentials 발급 단위 (ApiCredential) /// public class ApiApplication { [ForeignKey(nameof(OwnerMemberID))] public virtual Member? Owner { get; private set; } public virtual ICollection Credentials { get; private set; } = new List(); public virtual ICollection Scopes { get; private set; } = new List(); [Key] public int ID { get; private set; } public int OwnerMemberID { get; private set; } public string Name { get; private set; } = default!; public string? Description { get; private set; } public string? HomepageUrl { get; private set; } public string? LogoPath { get; private set; } public ApplicationStatus Status { get; private set; } = ApplicationStatus.Pending; public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; public DateTime? UpdatedAt { get; private set; } public DateTime? ApprovedAt { get; private set; } public DateTime? SuspendedAt { get; private set; } private ApiApplication() { } public static ApiApplication Create(int ownerMemberID, string name, string? description, string? homepageUrl) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentException("Name is required.", nameof(name)); } if (name.Length > 100) { throw new ArgumentOutOfRangeException(nameof(name)); } return new ApiApplication { OwnerMemberID = ownerMemberID, Name = name, Description = description, HomepageUrl = homepageUrl }; } public void UpdateInfo(string name, string? description, string? homepageUrl) { Name = name; Description = description; HomepageUrl = homepageUrl; UpdatedAt = DateTime.UtcNow; } public void SetLogo(string? logoPath) { LogoPath = logoPath; UpdatedAt = DateTime.UtcNow; } public void Approve() { Status = ApplicationStatus.Active; ApprovedAt = DateTime.UtcNow; UpdatedAt = DateTime.UtcNow; } public void Reject() { Status = ApplicationStatus.Rejected; UpdatedAt = DateTime.UtcNow; } public void Suspend() { Status = ApplicationStatus.Suspended; SuspendedAt = DateTime.UtcNow; UpdatedAt = DateTime.UtcNow; } public void Reactivate() { Status = ApplicationStatus.Active; SuspendedAt = null; UpdatedAt = DateTime.UtcNow; } }