announcement.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package schema
  2. import (
  3. "time"
  4. "github.com/Wei-Shaw/sub2api/internal/domain"
  5. "entgo.io/ent"
  6. "entgo.io/ent/dialect"
  7. "entgo.io/ent/dialect/entsql"
  8. "entgo.io/ent/schema"
  9. "entgo.io/ent/schema/edge"
  10. "entgo.io/ent/schema/field"
  11. "entgo.io/ent/schema/index"
  12. )
  13. // Announcement holds the schema definition for the Announcement entity.
  14. //
  15. // 删除策略:硬删除(已读记录通过外键级联删除)
  16. type Announcement struct {
  17. ent.Schema
  18. }
  19. func (Announcement) Annotations() []schema.Annotation {
  20. return []schema.Annotation{
  21. entsql.Annotation{Table: "announcements"},
  22. }
  23. }
  24. func (Announcement) Fields() []ent.Field {
  25. return []ent.Field{
  26. field.String("title").
  27. MaxLen(200).
  28. NotEmpty().
  29. Comment("公告标题"),
  30. field.String("content").
  31. SchemaType(map[string]string{dialect.Postgres: "text"}).
  32. NotEmpty().
  33. Comment("公告内容(支持 Markdown)"),
  34. field.String("status").
  35. MaxLen(20).
  36. Default(domain.AnnouncementStatusDraft).
  37. Comment("状态: draft, active, archived"),
  38. field.String("notify_mode").
  39. MaxLen(20).
  40. Default(domain.AnnouncementNotifyModeSilent).
  41. Comment("通知模式: silent(仅铃铛), popup(弹窗提醒)"),
  42. field.JSON("targeting", domain.AnnouncementTargeting{}).
  43. Optional().
  44. SchemaType(map[string]string{dialect.Postgres: "jsonb"}).
  45. Comment("展示条件(JSON 规则)"),
  46. field.Time("starts_at").
  47. Optional().
  48. Nillable().
  49. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}).
  50. Comment("开始展示时间(为空表示立即生效)"),
  51. field.Time("ends_at").
  52. Optional().
  53. Nillable().
  54. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}).
  55. Comment("结束展示时间(为空表示永久生效)"),
  56. field.Int64("created_by").
  57. Optional().
  58. Nillable().
  59. Comment("创建人用户ID(管理员)"),
  60. field.Int64("updated_by").
  61. Optional().
  62. Nillable().
  63. Comment("更新人用户ID(管理员)"),
  64. field.Time("created_at").
  65. Immutable().
  66. Default(time.Now).
  67. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  68. field.Time("updated_at").
  69. Default(time.Now).
  70. UpdateDefault(time.Now).
  71. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  72. }
  73. }
  74. func (Announcement) Edges() []ent.Edge {
  75. return []ent.Edge{
  76. edge.To("reads", AnnouncementRead.Type),
  77. }
  78. }
  79. func (Announcement) Indexes() []ent.Index {
  80. return []ent.Index{
  81. index.Fields("status"),
  82. index.Fields("created_at"),
  83. index.Fields("starts_at"),
  84. index.Fields("ends_at"),
  85. }
  86. }