refactor: migrate wechat to user attributes and enhance users list
Migrate the hardcoded wechat field to the new extensible user attributes system and improve the users management UI. Migration: - Add migration 019 to move wechat data to user_attribute_values - Remove wechat field from User entity, DTOs, and API contracts - Clean up wechat-related code from backend and frontend UsersView enhancements: - Add text labels to action buttons (Filter Settings, Column Settings, Attributes Config) for better UX - Change status column to show colored dot + Chinese text instead of English text - Add dynamic attribute columns support with batch loading - Add column visibility settings with localStorage persistence - Add filter settings modal for search and filter preferences - Update i18n translations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -57,9 +57,7 @@ func (User) Fields() []ent.Field {
|
||||
field.String("username").
|
||||
MaxLen(100).
|
||||
Default(""),
|
||||
field.String("wechat").
|
||||
MaxLen(100).
|
||||
Default(""),
|
||||
// wechat field migrated to user_attribute_values (see migration 019)
|
||||
field.String("notes").
|
||||
SchemaType(map[string]string{dialect.Postgres: "text"}).
|
||||
Default(""),
|
||||
@@ -75,6 +73,7 @@ func (User) Edges() []ent.Edge {
|
||||
edge.To("allowed_groups", Group.Type).
|
||||
Through("user_allowed_groups", UserAllowedGroup.Type),
|
||||
edge.To("usage_logs", UsageLog.Type),
|
||||
edge.To("attribute_values", UserAttributeValue.Type),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,8 +37,6 @@ type User struct {
|
||||
Status string `json:"status,omitempty"`
|
||||
// Username holds the value of the "username" field.
|
||||
Username string `json:"username,omitempty"`
|
||||
// Wechat holds the value of the "wechat" field.
|
||||
Wechat string `json:"wechat,omitempty"`
|
||||
// Notes holds the value of the "notes" field.
|
||||
Notes string `json:"notes,omitempty"`
|
||||
// Edges holds the relations/edges for other nodes in the graph.
|
||||
@@ -61,11 +59,13 @@ type UserEdges struct {
|
||||
AllowedGroups []*Group `json:"allowed_groups,omitempty"`
|
||||
// UsageLogs holds the value of the usage_logs edge.
|
||||
UsageLogs []*UsageLog `json:"usage_logs,omitempty"`
|
||||
// AttributeValues holds the value of the attribute_values edge.
|
||||
AttributeValues []*UserAttributeValue `json:"attribute_values,omitempty"`
|
||||
// UserAllowedGroups holds the value of the user_allowed_groups edge.
|
||||
UserAllowedGroups []*UserAllowedGroup `json:"user_allowed_groups,omitempty"`
|
||||
// loadedTypes holds the information for reporting if a
|
||||
// type was loaded (or requested) in eager-loading or not.
|
||||
loadedTypes [7]bool
|
||||
loadedTypes [8]bool
|
||||
}
|
||||
|
||||
// APIKeysOrErr returns the APIKeys value or an error if the edge
|
||||
@@ -122,10 +122,19 @@ func (e UserEdges) UsageLogsOrErr() ([]*UsageLog, error) {
|
||||
return nil, &NotLoadedError{edge: "usage_logs"}
|
||||
}
|
||||
|
||||
// AttributeValuesOrErr returns the AttributeValues value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e UserEdges) AttributeValuesOrErr() ([]*UserAttributeValue, error) {
|
||||
if e.loadedTypes[6] {
|
||||
return e.AttributeValues, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "attribute_values"}
|
||||
}
|
||||
|
||||
// UserAllowedGroupsOrErr returns the UserAllowedGroups value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e UserEdges) UserAllowedGroupsOrErr() ([]*UserAllowedGroup, error) {
|
||||
if e.loadedTypes[6] {
|
||||
if e.loadedTypes[7] {
|
||||
return e.UserAllowedGroups, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "user_allowed_groups"}
|
||||
@@ -140,7 +149,7 @@ func (*User) scanValues(columns []string) ([]any, error) {
|
||||
values[i] = new(sql.NullFloat64)
|
||||
case user.FieldID, user.FieldConcurrency:
|
||||
values[i] = new(sql.NullInt64)
|
||||
case user.FieldEmail, user.FieldPasswordHash, user.FieldRole, user.FieldStatus, user.FieldUsername, user.FieldWechat, user.FieldNotes:
|
||||
case user.FieldEmail, user.FieldPasswordHash, user.FieldRole, user.FieldStatus, user.FieldUsername, user.FieldNotes:
|
||||
values[i] = new(sql.NullString)
|
||||
case user.FieldCreatedAt, user.FieldUpdatedAt, user.FieldDeletedAt:
|
||||
values[i] = new(sql.NullTime)
|
||||
@@ -226,12 +235,6 @@ func (_m *User) assignValues(columns []string, values []any) error {
|
||||
} else if value.Valid {
|
||||
_m.Username = value.String
|
||||
}
|
||||
case user.FieldWechat:
|
||||
if value, ok := values[i].(*sql.NullString); !ok {
|
||||
return fmt.Errorf("unexpected type %T for field wechat", values[i])
|
||||
} else if value.Valid {
|
||||
_m.Wechat = value.String
|
||||
}
|
||||
case user.FieldNotes:
|
||||
if value, ok := values[i].(*sql.NullString); !ok {
|
||||
return fmt.Errorf("unexpected type %T for field notes", values[i])
|
||||
@@ -281,6 +284,11 @@ func (_m *User) QueryUsageLogs() *UsageLogQuery {
|
||||
return NewUserClient(_m.config).QueryUsageLogs(_m)
|
||||
}
|
||||
|
||||
// QueryAttributeValues queries the "attribute_values" edge of the User entity.
|
||||
func (_m *User) QueryAttributeValues() *UserAttributeValueQuery {
|
||||
return NewUserClient(_m.config).QueryAttributeValues(_m)
|
||||
}
|
||||
|
||||
// QueryUserAllowedGroups queries the "user_allowed_groups" edge of the User entity.
|
||||
func (_m *User) QueryUserAllowedGroups() *UserAllowedGroupQuery {
|
||||
return NewUserClient(_m.config).QueryUserAllowedGroups(_m)
|
||||
@@ -341,9 +349,6 @@ func (_m *User) String() string {
|
||||
builder.WriteString("username=")
|
||||
builder.WriteString(_m.Username)
|
||||
builder.WriteString(", ")
|
||||
builder.WriteString("wechat=")
|
||||
builder.WriteString(_m.Wechat)
|
||||
builder.WriteString(", ")
|
||||
builder.WriteString("notes=")
|
||||
builder.WriteString(_m.Notes)
|
||||
builder.WriteByte(')')
|
||||
|
||||
@@ -35,8 +35,6 @@ const (
|
||||
FieldStatus = "status"
|
||||
// FieldUsername holds the string denoting the username field in the database.
|
||||
FieldUsername = "username"
|
||||
// FieldWechat holds the string denoting the wechat field in the database.
|
||||
FieldWechat = "wechat"
|
||||
// FieldNotes holds the string denoting the notes field in the database.
|
||||
FieldNotes = "notes"
|
||||
// EdgeAPIKeys holds the string denoting the api_keys edge name in mutations.
|
||||
@@ -51,6 +49,8 @@ const (
|
||||
EdgeAllowedGroups = "allowed_groups"
|
||||
// EdgeUsageLogs holds the string denoting the usage_logs edge name in mutations.
|
||||
EdgeUsageLogs = "usage_logs"
|
||||
// EdgeAttributeValues holds the string denoting the attribute_values edge name in mutations.
|
||||
EdgeAttributeValues = "attribute_values"
|
||||
// EdgeUserAllowedGroups holds the string denoting the user_allowed_groups edge name in mutations.
|
||||
EdgeUserAllowedGroups = "user_allowed_groups"
|
||||
// Table holds the table name of the user in the database.
|
||||
@@ -95,6 +95,13 @@ const (
|
||||
UsageLogsInverseTable = "usage_logs"
|
||||
// UsageLogsColumn is the table column denoting the usage_logs relation/edge.
|
||||
UsageLogsColumn = "user_id"
|
||||
// AttributeValuesTable is the table that holds the attribute_values relation/edge.
|
||||
AttributeValuesTable = "user_attribute_values"
|
||||
// AttributeValuesInverseTable is the table name for the UserAttributeValue entity.
|
||||
// It exists in this package in order to avoid circular dependency with the "userattributevalue" package.
|
||||
AttributeValuesInverseTable = "user_attribute_values"
|
||||
// AttributeValuesColumn is the table column denoting the attribute_values relation/edge.
|
||||
AttributeValuesColumn = "user_id"
|
||||
// UserAllowedGroupsTable is the table that holds the user_allowed_groups relation/edge.
|
||||
UserAllowedGroupsTable = "user_allowed_groups"
|
||||
// UserAllowedGroupsInverseTable is the table name for the UserAllowedGroup entity.
|
||||
@@ -117,7 +124,6 @@ var Columns = []string{
|
||||
FieldConcurrency,
|
||||
FieldStatus,
|
||||
FieldUsername,
|
||||
FieldWechat,
|
||||
FieldNotes,
|
||||
}
|
||||
|
||||
@@ -171,10 +177,6 @@ var (
|
||||
DefaultUsername string
|
||||
// UsernameValidator is a validator for the "username" field. It is called by the builders before save.
|
||||
UsernameValidator func(string) error
|
||||
// DefaultWechat holds the default value on creation for the "wechat" field.
|
||||
DefaultWechat string
|
||||
// WechatValidator is a validator for the "wechat" field. It is called by the builders before save.
|
||||
WechatValidator func(string) error
|
||||
// DefaultNotes holds the default value on creation for the "notes" field.
|
||||
DefaultNotes string
|
||||
)
|
||||
@@ -237,11 +239,6 @@ func ByUsername(opts ...sql.OrderTermOption) OrderOption {
|
||||
return sql.OrderByField(FieldUsername, opts...).ToFunc()
|
||||
}
|
||||
|
||||
// ByWechat orders the results by the wechat field.
|
||||
func ByWechat(opts ...sql.OrderTermOption) OrderOption {
|
||||
return sql.OrderByField(FieldWechat, opts...).ToFunc()
|
||||
}
|
||||
|
||||
// ByNotes orders the results by the notes field.
|
||||
func ByNotes(opts ...sql.OrderTermOption) OrderOption {
|
||||
return sql.OrderByField(FieldNotes, opts...).ToFunc()
|
||||
@@ -331,6 +328,20 @@ func ByUsageLogs(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption {
|
||||
}
|
||||
}
|
||||
|
||||
// ByAttributeValuesCount orders the results by attribute_values count.
|
||||
func ByAttributeValuesCount(opts ...sql.OrderTermOption) OrderOption {
|
||||
return func(s *sql.Selector) {
|
||||
sqlgraph.OrderByNeighborsCount(s, newAttributeValuesStep(), opts...)
|
||||
}
|
||||
}
|
||||
|
||||
// ByAttributeValues orders the results by attribute_values terms.
|
||||
func ByAttributeValues(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption {
|
||||
return func(s *sql.Selector) {
|
||||
sqlgraph.OrderByNeighborTerms(s, newAttributeValuesStep(), append([]sql.OrderTerm{term}, terms...)...)
|
||||
}
|
||||
}
|
||||
|
||||
// ByUserAllowedGroupsCount orders the results by user_allowed_groups count.
|
||||
func ByUserAllowedGroupsCount(opts ...sql.OrderTermOption) OrderOption {
|
||||
return func(s *sql.Selector) {
|
||||
@@ -386,6 +397,13 @@ func newUsageLogsStep() *sqlgraph.Step {
|
||||
sqlgraph.Edge(sqlgraph.O2M, false, UsageLogsTable, UsageLogsColumn),
|
||||
)
|
||||
}
|
||||
func newAttributeValuesStep() *sqlgraph.Step {
|
||||
return sqlgraph.NewStep(
|
||||
sqlgraph.From(Table, FieldID),
|
||||
sqlgraph.To(AttributeValuesInverseTable, FieldID),
|
||||
sqlgraph.Edge(sqlgraph.O2M, false, AttributeValuesTable, AttributeValuesColumn),
|
||||
)
|
||||
}
|
||||
func newUserAllowedGroupsStep() *sqlgraph.Step {
|
||||
return sqlgraph.NewStep(
|
||||
sqlgraph.From(Table, FieldID),
|
||||
|
||||
@@ -105,11 +105,6 @@ func Username(v string) predicate.User {
|
||||
return predicate.User(sql.FieldEQ(FieldUsername, v))
|
||||
}
|
||||
|
||||
// Wechat applies equality check predicate on the "wechat" field. It's identical to WechatEQ.
|
||||
func Wechat(v string) predicate.User {
|
||||
return predicate.User(sql.FieldEQ(FieldWechat, v))
|
||||
}
|
||||
|
||||
// Notes applies equality check predicate on the "notes" field. It's identical to NotesEQ.
|
||||
func Notes(v string) predicate.User {
|
||||
return predicate.User(sql.FieldEQ(FieldNotes, v))
|
||||
@@ -650,71 +645,6 @@ func UsernameContainsFold(v string) predicate.User {
|
||||
return predicate.User(sql.FieldContainsFold(FieldUsername, v))
|
||||
}
|
||||
|
||||
// WechatEQ applies the EQ predicate on the "wechat" field.
|
||||
func WechatEQ(v string) predicate.User {
|
||||
return predicate.User(sql.FieldEQ(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatNEQ applies the NEQ predicate on the "wechat" field.
|
||||
func WechatNEQ(v string) predicate.User {
|
||||
return predicate.User(sql.FieldNEQ(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatIn applies the In predicate on the "wechat" field.
|
||||
func WechatIn(vs ...string) predicate.User {
|
||||
return predicate.User(sql.FieldIn(FieldWechat, vs...))
|
||||
}
|
||||
|
||||
// WechatNotIn applies the NotIn predicate on the "wechat" field.
|
||||
func WechatNotIn(vs ...string) predicate.User {
|
||||
return predicate.User(sql.FieldNotIn(FieldWechat, vs...))
|
||||
}
|
||||
|
||||
// WechatGT applies the GT predicate on the "wechat" field.
|
||||
func WechatGT(v string) predicate.User {
|
||||
return predicate.User(sql.FieldGT(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatGTE applies the GTE predicate on the "wechat" field.
|
||||
func WechatGTE(v string) predicate.User {
|
||||
return predicate.User(sql.FieldGTE(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatLT applies the LT predicate on the "wechat" field.
|
||||
func WechatLT(v string) predicate.User {
|
||||
return predicate.User(sql.FieldLT(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatLTE applies the LTE predicate on the "wechat" field.
|
||||
func WechatLTE(v string) predicate.User {
|
||||
return predicate.User(sql.FieldLTE(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatContains applies the Contains predicate on the "wechat" field.
|
||||
func WechatContains(v string) predicate.User {
|
||||
return predicate.User(sql.FieldContains(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatHasPrefix applies the HasPrefix predicate on the "wechat" field.
|
||||
func WechatHasPrefix(v string) predicate.User {
|
||||
return predicate.User(sql.FieldHasPrefix(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatHasSuffix applies the HasSuffix predicate on the "wechat" field.
|
||||
func WechatHasSuffix(v string) predicate.User {
|
||||
return predicate.User(sql.FieldHasSuffix(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatEqualFold applies the EqualFold predicate on the "wechat" field.
|
||||
func WechatEqualFold(v string) predicate.User {
|
||||
return predicate.User(sql.FieldEqualFold(FieldWechat, v))
|
||||
}
|
||||
|
||||
// WechatContainsFold applies the ContainsFold predicate on the "wechat" field.
|
||||
func WechatContainsFold(v string) predicate.User {
|
||||
return predicate.User(sql.FieldContainsFold(FieldWechat, v))
|
||||
}
|
||||
|
||||
// NotesEQ applies the EQ predicate on the "notes" field.
|
||||
func NotesEQ(v string) predicate.User {
|
||||
return predicate.User(sql.FieldEQ(FieldNotes, v))
|
||||
@@ -918,6 +848,29 @@ func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.User {
|
||||
})
|
||||
}
|
||||
|
||||
// HasAttributeValues applies the HasEdge predicate on the "attribute_values" edge.
|
||||
func HasAttributeValues() predicate.User {
|
||||
return predicate.User(func(s *sql.Selector) {
|
||||
step := sqlgraph.NewStep(
|
||||
sqlgraph.From(Table, FieldID),
|
||||
sqlgraph.Edge(sqlgraph.O2M, false, AttributeValuesTable, AttributeValuesColumn),
|
||||
)
|
||||
sqlgraph.HasNeighbors(s, step)
|
||||
})
|
||||
}
|
||||
|
||||
// HasAttributeValuesWith applies the HasEdge predicate on the "attribute_values" edge with a given conditions (other predicates).
|
||||
func HasAttributeValuesWith(preds ...predicate.UserAttributeValue) predicate.User {
|
||||
return predicate.User(func(s *sql.Selector) {
|
||||
step := newAttributeValuesStep()
|
||||
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
||||
for _, p := range preds {
|
||||
p(s)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// HasUserAllowedGroups applies the HasEdge predicate on the "user_allowed_groups" edge.
|
||||
func HasUserAllowedGroups() predicate.User {
|
||||
return predicate.User(func(s *sql.Selector) {
|
||||
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
"github.com/Wei-Shaw/sub2api/ent/redeemcode"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usagelog"
|
||||
"github.com/Wei-Shaw/sub2api/ent/user"
|
||||
"github.com/Wei-Shaw/sub2api/ent/userattributevalue"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usersubscription"
|
||||
)
|
||||
|
||||
@@ -151,20 +152,6 @@ func (_c *UserCreate) SetNillableUsername(v *string) *UserCreate {
|
||||
return _c
|
||||
}
|
||||
|
||||
// SetWechat sets the "wechat" field.
|
||||
func (_c *UserCreate) SetWechat(v string) *UserCreate {
|
||||
_c.mutation.SetWechat(v)
|
||||
return _c
|
||||
}
|
||||
|
||||
// SetNillableWechat sets the "wechat" field if the given value is not nil.
|
||||
func (_c *UserCreate) SetNillableWechat(v *string) *UserCreate {
|
||||
if v != nil {
|
||||
_c.SetWechat(*v)
|
||||
}
|
||||
return _c
|
||||
}
|
||||
|
||||
// SetNotes sets the "notes" field.
|
||||
func (_c *UserCreate) SetNotes(v string) *UserCreate {
|
||||
_c.mutation.SetNotes(v)
|
||||
@@ -269,6 +256,21 @@ func (_c *UserCreate) AddUsageLogs(v ...*UsageLog) *UserCreate {
|
||||
return _c.AddUsageLogIDs(ids...)
|
||||
}
|
||||
|
||||
// AddAttributeValueIDs adds the "attribute_values" edge to the UserAttributeValue entity by IDs.
|
||||
func (_c *UserCreate) AddAttributeValueIDs(ids ...int64) *UserCreate {
|
||||
_c.mutation.AddAttributeValueIDs(ids...)
|
||||
return _c
|
||||
}
|
||||
|
||||
// AddAttributeValues adds the "attribute_values" edges to the UserAttributeValue entity.
|
||||
func (_c *UserCreate) AddAttributeValues(v ...*UserAttributeValue) *UserCreate {
|
||||
ids := make([]int64, len(v))
|
||||
for i := range v {
|
||||
ids[i] = v[i].ID
|
||||
}
|
||||
return _c.AddAttributeValueIDs(ids...)
|
||||
}
|
||||
|
||||
// Mutation returns the UserMutation object of the builder.
|
||||
func (_c *UserCreate) Mutation() *UserMutation {
|
||||
return _c.mutation
|
||||
@@ -340,10 +342,6 @@ func (_c *UserCreate) defaults() error {
|
||||
v := user.DefaultUsername
|
||||
_c.mutation.SetUsername(v)
|
||||
}
|
||||
if _, ok := _c.mutation.Wechat(); !ok {
|
||||
v := user.DefaultWechat
|
||||
_c.mutation.SetWechat(v)
|
||||
}
|
||||
if _, ok := _c.mutation.Notes(); !ok {
|
||||
v := user.DefaultNotes
|
||||
_c.mutation.SetNotes(v)
|
||||
@@ -405,14 +403,6 @@ func (_c *UserCreate) check() error {
|
||||
return &ValidationError{Name: "username", err: fmt.Errorf(`ent: validator failed for field "User.username": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := _c.mutation.Wechat(); !ok {
|
||||
return &ValidationError{Name: "wechat", err: errors.New(`ent: missing required field "User.wechat"`)}
|
||||
}
|
||||
if v, ok := _c.mutation.Wechat(); ok {
|
||||
if err := user.WechatValidator(v); err != nil {
|
||||
return &ValidationError{Name: "wechat", err: fmt.Errorf(`ent: validator failed for field "User.wechat": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := _c.mutation.Notes(); !ok {
|
||||
return &ValidationError{Name: "notes", err: errors.New(`ent: missing required field "User.notes"`)}
|
||||
}
|
||||
@@ -483,10 +473,6 @@ func (_c *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) {
|
||||
_spec.SetField(user.FieldUsername, field.TypeString, value)
|
||||
_node.Username = value
|
||||
}
|
||||
if value, ok := _c.mutation.Wechat(); ok {
|
||||
_spec.SetField(user.FieldWechat, field.TypeString, value)
|
||||
_node.Wechat = value
|
||||
}
|
||||
if value, ok := _c.mutation.Notes(); ok {
|
||||
_spec.SetField(user.FieldNotes, field.TypeString, value)
|
||||
_node.Notes = value
|
||||
@@ -591,6 +577,22 @@ func (_c *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) {
|
||||
}
|
||||
_spec.Edges = append(_spec.Edges, edge)
|
||||
}
|
||||
if nodes := _c.mutation.AttributeValuesIDs(); len(nodes) > 0 {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
for _, k := range nodes {
|
||||
edge.Target.Nodes = append(edge.Target.Nodes, k)
|
||||
}
|
||||
_spec.Edges = append(_spec.Edges, edge)
|
||||
}
|
||||
return _node, _spec
|
||||
}
|
||||
|
||||
@@ -769,18 +771,6 @@ func (u *UserUpsert) UpdateUsername() *UserUpsert {
|
||||
return u
|
||||
}
|
||||
|
||||
// SetWechat sets the "wechat" field.
|
||||
func (u *UserUpsert) SetWechat(v string) *UserUpsert {
|
||||
u.Set(user.FieldWechat, v)
|
||||
return u
|
||||
}
|
||||
|
||||
// UpdateWechat sets the "wechat" field to the value that was provided on create.
|
||||
func (u *UserUpsert) UpdateWechat() *UserUpsert {
|
||||
u.SetExcluded(user.FieldWechat)
|
||||
return u
|
||||
}
|
||||
|
||||
// SetNotes sets the "notes" field.
|
||||
func (u *UserUpsert) SetNotes(v string) *UserUpsert {
|
||||
u.Set(user.FieldNotes, v)
|
||||
@@ -985,20 +975,6 @@ func (u *UserUpsertOne) UpdateUsername() *UserUpsertOne {
|
||||
})
|
||||
}
|
||||
|
||||
// SetWechat sets the "wechat" field.
|
||||
func (u *UserUpsertOne) SetWechat(v string) *UserUpsertOne {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.SetWechat(v)
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateWechat sets the "wechat" field to the value that was provided on create.
|
||||
func (u *UserUpsertOne) UpdateWechat() *UserUpsertOne {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.UpdateWechat()
|
||||
})
|
||||
}
|
||||
|
||||
// SetNotes sets the "notes" field.
|
||||
func (u *UserUpsertOne) SetNotes(v string) *UserUpsertOne {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
@@ -1371,20 +1347,6 @@ func (u *UserUpsertBulk) UpdateUsername() *UserUpsertBulk {
|
||||
})
|
||||
}
|
||||
|
||||
// SetWechat sets the "wechat" field.
|
||||
func (u *UserUpsertBulk) SetWechat(v string) *UserUpsertBulk {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.SetWechat(v)
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateWechat sets the "wechat" field to the value that was provided on create.
|
||||
func (u *UserUpsertBulk) UpdateWechat() *UserUpsertBulk {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.UpdateWechat()
|
||||
})
|
||||
}
|
||||
|
||||
// SetNotes sets the "notes" field.
|
||||
func (u *UserUpsertBulk) SetNotes(v string) *UserUpsertBulk {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
|
||||
@@ -19,6 +19,7 @@ import (
|
||||
"github.com/Wei-Shaw/sub2api/ent/usagelog"
|
||||
"github.com/Wei-Shaw/sub2api/ent/user"
|
||||
"github.com/Wei-Shaw/sub2api/ent/userallowedgroup"
|
||||
"github.com/Wei-Shaw/sub2api/ent/userattributevalue"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usersubscription"
|
||||
)
|
||||
|
||||
@@ -35,6 +36,7 @@ type UserQuery struct {
|
||||
withAssignedSubscriptions *UserSubscriptionQuery
|
||||
withAllowedGroups *GroupQuery
|
||||
withUsageLogs *UsageLogQuery
|
||||
withAttributeValues *UserAttributeValueQuery
|
||||
withUserAllowedGroups *UserAllowedGroupQuery
|
||||
// intermediate query (i.e. traversal path).
|
||||
sql *sql.Selector
|
||||
@@ -204,6 +206,28 @@ func (_q *UserQuery) QueryUsageLogs() *UsageLogQuery {
|
||||
return query
|
||||
}
|
||||
|
||||
// QueryAttributeValues chains the current query on the "attribute_values" edge.
|
||||
func (_q *UserQuery) QueryAttributeValues() *UserAttributeValueQuery {
|
||||
query := (&UserAttributeValueClient{config: _q.config}).Query()
|
||||
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
|
||||
if err := _q.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
selector := _q.sqlQuery(ctx)
|
||||
if err := selector.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
step := sqlgraph.NewStep(
|
||||
sqlgraph.From(user.Table, user.FieldID, selector),
|
||||
sqlgraph.To(userattributevalue.Table, userattributevalue.FieldID),
|
||||
sqlgraph.Edge(sqlgraph.O2M, false, user.AttributeValuesTable, user.AttributeValuesColumn),
|
||||
)
|
||||
fromU = sqlgraph.SetNeighbors(_q.driver.Dialect(), step)
|
||||
return fromU, nil
|
||||
}
|
||||
return query
|
||||
}
|
||||
|
||||
// QueryUserAllowedGroups chains the current query on the "user_allowed_groups" edge.
|
||||
func (_q *UserQuery) QueryUserAllowedGroups() *UserAllowedGroupQuery {
|
||||
query := (&UserAllowedGroupClient{config: _q.config}).Query()
|
||||
@@ -424,6 +448,7 @@ func (_q *UserQuery) Clone() *UserQuery {
|
||||
withAssignedSubscriptions: _q.withAssignedSubscriptions.Clone(),
|
||||
withAllowedGroups: _q.withAllowedGroups.Clone(),
|
||||
withUsageLogs: _q.withUsageLogs.Clone(),
|
||||
withAttributeValues: _q.withAttributeValues.Clone(),
|
||||
withUserAllowedGroups: _q.withUserAllowedGroups.Clone(),
|
||||
// clone intermediate query.
|
||||
sql: _q.sql.Clone(),
|
||||
@@ -497,6 +522,17 @@ func (_q *UserQuery) WithUsageLogs(opts ...func(*UsageLogQuery)) *UserQuery {
|
||||
return _q
|
||||
}
|
||||
|
||||
// WithAttributeValues tells the query-builder to eager-load the nodes that are connected to
|
||||
// the "attribute_values" edge. The optional arguments are used to configure the query builder of the edge.
|
||||
func (_q *UserQuery) WithAttributeValues(opts ...func(*UserAttributeValueQuery)) *UserQuery {
|
||||
query := (&UserAttributeValueClient{config: _q.config}).Query()
|
||||
for _, opt := range opts {
|
||||
opt(query)
|
||||
}
|
||||
_q.withAttributeValues = query
|
||||
return _q
|
||||
}
|
||||
|
||||
// WithUserAllowedGroups tells the query-builder to eager-load the nodes that are connected to
|
||||
// the "user_allowed_groups" edge. The optional arguments are used to configure the query builder of the edge.
|
||||
func (_q *UserQuery) WithUserAllowedGroups(opts ...func(*UserAllowedGroupQuery)) *UserQuery {
|
||||
@@ -586,13 +622,14 @@ func (_q *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e
|
||||
var (
|
||||
nodes = []*User{}
|
||||
_spec = _q.querySpec()
|
||||
loadedTypes = [7]bool{
|
||||
loadedTypes = [8]bool{
|
||||
_q.withAPIKeys != nil,
|
||||
_q.withRedeemCodes != nil,
|
||||
_q.withSubscriptions != nil,
|
||||
_q.withAssignedSubscriptions != nil,
|
||||
_q.withAllowedGroups != nil,
|
||||
_q.withUsageLogs != nil,
|
||||
_q.withAttributeValues != nil,
|
||||
_q.withUserAllowedGroups != nil,
|
||||
}
|
||||
)
|
||||
@@ -658,6 +695,13 @@ func (_q *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if query := _q.withAttributeValues; query != nil {
|
||||
if err := _q.loadAttributeValues(ctx, query, nodes,
|
||||
func(n *User) { n.Edges.AttributeValues = []*UserAttributeValue{} },
|
||||
func(n *User, e *UserAttributeValue) { n.Edges.AttributeValues = append(n.Edges.AttributeValues, e) }); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if query := _q.withUserAllowedGroups; query != nil {
|
||||
if err := _q.loadUserAllowedGroups(ctx, query, nodes,
|
||||
func(n *User) { n.Edges.UserAllowedGroups = []*UserAllowedGroup{} },
|
||||
@@ -885,6 +929,36 @@ func (_q *UserQuery) loadUsageLogs(ctx context.Context, query *UsageLogQuery, no
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (_q *UserQuery) loadAttributeValues(ctx context.Context, query *UserAttributeValueQuery, nodes []*User, init func(*User), assign func(*User, *UserAttributeValue)) error {
|
||||
fks := make([]driver.Value, 0, len(nodes))
|
||||
nodeids := make(map[int64]*User)
|
||||
for i := range nodes {
|
||||
fks = append(fks, nodes[i].ID)
|
||||
nodeids[nodes[i].ID] = nodes[i]
|
||||
if init != nil {
|
||||
init(nodes[i])
|
||||
}
|
||||
}
|
||||
if len(query.ctx.Fields) > 0 {
|
||||
query.ctx.AppendFieldOnce(userattributevalue.FieldUserID)
|
||||
}
|
||||
query.Where(predicate.UserAttributeValue(func(s *sql.Selector) {
|
||||
s.Where(sql.InValues(s.C(user.AttributeValuesColumn), fks...))
|
||||
}))
|
||||
neighbors, err := query.All(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, n := range neighbors {
|
||||
fk := n.UserID
|
||||
node, ok := nodeids[fk]
|
||||
if !ok {
|
||||
return fmt.Errorf(`unexpected referenced foreign-key "user_id" returned %v for node %v`, fk, n.ID)
|
||||
}
|
||||
assign(node, n)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (_q *UserQuery) loadUserAllowedGroups(ctx context.Context, query *UserAllowedGroupQuery, nodes []*User, init func(*User), assign func(*User, *UserAllowedGroup)) error {
|
||||
fks := make([]driver.Value, 0, len(nodes))
|
||||
nodeids := make(map[int64]*User)
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/Wei-Shaw/sub2api/ent/redeemcode"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usagelog"
|
||||
"github.com/Wei-Shaw/sub2api/ent/user"
|
||||
"github.com/Wei-Shaw/sub2api/ent/userattributevalue"
|
||||
"github.com/Wei-Shaw/sub2api/ent/usersubscription"
|
||||
)
|
||||
|
||||
@@ -171,20 +172,6 @@ func (_u *UserUpdate) SetNillableUsername(v *string) *UserUpdate {
|
||||
return _u
|
||||
}
|
||||
|
||||
// SetWechat sets the "wechat" field.
|
||||
func (_u *UserUpdate) SetWechat(v string) *UserUpdate {
|
||||
_u.mutation.SetWechat(v)
|
||||
return _u
|
||||
}
|
||||
|
||||
// SetNillableWechat sets the "wechat" field if the given value is not nil.
|
||||
func (_u *UserUpdate) SetNillableWechat(v *string) *UserUpdate {
|
||||
if v != nil {
|
||||
_u.SetWechat(*v)
|
||||
}
|
||||
return _u
|
||||
}
|
||||
|
||||
// SetNotes sets the "notes" field.
|
||||
func (_u *UserUpdate) SetNotes(v string) *UserUpdate {
|
||||
_u.mutation.SetNotes(v)
|
||||
@@ -289,6 +276,21 @@ func (_u *UserUpdate) AddUsageLogs(v ...*UsageLog) *UserUpdate {
|
||||
return _u.AddUsageLogIDs(ids...)
|
||||
}
|
||||
|
||||
// AddAttributeValueIDs adds the "attribute_values" edge to the UserAttributeValue entity by IDs.
|
||||
func (_u *UserUpdate) AddAttributeValueIDs(ids ...int64) *UserUpdate {
|
||||
_u.mutation.AddAttributeValueIDs(ids...)
|
||||
return _u
|
||||
}
|
||||
|
||||
// AddAttributeValues adds the "attribute_values" edges to the UserAttributeValue entity.
|
||||
func (_u *UserUpdate) AddAttributeValues(v ...*UserAttributeValue) *UserUpdate {
|
||||
ids := make([]int64, len(v))
|
||||
for i := range v {
|
||||
ids[i] = v[i].ID
|
||||
}
|
||||
return _u.AddAttributeValueIDs(ids...)
|
||||
}
|
||||
|
||||
// Mutation returns the UserMutation object of the builder.
|
||||
func (_u *UserUpdate) Mutation() *UserMutation {
|
||||
return _u.mutation
|
||||
@@ -420,6 +422,27 @@ func (_u *UserUpdate) RemoveUsageLogs(v ...*UsageLog) *UserUpdate {
|
||||
return _u.RemoveUsageLogIDs(ids...)
|
||||
}
|
||||
|
||||
// ClearAttributeValues clears all "attribute_values" edges to the UserAttributeValue entity.
|
||||
func (_u *UserUpdate) ClearAttributeValues() *UserUpdate {
|
||||
_u.mutation.ClearAttributeValues()
|
||||
return _u
|
||||
}
|
||||
|
||||
// RemoveAttributeValueIDs removes the "attribute_values" edge to UserAttributeValue entities by IDs.
|
||||
func (_u *UserUpdate) RemoveAttributeValueIDs(ids ...int64) *UserUpdate {
|
||||
_u.mutation.RemoveAttributeValueIDs(ids...)
|
||||
return _u
|
||||
}
|
||||
|
||||
// RemoveAttributeValues removes "attribute_values" edges to UserAttributeValue entities.
|
||||
func (_u *UserUpdate) RemoveAttributeValues(v ...*UserAttributeValue) *UserUpdate {
|
||||
ids := make([]int64, len(v))
|
||||
for i := range v {
|
||||
ids[i] = v[i].ID
|
||||
}
|
||||
return _u.RemoveAttributeValueIDs(ids...)
|
||||
}
|
||||
|
||||
// Save executes the query and returns the number of nodes affected by the update operation.
|
||||
func (_u *UserUpdate) Save(ctx context.Context) (int, error) {
|
||||
if err := _u.defaults(); err != nil {
|
||||
@@ -489,11 +512,6 @@ func (_u *UserUpdate) check() error {
|
||||
return &ValidationError{Name: "username", err: fmt.Errorf(`ent: validator failed for field "User.username": %w`, err)}
|
||||
}
|
||||
}
|
||||
if v, ok := _u.mutation.Wechat(); ok {
|
||||
if err := user.WechatValidator(v); err != nil {
|
||||
return &ValidationError{Name: "wechat", err: fmt.Errorf(`ent: validator failed for field "User.wechat": %w`, err)}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -545,9 +563,6 @@ func (_u *UserUpdate) sqlSave(ctx context.Context) (_node int, err error) {
|
||||
if value, ok := _u.mutation.Username(); ok {
|
||||
_spec.SetField(user.FieldUsername, field.TypeString, value)
|
||||
}
|
||||
if value, ok := _u.mutation.Wechat(); ok {
|
||||
_spec.SetField(user.FieldWechat, field.TypeString, value)
|
||||
}
|
||||
if value, ok := _u.mutation.Notes(); ok {
|
||||
_spec.SetField(user.FieldNotes, field.TypeString, value)
|
||||
}
|
||||
@@ -833,6 +848,51 @@ func (_u *UserUpdate) sqlSave(ctx context.Context) (_node int, err error) {
|
||||
}
|
||||
_spec.Edges.Add = append(_spec.Edges.Add, edge)
|
||||
}
|
||||
if _u.mutation.AttributeValuesCleared() {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
|
||||
}
|
||||
if nodes := _u.mutation.RemovedAttributeValuesIDs(); len(nodes) > 0 && !_u.mutation.AttributeValuesCleared() {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
for _, k := range nodes {
|
||||
edge.Target.Nodes = append(edge.Target.Nodes, k)
|
||||
}
|
||||
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
|
||||
}
|
||||
if nodes := _u.mutation.AttributeValuesIDs(); len(nodes) > 0 {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
for _, k := range nodes {
|
||||
edge.Target.Nodes = append(edge.Target.Nodes, k)
|
||||
}
|
||||
_spec.Edges.Add = append(_spec.Edges.Add, edge)
|
||||
}
|
||||
if _node, err = sqlgraph.UpdateNodes(ctx, _u.driver, _spec); err != nil {
|
||||
if _, ok := err.(*sqlgraph.NotFoundError); ok {
|
||||
err = &NotFoundError{user.Label}
|
||||
@@ -991,20 +1051,6 @@ func (_u *UserUpdateOne) SetNillableUsername(v *string) *UserUpdateOne {
|
||||
return _u
|
||||
}
|
||||
|
||||
// SetWechat sets the "wechat" field.
|
||||
func (_u *UserUpdateOne) SetWechat(v string) *UserUpdateOne {
|
||||
_u.mutation.SetWechat(v)
|
||||
return _u
|
||||
}
|
||||
|
||||
// SetNillableWechat sets the "wechat" field if the given value is not nil.
|
||||
func (_u *UserUpdateOne) SetNillableWechat(v *string) *UserUpdateOne {
|
||||
if v != nil {
|
||||
_u.SetWechat(*v)
|
||||
}
|
||||
return _u
|
||||
}
|
||||
|
||||
// SetNotes sets the "notes" field.
|
||||
func (_u *UserUpdateOne) SetNotes(v string) *UserUpdateOne {
|
||||
_u.mutation.SetNotes(v)
|
||||
@@ -1109,6 +1155,21 @@ func (_u *UserUpdateOne) AddUsageLogs(v ...*UsageLog) *UserUpdateOne {
|
||||
return _u.AddUsageLogIDs(ids...)
|
||||
}
|
||||
|
||||
// AddAttributeValueIDs adds the "attribute_values" edge to the UserAttributeValue entity by IDs.
|
||||
func (_u *UserUpdateOne) AddAttributeValueIDs(ids ...int64) *UserUpdateOne {
|
||||
_u.mutation.AddAttributeValueIDs(ids...)
|
||||
return _u
|
||||
}
|
||||
|
||||
// AddAttributeValues adds the "attribute_values" edges to the UserAttributeValue entity.
|
||||
func (_u *UserUpdateOne) AddAttributeValues(v ...*UserAttributeValue) *UserUpdateOne {
|
||||
ids := make([]int64, len(v))
|
||||
for i := range v {
|
||||
ids[i] = v[i].ID
|
||||
}
|
||||
return _u.AddAttributeValueIDs(ids...)
|
||||
}
|
||||
|
||||
// Mutation returns the UserMutation object of the builder.
|
||||
func (_u *UserUpdateOne) Mutation() *UserMutation {
|
||||
return _u.mutation
|
||||
@@ -1240,6 +1301,27 @@ func (_u *UserUpdateOne) RemoveUsageLogs(v ...*UsageLog) *UserUpdateOne {
|
||||
return _u.RemoveUsageLogIDs(ids...)
|
||||
}
|
||||
|
||||
// ClearAttributeValues clears all "attribute_values" edges to the UserAttributeValue entity.
|
||||
func (_u *UserUpdateOne) ClearAttributeValues() *UserUpdateOne {
|
||||
_u.mutation.ClearAttributeValues()
|
||||
return _u
|
||||
}
|
||||
|
||||
// RemoveAttributeValueIDs removes the "attribute_values" edge to UserAttributeValue entities by IDs.
|
||||
func (_u *UserUpdateOne) RemoveAttributeValueIDs(ids ...int64) *UserUpdateOne {
|
||||
_u.mutation.RemoveAttributeValueIDs(ids...)
|
||||
return _u
|
||||
}
|
||||
|
||||
// RemoveAttributeValues removes "attribute_values" edges to UserAttributeValue entities.
|
||||
func (_u *UserUpdateOne) RemoveAttributeValues(v ...*UserAttributeValue) *UserUpdateOne {
|
||||
ids := make([]int64, len(v))
|
||||
for i := range v {
|
||||
ids[i] = v[i].ID
|
||||
}
|
||||
return _u.RemoveAttributeValueIDs(ids...)
|
||||
}
|
||||
|
||||
// Where appends a list predicates to the UserUpdate builder.
|
||||
func (_u *UserUpdateOne) Where(ps ...predicate.User) *UserUpdateOne {
|
||||
_u.mutation.Where(ps...)
|
||||
@@ -1322,11 +1404,6 @@ func (_u *UserUpdateOne) check() error {
|
||||
return &ValidationError{Name: "username", err: fmt.Errorf(`ent: validator failed for field "User.username": %w`, err)}
|
||||
}
|
||||
}
|
||||
if v, ok := _u.mutation.Wechat(); ok {
|
||||
if err := user.WechatValidator(v); err != nil {
|
||||
return &ValidationError{Name: "wechat", err: fmt.Errorf(`ent: validator failed for field "User.wechat": %w`, err)}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1395,9 +1472,6 @@ func (_u *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) {
|
||||
if value, ok := _u.mutation.Username(); ok {
|
||||
_spec.SetField(user.FieldUsername, field.TypeString, value)
|
||||
}
|
||||
if value, ok := _u.mutation.Wechat(); ok {
|
||||
_spec.SetField(user.FieldWechat, field.TypeString, value)
|
||||
}
|
||||
if value, ok := _u.mutation.Notes(); ok {
|
||||
_spec.SetField(user.FieldNotes, field.TypeString, value)
|
||||
}
|
||||
@@ -1683,6 +1757,51 @@ func (_u *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) {
|
||||
}
|
||||
_spec.Edges.Add = append(_spec.Edges.Add, edge)
|
||||
}
|
||||
if _u.mutation.AttributeValuesCleared() {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
|
||||
}
|
||||
if nodes := _u.mutation.RemovedAttributeValuesIDs(); len(nodes) > 0 && !_u.mutation.AttributeValuesCleared() {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
for _, k := range nodes {
|
||||
edge.Target.Nodes = append(edge.Target.Nodes, k)
|
||||
}
|
||||
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
|
||||
}
|
||||
if nodes := _u.mutation.AttributeValuesIDs(); len(nodes) > 0 {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
Inverse: false,
|
||||
Table: user.AttributeValuesTable,
|
||||
Columns: []string{user.AttributeValuesColumn},
|
||||
Bidi: false,
|
||||
Target: &sqlgraph.EdgeTarget{
|
||||
IDSpec: sqlgraph.NewFieldSpec(userattributevalue.FieldID, field.TypeInt64),
|
||||
},
|
||||
}
|
||||
for _, k := range nodes {
|
||||
edge.Target.Nodes = append(edge.Target.Nodes, k)
|
||||
}
|
||||
_spec.Edges.Add = append(_spec.Edges.Add, edge)
|
||||
}
|
||||
_node = &User{config: _u.config}
|
||||
_spec.Assign = _node.assignValues
|
||||
_spec.ScanValues = _node.scanValues
|
||||
|
||||
Reference in New Issue
Block a user