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, "_")
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, "")

View file

@ -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 ?
},

View file

@ -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())

View file

@ -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 }}
}

View file

@ -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 {

View file

@ -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{

View file

@ -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

View file

@ -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=<sensitive>")
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(')')

View file

@ -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()

View file

@ -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))

View file

@ -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

View file

@ -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) {

View file

@ -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)

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 = 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()

View file

@ -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(),
}

View file

@ -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.

View file

@ -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)
}

View file

@ -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 {

View file

@ -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
}