Note.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using Domain.Entities.Members;
  4. namespace Domain.Entities.Notes;
  5. public class Note
  6. {
  7. [ForeignKey(nameof(SenderMemberID))]
  8. public virtual Member? Sender { get; private set; }
  9. [ForeignKey(nameof(ReceiverMemberID))]
  10. public virtual Member? Receiver { get; private set; }
  11. [Key]
  12. public int ID { get; private set; }
  13. /// <summary>0 = 시스템 발송</summary>
  14. public int SenderMemberID { get; private set; }
  15. public int ReceiverMemberID { get; private set; }
  16. public string Title { get; private set; } = default!;
  17. public string Content { get; private set; } = default!;
  18. public bool IsRead { get; private set; }
  19. public bool IsDeletedBySender { get; private set; }
  20. public bool IsDeletedByReceiver { get; private set; }
  21. public bool IsSystem { get; private set; }
  22. public string? RelatedType { get; private set; }
  23. public int? RelatedID { get; private set; }
  24. public DateTime? ReadAt { get; private set; }
  25. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  26. private Note() { }
  27. public static Note Create(
  28. int senderMemberID,
  29. int receiverMemberID,
  30. string title,
  31. string content,
  32. bool isSystem = false,
  33. string? relatedType = null,
  34. int? relatedID = null
  35. )
  36. {
  37. if (string.IsNullOrWhiteSpace(title))
  38. {
  39. throw new ArgumentException("Title is required.", nameof(title));
  40. }
  41. if (string.IsNullOrWhiteSpace(content))
  42. {
  43. throw new ArgumentException("Content is required.", nameof(content));
  44. }
  45. return new Note
  46. {
  47. SenderMemberID = senderMemberID,
  48. ReceiverMemberID = receiverMemberID,
  49. Title = title,
  50. Content = content,
  51. IsSystem = isSystem,
  52. RelatedType = relatedType,
  53. RelatedID = relatedID
  54. };
  55. }
  56. public static Note CreateSystem(int receiverMemberID, string title, string content, string? relatedType = null, int? relatedID = null)
  57. {
  58. return Create(0, receiverMemberID, title, content, true, relatedType, relatedID);
  59. }
  60. public void MarkRead()
  61. {
  62. if (!IsRead)
  63. {
  64. IsRead = true;
  65. ReadAt = DateTime.UtcNow;
  66. }
  67. }
  68. public void DeleteBySender() => IsDeletedBySender = true;
  69. public void DeleteByReceiver() => IsDeletedByReceiver = true;
  70. }