subscription_plan.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package schema
  2. import (
  3. "time"
  4. "entgo.io/ent"
  5. "entgo.io/ent/dialect"
  6. "entgo.io/ent/dialect/entsql"
  7. "entgo.io/ent/schema"
  8. "entgo.io/ent/schema/field"
  9. "entgo.io/ent/schema/index"
  10. )
  11. // SubscriptionPlan holds the schema definition for the SubscriptionPlan entity.
  12. //
  13. // 删除策略:硬删除
  14. // SubscriptionPlan 使用硬删除而非软删除,原因如下:
  15. // - 套餐为管理员维护的商品配置,删除即表示下架移除
  16. // - 通过 for_sale 字段控制是否在售,删除仅用于彻底移除
  17. // - 已购买的订阅记录保存在 UserSubscription 中,不受套餐删除影响
  18. type SubscriptionPlan struct {
  19. ent.Schema
  20. }
  21. func (SubscriptionPlan) Annotations() []schema.Annotation {
  22. return []schema.Annotation{
  23. entsql.Annotation{Table: "subscription_plans"},
  24. }
  25. }
  26. func (SubscriptionPlan) Fields() []ent.Field {
  27. return []ent.Field{
  28. field.Int64("group_id"),
  29. field.String("name").
  30. MaxLen(100).
  31. NotEmpty(),
  32. field.String("description").
  33. SchemaType(map[string]string{dialect.Postgres: "text"}).
  34. Default(""),
  35. field.Float("price").
  36. SchemaType(map[string]string{dialect.Postgres: "decimal(20,2)"}),
  37. field.Float("original_price").
  38. SchemaType(map[string]string{dialect.Postgres: "decimal(20,2)"}).
  39. Optional().
  40. Nillable(),
  41. field.String("currency").
  42. MaxLen(3).
  43. Default(""),
  44. field.Int("validity_days").
  45. Default(30),
  46. field.String("validity_unit").
  47. MaxLen(10).
  48. Default("day"),
  49. field.String("features").
  50. SchemaType(map[string]string{dialect.Postgres: "text"}).
  51. Default(""),
  52. field.String("product_name").
  53. MaxLen(100).
  54. Default(""),
  55. field.Bool("for_sale").
  56. Default(true),
  57. field.Int("sort_order").
  58. Default(0),
  59. field.Time("created_at").
  60. Immutable().
  61. Default(time.Now).
  62. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  63. field.Time("updated_at").
  64. Default(time.Now).
  65. UpdateDefault(time.Now).
  66. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  67. }
  68. }
  69. func (SubscriptionPlan) Indexes() []ent.Index {
  70. return []ent.Index{
  71. index.Fields("group_id"),
  72. index.Fields("for_sale"),
  73. }
  74. }