auth_identity.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package schema
  2. import (
  3. "fmt"
  4. "github.com/Wei-Shaw/sub2api/ent/schema/mixins"
  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. var authProviderTypes = map[string]struct{}{
  14. "email": {},
  15. "github": {},
  16. "google": {},
  17. "linuxdo": {},
  18. "oidc": {},
  19. "wechat": {},
  20. "dingtalk": {},
  21. }
  22. func validateAuthProviderType(value string) error {
  23. if _, ok := authProviderTypes[value]; ok {
  24. return nil
  25. }
  26. return fmt.Errorf("invalid auth provider type %q", value)
  27. }
  28. // AuthIdentity stores the canonical login identity for an account.
  29. type AuthIdentity struct {
  30. ent.Schema
  31. }
  32. func (AuthIdentity) Annotations() []schema.Annotation {
  33. return []schema.Annotation{
  34. entsql.Annotation{Table: "auth_identities"},
  35. }
  36. }
  37. func (AuthIdentity) Mixin() []ent.Mixin {
  38. return []ent.Mixin{
  39. mixins.TimeMixin{},
  40. }
  41. }
  42. func (AuthIdentity) Fields() []ent.Field {
  43. return []ent.Field{
  44. field.Int64("user_id"),
  45. field.String("provider_type").
  46. MaxLen(20).
  47. NotEmpty().
  48. Validate(validateAuthProviderType),
  49. field.String("provider_key").
  50. NotEmpty().
  51. SchemaType(map[string]string{dialect.Postgres: "text"}),
  52. field.String("provider_subject").
  53. NotEmpty().
  54. SchemaType(map[string]string{dialect.Postgres: "text"}),
  55. field.Time("verified_at").
  56. Optional().
  57. Nillable().
  58. SchemaType(map[string]string{dialect.Postgres: "timestamptz"}),
  59. field.String("issuer").
  60. Optional().
  61. Nillable().
  62. SchemaType(map[string]string{dialect.Postgres: "text"}),
  63. field.JSON("metadata", map[string]any{}).
  64. Default(func() map[string]any { return map[string]any{} }).
  65. SchemaType(map[string]string{dialect.Postgres: "jsonb"}),
  66. }
  67. }
  68. func (AuthIdentity) Edges() []ent.Edge {
  69. return []ent.Edge{
  70. edge.From("user", User.Type).
  71. Ref("auth_identities").
  72. Field("user_id").
  73. Required().
  74. Unique(),
  75. edge.To("channels", AuthIdentityChannel.Type).
  76. Annotations(entsql.OnDelete(entsql.Cascade)),
  77. edge.To("adoption_decisions", IdentityAdoptionDecision.Type),
  78. }
  79. }
  80. func (AuthIdentity) Indexes() []ent.Index {
  81. return []ent.Index{
  82. index.Fields("provider_type", "provider_key", "provider_subject").Unique(),
  83. index.Fields("user_id"),
  84. index.Fields("user_id", "provider_type"),
  85. }
  86. }