diff --git a/ent/admin/extension.go b/ent/admin/extension.go index 9094038..c9f5a6a 100644 --- a/ent/admin/extension.go +++ b/ent/admin/extension.go @@ -39,7 +39,11 @@ func fieldName(name string) string { parts := strings.Split(name, "_") for i := 0; i < len(parts); i++ { - parts[i] = upperFirst(parts[i]) + if parts[i] == "id" { + parts[i] = "ID" + } else { + parts[i] = upperFirst(parts[i]) + } } return strings.Join(parts, "") diff --git a/ent/admin/handler.go b/ent/admin/handler.go index 3e2c8d7..8b27284 100644 --- a/ent/admin/handler.go +++ b/ent/admin/handler.go @@ -89,8 +89,9 @@ func (h *Handler) PasswordTokenCreate(ctx echo.Context) error { op := h.client.PasswordToken.Create() op.SetHash(payload.Hash) + op.SetUserID(payload.UserID) op.SetCreatedAt(payload.CreatedAt) - op.SetUserID(payload.User) + // op.SetUserID(payload.User) _, err := op.Save(ctx.Request().Context()) return err } @@ -108,8 +109,9 @@ func (h *Handler) PasswordTokenUpdate(ctx echo.Context, id int) error { op := entity.Update() op.SetHash(payload.Hash) + op.SetUserID(payload.UserID) op.SetCreatedAt(payload.CreatedAt) - op.SetUserID(payload.User) + // op.SetUserID(payload.User) _, err = op.Save(ctx.Request().Context()) return err } @@ -133,6 +135,7 @@ func (h *Handler) PasswordTokenList(ctx echo.Context) (*EntityList, error) { list := &EntityList{ Columns: []string{ + "User id", "Created at", // "User", ? }, @@ -144,6 +147,7 @@ func (h *Handler) PasswordTokenList(ctx echo.Context) (*EntityList, error) { list.Entities = append(list.Entities, EntityValues{ ID: res[i].ID, Values: []string{ + fmt.Sprint(res[i].UserID), fmt.Sprint(res[i].CreatedAt), // TODO User ? }, diff --git a/ent/admin/templates/handler.tmpl b/ent/admin/templates/handler.tmpl index d390b84..e99eaad 100644 --- a/ent/admin/templates/handler.tmpl +++ b/ent/admin/templates/handler.tmpl @@ -100,7 +100,7 @@ {{- end }} {{- range $e := $n.Edges }} {{- if not $e.Inverse}} - op.Set{{ fieldName $e.Name }}ID(payload.{{ fieldName $e.Name }}) + // op.Set{{ fieldName $e.Name }}ID(payload.{{ fieldName $e.Name }}) {{- end }} {{- end }} _, err := op.Save(ctx.Request().Context()) @@ -126,7 +126,7 @@ {{- end }} {{- range $e := $n.Edges }} {{- if not $e.Inverse}} - op.Set{{ fieldName $e.Name }}ID(payload.{{ fieldName $e.Name }}) + // op.Set{{ fieldName $e.Name }}ID(payload.{{ fieldName $e.Name }}) {{- end }} {{- end }} _, err = op.Save(ctx.Request().Context()) diff --git a/ent/admin/templates/types.tmpl b/ent/admin/templates/types.tmpl index a874443..2fbc9a6 100644 --- a/ent/admin/templates/types.tmpl +++ b/ent/admin/templates/types.tmpl @@ -14,7 +14,7 @@ // Edges. {{- range $e := $n.Edges }} {{- if not $e.Inverse}} - {{ fieldName $e.Name }} int `form:"{{ $e.Name }}"` + // {{ fieldName $e.Name }} int `form:"{{ $e.Name }}"` {{- end }} {{- end }} } diff --git a/ent/admin/types.go b/ent/admin/types.go index f5487c7..16f5a9e 100644 --- a/ent/admin/types.go +++ b/ent/admin/types.go @@ -6,9 +6,10 @@ import "time" type PasswordToken struct { // Fields. Hash string `form:"hash"` + UserID int `form:"user_id"` CreatedAt time.Time `form:"created_at"` // Edges. - User int `form:"user"` + // User int `form:"user"` } type User struct { diff --git a/ent/migrate/schema.go b/ent/migrate/schema.go index ae043a4..10049a6 100644 --- a/ent/migrate/schema.go +++ b/ent/migrate/schema.go @@ -13,7 +13,7 @@ var ( {Name: "id", Type: field.TypeInt, Increment: true}, {Name: "hash", Type: field.TypeString}, {Name: "created_at", Type: field.TypeTime}, - {Name: "password_token_user", Type: field.TypeInt}, + {Name: "user_id", Type: field.TypeInt}, } // PasswordTokensTable holds the schema information for the "password_tokens" table. PasswordTokensTable = &schema.Table{ diff --git a/ent/mutation.go b/ent/mutation.go index a1dad5f..0d90136 100644 --- a/ent/mutation.go +++ b/ent/mutation.go @@ -179,6 +179,42 @@ func (m *PasswordTokenMutation) ResetHash() { m.hash = nil } +// SetUserID sets the "user_id" field. +func (m *PasswordTokenMutation) SetUserID(i int) { + m.user = &i +} + +// UserID returns the value of the "user_id" field in the mutation. +func (m *PasswordTokenMutation) UserID() (r int, exists bool) { + v := m.user + if v == nil { + return + } + return *v, true +} + +// OldUserID returns the old "user_id" field's value of the PasswordToken entity. +// If the PasswordToken object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *PasswordTokenMutation) OldUserID(ctx context.Context) (v int, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldUserID is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldUserID requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldUserID: %w", err) + } + return oldValue.UserID, nil +} + +// ResetUserID resets all changes to the "user_id" field. +func (m *PasswordTokenMutation) ResetUserID() { + m.user = nil +} + // SetCreatedAt sets the "created_at" field. func (m *PasswordTokenMutation) SetCreatedAt(t time.Time) { m.created_at = &t @@ -215,14 +251,10 @@ func (m *PasswordTokenMutation) ResetCreatedAt() { m.created_at = nil } -// SetUserID sets the "user" edge to the User entity by id. -func (m *PasswordTokenMutation) SetUserID(id int) { - m.user = &id -} - // ClearUser clears the "user" edge to the User entity. func (m *PasswordTokenMutation) ClearUser() { m.cleareduser = true + m.clearedFields[passwordtoken.FieldUserID] = struct{}{} } // UserCleared reports if the "user" edge to the User entity was cleared. @@ -230,14 +262,6 @@ func (m *PasswordTokenMutation) UserCleared() bool { return m.cleareduser } -// UserID returns the "user" edge ID in the mutation. -func (m *PasswordTokenMutation) UserID() (id int, exists bool) { - if m.user != nil { - return *m.user, true - } - return -} - // UserIDs returns the "user" edge IDs in the mutation. // Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use // UserID instead. It exists only for internal usage by the builders. @@ -288,10 +312,13 @@ func (m *PasswordTokenMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *PasswordTokenMutation) Fields() []string { - fields := make([]string, 0, 2) + fields := make([]string, 0, 3) if m.hash != nil { fields = append(fields, passwordtoken.FieldHash) } + if m.user != nil { + fields = append(fields, passwordtoken.FieldUserID) + } if m.created_at != nil { fields = append(fields, passwordtoken.FieldCreatedAt) } @@ -305,6 +332,8 @@ func (m *PasswordTokenMutation) Field(name string) (ent.Value, bool) { switch name { case passwordtoken.FieldHash: return m.Hash() + case passwordtoken.FieldUserID: + return m.UserID() case passwordtoken.FieldCreatedAt: return m.CreatedAt() } @@ -318,6 +347,8 @@ func (m *PasswordTokenMutation) OldField(ctx context.Context, name string) (ent. switch name { case passwordtoken.FieldHash: return m.OldHash(ctx) + case passwordtoken.FieldUserID: + return m.OldUserID(ctx) case passwordtoken.FieldCreatedAt: return m.OldCreatedAt(ctx) } @@ -336,6 +367,13 @@ func (m *PasswordTokenMutation) SetField(name string, value ent.Value) error { } m.SetHash(v) return nil + case passwordtoken.FieldUserID: + v, ok := value.(int) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetUserID(v) + return nil case passwordtoken.FieldCreatedAt: v, ok := value.(time.Time) if !ok { @@ -350,13 +388,16 @@ func (m *PasswordTokenMutation) SetField(name string, value ent.Value) error { // AddedFields returns all numeric fields that were incremented/decremented during // this mutation. func (m *PasswordTokenMutation) AddedFields() []string { - return nil + var fields []string + return fields } // AddedField returns the numeric value that was incremented/decremented on a field // with the given name. The second boolean return value indicates that this field // was not set, or was not defined in the schema. func (m *PasswordTokenMutation) AddedField(name string) (ent.Value, bool) { + switch name { + } return nil, false } @@ -395,6 +436,9 @@ func (m *PasswordTokenMutation) ResetField(name string) error { case passwordtoken.FieldHash: m.ResetHash() return nil + case passwordtoken.FieldUserID: + m.ResetUserID() + return nil case passwordtoken.FieldCreatedAt: m.ResetCreatedAt() return nil diff --git a/ent/passwordtoken.go b/ent/passwordtoken.go index c3a27bd..40f9bcb 100644 --- a/ent/passwordtoken.go +++ b/ent/passwordtoken.go @@ -20,13 +20,14 @@ type PasswordToken struct { ID int `json:"id,omitempty"` // Hash holds the value of the "hash" field. Hash string `json:"-"` + // UserID holds the value of the "user_id" field. + UserID int `json:"user_id,omitempty"` // CreatedAt holds the value of the "created_at" field. CreatedAt time.Time `json:"created_at,omitempty"` // Edges holds the relations/edges for other nodes in the graph. // The values are being populated by the PasswordTokenQuery when eager-loading is set. - Edges PasswordTokenEdges `json:"edges"` - password_token_user *int - selectValues sql.SelectValues + Edges PasswordTokenEdges `json:"edges"` + selectValues sql.SelectValues } // PasswordTokenEdges holds the relations/edges for other nodes in the graph. @@ -54,14 +55,12 @@ func (*PasswordToken) scanValues(columns []string) ([]any, error) { values := make([]any, len(columns)) for i := range columns { switch columns[i] { - case passwordtoken.FieldID: + case passwordtoken.FieldID, passwordtoken.FieldUserID: values[i] = new(sql.NullInt64) case passwordtoken.FieldHash: values[i] = new(sql.NullString) case passwordtoken.FieldCreatedAt: values[i] = new(sql.NullTime) - case passwordtoken.ForeignKeys[0]: // password_token_user - values[i] = new(sql.NullInt64) default: values[i] = new(sql.UnknownType) } @@ -89,19 +88,18 @@ func (pt *PasswordToken) assignValues(columns []string, values []any) error { } else if value.Valid { pt.Hash = value.String } + case passwordtoken.FieldUserID: + if value, ok := values[i].(*sql.NullInt64); !ok { + return fmt.Errorf("unexpected type %T for field user_id", values[i]) + } else if value.Valid { + pt.UserID = int(value.Int64) + } case passwordtoken.FieldCreatedAt: if value, ok := values[i].(*sql.NullTime); !ok { return fmt.Errorf("unexpected type %T for field created_at", values[i]) } else if value.Valid { pt.CreatedAt = value.Time } - case passwordtoken.ForeignKeys[0]: - if value, ok := values[i].(*sql.NullInt64); !ok { - return fmt.Errorf("unexpected type %T for edge-field password_token_user", value) - } else if value.Valid { - pt.password_token_user = new(int) - *pt.password_token_user = int(value.Int64) - } default: pt.selectValues.Set(columns[i], values[i]) } @@ -145,6 +143,9 @@ func (pt *PasswordToken) String() string { builder.WriteString(fmt.Sprintf("id=%v, ", pt.ID)) builder.WriteString("hash=") builder.WriteString(", ") + builder.WriteString("user_id=") + builder.WriteString(fmt.Sprintf("%v", pt.UserID)) + builder.WriteString(", ") builder.WriteString("created_at=") builder.WriteString(pt.CreatedAt.Format(time.ANSIC)) builder.WriteByte(')') diff --git a/ent/passwordtoken/passwordtoken.go b/ent/passwordtoken/passwordtoken.go index 6e9c6c9..fd7a716 100644 --- a/ent/passwordtoken/passwordtoken.go +++ b/ent/passwordtoken/passwordtoken.go @@ -16,6 +16,8 @@ const ( FieldID = "id" // FieldHash holds the string denoting the hash field in the database. FieldHash = "hash" + // FieldUserID holds the string denoting the user_id field in the database. + FieldUserID = "user_id" // FieldCreatedAt holds the string denoting the created_at field in the database. FieldCreatedAt = "created_at" // EdgeUser holds the string denoting the user edge name in mutations. @@ -28,22 +30,17 @@ const ( // It exists in this package in order to avoid circular dependency with the "user" package. UserInverseTable = "users" // UserColumn is the table column denoting the user relation/edge. - UserColumn = "password_token_user" + UserColumn = "user_id" ) // Columns holds all SQL columns for passwordtoken fields. var Columns = []string{ FieldID, FieldHash, + FieldUserID, FieldCreatedAt, } -// ForeignKeys holds the SQL foreign-keys that are owned by the "password_tokens" -// table and are not defined as standalone fields in the schema. -var ForeignKeys = []string{ - "password_token_user", -} - // ValidColumn reports if the column name is valid (part of the table columns). func ValidColumn(column string) bool { for i := range Columns { @@ -51,11 +48,6 @@ func ValidColumn(column string) bool { return true } } - for i := range ForeignKeys { - if column == ForeignKeys[i] { - return true - } - } return false } @@ -79,6 +71,11 @@ func ByHash(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldHash, opts...).ToFunc() } +// ByUserID orders the results by the user_id field. +func ByUserID(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldUserID, opts...).ToFunc() +} + // ByCreatedAt orders the results by the created_at field. func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldCreatedAt, opts...).ToFunc() diff --git a/ent/passwordtoken/where.go b/ent/passwordtoken/where.go index cacfbdb..c61436b 100644 --- a/ent/passwordtoken/where.go +++ b/ent/passwordtoken/where.go @@ -60,6 +60,11 @@ func Hash(v string) predicate.PasswordToken { return predicate.PasswordToken(sql.FieldEQ(FieldHash, v)) } +// UserID applies equality check predicate on the "user_id" field. It's identical to UserIDEQ. +func UserID(v int) predicate.PasswordToken { + return predicate.PasswordToken(sql.FieldEQ(FieldUserID, v)) +} + // CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ. func CreatedAt(v time.Time) predicate.PasswordToken { return predicate.PasswordToken(sql.FieldEQ(FieldCreatedAt, v)) @@ -130,6 +135,26 @@ func HashContainsFold(v string) predicate.PasswordToken { return predicate.PasswordToken(sql.FieldContainsFold(FieldHash, v)) } +// UserIDEQ applies the EQ predicate on the "user_id" field. +func UserIDEQ(v int) predicate.PasswordToken { + return predicate.PasswordToken(sql.FieldEQ(FieldUserID, v)) +} + +// UserIDNEQ applies the NEQ predicate on the "user_id" field. +func UserIDNEQ(v int) predicate.PasswordToken { + return predicate.PasswordToken(sql.FieldNEQ(FieldUserID, v)) +} + +// UserIDIn applies the In predicate on the "user_id" field. +func UserIDIn(vs ...int) predicate.PasswordToken { + return predicate.PasswordToken(sql.FieldIn(FieldUserID, vs...)) +} + +// UserIDNotIn applies the NotIn predicate on the "user_id" field. +func UserIDNotIn(vs ...int) predicate.PasswordToken { + return predicate.PasswordToken(sql.FieldNotIn(FieldUserID, vs...)) +} + // CreatedAtEQ applies the EQ predicate on the "created_at" field. func CreatedAtEQ(v time.Time) predicate.PasswordToken { return predicate.PasswordToken(sql.FieldEQ(FieldCreatedAt, v)) diff --git a/ent/passwordtoken_create.go b/ent/passwordtoken_create.go index 08ea521..b3a427a 100644 --- a/ent/passwordtoken_create.go +++ b/ent/passwordtoken_create.go @@ -27,6 +27,12 @@ func (ptc *PasswordTokenCreate) SetHash(s string) *PasswordTokenCreate { return ptc } +// SetUserID sets the "user_id" field. +func (ptc *PasswordTokenCreate) SetUserID(i int) *PasswordTokenCreate { + ptc.mutation.SetUserID(i) + return ptc +} + // SetCreatedAt sets the "created_at" field. func (ptc *PasswordTokenCreate) SetCreatedAt(t time.Time) *PasswordTokenCreate { ptc.mutation.SetCreatedAt(t) @@ -41,12 +47,6 @@ func (ptc *PasswordTokenCreate) SetNillableCreatedAt(t *time.Time) *PasswordToke return ptc } -// SetUserID sets the "user" edge to the User entity by ID. -func (ptc *PasswordTokenCreate) SetUserID(id int) *PasswordTokenCreate { - ptc.mutation.SetUserID(id) - return ptc -} - // SetUser sets the "user" edge to the User entity. func (ptc *PasswordTokenCreate) SetUser(u *User) *PasswordTokenCreate { return ptc.SetUserID(u.ID) @@ -103,6 +103,9 @@ func (ptc *PasswordTokenCreate) check() error { return &ValidationError{Name: "hash", err: fmt.Errorf(`ent: validator failed for field "PasswordToken.hash": %w`, err)} } } + if _, ok := ptc.mutation.UserID(); !ok { + return &ValidationError{Name: "user_id", err: errors.New(`ent: missing required field "PasswordToken.user_id"`)} + } if _, ok := ptc.mutation.CreatedAt(); !ok { return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "PasswordToken.created_at"`)} } @@ -157,7 +160,7 @@ func (ptc *PasswordTokenCreate) createSpec() (*PasswordToken, *sqlgraph.CreateSp for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - _node.password_token_user = &nodes[0] + _node.UserID = nodes[0] _spec.Edges = append(_spec.Edges, edge) } return _node, _spec diff --git a/ent/passwordtoken_query.go b/ent/passwordtoken_query.go index 1499b04..4c7ada6 100644 --- a/ent/passwordtoken_query.go +++ b/ent/passwordtoken_query.go @@ -24,7 +24,6 @@ type PasswordTokenQuery struct { inters []Interceptor predicates []predicate.PasswordToken withUser *UserQuery - withFKs bool // intermediate query (i.e. traversal path). sql *sql.Selector path func(context.Context) (*sql.Selector, error) @@ -370,18 +369,11 @@ func (ptq *PasswordTokenQuery) prepareQuery(ctx context.Context) error { func (ptq *PasswordTokenQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*PasswordToken, error) { var ( nodes = []*PasswordToken{} - withFKs = ptq.withFKs _spec = ptq.querySpec() loadedTypes = [1]bool{ ptq.withUser != nil, } ) - if ptq.withUser != nil { - withFKs = true - } - if withFKs { - _spec.Node.Columns = append(_spec.Node.Columns, passwordtoken.ForeignKeys...) - } _spec.ScanValues = func(columns []string) ([]any, error) { return (*PasswordToken).scanValues(nil, columns) } @@ -413,10 +405,7 @@ func (ptq *PasswordTokenQuery) loadUser(ctx context.Context, query *UserQuery, n ids := make([]int, 0, len(nodes)) nodeids := make(map[int][]*PasswordToken) for i := range nodes { - if nodes[i].password_token_user == nil { - continue - } - fk := *nodes[i].password_token_user + fk := nodes[i].UserID if _, ok := nodeids[fk]; !ok { ids = append(ids, fk) } @@ -433,7 +422,7 @@ func (ptq *PasswordTokenQuery) loadUser(ctx context.Context, query *UserQuery, n for _, n := range neighbors { nodes, ok := nodeids[n.ID] if !ok { - return fmt.Errorf(`unexpected foreign-key "password_token_user" returned %v`, n.ID) + return fmt.Errorf(`unexpected foreign-key "user_id" returned %v`, n.ID) } for i := range nodes { assign(nodes[i], n) @@ -467,6 +456,9 @@ func (ptq *PasswordTokenQuery) querySpec() *sqlgraph.QuerySpec { _spec.Node.Columns = append(_spec.Node.Columns, fields[i]) } } + if ptq.withUser != nil { + _spec.Node.AddColumnOnce(passwordtoken.FieldUserID) + } } if ps := ptq.predicates; len(ps) > 0 { _spec.Predicate = func(selector *sql.Selector) { diff --git a/ent/passwordtoken_update.go b/ent/passwordtoken_update.go index 35025cc..98b0848 100644 --- a/ent/passwordtoken_update.go +++ b/ent/passwordtoken_update.go @@ -43,6 +43,20 @@ func (ptu *PasswordTokenUpdate) SetNillableHash(s *string) *PasswordTokenUpdate return ptu } +// SetUserID sets the "user_id" field. +func (ptu *PasswordTokenUpdate) SetUserID(i int) *PasswordTokenUpdate { + ptu.mutation.SetUserID(i) + return ptu +} + +// SetNillableUserID sets the "user_id" field if the given value is not nil. +func (ptu *PasswordTokenUpdate) SetNillableUserID(i *int) *PasswordTokenUpdate { + if i != nil { + ptu.SetUserID(*i) + } + return ptu +} + // SetCreatedAt sets the "created_at" field. func (ptu *PasswordTokenUpdate) SetCreatedAt(t time.Time) *PasswordTokenUpdate { ptu.mutation.SetCreatedAt(t) @@ -57,12 +71,6 @@ func (ptu *PasswordTokenUpdate) SetNillableCreatedAt(t *time.Time) *PasswordToke return ptu } -// SetUserID sets the "user" edge to the User entity by ID. -func (ptu *PasswordTokenUpdate) SetUserID(id int) *PasswordTokenUpdate { - ptu.mutation.SetUserID(id) - return ptu -} - // SetUser sets the "user" edge to the User entity. func (ptu *PasswordTokenUpdate) SetUser(u *User) *PasswordTokenUpdate { return ptu.SetUserID(u.ID) @@ -200,6 +208,20 @@ func (ptuo *PasswordTokenUpdateOne) SetNillableHash(s *string) *PasswordTokenUpd return ptuo } +// SetUserID sets the "user_id" field. +func (ptuo *PasswordTokenUpdateOne) SetUserID(i int) *PasswordTokenUpdateOne { + ptuo.mutation.SetUserID(i) + return ptuo +} + +// SetNillableUserID sets the "user_id" field if the given value is not nil. +func (ptuo *PasswordTokenUpdateOne) SetNillableUserID(i *int) *PasswordTokenUpdateOne { + if i != nil { + ptuo.SetUserID(*i) + } + return ptuo +} + // SetCreatedAt sets the "created_at" field. func (ptuo *PasswordTokenUpdateOne) SetCreatedAt(t time.Time) *PasswordTokenUpdateOne { ptuo.mutation.SetCreatedAt(t) @@ -214,12 +236,6 @@ func (ptuo *PasswordTokenUpdateOne) SetNillableCreatedAt(t *time.Time) *Password return ptuo } -// SetUserID sets the "user" edge to the User entity by ID. -func (ptuo *PasswordTokenUpdateOne) SetUserID(id int) *PasswordTokenUpdateOne { - ptuo.mutation.SetUserID(id) - return ptuo -} - // SetUser sets the "user" edge to the User entity. func (ptuo *PasswordTokenUpdateOne) SetUser(u *User) *PasswordTokenUpdateOne { return ptuo.SetUserID(u.ID) diff --git a/ent/runtime/runtime.go b/ent/runtime/runtime.go index e75c555..f45a5da 100644 --- a/ent/runtime/runtime.go +++ b/ent/runtime/runtime.go @@ -21,7 +21,7 @@ func init() { // passwordtoken.HashValidator is a validator for the "hash" field. It is called by the builders before save. passwordtoken.HashValidator = passwordtokenDescHash.Validators[0].(func(string) error) // passwordtokenDescCreatedAt is the schema descriptor for created_at field. - passwordtokenDescCreatedAt := passwordtokenFields[1].Descriptor() + passwordtokenDescCreatedAt := passwordtokenFields[2].Descriptor() // passwordtoken.DefaultCreatedAt holds the default value on creation for the created_at field. passwordtoken.DefaultCreatedAt = passwordtokenDescCreatedAt.Default.(func() time.Time) userHooks := schema.User{}.Hooks() diff --git a/ent/schema/passwordtoken.go b/ent/schema/passwordtoken.go index e518d16..5a59f33 100644 --- a/ent/schema/passwordtoken.go +++ b/ent/schema/passwordtoken.go @@ -19,6 +19,7 @@ func (PasswordToken) Fields() []ent.Field { field.String("hash"). Sensitive(). NotEmpty(), + field.Int("user_id"), field.Time("created_at"). Default(time.Now), } @@ -28,6 +29,7 @@ func (PasswordToken) Fields() []ent.Field { func (PasswordToken) Edges() []ent.Edge { return []ent.Edge{ edge.To("user", User.Type). + Field("user_id"). Required(). Unique(), } diff --git a/ent/user/user.go b/ent/user/user.go index 06c938c..f516800 100644 --- a/ent/user/user.go +++ b/ent/user/user.go @@ -35,7 +35,7 @@ const ( // It exists in this package in order to avoid circular dependency with the "passwordtoken" package. OwnerInverseTable = "password_tokens" // OwnerColumn is the table column denoting the owner relation/edge. - OwnerColumn = "password_token_user" + OwnerColumn = "user_id" ) // Columns holds all SQL columns for user fields. diff --git a/ent/user_query.go b/ent/user_query.go index f06f520..cf1b7fe 100644 --- a/ent/user_query.go +++ b/ent/user_query.go @@ -413,7 +413,9 @@ func (uq *UserQuery) loadOwner(ctx context.Context, query *PasswordTokenQuery, n init(nodes[i]) } } - query.withFKs = true + if len(query.ctx.Fields) > 0 { + query.ctx.AppendFieldOnce(passwordtoken.FieldUserID) + } query.Where(predicate.PasswordToken(func(s *sql.Selector) { s.Where(sql.InValues(s.C(user.OwnerColumn), fks...)) })) @@ -422,13 +424,10 @@ func (uq *UserQuery) loadOwner(ctx context.Context, query *PasswordTokenQuery, n return err } for _, n := range neighbors { - fk := n.password_token_user - if fk == nil { - return fmt.Errorf(`foreign-key "password_token_user" is nil for node %v`, n.ID) - } - node, ok := nodeids[*fk] + fk := n.UserID + node, ok := nodeids[fk] if !ok { - return fmt.Errorf(`unexpected referenced foreign-key "password_token_user" returned %v for node %v`, *fk, n.ID) + return fmt.Errorf(`unexpected referenced foreign-key "user_id" returned %v for node %v`, fk, n.ID) } assign(node, n) } diff --git a/pkg/handlers/admin.go b/pkg/handlers/admin.go index 84da9e0..5588494 100644 --- a/pkg/handlers/admin.go +++ b/pkg/handlers/admin.go @@ -1,7 +1,6 @@ package handlers import ( - "errors" "fmt" "net/http" "strconv" @@ -76,9 +75,9 @@ func (h *Admin) middlewareEntityLoad(n *gen.Type) echo.MiddlewareFunc { switch { case err == nil: ctx.Set(entityIDContextKey, id) - //ctx.Set(entityContextKey, entity) // TODO + //ctx.Set(entityContextKey, entityValues) return next(ctx) - case errors.Is(err, new(ent.NotFoundError)): + case ent.IsNotFound(err): return echo.NewHTTPError(http.StatusNotFound, "entity not found") default: return echo.NewHTTPError(http.StatusInternalServerError, err) @@ -91,7 +90,7 @@ func (h *Admin) EntityList(n *gen.Type) echo.HandlerFunc { return func(ctx echo.Context) error { list, err := h.admin.List(ctx, n.Name) if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + return echo.NewHTTPError(http.StatusInternalServerError, err) } return pages.AdminEntityList(ctx, pages.AdminEntityListParams{ @@ -125,12 +124,13 @@ func (h *Admin) EntityAddSubmit(n *gen.Type) echo.HandlerFunc { } } -// -//func (h *Admin) EntityEdit(p AdminEntityPlugin) echo.HandlerFunc { +//func (h *Admin) EntityEdit(n *gen.Type) echo.HandlerFunc { // return func(ctx echo.Context) error { -// return nil +// v := ctx.Get(entityContextKey).(map[string][]string) +// return pages.AdminEntityForm(ctx, h.getEntitySchema(n), v) // } //} + // //func (h *Admin) EntityEditSubmit(p AdminEntityPlugin) echo.HandlerFunc { // return func(ctx echo.Context) error { diff --git a/pkg/ui/pages/entity.go b/pkg/ui/pages/entity.go index da56b90..8f96db3 100644 --- a/pkg/ui/pages/entity.go +++ b/pkg/ui/pages/entity.go @@ -65,6 +65,7 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e for _, f := range schema.Fields { // TODO cardinality? + // TODO optional fields? switch f.Info.Type { case field.TypeString: nodes = append(nodes, InputField(InputFieldParams{ @@ -74,6 +75,7 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e Value: getValue(f.Name), })) case field.TypeTime: + // todo make this easier nodes = append(nodes, InputField(InputFieldParams{ Name: f.Name, InputType: "text", @@ -81,6 +83,13 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e Help: fmt.Sprintf("Use the following format: %s", time.Now().Format(time.RFC3339)), Value: getValue(f.Name), })) + case field.TypeInt: + nodes = append(nodes, InputField(InputFieldParams{ + Name: f.Name, + InputType: "number", + Label: label(f.Name), + Value: getValue(f.Name), + })) case field.TypeBool: // TODO nodes = append(nodes, P(Textf("%s not supported", f.Name))) @@ -93,17 +102,17 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e } } - for _, e := range schema.Edges { - if e.Inverse { - continue - } - nodes = append(nodes, InputField(InputFieldParams{ - Name: e.Name, - InputType: "number", - Label: label(e.Name), - Value: getValue(e.Name), // TODO load does not load this - })) - } + //for _, e := range schema.Edges { + // if e.Inverse { + // continue + // } + // nodes = append(nodes, InputField(InputFieldParams{ + // Name: e.Name, + // InputType: "number", + // Label: label(e.Name), + // Value: getValue(e.Name), // TODO load does not load this + // })) + //} nodes = append(nodes, ControlGroup( FormButton("is-primary", "Submit"), @@ -148,8 +157,19 @@ func AdminEntityList(ctx echo.Context, params AdminEntityListParams) error { g = append(g, Td(Text(h))) } g = append(g, - Td(ButtonLink(r.Path(routenames.AdminEntityEdit(params.EntityType.Name), row.ID), "is-link", "Edit")), - Td(ButtonLink(r.Path(routenames.AdminEntityDelete(params.EntityType.Name), row.ID), "is-danger", "Delete")), + Td( + ButtonLink( + r.Path(routenames.AdminEntityEdit(params.EntityType.Name), row.ID), + "is-link", + "Edit", + ), + ), + Td( + ButtonLink(r.Path(routenames.AdminEntityDelete(params.EntityType.Name), row.ID), + "is-danger", + "Delete", + ), + ), ) return g }