promo_code.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. // PromoCode holds the schema definition for the PromoCode entity.
  14. //
  15. // 注册优惠码:用户注册时使用,可获得赠送余额
  16. // 与 RedeemCode 不同,PromoCode 支持多次使用(有使用次数限制)
  17. //
  18. // 删除策略:硬删除
  19. type PromoCode struct {
  20. ent.Schema
  21. }
  22. func (PromoCode) Annotations() []schema.Annotation {
  23. return []schema.Annotation{
  24. entsql.Annotation{Table: "promo_codes"},
  25. }
  26. }
  27. func (PromoCode) Fields() []ent.Field {
  28. return []ent.Field{
  29. field.String("code").
  30. MaxLen(32).
  31. NotEmpty().
  32. Unique().
  33. Comment("优惠码"),
  34. field.Float("bonus_amount").
  35. SchemaType(map[string]string{dialect.Postgres: "decimal(20,8)"}).
  36. Default(0).
  37. Comment("赠送余额金额"),
  38. field.Int("max_uses").
  39. Default(0).
  40. Comment("最大使用次数,0表示无限制"),
  41. field.Int("used_count").
  42. Default(0).
  43. Comment("已使用次数"),
  44. field.String("status").
  45. MaxLen(20).
  46. Default(domain.PromoCodeStatusActive).
  47. Comment("状态: active, disabled"),
  48. field.Time("expires_at").
  49. Optional().
  50. Nillable().
  51. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}).
  52. Comment("过期时间,null表示永不过期"),
  53. field.String("notes").
  54. Optional().
  55. Nillable().
  56. SchemaType(map[string]string{dialect.Postgres: "text"}).
  57. Comment("备注"),
  58. field.Time("created_at").
  59. Immutable().
  60. Default(time.Now).
  61. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  62. field.Time("updated_at").
  63. Default(time.Now).
  64. UpdateDefault(time.Now).
  65. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  66. }
  67. }
  68. func (PromoCode) Edges() []ent.Edge {
  69. return []ent.Edge{
  70. edge.To("usage_records", PromoCodeUsage.Type),
  71. }
  72. }
  73. func (PromoCode) Indexes() []ent.Index {
  74. return []ent.Index{
  75. // code 字段已在 Fields() 中声明 Unique(),无需重复索引
  76. index.Fields("status"),
  77. index.Fields("expires_at"),
  78. }
  79. }