Switch to edge fields for passwordtoken.

This commit is contained in:
mikestefanello 2025-04-10 09:07:53 -04:00
parent acf8a830d7
commit 1b86097376
19 changed files with 217 additions and 109 deletions

View file

@ -39,7 +39,11 @@ func fieldName(name string) string {
parts := strings.Split(name, "_") parts := strings.Split(name, "_")
for i := 0; i < len(parts); i++ { 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, "") return strings.Join(parts, "")

View file

@ -89,8 +89,9 @@ func (h *Handler) PasswordTokenCreate(ctx echo.Context) error {
op := h.client.PasswordToken.Create() op := h.client.PasswordToken.Create()
op.SetHash(payload.Hash) op.SetHash(payload.Hash)
op.SetUserID(payload.UserID)
op.SetCreatedAt(payload.CreatedAt) op.SetCreatedAt(payload.CreatedAt)
op.SetUserID(payload.User) // op.SetUserID(payload.User)
_, err := op.Save(ctx.Request().Context()) _, err := op.Save(ctx.Request().Context())
return err return err
} }
@ -108,8 +109,9 @@ func (h *Handler) PasswordTokenUpdate(ctx echo.Context, id int) error {
op := entity.Update() op := entity.Update()
op.SetHash(payload.Hash) op.SetHash(payload.Hash)
op.SetUserID(payload.UserID)
op.SetCreatedAt(payload.CreatedAt) op.SetCreatedAt(payload.CreatedAt)
op.SetUserID(payload.User) // op.SetUserID(payload.User)
_, err = op.Save(ctx.Request().Context()) _, err = op.Save(ctx.Request().Context())
return err return err
} }
@ -133,6 +135,7 @@ func (h *Handler) PasswordTokenList(ctx echo.Context) (*EntityList, error) {
list := &EntityList{ list := &EntityList{
Columns: []string{ Columns: []string{
"User id",
"Created at", "Created at",
// "User", ? // "User", ?
}, },
@ -144,6 +147,7 @@ func (h *Handler) PasswordTokenList(ctx echo.Context) (*EntityList, error) {
list.Entities = append(list.Entities, EntityValues{ list.Entities = append(list.Entities, EntityValues{
ID: res[i].ID, ID: res[i].ID,
Values: []string{ Values: []string{
fmt.Sprint(res[i].UserID),
fmt.Sprint(res[i].CreatedAt), fmt.Sprint(res[i].CreatedAt),
// TODO User ? // TODO User ?
}, },

View file

@ -100,7 +100,7 @@
{{- end }} {{- end }}
{{- range $e := $n.Edges }} {{- range $e := $n.Edges }}
{{- if not $e.Inverse}} {{- 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 }}
{{- end }} {{- end }}
_, err := op.Save(ctx.Request().Context()) _, err := op.Save(ctx.Request().Context())
@ -126,7 +126,7 @@
{{- end }} {{- end }}
{{- range $e := $n.Edges }} {{- range $e := $n.Edges }}
{{- if not $e.Inverse}} {{- 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 }}
{{- end }} {{- end }}
_, err = op.Save(ctx.Request().Context()) _, err = op.Save(ctx.Request().Context())

View file

@ -14,7 +14,7 @@
// Edges. // Edges.
{{- range $e := $n.Edges }} {{- range $e := $n.Edges }}
{{- if not $e.Inverse}} {{- if not $e.Inverse}}
{{ fieldName $e.Name }} int `form:"{{ $e.Name }}"` // {{ fieldName $e.Name }} int `form:"{{ $e.Name }}"`
{{- end }} {{- end }}
{{- end }} {{- end }}
} }

View file

@ -6,9 +6,10 @@ import "time"
type PasswordToken struct { type PasswordToken struct {
// Fields. // Fields.
Hash string `form:"hash"` Hash string `form:"hash"`
UserID int `form:"user_id"`
CreatedAt time.Time `form:"created_at"` CreatedAt time.Time `form:"created_at"`
// Edges. // Edges.
User int `form:"user"` // User int `form:"user"`
} }
type User struct { type User struct {

View file

@ -13,7 +13,7 @@ var (
{Name: "id", Type: field.TypeInt, Increment: true}, {Name: "id", Type: field.TypeInt, Increment: true},
{Name: "hash", Type: field.TypeString}, {Name: "hash", Type: field.TypeString},
{Name: "created_at", Type: field.TypeTime}, {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 holds the schema information for the "password_tokens" table.
PasswordTokensTable = &schema.Table{ PasswordTokensTable = &schema.Table{

View file

@ -179,6 +179,42 @@ func (m *PasswordTokenMutation) ResetHash() {
m.hash = nil 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. // SetCreatedAt sets the "created_at" field.
func (m *PasswordTokenMutation) SetCreatedAt(t time.Time) { func (m *PasswordTokenMutation) SetCreatedAt(t time.Time) {
m.created_at = &t m.created_at = &t
@ -215,14 +251,10 @@ func (m *PasswordTokenMutation) ResetCreatedAt() {
m.created_at = nil 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. // ClearUser clears the "user" edge to the User entity.
func (m *PasswordTokenMutation) ClearUser() { func (m *PasswordTokenMutation) ClearUser() {
m.cleareduser = true m.cleareduser = true
m.clearedFields[passwordtoken.FieldUserID] = struct{}{}
} }
// UserCleared reports if the "user" edge to the User entity was cleared. // UserCleared reports if the "user" edge to the User entity was cleared.
@ -230,14 +262,6 @@ func (m *PasswordTokenMutation) UserCleared() bool {
return m.cleareduser 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. // UserIDs returns the "user" edge IDs in the mutation.
// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use // 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. // 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 // order to get all numeric fields that were incremented/decremented, call
// AddedFields(). // AddedFields().
func (m *PasswordTokenMutation) Fields() []string { func (m *PasswordTokenMutation) Fields() []string {
fields := make([]string, 0, 2) fields := make([]string, 0, 3)
if m.hash != nil { if m.hash != nil {
fields = append(fields, passwordtoken.FieldHash) fields = append(fields, passwordtoken.FieldHash)
} }
if m.user != nil {
fields = append(fields, passwordtoken.FieldUserID)
}
if m.created_at != nil { if m.created_at != nil {
fields = append(fields, passwordtoken.FieldCreatedAt) fields = append(fields, passwordtoken.FieldCreatedAt)
} }
@ -305,6 +332,8 @@ func (m *PasswordTokenMutation) Field(name string) (ent.Value, bool) {
switch name { switch name {
case passwordtoken.FieldHash: case passwordtoken.FieldHash:
return m.Hash() return m.Hash()
case passwordtoken.FieldUserID:
return m.UserID()
case passwordtoken.FieldCreatedAt: case passwordtoken.FieldCreatedAt:
return m.CreatedAt() return m.CreatedAt()
} }
@ -318,6 +347,8 @@ func (m *PasswordTokenMutation) OldField(ctx context.Context, name string) (ent.
switch name { switch name {
case passwordtoken.FieldHash: case passwordtoken.FieldHash:
return m.OldHash(ctx) return m.OldHash(ctx)
case passwordtoken.FieldUserID:
return m.OldUserID(ctx)
case passwordtoken.FieldCreatedAt: case passwordtoken.FieldCreatedAt:
return m.OldCreatedAt(ctx) return m.OldCreatedAt(ctx)
} }
@ -336,6 +367,13 @@ func (m *PasswordTokenMutation) SetField(name string, value ent.Value) error {
} }
m.SetHash(v) m.SetHash(v)
return nil 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: case passwordtoken.FieldCreatedAt:
v, ok := value.(time.Time) v, ok := value.(time.Time)
if !ok { 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 // AddedFields returns all numeric fields that were incremented/decremented during
// this mutation. // this mutation.
func (m *PasswordTokenMutation) AddedFields() []string { func (m *PasswordTokenMutation) AddedFields() []string {
return nil var fields []string
return fields
} }
// AddedField returns the numeric value that was incremented/decremented on a field // 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 // with the given name. The second boolean return value indicates that this field
// was not set, or was not defined in the schema. // was not set, or was not defined in the schema.
func (m *PasswordTokenMutation) AddedField(name string) (ent.Value, bool) { func (m *PasswordTokenMutation) AddedField(name string) (ent.Value, bool) {
switch name {
}
return nil, false return nil, false
} }
@ -395,6 +436,9 @@ func (m *PasswordTokenMutation) ResetField(name string) error {
case passwordtoken.FieldHash: case passwordtoken.FieldHash:
m.ResetHash() m.ResetHash()
return nil return nil
case passwordtoken.FieldUserID:
m.ResetUserID()
return nil
case passwordtoken.FieldCreatedAt: case passwordtoken.FieldCreatedAt:
m.ResetCreatedAt() m.ResetCreatedAt()
return nil return nil

View file

@ -20,13 +20,14 @@ type PasswordToken struct {
ID int `json:"id,omitempty"` ID int `json:"id,omitempty"`
// Hash holds the value of the "hash" field. // Hash holds the value of the "hash" field.
Hash string `json:"-"` 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 holds the value of the "created_at" field.
CreatedAt time.Time `json:"created_at,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"`
// Edges holds the relations/edges for other nodes in the graph. // Edges holds the relations/edges for other nodes in the graph.
// The values are being populated by the PasswordTokenQuery when eager-loading is set. // The values are being populated by the PasswordTokenQuery when eager-loading is set.
Edges PasswordTokenEdges `json:"edges"` Edges PasswordTokenEdges `json:"edges"`
password_token_user *int selectValues sql.SelectValues
selectValues sql.SelectValues
} }
// PasswordTokenEdges holds the relations/edges for other nodes in the graph. // 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)) values := make([]any, len(columns))
for i := range columns { for i := range columns {
switch columns[i] { switch columns[i] {
case passwordtoken.FieldID: case passwordtoken.FieldID, passwordtoken.FieldUserID:
values[i] = new(sql.NullInt64) values[i] = new(sql.NullInt64)
case passwordtoken.FieldHash: case passwordtoken.FieldHash:
values[i] = new(sql.NullString) values[i] = new(sql.NullString)
case passwordtoken.FieldCreatedAt: case passwordtoken.FieldCreatedAt:
values[i] = new(sql.NullTime) values[i] = new(sql.NullTime)
case passwordtoken.ForeignKeys[0]: // password_token_user
values[i] = new(sql.NullInt64)
default: default:
values[i] = new(sql.UnknownType) values[i] = new(sql.UnknownType)
} }
@ -89,19 +88,18 @@ func (pt *PasswordToken) assignValues(columns []string, values []any) error {
} else if value.Valid { } else if value.Valid {
pt.Hash = value.String 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: case passwordtoken.FieldCreatedAt:
if value, ok := values[i].(*sql.NullTime); !ok { if value, ok := values[i].(*sql.NullTime); !ok {
return fmt.Errorf("unexpected type %T for field created_at", values[i]) return fmt.Errorf("unexpected type %T for field created_at", values[i])
} else if value.Valid { } else if value.Valid {
pt.CreatedAt = value.Time 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: default:
pt.selectValues.Set(columns[i], values[i]) 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(fmt.Sprintf("id=%v, ", pt.ID))
builder.WriteString("hash=<sensitive>") builder.WriteString("hash=<sensitive>")
builder.WriteString(", ") builder.WriteString(", ")
builder.WriteString("user_id=")
builder.WriteString(fmt.Sprintf("%v", pt.UserID))
builder.WriteString(", ")
builder.WriteString("created_at=") builder.WriteString("created_at=")
builder.WriteString(pt.CreatedAt.Format(time.ANSIC)) builder.WriteString(pt.CreatedAt.Format(time.ANSIC))
builder.WriteByte(')') builder.WriteByte(')')

View file

@ -16,6 +16,8 @@ const (
FieldID = "id" FieldID = "id"
// FieldHash holds the string denoting the hash field in the database. // FieldHash holds the string denoting the hash field in the database.
FieldHash = "hash" 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 holds the string denoting the created_at field in the database.
FieldCreatedAt = "created_at" FieldCreatedAt = "created_at"
// EdgeUser holds the string denoting the user edge name in mutations. // 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. // It exists in this package in order to avoid circular dependency with the "user" package.
UserInverseTable = "users" UserInverseTable = "users"
// UserColumn is the table column denoting the user relation/edge. // 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. // Columns holds all SQL columns for passwordtoken fields.
var Columns = []string{ var Columns = []string{
FieldID, FieldID,
FieldHash, FieldHash,
FieldUserID,
FieldCreatedAt, 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). // ValidColumn reports if the column name is valid (part of the table columns).
func ValidColumn(column string) bool { func ValidColumn(column string) bool {
for i := range Columns { for i := range Columns {
@ -51,11 +48,6 @@ func ValidColumn(column string) bool {
return true return true
} }
} }
for i := range ForeignKeys {
if column == ForeignKeys[i] {
return true
}
}
return false return false
} }
@ -79,6 +71,11 @@ func ByHash(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldHash, opts...).ToFunc() 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. // ByCreatedAt orders the results by the created_at field.
func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption { func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldCreatedAt, opts...).ToFunc() return sql.OrderByField(FieldCreatedAt, opts...).ToFunc()

View file

@ -60,6 +60,11 @@ func Hash(v string) predicate.PasswordToken {
return predicate.PasswordToken(sql.FieldEQ(FieldHash, v)) 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. // CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ.
func CreatedAt(v time.Time) predicate.PasswordToken { func CreatedAt(v time.Time) predicate.PasswordToken {
return predicate.PasswordToken(sql.FieldEQ(FieldCreatedAt, v)) return predicate.PasswordToken(sql.FieldEQ(FieldCreatedAt, v))
@ -130,6 +135,26 @@ func HashContainsFold(v string) predicate.PasswordToken {
return predicate.PasswordToken(sql.FieldContainsFold(FieldHash, v)) 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. // CreatedAtEQ applies the EQ predicate on the "created_at" field.
func CreatedAtEQ(v time.Time) predicate.PasswordToken { func CreatedAtEQ(v time.Time) predicate.PasswordToken {
return predicate.PasswordToken(sql.FieldEQ(FieldCreatedAt, v)) return predicate.PasswordToken(sql.FieldEQ(FieldCreatedAt, v))

View file

@ -27,6 +27,12 @@ func (ptc *PasswordTokenCreate) SetHash(s string) *PasswordTokenCreate {
return ptc 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. // SetCreatedAt sets the "created_at" field.
func (ptc *PasswordTokenCreate) SetCreatedAt(t time.Time) *PasswordTokenCreate { func (ptc *PasswordTokenCreate) SetCreatedAt(t time.Time) *PasswordTokenCreate {
ptc.mutation.SetCreatedAt(t) ptc.mutation.SetCreatedAt(t)
@ -41,12 +47,6 @@ func (ptc *PasswordTokenCreate) SetNillableCreatedAt(t *time.Time) *PasswordToke
return ptc 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. // SetUser sets the "user" edge to the User entity.
func (ptc *PasswordTokenCreate) SetUser(u *User) *PasswordTokenCreate { func (ptc *PasswordTokenCreate) SetUser(u *User) *PasswordTokenCreate {
return ptc.SetUserID(u.ID) 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)} 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 { if _, ok := ptc.mutation.CreatedAt(); !ok {
return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "PasswordToken.created_at"`)} 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 { for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k) edge.Target.Nodes = append(edge.Target.Nodes, k)
} }
_node.password_token_user = &nodes[0] _node.UserID = nodes[0]
_spec.Edges = append(_spec.Edges, edge) _spec.Edges = append(_spec.Edges, edge)
} }
return _node, _spec return _node, _spec

View file

@ -24,7 +24,6 @@ type PasswordTokenQuery struct {
inters []Interceptor inters []Interceptor
predicates []predicate.PasswordToken predicates []predicate.PasswordToken
withUser *UserQuery withUser *UserQuery
withFKs bool
// intermediate query (i.e. traversal path). // intermediate query (i.e. traversal path).
sql *sql.Selector sql *sql.Selector
path func(context.Context) (*sql.Selector, error) 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) { func (ptq *PasswordTokenQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*PasswordToken, error) {
var ( var (
nodes = []*PasswordToken{} nodes = []*PasswordToken{}
withFKs = ptq.withFKs
_spec = ptq.querySpec() _spec = ptq.querySpec()
loadedTypes = [1]bool{ loadedTypes = [1]bool{
ptq.withUser != nil, 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) { _spec.ScanValues = func(columns []string) ([]any, error) {
return (*PasswordToken).scanValues(nil, columns) 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)) ids := make([]int, 0, len(nodes))
nodeids := make(map[int][]*PasswordToken) nodeids := make(map[int][]*PasswordToken)
for i := range nodes { for i := range nodes {
if nodes[i].password_token_user == nil { fk := nodes[i].UserID
continue
}
fk := *nodes[i].password_token_user
if _, ok := nodeids[fk]; !ok { if _, ok := nodeids[fk]; !ok {
ids = append(ids, fk) ids = append(ids, fk)
} }
@ -433,7 +422,7 @@ func (ptq *PasswordTokenQuery) loadUser(ctx context.Context, query *UserQuery, n
for _, n := range neighbors { for _, n := range neighbors {
nodes, ok := nodeids[n.ID] nodes, ok := nodeids[n.ID]
if !ok { 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 { for i := range nodes {
assign(nodes[i], n) assign(nodes[i], n)
@ -467,6 +456,9 @@ func (ptq *PasswordTokenQuery) querySpec() *sqlgraph.QuerySpec {
_spec.Node.Columns = append(_spec.Node.Columns, fields[i]) _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 { if ps := ptq.predicates; len(ps) > 0 {
_spec.Predicate = func(selector *sql.Selector) { _spec.Predicate = func(selector *sql.Selector) {

View file

@ -43,6 +43,20 @@ func (ptu *PasswordTokenUpdate) SetNillableHash(s *string) *PasswordTokenUpdate
return ptu 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. // SetCreatedAt sets the "created_at" field.
func (ptu *PasswordTokenUpdate) SetCreatedAt(t time.Time) *PasswordTokenUpdate { func (ptu *PasswordTokenUpdate) SetCreatedAt(t time.Time) *PasswordTokenUpdate {
ptu.mutation.SetCreatedAt(t) ptu.mutation.SetCreatedAt(t)
@ -57,12 +71,6 @@ func (ptu *PasswordTokenUpdate) SetNillableCreatedAt(t *time.Time) *PasswordToke
return ptu 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. // SetUser sets the "user" edge to the User entity.
func (ptu *PasswordTokenUpdate) SetUser(u *User) *PasswordTokenUpdate { func (ptu *PasswordTokenUpdate) SetUser(u *User) *PasswordTokenUpdate {
return ptu.SetUserID(u.ID) return ptu.SetUserID(u.ID)
@ -200,6 +208,20 @@ func (ptuo *PasswordTokenUpdateOne) SetNillableHash(s *string) *PasswordTokenUpd
return ptuo 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. // SetCreatedAt sets the "created_at" field.
func (ptuo *PasswordTokenUpdateOne) SetCreatedAt(t time.Time) *PasswordTokenUpdateOne { func (ptuo *PasswordTokenUpdateOne) SetCreatedAt(t time.Time) *PasswordTokenUpdateOne {
ptuo.mutation.SetCreatedAt(t) ptuo.mutation.SetCreatedAt(t)
@ -214,12 +236,6 @@ func (ptuo *PasswordTokenUpdateOne) SetNillableCreatedAt(t *time.Time) *Password
return ptuo 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. // SetUser sets the "user" edge to the User entity.
func (ptuo *PasswordTokenUpdateOne) SetUser(u *User) *PasswordTokenUpdateOne { func (ptuo *PasswordTokenUpdateOne) SetUser(u *User) *PasswordTokenUpdateOne {
return ptuo.SetUserID(u.ID) return ptuo.SetUserID(u.ID)

View file

@ -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 is a validator for the "hash" field. It is called by the builders before save.
passwordtoken.HashValidator = passwordtokenDescHash.Validators[0].(func(string) error) passwordtoken.HashValidator = passwordtokenDescHash.Validators[0].(func(string) error)
// passwordtokenDescCreatedAt is the schema descriptor for created_at field. // 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 holds the default value on creation for the created_at field.
passwordtoken.DefaultCreatedAt = passwordtokenDescCreatedAt.Default.(func() time.Time) passwordtoken.DefaultCreatedAt = passwordtokenDescCreatedAt.Default.(func() time.Time)
userHooks := schema.User{}.Hooks() userHooks := schema.User{}.Hooks()

View file

@ -19,6 +19,7 @@ func (PasswordToken) Fields() []ent.Field {
field.String("hash"). field.String("hash").
Sensitive(). Sensitive().
NotEmpty(), NotEmpty(),
field.Int("user_id"),
field.Time("created_at"). field.Time("created_at").
Default(time.Now), Default(time.Now),
} }
@ -28,6 +29,7 @@ func (PasswordToken) Fields() []ent.Field {
func (PasswordToken) Edges() []ent.Edge { func (PasswordToken) Edges() []ent.Edge {
return []ent.Edge{ return []ent.Edge{
edge.To("user", User.Type). edge.To("user", User.Type).
Field("user_id").
Required(). Required().
Unique(), Unique(),
} }

View file

@ -35,7 +35,7 @@ const (
// It exists in this package in order to avoid circular dependency with the "passwordtoken" package. // It exists in this package in order to avoid circular dependency with the "passwordtoken" package.
OwnerInverseTable = "password_tokens" OwnerInverseTable = "password_tokens"
// OwnerColumn is the table column denoting the owner relation/edge. // 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. // Columns holds all SQL columns for user fields.

View file

@ -413,7 +413,9 @@ func (uq *UserQuery) loadOwner(ctx context.Context, query *PasswordTokenQuery, n
init(nodes[i]) 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) { query.Where(predicate.PasswordToken(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(user.OwnerColumn), fks...)) 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 return err
} }
for _, n := range neighbors { for _, n := range neighbors {
fk := n.password_token_user fk := n.UserID
if fk == nil { node, ok := nodeids[fk]
return fmt.Errorf(`foreign-key "password_token_user" is nil for node %v`, n.ID)
}
node, ok := nodeids[*fk]
if !ok { 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) assign(node, n)
} }

View file

@ -1,7 +1,6 @@
package handlers package handlers
import ( import (
"errors"
"fmt" "fmt"
"net/http" "net/http"
"strconv" "strconv"
@ -76,9 +75,9 @@ func (h *Admin) middlewareEntityLoad(n *gen.Type) echo.MiddlewareFunc {
switch { switch {
case err == nil: case err == nil:
ctx.Set(entityIDContextKey, id) ctx.Set(entityIDContextKey, id)
//ctx.Set(entityContextKey, entity) // TODO //ctx.Set(entityContextKey, entityValues)
return next(ctx) return next(ctx)
case errors.Is(err, new(ent.NotFoundError)): case ent.IsNotFound(err):
return echo.NewHTTPError(http.StatusNotFound, "entity not found") return echo.NewHTTPError(http.StatusNotFound, "entity not found")
default: default:
return echo.NewHTTPError(http.StatusInternalServerError, err) 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 { return func(ctx echo.Context) error {
list, err := h.admin.List(ctx, n.Name) list, err := h.admin.List(ctx, n.Name)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) return echo.NewHTTPError(http.StatusInternalServerError, err)
} }
return pages.AdminEntityList(ctx, pages.AdminEntityListParams{ return pages.AdminEntityList(ctx, pages.AdminEntityListParams{
@ -125,12 +124,13 @@ func (h *Admin) EntityAddSubmit(n *gen.Type) echo.HandlerFunc {
} }
} }
// //func (h *Admin) EntityEdit(n *gen.Type) echo.HandlerFunc {
//func (h *Admin) EntityEdit(p AdminEntityPlugin) echo.HandlerFunc {
// return func(ctx echo.Context) error { // 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 { //func (h *Admin) EntityEditSubmit(p AdminEntityPlugin) echo.HandlerFunc {
// return func(ctx echo.Context) error { // return func(ctx echo.Context) error {

View file

@ -65,6 +65,7 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e
for _, f := range schema.Fields { for _, f := range schema.Fields {
// TODO cardinality? // TODO cardinality?
// TODO optional fields?
switch f.Info.Type { switch f.Info.Type {
case field.TypeString: case field.TypeString:
nodes = append(nodes, InputField(InputFieldParams{ 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), Value: getValue(f.Name),
})) }))
case field.TypeTime: case field.TypeTime:
// todo make this easier
nodes = append(nodes, InputField(InputFieldParams{ nodes = append(nodes, InputField(InputFieldParams{
Name: f.Name, Name: f.Name,
InputType: "text", 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)), Help: fmt.Sprintf("Use the following format: %s", time.Now().Format(time.RFC3339)),
Value: getValue(f.Name), 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: case field.TypeBool:
// TODO // TODO
nodes = append(nodes, P(Textf("%s not supported", f.Name))) 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 { //for _, e := range schema.Edges {
if e.Inverse { // if e.Inverse {
continue // continue
} // }
nodes = append(nodes, InputField(InputFieldParams{ // nodes = append(nodes, InputField(InputFieldParams{
Name: e.Name, // Name: e.Name,
InputType: "number", // InputType: "number",
Label: label(e.Name), // Label: label(e.Name),
Value: getValue(e.Name), // TODO load does not load this // Value: getValue(e.Name), // TODO load does not load this
})) // }))
} //}
nodes = append(nodes, ControlGroup( nodes = append(nodes, ControlGroup(
FormButton("is-primary", "Submit"), 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(Text(h)))
} }
g = append(g, g = append(g,
Td(ButtonLink(r.Path(routenames.AdminEntityEdit(params.EntityType.Name), row.ID), "is-link", "Edit")), Td(
Td(ButtonLink(r.Path(routenames.AdminEntityDelete(params.EntityType.Name), row.ID), "is-danger", "Delete")), 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 return g
} }