feature: verify tokens
This commit is contained in:
		
							
								
								
									
										39
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| # RANO | ||||
|  | ||||
| "Reliable And Nonstop Operations" for | ||||
| Reliable And Nonstop Operations | ||||
|  | ||||
| ## Prerequisites | ||||
|  | ||||
| @@ -12,11 +12,45 @@ | ||||
| - [golang-migrate](https://github.com/golang-migrate/migrate) for manual migrations. | ||||
|   To install [follow instructions](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate) | ||||
|  | ||||
| ## Go packages | ||||
| ## Use RANO as your new project template | ||||
|  | ||||
| to use "rano" as your new project template first install `gonew` | ||||
|  | ||||
| ```bash | ||||
| go install golang.org/x/tools/cmd/gonew@latest | ||||
|  | ||||
| ``` | ||||
|  | ||||
| now run gonew in your new project’s parent directory with two arguments: first, the path to the template you wish to copy, and second, the module name of the project you are creating.\ | ||||
| For example: | ||||
|  | ||||
| ```bash | ||||
| gonew gitserver.in/patialtech/rano example.com/mynewapp | ||||
| cd ./mynewapp | ||||
| ``` | ||||
|  | ||||
| ## Project Structure | ||||
|  | ||||
| - `cmd` dir contains quick commands or scripts we need in app | ||||
| - `config` app configurations depends .env.\<environment\> file\ | ||||
|   for development we have .env.development file | ||||
| - `db` databse schema and migrations | ||||
| - `graph` is [gqlgen](https://gqlgen.com/) graph server | ||||
| - `mailer` to send emails and contains mail message templates | ||||
| - `pkg` folder is home for most of the business logic for your go app | ||||
| - `util` shared utilities | ||||
| - `web`single page web app built using [SvelteKit](https://svelte.dev/docs/kit/introduction) | ||||
|   - `assets` keep images and icons used in app init | ||||
|   - `lib` client lib | ||||
|   - `public` files of frontend app | ||||
|   - `routes` svelte app pages | ||||
|  | ||||
| ## Go packages that are in use | ||||
|  | ||||
| - [gqlgen](https://gqlgen.com/) | ||||
| - [mux](https://gitserver.in/patialtech/mux) | ||||
| - [ent. Go](https://entgo.io/docs/tutorial-setup) ORM | ||||
| - | ||||
|  | ||||
| ## Web modules | ||||
|  | ||||
| @@ -25,3 +59,4 @@ | ||||
| - [daisyui](https://daisyui.com/docs/install/) | ||||
| - [urql](https://commerce.nearform.com/open-source/urql/docs/basics/svelte/) | ||||
| - [GraphQL Codegen](https://the-guild.dev/graphql/codegen) | ||||
| - [short unique identifiers from numbers](https://sqids.org/go) | ||||
|   | ||||
							
								
								
									
										63
									
								
								cmd/server/handler/request.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								cmd/server/handler/request.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| package handler | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/util/uid" | ||||
| ) | ||||
|  | ||||
| const RequestIDKey = "RequestID" | ||||
| const RequestIPKey = "RequestIP" | ||||
| const RequestUserAgentKey = "RequestUA" | ||||
|  | ||||
| var defaultHeaders = []string{ | ||||
| 	"True-Client-IP", // Cloudflare Enterprise plan | ||||
| 	"X-Real-IP", | ||||
| 	"X-Forwarded-For", | ||||
| } | ||||
|  | ||||
| // Request middleware that will do the following: | ||||
| //   - pull session user | ||||
| //   - set requestID | ||||
| //   - set ctx RealIP and client userAgent info | ||||
| func Request() func(http.Handler) http.Handler { | ||||
| 	return func(h http.Handler) http.Handler { | ||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 			ctx := r.Context() | ||||
|  | ||||
| 			// ID | ||||
| 			requestID := r.Header.Get("X-Request-Id") | ||||
| 			if requestID == "" { | ||||
| 				requestID = uid.ULID() | ||||
| 			} | ||||
| 			ctx = context.WithValue(ctx, RequestIDKey, requestID) | ||||
|  | ||||
| 			// IP | ||||
| 			if ip := getRealIP(r, defaultHeaders); ip != "" { | ||||
| 				r.RemoteAddr = ip | ||||
| 			} | ||||
| 			ctx = context.WithValue(ctx, RequestIPKey, requestID) | ||||
|  | ||||
| 			// User Agent | ||||
| 			ctx = context.WithValue(ctx, RequestUserAgentKey, r.UserAgent()) | ||||
|  | ||||
| 			h.ServeHTTP(w, r) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func getRealIP(r *http.Request, headers []string) string { | ||||
| 	for _, header := range headers { | ||||
| 		if ip := r.Header.Get(header); ip != "" { | ||||
| 			ips := strings.Split(ip, ",") | ||||
| 			if ips[0] == "" || net.ParseIP(ips[0]) == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 			return ips[0] | ||||
| 		} | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import ( | ||||
| 
 | ||||
| 	"gitserver.in/patialtech/mux" | ||||
| 	"gitserver.in/patialtech/mux/middleware" | ||||
| 	"gitserver.in/patialtech/rano/cmd/server/handler" | ||||
| 	"gitserver.in/patialtech/rano/config" | ||||
| 	"gitserver.in/patialtech/rano/graph" | ||||
| 	"gitserver.in/patialtech/rano/util/logger" | ||||
| @@ -13,6 +14,9 @@ import ( | ||||
| 
 | ||||
| func main() { | ||||
| 	r := mux.NewRouter() | ||||
| 
 | ||||
| 	r.Use(handler.Request()) | ||||
| 
 | ||||
| 	// CORS | ||||
| 	r.Use(middleware.CORS(middleware.CORSOption{ | ||||
| 		AllowedHeaders: []string{"Content-Type"}, | ||||
							
								
								
									
										7
									
								
								config/urls.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								config/urls.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package config | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| func VerifyEmailURL(token string) string { | ||||
| 	return fmt.Sprintf("%s/account/verify-email#%s", Read().WebURL, token) | ||||
| } | ||||
							
								
								
									
										18
									
								
								db/client.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								db/client.go
									
									
									
									
									
								
							| @@ -23,9 +23,9 @@ type connector struct { | ||||
| func New() *sql.DB { | ||||
| 	databaseUrl := config.Read().DbURL | ||||
| 	db := sql.OpenDB(connector{dsn: databaseUrl}) | ||||
| 	db.SetMaxIdleConns(5) | ||||
| 	db.SetMaxOpenConns(50) | ||||
| 	db.SetConnMaxLifetime(time.Minute) | ||||
| 	db.SetMaxIdleConns(5) | ||||
| 	db.SetConnMaxLifetime(0) // Maximum amount of time a connection can be reused (0 means no limit) | ||||
| 	return db | ||||
| } | ||||
|  | ||||
| @@ -56,20 +56,28 @@ func Client() *ent.Client { | ||||
|  | ||||
| // A AuditHook is an example for audit-log hook. | ||||
| func AuditHook(next ent.Mutator) ent.Mutator { | ||||
| 	type Entity interface { | ||||
| 		GetID() (int64, error) | ||||
| 	} | ||||
| 	return ent.MutateFunc(func(ctx context.Context, m ent.Mutation) (v ent.Value, err error) { | ||||
| 		var id int64 | ||||
| 		start := time.Now() | ||||
| 		defer func() { | ||||
| 			saveAudit(ctx, m.Type(), m.Op().String(), time.Since(start), err) | ||||
| 			saveAudit(ctx, id, m.Type(), m.Op().String(), time.Since(start), err) | ||||
| 		}() | ||||
|  | ||||
| 		v, err = next.Mutate(ctx, m) | ||||
|  | ||||
| 		if en, ok := v.(Entity); ok { | ||||
| 			id, _ = en.GetID() | ||||
| 		} | ||||
| 		logger.Info("** %v", v) | ||||
| 		return | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func saveAudit(_ context.Context, entT, op string, d time.Duration, err error) { | ||||
| 	logger.Info("audit: %s %s %s %v", entT, op, d, err) | ||||
| func saveAudit(_ context.Context, entID int64, entT, op string, d time.Duration, err error) { | ||||
| 	logger.Info("audit: %d, %s, %s, %s, %v", entID, entT, op, d, err) | ||||
| 	// ml.SetCreatedAt(time.Now()) | ||||
| 	// if usr := auth.CtxUser(ctx); usr != nil { | ||||
| 	// 	ml.SetByID(usr.ID) | ||||
|   | ||||
							
								
								
									
										182
									
								
								db/ent/client.go
									
									
									
									
									
								
							
							
						
						
									
										182
									
								
								db/ent/client.go
									
									
									
									
									
								
							| @@ -21,6 +21,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/todo" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // Client is the client that holds all ent builders. | ||||
| @@ -40,6 +41,8 @@ type Client struct { | ||||
| 	User *UserClient | ||||
| 	// UserSession is the client for interacting with the UserSession builders. | ||||
| 	UserSession *UserSessionClient | ||||
| 	// VerifyToken is the client for interacting with the VerifyToken builders. | ||||
| 	VerifyToken *VerifyTokenClient | ||||
| } | ||||
|  | ||||
| // NewClient creates a new client configured with the given options. | ||||
| @@ -57,6 +60,7 @@ func (c *Client) init() { | ||||
| 	c.Todo = NewTodoClient(c.config) | ||||
| 	c.User = NewUserClient(c.config) | ||||
| 	c.UserSession = NewUserSessionClient(c.config) | ||||
| 	c.VerifyToken = NewVerifyTokenClient(c.config) | ||||
| } | ||||
|  | ||||
| type ( | ||||
| @@ -155,6 +159,7 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) { | ||||
| 		Todo:          NewTodoClient(cfg), | ||||
| 		User:          NewUserClient(cfg), | ||||
| 		UserSession:   NewUserSessionClient(cfg), | ||||
| 		VerifyToken:   NewVerifyTokenClient(cfg), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| @@ -180,6 +185,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) | ||||
| 		Todo:          NewTodoClient(cfg), | ||||
| 		User:          NewUserClient(cfg), | ||||
| 		UserSession:   NewUserSessionClient(cfg), | ||||
| 		VerifyToken:   NewVerifyTokenClient(cfg), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| @@ -209,7 +215,7 @@ func (c *Client) Close() error { | ||||
| // In order to add hooks to a specific client, call: `client.Node.Use(...)`. | ||||
| func (c *Client) Use(hooks ...Hook) { | ||||
| 	for _, n := range []interface{ Use(...Hook) }{ | ||||
| 		c.AccessControl, c.Audit, c.Role, c.Todo, c.User, c.UserSession, | ||||
| 		c.AccessControl, c.Audit, c.Role, c.Todo, c.User, c.UserSession, c.VerifyToken, | ||||
| 	} { | ||||
| 		n.Use(hooks...) | ||||
| 	} | ||||
| @@ -219,7 +225,7 @@ func (c *Client) Use(hooks ...Hook) { | ||||
| // In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`. | ||||
| func (c *Client) Intercept(interceptors ...Interceptor) { | ||||
| 	for _, n := range []interface{ Intercept(...Interceptor) }{ | ||||
| 		c.AccessControl, c.Audit, c.Role, c.Todo, c.User, c.UserSession, | ||||
| 		c.AccessControl, c.Audit, c.Role, c.Todo, c.User, c.UserSession, c.VerifyToken, | ||||
| 	} { | ||||
| 		n.Intercept(interceptors...) | ||||
| 	} | ||||
| @@ -240,6 +246,8 @@ func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) { | ||||
| 		return c.User.mutate(ctx, m) | ||||
| 	case *UserSessionMutation: | ||||
| 		return c.UserSession.mutate(ctx, m) | ||||
| 	case *VerifyTokenMutation: | ||||
| 		return c.VerifyToken.mutate(ctx, m) | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("ent: unknown mutation type %T", m) | ||||
| 	} | ||||
| @@ -933,6 +941,22 @@ func (c *UserClient) QueryAuditLogs(u *User) *AuditQuery { | ||||
| 	return query | ||||
| } | ||||
|  | ||||
| // QueryVerifyTokens queries the verify_tokens edge of a User. | ||||
| func (c *UserClient) QueryVerifyTokens(u *User) *VerifyTokenQuery { | ||||
| 	query := (&VerifyTokenClient{config: c.config}).Query() | ||||
| 	query.path = func(context.Context) (fromV *sql.Selector, _ error) { | ||||
| 		id := u.ID | ||||
| 		step := sqlgraph.NewStep( | ||||
| 			sqlgraph.From(user.Table, user.FieldID, id), | ||||
| 			sqlgraph.To(verifytoken.Table, verifytoken.FieldID), | ||||
| 			sqlgraph.Edge(sqlgraph.O2M, false, user.VerifyTokensTable, user.VerifyTokensColumn), | ||||
| 		) | ||||
| 		fromV = sqlgraph.Neighbors(u.driver.Dialect(), step) | ||||
| 		return fromV, nil | ||||
| 	} | ||||
| 	return query | ||||
| } | ||||
|  | ||||
| // Hooks returns the client hooks. | ||||
| func (c *UserClient) Hooks() []Hook { | ||||
| 	return c.hooks.User | ||||
| @@ -1107,12 +1131,162 @@ func (c *UserSessionClient) mutate(ctx context.Context, m *UserSessionMutation) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // VerifyTokenClient is a client for the VerifyToken schema. | ||||
| type VerifyTokenClient struct { | ||||
| 	config | ||||
| } | ||||
|  | ||||
| // NewVerifyTokenClient returns a client for the VerifyToken from the given config. | ||||
| func NewVerifyTokenClient(c config) *VerifyTokenClient { | ||||
| 	return &VerifyTokenClient{config: c} | ||||
| } | ||||
|  | ||||
| // Use adds a list of mutation hooks to the hooks stack. | ||||
| // A call to `Use(f, g, h)` equals to `verifytoken.Hooks(f(g(h())))`. | ||||
| func (c *VerifyTokenClient) Use(hooks ...Hook) { | ||||
| 	c.hooks.VerifyToken = append(c.hooks.VerifyToken, hooks...) | ||||
| } | ||||
|  | ||||
| // Intercept adds a list of query interceptors to the interceptors stack. | ||||
| // A call to `Intercept(f, g, h)` equals to `verifytoken.Intercept(f(g(h())))`. | ||||
| func (c *VerifyTokenClient) Intercept(interceptors ...Interceptor) { | ||||
| 	c.inters.VerifyToken = append(c.inters.VerifyToken, interceptors...) | ||||
| } | ||||
|  | ||||
| // Create returns a builder for creating a VerifyToken entity. | ||||
| func (c *VerifyTokenClient) Create() *VerifyTokenCreate { | ||||
| 	mutation := newVerifyTokenMutation(c.config, OpCreate) | ||||
| 	return &VerifyTokenCreate{config: c.config, hooks: c.Hooks(), mutation: mutation} | ||||
| } | ||||
|  | ||||
| // CreateBulk returns a builder for creating a bulk of VerifyToken entities. | ||||
| func (c *VerifyTokenClient) CreateBulk(builders ...*VerifyTokenCreate) *VerifyTokenCreateBulk { | ||||
| 	return &VerifyTokenCreateBulk{config: c.config, builders: builders} | ||||
| } | ||||
|  | ||||
| // MapCreateBulk creates a bulk creation builder from the given slice. For each item in the slice, the function creates | ||||
| // a builder and applies setFunc on it. | ||||
| func (c *VerifyTokenClient) MapCreateBulk(slice any, setFunc func(*VerifyTokenCreate, int)) *VerifyTokenCreateBulk { | ||||
| 	rv := reflect.ValueOf(slice) | ||||
| 	if rv.Kind() != reflect.Slice { | ||||
| 		return &VerifyTokenCreateBulk{err: fmt.Errorf("calling to VerifyTokenClient.MapCreateBulk with wrong type %T, need slice", slice)} | ||||
| 	} | ||||
| 	builders := make([]*VerifyTokenCreate, rv.Len()) | ||||
| 	for i := 0; i < rv.Len(); i++ { | ||||
| 		builders[i] = c.Create() | ||||
| 		setFunc(builders[i], i) | ||||
| 	} | ||||
| 	return &VerifyTokenCreateBulk{config: c.config, builders: builders} | ||||
| } | ||||
|  | ||||
| // Update returns an update builder for VerifyToken. | ||||
| func (c *VerifyTokenClient) Update() *VerifyTokenUpdate { | ||||
| 	mutation := newVerifyTokenMutation(c.config, OpUpdate) | ||||
| 	return &VerifyTokenUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation} | ||||
| } | ||||
|  | ||||
| // UpdateOne returns an update builder for the given entity. | ||||
| func (c *VerifyTokenClient) UpdateOne(vt *VerifyToken) *VerifyTokenUpdateOne { | ||||
| 	mutation := newVerifyTokenMutation(c.config, OpUpdateOne, withVerifyToken(vt)) | ||||
| 	return &VerifyTokenUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation} | ||||
| } | ||||
|  | ||||
| // UpdateOneID returns an update builder for the given id. | ||||
| func (c *VerifyTokenClient) UpdateOneID(id int64) *VerifyTokenUpdateOne { | ||||
| 	mutation := newVerifyTokenMutation(c.config, OpUpdateOne, withVerifyTokenID(id)) | ||||
| 	return &VerifyTokenUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation} | ||||
| } | ||||
|  | ||||
| // Delete returns a delete builder for VerifyToken. | ||||
| func (c *VerifyTokenClient) Delete() *VerifyTokenDelete { | ||||
| 	mutation := newVerifyTokenMutation(c.config, OpDelete) | ||||
| 	return &VerifyTokenDelete{config: c.config, hooks: c.Hooks(), mutation: mutation} | ||||
| } | ||||
|  | ||||
| // DeleteOne returns a builder for deleting the given entity. | ||||
| func (c *VerifyTokenClient) DeleteOne(vt *VerifyToken) *VerifyTokenDeleteOne { | ||||
| 	return c.DeleteOneID(vt.ID) | ||||
| } | ||||
|  | ||||
| // DeleteOneID returns a builder for deleting the given entity by its id. | ||||
| func (c *VerifyTokenClient) DeleteOneID(id int64) *VerifyTokenDeleteOne { | ||||
| 	builder := c.Delete().Where(verifytoken.ID(id)) | ||||
| 	builder.mutation.id = &id | ||||
| 	builder.mutation.op = OpDeleteOne | ||||
| 	return &VerifyTokenDeleteOne{builder} | ||||
| } | ||||
|  | ||||
| // Query returns a query builder for VerifyToken. | ||||
| func (c *VerifyTokenClient) Query() *VerifyTokenQuery { | ||||
| 	return &VerifyTokenQuery{ | ||||
| 		config: c.config, | ||||
| 		ctx:    &QueryContext{Type: TypeVerifyToken}, | ||||
| 		inters: c.Interceptors(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Get returns a VerifyToken entity by its id. | ||||
| func (c *VerifyTokenClient) Get(ctx context.Context, id int64) (*VerifyToken, error) { | ||||
| 	return c.Query().Where(verifytoken.ID(id)).Only(ctx) | ||||
| } | ||||
|  | ||||
| // GetX is like Get, but panics if an error occurs. | ||||
| func (c *VerifyTokenClient) GetX(ctx context.Context, id int64) *VerifyToken { | ||||
| 	obj, err := c.Get(ctx, id) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return obj | ||||
| } | ||||
|  | ||||
| // QueryUser queries the user edge of a VerifyToken. | ||||
| func (c *VerifyTokenClient) QueryUser(vt *VerifyToken) *UserQuery { | ||||
| 	query := (&UserClient{config: c.config}).Query() | ||||
| 	query.path = func(context.Context) (fromV *sql.Selector, _ error) { | ||||
| 		id := vt.ID | ||||
| 		step := sqlgraph.NewStep( | ||||
| 			sqlgraph.From(verifytoken.Table, verifytoken.FieldID, id), | ||||
| 			sqlgraph.To(user.Table, user.FieldID), | ||||
| 			sqlgraph.Edge(sqlgraph.M2O, true, verifytoken.UserTable, verifytoken.UserColumn), | ||||
| 		) | ||||
| 		fromV = sqlgraph.Neighbors(vt.driver.Dialect(), step) | ||||
| 		return fromV, nil | ||||
| 	} | ||||
| 	return query | ||||
| } | ||||
|  | ||||
| // Hooks returns the client hooks. | ||||
| func (c *VerifyTokenClient) Hooks() []Hook { | ||||
| 	return c.hooks.VerifyToken | ||||
| } | ||||
|  | ||||
| // Interceptors returns the client interceptors. | ||||
| func (c *VerifyTokenClient) Interceptors() []Interceptor { | ||||
| 	return c.inters.VerifyToken | ||||
| } | ||||
|  | ||||
| func (c *VerifyTokenClient) mutate(ctx context.Context, m *VerifyTokenMutation) (Value, error) { | ||||
| 	switch m.Op() { | ||||
| 	case OpCreate: | ||||
| 		return (&VerifyTokenCreate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) | ||||
| 	case OpUpdate: | ||||
| 		return (&VerifyTokenUpdate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) | ||||
| 	case OpUpdateOne: | ||||
| 		return (&VerifyTokenUpdateOne{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx) | ||||
| 	case OpDelete, OpDeleteOne: | ||||
| 		return (&VerifyTokenDelete{config: c.config, hooks: c.Hooks(), mutation: m}).Exec(ctx) | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("ent: unknown VerifyToken mutation op: %q", m.Op()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // hooks and interceptors per client, for fast access. | ||||
| type ( | ||||
| 	hooks struct { | ||||
| 		AccessControl, Audit, Role, Todo, User, UserSession []ent.Hook | ||||
| 		AccessControl, Audit, Role, Todo, User, UserSession, VerifyToken []ent.Hook | ||||
| 	} | ||||
| 	inters struct { | ||||
| 		AccessControl, Audit, Role, Todo, User, UserSession []ent.Interceptor | ||||
| 		AccessControl, Audit, Role, Todo, User, UserSession, | ||||
| 		VerifyToken []ent.Interceptor | ||||
| 	} | ||||
| ) | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/todo" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // ent aliases to avoid import conflicts in user's code. | ||||
| @@ -84,6 +85,7 @@ func checkColumn(table, column string) error { | ||||
| 			todo.Table:          todo.ValidColumn, | ||||
| 			user.Table:          user.ValidColumn, | ||||
| 			usersession.Table:   usersession.ValidColumn, | ||||
| 			verifytoken.Table:   verifytoken.ValidColumn, | ||||
| 		}) | ||||
| 	}) | ||||
| 	return columnCheck(table, column) | ||||
|   | ||||
| @@ -81,6 +81,18 @@ func (f UserSessionFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, | ||||
| 	return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.UserSessionMutation", m) | ||||
| } | ||||
|  | ||||
| // The VerifyTokenFunc type is an adapter to allow the use of ordinary | ||||
| // function as VerifyToken mutator. | ||||
| type VerifyTokenFunc func(context.Context, *ent.VerifyTokenMutation) (ent.Value, error) | ||||
|  | ||||
| // Mutate calls f(ctx, m). | ||||
| func (f VerifyTokenFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) { | ||||
| 	if mv, ok := m.(*ent.VerifyTokenMutation); ok { | ||||
| 		return f(ctx, mv) | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.VerifyTokenMutation", m) | ||||
| } | ||||
|  | ||||
| // Condition is a hook condition function. | ||||
| type Condition func(context.Context, ent.Mutation) bool | ||||
|  | ||||
|   | ||||
| @@ -101,8 +101,8 @@ var ( | ||||
| 		{Name: "email_verified", Type: field.TypeBool, Default: false}, | ||||
| 		{Name: "phone", Type: field.TypeString, Nullable: true, Size: 20}, | ||||
| 		{Name: "phone_verified", Type: field.TypeBool, Default: false}, | ||||
| 		{Name: "pwd_salt", Type: field.TypeString, Size: 250}, | ||||
| 		{Name: "pwd_hash", Type: field.TypeString, Size: 250}, | ||||
| 		{Name: "pwd_salt", Type: field.TypeString, Size: 100}, | ||||
| 		{Name: "pwd_hash", Type: field.TypeString, Size: 100}, | ||||
| 		{Name: "login_failed_count", Type: field.TypeUint8, Nullable: true, Default: 0}, | ||||
| 		{Name: "login_attempt_on", Type: field.TypeTime, Nullable: true}, | ||||
| 		{Name: "login_locked_until", Type: field.TypeTime, Nullable: true}, | ||||
| @@ -186,6 +186,29 @@ var ( | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	// VerifyTokensColumns holds the columns for the "verify_tokens" table. | ||||
| 	VerifyTokensColumns = []*schema.Column{ | ||||
| 		{Name: "id", Type: field.TypeInt64, Increment: true}, | ||||
| 		{Name: "created_at", Type: field.TypeTime}, | ||||
| 		{Name: "expires_at", Type: field.TypeTime}, | ||||
| 		{Name: "token", Type: field.TypeString, Unique: true, Size: 50}, | ||||
| 		{Name: "purpose", Type: field.TypeString, Nullable: true, Size: 50}, | ||||
| 		{Name: "user_id", Type: field.TypeInt64, Nullable: true}, | ||||
| 	} | ||||
| 	// VerifyTokensTable holds the schema information for the "verify_tokens" table. | ||||
| 	VerifyTokensTable = &schema.Table{ | ||||
| 		Name:       "verify_tokens", | ||||
| 		Columns:    VerifyTokensColumns, | ||||
| 		PrimaryKey: []*schema.Column{VerifyTokensColumns[0]}, | ||||
| 		ForeignKeys: []*schema.ForeignKey{ | ||||
| 			{ | ||||
| 				Symbol:     "verify_tokens_users_verify_tokens", | ||||
| 				Columns:    []*schema.Column{VerifyTokensColumns[5]}, | ||||
| 				RefColumns: []*schema.Column{UsersColumns[0]}, | ||||
| 				OnDelete:   schema.SetNull, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	// Tables holds all the tables in the schema. | ||||
| 	Tables = []*schema.Table{ | ||||
| 		AccessControlsTable, | ||||
| @@ -194,10 +217,12 @@ var ( | ||||
| 		TodosTable, | ||||
| 		UsersTable, | ||||
| 		UserSessionsTable, | ||||
| 		VerifyTokensTable, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	AuditsTable.ForeignKeys[0].RefTable = UsersTable | ||||
| 	UserSessionsTable.ForeignKeys[0].RefTable = UsersTable | ||||
| 	VerifyTokensTable.ForeignKeys[0].RefTable = UsersTable | ||||
| } | ||||
|   | ||||
| @@ -17,6 +17,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/role" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| @@ -34,6 +35,7 @@ const ( | ||||
| 	TypeTodo          = "Todo" | ||||
| 	TypeUser          = "User" | ||||
| 	TypeUserSession   = "UserSession" | ||||
| 	TypeVerifyToken   = "VerifyToken" | ||||
| ) | ||||
|  | ||||
| // AccessControlMutation represents an operation that mutates the AccessControl nodes in the graph. | ||||
| @@ -2225,6 +2227,9 @@ type UserMutation struct { | ||||
| 	audit_logs            map[int64]struct{} | ||||
| 	removedaudit_logs     map[int64]struct{} | ||||
| 	clearedaudit_logs     bool | ||||
| 	verify_tokens         map[int64]struct{} | ||||
| 	removedverify_tokens  map[int64]struct{} | ||||
| 	clearedverify_tokens  bool | ||||
| 	done                  bool | ||||
| 	oldValue              func(context.Context) (*User, error) | ||||
| 	predicates            []predicate.User | ||||
| @@ -3055,6 +3060,60 @@ func (m *UserMutation) ResetAuditLogs() { | ||||
| 	m.removedaudit_logs = nil | ||||
| } | ||||
|  | ||||
| // AddVerifyTokenIDs adds the "verify_tokens" edge to the VerifyToken entity by ids. | ||||
| func (m *UserMutation) AddVerifyTokenIDs(ids ...int64) { | ||||
| 	if m.verify_tokens == nil { | ||||
| 		m.verify_tokens = make(map[int64]struct{}) | ||||
| 	} | ||||
| 	for i := range ids { | ||||
| 		m.verify_tokens[ids[i]] = struct{}{} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ClearVerifyTokens clears the "verify_tokens" edge to the VerifyToken entity. | ||||
| func (m *UserMutation) ClearVerifyTokens() { | ||||
| 	m.clearedverify_tokens = true | ||||
| } | ||||
|  | ||||
| // VerifyTokensCleared reports if the "verify_tokens" edge to the VerifyToken entity was cleared. | ||||
| func (m *UserMutation) VerifyTokensCleared() bool { | ||||
| 	return m.clearedverify_tokens | ||||
| } | ||||
|  | ||||
| // RemoveVerifyTokenIDs removes the "verify_tokens" edge to the VerifyToken entity by IDs. | ||||
| func (m *UserMutation) RemoveVerifyTokenIDs(ids ...int64) { | ||||
| 	if m.removedverify_tokens == nil { | ||||
| 		m.removedverify_tokens = make(map[int64]struct{}) | ||||
| 	} | ||||
| 	for i := range ids { | ||||
| 		delete(m.verify_tokens, ids[i]) | ||||
| 		m.removedverify_tokens[ids[i]] = struct{}{} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // RemovedVerifyTokens returns the removed IDs of the "verify_tokens" edge to the VerifyToken entity. | ||||
| func (m *UserMutation) RemovedVerifyTokensIDs() (ids []int64) { | ||||
| 	for id := range m.removedverify_tokens { | ||||
| 		ids = append(ids, id) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // VerifyTokensIDs returns the "verify_tokens" edge IDs in the mutation. | ||||
| func (m *UserMutation) VerifyTokensIDs() (ids []int64) { | ||||
| 	for id := range m.verify_tokens { | ||||
| 		ids = append(ids, id) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // ResetVerifyTokens resets all changes to the "verify_tokens" edge. | ||||
| func (m *UserMutation) ResetVerifyTokens() { | ||||
| 	m.verify_tokens = nil | ||||
| 	m.clearedverify_tokens = false | ||||
| 	m.removedverify_tokens = nil | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the UserMutation builder. | ||||
| func (m *UserMutation) Where(ps ...predicate.User) { | ||||
| 	m.predicates = append(m.predicates, ps...) | ||||
| @@ -3468,13 +3527,16 @@ func (m *UserMutation) ResetField(name string) error { | ||||
|  | ||||
| // AddedEdges returns all edge names that were set/added in this mutation. | ||||
| func (m *UserMutation) AddedEdges() []string { | ||||
| 	edges := make([]string, 0, 2) | ||||
| 	edges := make([]string, 0, 3) | ||||
| 	if m.sessions != nil { | ||||
| 		edges = append(edges, user.EdgeSessions) | ||||
| 	} | ||||
| 	if m.audit_logs != nil { | ||||
| 		edges = append(edges, user.EdgeAuditLogs) | ||||
| 	} | ||||
| 	if m.verify_tokens != nil { | ||||
| 		edges = append(edges, user.EdgeVerifyTokens) | ||||
| 	} | ||||
| 	return edges | ||||
| } | ||||
|  | ||||
| @@ -3494,19 +3556,28 @@ func (m *UserMutation) AddedIDs(name string) []ent.Value { | ||||
| 			ids = append(ids, id) | ||||
| 		} | ||||
| 		return ids | ||||
| 	case user.EdgeVerifyTokens: | ||||
| 		ids := make([]ent.Value, 0, len(m.verify_tokens)) | ||||
| 		for id := range m.verify_tokens { | ||||
| 			ids = append(ids, id) | ||||
| 		} | ||||
| 		return ids | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // RemovedEdges returns all edge names that were removed in this mutation. | ||||
| func (m *UserMutation) RemovedEdges() []string { | ||||
| 	edges := make([]string, 0, 2) | ||||
| 	edges := make([]string, 0, 3) | ||||
| 	if m.removedsessions != nil { | ||||
| 		edges = append(edges, user.EdgeSessions) | ||||
| 	} | ||||
| 	if m.removedaudit_logs != nil { | ||||
| 		edges = append(edges, user.EdgeAuditLogs) | ||||
| 	} | ||||
| 	if m.removedverify_tokens != nil { | ||||
| 		edges = append(edges, user.EdgeVerifyTokens) | ||||
| 	} | ||||
| 	return edges | ||||
| } | ||||
|  | ||||
| @@ -3526,19 +3597,28 @@ func (m *UserMutation) RemovedIDs(name string) []ent.Value { | ||||
| 			ids = append(ids, id) | ||||
| 		} | ||||
| 		return ids | ||||
| 	case user.EdgeVerifyTokens: | ||||
| 		ids := make([]ent.Value, 0, len(m.removedverify_tokens)) | ||||
| 		for id := range m.removedverify_tokens { | ||||
| 			ids = append(ids, id) | ||||
| 		} | ||||
| 		return ids | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ClearedEdges returns all edge names that were cleared in this mutation. | ||||
| func (m *UserMutation) ClearedEdges() []string { | ||||
| 	edges := make([]string, 0, 2) | ||||
| 	edges := make([]string, 0, 3) | ||||
| 	if m.clearedsessions { | ||||
| 		edges = append(edges, user.EdgeSessions) | ||||
| 	} | ||||
| 	if m.clearedaudit_logs { | ||||
| 		edges = append(edges, user.EdgeAuditLogs) | ||||
| 	} | ||||
| 	if m.clearedverify_tokens { | ||||
| 		edges = append(edges, user.EdgeVerifyTokens) | ||||
| 	} | ||||
| 	return edges | ||||
| } | ||||
|  | ||||
| @@ -3550,6 +3630,8 @@ func (m *UserMutation) EdgeCleared(name string) bool { | ||||
| 		return m.clearedsessions | ||||
| 	case user.EdgeAuditLogs: | ||||
| 		return m.clearedaudit_logs | ||||
| 	case user.EdgeVerifyTokens: | ||||
| 		return m.clearedverify_tokens | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| @@ -3572,6 +3654,9 @@ func (m *UserMutation) ResetEdge(name string) error { | ||||
| 	case user.EdgeAuditLogs: | ||||
| 		m.ResetAuditLogs() | ||||
| 		return nil | ||||
| 	case user.EdgeVerifyTokens: | ||||
| 		m.ResetVerifyTokens() | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown User edge %s", name) | ||||
| } | ||||
| @@ -4212,3 +4297,586 @@ func (m *UserSessionMutation) ResetEdge(name string) error { | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown UserSession edge %s", name) | ||||
| } | ||||
|  | ||||
| // VerifyTokenMutation represents an operation that mutates the VerifyToken nodes in the graph. | ||||
| type VerifyTokenMutation struct { | ||||
| 	config | ||||
| 	op            Op | ||||
| 	typ           string | ||||
| 	id            *int64 | ||||
| 	created_at    *time.Time | ||||
| 	expires_at    *time.Time | ||||
| 	token         *string | ||||
| 	purpose       *string | ||||
| 	clearedFields map[string]struct{} | ||||
| 	user          *int64 | ||||
| 	cleareduser   bool | ||||
| 	done          bool | ||||
| 	oldValue      func(context.Context) (*VerifyToken, error) | ||||
| 	predicates    []predicate.VerifyToken | ||||
| } | ||||
|  | ||||
| var _ ent.Mutation = (*VerifyTokenMutation)(nil) | ||||
|  | ||||
| // verifytokenOption allows management of the mutation configuration using functional options. | ||||
| type verifytokenOption func(*VerifyTokenMutation) | ||||
|  | ||||
| // newVerifyTokenMutation creates new mutation for the VerifyToken entity. | ||||
| func newVerifyTokenMutation(c config, op Op, opts ...verifytokenOption) *VerifyTokenMutation { | ||||
| 	m := &VerifyTokenMutation{ | ||||
| 		config:        c, | ||||
| 		op:            op, | ||||
| 		typ:           TypeVerifyToken, | ||||
| 		clearedFields: make(map[string]struct{}), | ||||
| 	} | ||||
| 	for _, opt := range opts { | ||||
| 		opt(m) | ||||
| 	} | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| // withVerifyTokenID sets the ID field of the mutation. | ||||
| func withVerifyTokenID(id int64) verifytokenOption { | ||||
| 	return func(m *VerifyTokenMutation) { | ||||
| 		var ( | ||||
| 			err   error | ||||
| 			once  sync.Once | ||||
| 			value *VerifyToken | ||||
| 		) | ||||
| 		m.oldValue = func(ctx context.Context) (*VerifyToken, error) { | ||||
| 			once.Do(func() { | ||||
| 				if m.done { | ||||
| 					err = errors.New("querying old values post mutation is not allowed") | ||||
| 				} else { | ||||
| 					value, err = m.Client().VerifyToken.Get(ctx, id) | ||||
| 				} | ||||
| 			}) | ||||
| 			return value, err | ||||
| 		} | ||||
| 		m.id = &id | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // withVerifyToken sets the old VerifyToken of the mutation. | ||||
| func withVerifyToken(node *VerifyToken) verifytokenOption { | ||||
| 	return func(m *VerifyTokenMutation) { | ||||
| 		m.oldValue = func(context.Context) (*VerifyToken, error) { | ||||
| 			return node, nil | ||||
| 		} | ||||
| 		m.id = &node.ID | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Client returns a new `ent.Client` from the mutation. If the mutation was | ||||
| // executed in a transaction (ent.Tx), a transactional client is returned. | ||||
| func (m VerifyTokenMutation) Client() *Client { | ||||
| 	client := &Client{config: m.config} | ||||
| 	client.init() | ||||
| 	return client | ||||
| } | ||||
|  | ||||
| // Tx returns an `ent.Tx` for mutations that were executed in transactions; | ||||
| // it returns an error otherwise. | ||||
| func (m VerifyTokenMutation) Tx() (*Tx, error) { | ||||
| 	if _, ok := m.driver.(*txDriver); !ok { | ||||
| 		return nil, errors.New("ent: mutation is not running in a transaction") | ||||
| 	} | ||||
| 	tx := &Tx{config: m.config} | ||||
| 	tx.init() | ||||
| 	return tx, nil | ||||
| } | ||||
|  | ||||
| // SetID sets the value of the id field. Note that this | ||||
| // operation is only accepted on creation of VerifyToken entities. | ||||
| func (m *VerifyTokenMutation) SetID(id int64) { | ||||
| 	m.id = &id | ||||
| } | ||||
|  | ||||
| // ID returns the ID value in the mutation. Note that the ID is only available | ||||
| // if it was provided to the builder or after it was returned from the database. | ||||
| func (m *VerifyTokenMutation) ID() (id int64, exists bool) { | ||||
| 	if m.id == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return *m.id, true | ||||
| } | ||||
|  | ||||
| // IDs queries the database and returns the entity ids that match the mutation's predicate. | ||||
| // That means, if the mutation is applied within a transaction with an isolation level such | ||||
| // as sql.LevelSerializable, the returned ids match the ids of the rows that will be updated | ||||
| // or updated by the mutation. | ||||
| func (m *VerifyTokenMutation) IDs(ctx context.Context) ([]int64, error) { | ||||
| 	switch { | ||||
| 	case m.op.Is(OpUpdateOne | OpDeleteOne): | ||||
| 		id, exists := m.ID() | ||||
| 		if exists { | ||||
| 			return []int64{id}, nil | ||||
| 		} | ||||
| 		fallthrough | ||||
| 	case m.op.Is(OpUpdate | OpDelete): | ||||
| 		return m.Client().VerifyToken.Query().Where(m.predicates...).IDs(ctx) | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("IDs is not allowed on %s operations", m.op) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // SetCreatedAt sets the "created_at" field. | ||||
| func (m *VerifyTokenMutation) SetCreatedAt(t time.Time) { | ||||
| 	m.created_at = &t | ||||
| } | ||||
|  | ||||
| // CreatedAt returns the value of the "created_at" field in the mutation. | ||||
| func (m *VerifyTokenMutation) CreatedAt() (r time.Time, exists bool) { | ||||
| 	v := m.created_at | ||||
| 	if v == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return *v, true | ||||
| } | ||||
|  | ||||
| // OldCreatedAt returns the old "created_at" field's value of the VerifyToken entity. | ||||
| // If the VerifyToken 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 *VerifyTokenMutation) OldCreatedAt(ctx context.Context) (v time.Time, err error) { | ||||
| 	if !m.op.Is(OpUpdateOne) { | ||||
| 		return v, errors.New("OldCreatedAt is only allowed on UpdateOne operations") | ||||
| 	} | ||||
| 	if m.id == nil || m.oldValue == nil { | ||||
| 		return v, errors.New("OldCreatedAt requires an ID field in the mutation") | ||||
| 	} | ||||
| 	oldValue, err := m.oldValue(ctx) | ||||
| 	if err != nil { | ||||
| 		return v, fmt.Errorf("querying old value for OldCreatedAt: %w", err) | ||||
| 	} | ||||
| 	return oldValue.CreatedAt, nil | ||||
| } | ||||
|  | ||||
| // ResetCreatedAt resets all changes to the "created_at" field. | ||||
| func (m *VerifyTokenMutation) ResetCreatedAt() { | ||||
| 	m.created_at = nil | ||||
| } | ||||
|  | ||||
| // SetExpiresAt sets the "expires_at" field. | ||||
| func (m *VerifyTokenMutation) SetExpiresAt(t time.Time) { | ||||
| 	m.expires_at = &t | ||||
| } | ||||
|  | ||||
| // ExpiresAt returns the value of the "expires_at" field in the mutation. | ||||
| func (m *VerifyTokenMutation) ExpiresAt() (r time.Time, exists bool) { | ||||
| 	v := m.expires_at | ||||
| 	if v == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return *v, true | ||||
| } | ||||
|  | ||||
| // OldExpiresAt returns the old "expires_at" field's value of the VerifyToken entity. | ||||
| // If the VerifyToken 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 *VerifyTokenMutation) OldExpiresAt(ctx context.Context) (v time.Time, err error) { | ||||
| 	if !m.op.Is(OpUpdateOne) { | ||||
| 		return v, errors.New("OldExpiresAt is only allowed on UpdateOne operations") | ||||
| 	} | ||||
| 	if m.id == nil || m.oldValue == nil { | ||||
| 		return v, errors.New("OldExpiresAt requires an ID field in the mutation") | ||||
| 	} | ||||
| 	oldValue, err := m.oldValue(ctx) | ||||
| 	if err != nil { | ||||
| 		return v, fmt.Errorf("querying old value for OldExpiresAt: %w", err) | ||||
| 	} | ||||
| 	return oldValue.ExpiresAt, nil | ||||
| } | ||||
|  | ||||
| // ResetExpiresAt resets all changes to the "expires_at" field. | ||||
| func (m *VerifyTokenMutation) ResetExpiresAt() { | ||||
| 	m.expires_at = nil | ||||
| } | ||||
|  | ||||
| // SetToken sets the "token" field. | ||||
| func (m *VerifyTokenMutation) SetToken(s string) { | ||||
| 	m.token = &s | ||||
| } | ||||
|  | ||||
| // Token returns the value of the "token" field in the mutation. | ||||
| func (m *VerifyTokenMutation) Token() (r string, exists bool) { | ||||
| 	v := m.token | ||||
| 	if v == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return *v, true | ||||
| } | ||||
|  | ||||
| // OldToken returns the old "token" field's value of the VerifyToken entity. | ||||
| // If the VerifyToken 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 *VerifyTokenMutation) OldToken(ctx context.Context) (v string, err error) { | ||||
| 	if !m.op.Is(OpUpdateOne) { | ||||
| 		return v, errors.New("OldToken is only allowed on UpdateOne operations") | ||||
| 	} | ||||
| 	if m.id == nil || m.oldValue == nil { | ||||
| 		return v, errors.New("OldToken requires an ID field in the mutation") | ||||
| 	} | ||||
| 	oldValue, err := m.oldValue(ctx) | ||||
| 	if err != nil { | ||||
| 		return v, fmt.Errorf("querying old value for OldToken: %w", err) | ||||
| 	} | ||||
| 	return oldValue.Token, nil | ||||
| } | ||||
|  | ||||
| // ResetToken resets all changes to the "token" field. | ||||
| func (m *VerifyTokenMutation) ResetToken() { | ||||
| 	m.token = nil | ||||
| } | ||||
|  | ||||
| // SetPurpose sets the "purpose" field. | ||||
| func (m *VerifyTokenMutation) SetPurpose(s string) { | ||||
| 	m.purpose = &s | ||||
| } | ||||
|  | ||||
| // Purpose returns the value of the "purpose" field in the mutation. | ||||
| func (m *VerifyTokenMutation) Purpose() (r string, exists bool) { | ||||
| 	v := m.purpose | ||||
| 	if v == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return *v, true | ||||
| } | ||||
|  | ||||
| // OldPurpose returns the old "purpose" field's value of the VerifyToken entity. | ||||
| // If the VerifyToken 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 *VerifyTokenMutation) OldPurpose(ctx context.Context) (v string, err error) { | ||||
| 	if !m.op.Is(OpUpdateOne) { | ||||
| 		return v, errors.New("OldPurpose is only allowed on UpdateOne operations") | ||||
| 	} | ||||
| 	if m.id == nil || m.oldValue == nil { | ||||
| 		return v, errors.New("OldPurpose requires an ID field in the mutation") | ||||
| 	} | ||||
| 	oldValue, err := m.oldValue(ctx) | ||||
| 	if err != nil { | ||||
| 		return v, fmt.Errorf("querying old value for OldPurpose: %w", err) | ||||
| 	} | ||||
| 	return oldValue.Purpose, nil | ||||
| } | ||||
|  | ||||
| // ClearPurpose clears the value of the "purpose" field. | ||||
| func (m *VerifyTokenMutation) ClearPurpose() { | ||||
| 	m.purpose = nil | ||||
| 	m.clearedFields[verifytoken.FieldPurpose] = struct{}{} | ||||
| } | ||||
|  | ||||
| // PurposeCleared returns if the "purpose" field was cleared in this mutation. | ||||
| func (m *VerifyTokenMutation) PurposeCleared() bool { | ||||
| 	_, ok := m.clearedFields[verifytoken.FieldPurpose] | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| // ResetPurpose resets all changes to the "purpose" field. | ||||
| func (m *VerifyTokenMutation) ResetPurpose() { | ||||
| 	m.purpose = nil | ||||
| 	delete(m.clearedFields, verifytoken.FieldPurpose) | ||||
| } | ||||
|  | ||||
| // SetUserID sets the "user" edge to the User entity by id. | ||||
| func (m *VerifyTokenMutation) SetUserID(id int64) { | ||||
| 	m.user = &id | ||||
| } | ||||
|  | ||||
| // ClearUser clears the "user" edge to the User entity. | ||||
| func (m *VerifyTokenMutation) ClearUser() { | ||||
| 	m.cleareduser = true | ||||
| } | ||||
|  | ||||
| // UserCleared reports if the "user" edge to the User entity was cleared. | ||||
| func (m *VerifyTokenMutation) UserCleared() bool { | ||||
| 	return m.cleareduser | ||||
| } | ||||
|  | ||||
| // UserID returns the "user" edge ID in the mutation. | ||||
| func (m *VerifyTokenMutation) UserID() (id int64, 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. | ||||
| func (m *VerifyTokenMutation) UserIDs() (ids []int64) { | ||||
| 	if id := m.user; id != nil { | ||||
| 		ids = append(ids, *id) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // ResetUser resets all changes to the "user" edge. | ||||
| func (m *VerifyTokenMutation) ResetUser() { | ||||
| 	m.user = nil | ||||
| 	m.cleareduser = false | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the VerifyTokenMutation builder. | ||||
| func (m *VerifyTokenMutation) Where(ps ...predicate.VerifyToken) { | ||||
| 	m.predicates = append(m.predicates, ps...) | ||||
| } | ||||
|  | ||||
| // WhereP appends storage-level predicates to the VerifyTokenMutation builder. Using this method, | ||||
| // users can use type-assertion to append predicates that do not depend on any generated package. | ||||
| func (m *VerifyTokenMutation) WhereP(ps ...func(*sql.Selector)) { | ||||
| 	p := make([]predicate.VerifyToken, len(ps)) | ||||
| 	for i := range ps { | ||||
| 		p[i] = ps[i] | ||||
| 	} | ||||
| 	m.Where(p...) | ||||
| } | ||||
|  | ||||
| // Op returns the operation name. | ||||
| func (m *VerifyTokenMutation) Op() Op { | ||||
| 	return m.op | ||||
| } | ||||
|  | ||||
| // SetOp allows setting the mutation operation. | ||||
| func (m *VerifyTokenMutation) SetOp(op Op) { | ||||
| 	m.op = op | ||||
| } | ||||
|  | ||||
| // Type returns the node type of this mutation (VerifyToken). | ||||
| func (m *VerifyTokenMutation) Type() string { | ||||
| 	return m.typ | ||||
| } | ||||
|  | ||||
| // Fields returns all fields that were changed during this mutation. Note that in | ||||
| // order to get all numeric fields that were incremented/decremented, call | ||||
| // AddedFields(). | ||||
| func (m *VerifyTokenMutation) Fields() []string { | ||||
| 	fields := make([]string, 0, 4) | ||||
| 	if m.created_at != nil { | ||||
| 		fields = append(fields, verifytoken.FieldCreatedAt) | ||||
| 	} | ||||
| 	if m.expires_at != nil { | ||||
| 		fields = append(fields, verifytoken.FieldExpiresAt) | ||||
| 	} | ||||
| 	if m.token != nil { | ||||
| 		fields = append(fields, verifytoken.FieldToken) | ||||
| 	} | ||||
| 	if m.purpose != nil { | ||||
| 		fields = append(fields, verifytoken.FieldPurpose) | ||||
| 	} | ||||
| 	return fields | ||||
| } | ||||
|  | ||||
| // Field returns the value of 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 *VerifyTokenMutation) Field(name string) (ent.Value, bool) { | ||||
| 	switch name { | ||||
| 	case verifytoken.FieldCreatedAt: | ||||
| 		return m.CreatedAt() | ||||
| 	case verifytoken.FieldExpiresAt: | ||||
| 		return m.ExpiresAt() | ||||
| 	case verifytoken.FieldToken: | ||||
| 		return m.Token() | ||||
| 	case verifytoken.FieldPurpose: | ||||
| 		return m.Purpose() | ||||
| 	} | ||||
| 	return nil, false | ||||
| } | ||||
|  | ||||
| // OldField returns the old value of the field from the database. An error is | ||||
| // returned if the mutation operation is not UpdateOne, or the query to the | ||||
| // database failed. | ||||
| func (m *VerifyTokenMutation) OldField(ctx context.Context, name string) (ent.Value, error) { | ||||
| 	switch name { | ||||
| 	case verifytoken.FieldCreatedAt: | ||||
| 		return m.OldCreatedAt(ctx) | ||||
| 	case verifytoken.FieldExpiresAt: | ||||
| 		return m.OldExpiresAt(ctx) | ||||
| 	case verifytoken.FieldToken: | ||||
| 		return m.OldToken(ctx) | ||||
| 	case verifytoken.FieldPurpose: | ||||
| 		return m.OldPurpose(ctx) | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("unknown VerifyToken field %s", name) | ||||
| } | ||||
|  | ||||
| // SetField sets the value of a field with the given name. It returns an error if | ||||
| // the field is not defined in the schema, or if the type mismatched the field | ||||
| // type. | ||||
| func (m *VerifyTokenMutation) SetField(name string, value ent.Value) error { | ||||
| 	switch name { | ||||
| 	case verifytoken.FieldCreatedAt: | ||||
| 		v, ok := value.(time.Time) | ||||
| 		if !ok { | ||||
| 			return fmt.Errorf("unexpected type %T for field %s", value, name) | ||||
| 		} | ||||
| 		m.SetCreatedAt(v) | ||||
| 		return nil | ||||
| 	case verifytoken.FieldExpiresAt: | ||||
| 		v, ok := value.(time.Time) | ||||
| 		if !ok { | ||||
| 			return fmt.Errorf("unexpected type %T for field %s", value, name) | ||||
| 		} | ||||
| 		m.SetExpiresAt(v) | ||||
| 		return nil | ||||
| 	case verifytoken.FieldToken: | ||||
| 		v, ok := value.(string) | ||||
| 		if !ok { | ||||
| 			return fmt.Errorf("unexpected type %T for field %s", value, name) | ||||
| 		} | ||||
| 		m.SetToken(v) | ||||
| 		return nil | ||||
| 	case verifytoken.FieldPurpose: | ||||
| 		v, ok := value.(string) | ||||
| 		if !ok { | ||||
| 			return fmt.Errorf("unexpected type %T for field %s", value, name) | ||||
| 		} | ||||
| 		m.SetPurpose(v) | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown VerifyToken field %s", name) | ||||
| } | ||||
|  | ||||
| // AddedFields returns all numeric fields that were incremented/decremented during | ||||
| // this mutation. | ||||
| func (m *VerifyTokenMutation) AddedFields() []string { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // 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 *VerifyTokenMutation) AddedField(name string) (ent.Value, bool) { | ||||
| 	return nil, false | ||||
| } | ||||
|  | ||||
| // AddField adds the value to the field with the given name. It returns an error if | ||||
| // the field is not defined in the schema, or if the type mismatched the field | ||||
| // type. | ||||
| func (m *VerifyTokenMutation) AddField(name string, value ent.Value) error { | ||||
| 	switch name { | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown VerifyToken numeric field %s", name) | ||||
| } | ||||
|  | ||||
| // ClearedFields returns all nullable fields that were cleared during this | ||||
| // mutation. | ||||
| func (m *VerifyTokenMutation) ClearedFields() []string { | ||||
| 	var fields []string | ||||
| 	if m.FieldCleared(verifytoken.FieldPurpose) { | ||||
| 		fields = append(fields, verifytoken.FieldPurpose) | ||||
| 	} | ||||
| 	return fields | ||||
| } | ||||
|  | ||||
| // FieldCleared returns a boolean indicating if a field with the given name was | ||||
| // cleared in this mutation. | ||||
| func (m *VerifyTokenMutation) FieldCleared(name string) bool { | ||||
| 	_, ok := m.clearedFields[name] | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| // ClearField clears the value of the field with the given name. It returns an | ||||
| // error if the field is not defined in the schema. | ||||
| func (m *VerifyTokenMutation) ClearField(name string) error { | ||||
| 	switch name { | ||||
| 	case verifytoken.FieldPurpose: | ||||
| 		m.ClearPurpose() | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown VerifyToken nullable field %s", name) | ||||
| } | ||||
|  | ||||
| // ResetField resets all changes in the mutation for the field with the given name. | ||||
| // It returns an error if the field is not defined in the schema. | ||||
| func (m *VerifyTokenMutation) ResetField(name string) error { | ||||
| 	switch name { | ||||
| 	case verifytoken.FieldCreatedAt: | ||||
| 		m.ResetCreatedAt() | ||||
| 		return nil | ||||
| 	case verifytoken.FieldExpiresAt: | ||||
| 		m.ResetExpiresAt() | ||||
| 		return nil | ||||
| 	case verifytoken.FieldToken: | ||||
| 		m.ResetToken() | ||||
| 		return nil | ||||
| 	case verifytoken.FieldPurpose: | ||||
| 		m.ResetPurpose() | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown VerifyToken field %s", name) | ||||
| } | ||||
|  | ||||
| // AddedEdges returns all edge names that were set/added in this mutation. | ||||
| func (m *VerifyTokenMutation) AddedEdges() []string { | ||||
| 	edges := make([]string, 0, 1) | ||||
| 	if m.user != nil { | ||||
| 		edges = append(edges, verifytoken.EdgeUser) | ||||
| 	} | ||||
| 	return edges | ||||
| } | ||||
|  | ||||
| // AddedIDs returns all IDs (to other nodes) that were added for the given edge | ||||
| // name in this mutation. | ||||
| func (m *VerifyTokenMutation) AddedIDs(name string) []ent.Value { | ||||
| 	switch name { | ||||
| 	case verifytoken.EdgeUser: | ||||
| 		if id := m.user; id != nil { | ||||
| 			return []ent.Value{*id} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // RemovedEdges returns all edge names that were removed in this mutation. | ||||
| func (m *VerifyTokenMutation) RemovedEdges() []string { | ||||
| 	edges := make([]string, 0, 1) | ||||
| 	return edges | ||||
| } | ||||
|  | ||||
| // RemovedIDs returns all IDs (to other nodes) that were removed for the edge with | ||||
| // the given name in this mutation. | ||||
| func (m *VerifyTokenMutation) RemovedIDs(name string) []ent.Value { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ClearedEdges returns all edge names that were cleared in this mutation. | ||||
| func (m *VerifyTokenMutation) ClearedEdges() []string { | ||||
| 	edges := make([]string, 0, 1) | ||||
| 	if m.cleareduser { | ||||
| 		edges = append(edges, verifytoken.EdgeUser) | ||||
| 	} | ||||
| 	return edges | ||||
| } | ||||
|  | ||||
| // EdgeCleared returns a boolean which indicates if the edge with the given name | ||||
| // was cleared in this mutation. | ||||
| func (m *VerifyTokenMutation) EdgeCleared(name string) bool { | ||||
| 	switch name { | ||||
| 	case verifytoken.EdgeUser: | ||||
| 		return m.cleareduser | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // ClearEdge clears the value of the edge with the given name. It returns an error | ||||
| // if that edge is not defined in the schema. | ||||
| func (m *VerifyTokenMutation) ClearEdge(name string) error { | ||||
| 	switch name { | ||||
| 	case verifytoken.EdgeUser: | ||||
| 		m.ClearUser() | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown VerifyToken unique edge %s", name) | ||||
| } | ||||
|  | ||||
| // ResetEdge resets all changes to the edge with the given name in this mutation. | ||||
| // It returns an error if the edge is not defined in the schema. | ||||
| func (m *VerifyTokenMutation) ResetEdge(name string) error { | ||||
| 	switch name { | ||||
| 	case verifytoken.EdgeUser: | ||||
| 		m.ResetUser() | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fmt.Errorf("unknown VerifyToken edge %s", name) | ||||
| } | ||||
|   | ||||
| @@ -23,3 +23,6 @@ type User func(*sql.Selector) | ||||
|  | ||||
| // UserSession is the predicate function for usersession builders. | ||||
| type UserSession func(*sql.Selector) | ||||
|  | ||||
| // VerifyToken is the predicate function for verifytoken builders. | ||||
| type VerifyToken func(*sql.Selector) | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/schema" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // The init function reads all schema descriptors with runtime code | ||||
| @@ -176,4 +177,18 @@ func init() { | ||||
| 	usersessionDescIP := usersessionFields[5].Descriptor() | ||||
| 	// usersession.IPValidator is a validator for the "ip" field. It is called by the builders before save. | ||||
| 	usersession.IPValidator = usersessionDescIP.Validators[0].(func(string) error) | ||||
| 	verifytokenFields := schema.VerifyToken{}.Fields() | ||||
| 	_ = verifytokenFields | ||||
| 	// verifytokenDescCreatedAt is the schema descriptor for created_at field. | ||||
| 	verifytokenDescCreatedAt := verifytokenFields[1].Descriptor() | ||||
| 	// verifytoken.DefaultCreatedAt holds the default value on creation for the created_at field. | ||||
| 	verifytoken.DefaultCreatedAt = verifytokenDescCreatedAt.Default.(func() time.Time) | ||||
| 	// verifytokenDescToken is the schema descriptor for token field. | ||||
| 	verifytokenDescToken := verifytokenFields[3].Descriptor() | ||||
| 	// verifytoken.TokenValidator is a validator for the "token" field. It is called by the builders before save. | ||||
| 	verifytoken.TokenValidator = verifytokenDescToken.Validators[0].(func(string) error) | ||||
| 	// verifytokenDescPurpose is the schema descriptor for purpose field. | ||||
| 	verifytokenDescPurpose := verifytokenFields[4].Descriptor() | ||||
| 	// verifytoken.PurposeValidator is a validator for the "purpose" field. It is called by the builders before save. | ||||
| 	verifytoken.PurposeValidator = verifytokenDescPurpose.Validators[0].(func(string) error) | ||||
| } | ||||
|   | ||||
| @@ -23,8 +23,8 @@ func (User) Fields() []ent.Field { | ||||
| 		field.Bool("email_verified").Default(false), | ||||
| 		field.String("phone").MaxLen(20).Optional(), | ||||
| 		field.Bool("phone_verified").Default(false), | ||||
| 		field.String("pwd_salt").MaxLen(250).NotEmpty(), | ||||
| 		field.String("pwd_hash").MaxLen(250).NotEmpty(), | ||||
| 		field.String("pwd_salt").MaxLen(100).NotEmpty(), | ||||
| 		field.String("pwd_hash").MaxLen(100).NotEmpty(), | ||||
| 		field.Uint8("login_failed_count").Optional().Default(0), | ||||
| 		field.Time("login_attempt_on").Optional().Nillable(), | ||||
| 		field.Time("login_locked_until").Optional().Nillable(), | ||||
| @@ -40,6 +40,7 @@ func (User) Edges() []ent.Edge { | ||||
| 	return []ent.Edge{ | ||||
| 		edge.To("sessions", UserSession.Type).StorageKey(edge.Column("user_id")), | ||||
| 		edge.To("audit_logs", Audit.Type).StorageKey(edge.Column("user_id")), | ||||
| 		edge.To("verify_tokens", VerifyToken.Type).StorageKey(edge.Column("user_id")), | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										29
									
								
								db/ent/schema/verifyToken.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								db/ent/schema/verifyToken.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| package schema | ||||
|  | ||||
| import ( | ||||
| 	"entgo.io/ent" | ||||
| 	"entgo.io/ent/schema/edge" | ||||
| 	"entgo.io/ent/schema/field" | ||||
| ) | ||||
|  | ||||
| // Verify holds the schema definition for the Verify entity. | ||||
| type VerifyToken struct { | ||||
| 	ent.Schema | ||||
| } | ||||
|  | ||||
| // Fields of the Verify. | ||||
| func (VerifyToken) Fields() []ent.Field { | ||||
| 	return []ent.Field{ | ||||
| 		fieldID, | ||||
| 		fieldCreated, | ||||
| 		field.Time("expires_at").Immutable(), | ||||
| 		field.String("token").MaxLen(50).Unique(), | ||||
| 		field.String("purpose").MaxLen(50).Optional(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (VerifyToken) Edges() []ent.Edge { | ||||
| 	return []ent.Edge{ | ||||
| 		edge.From("user", User.Type).Ref("verify_tokens").Unique(), | ||||
| 	} | ||||
| } | ||||
| @@ -24,6 +24,8 @@ type Tx struct { | ||||
| 	User *UserClient | ||||
| 	// UserSession is the client for interacting with the UserSession builders. | ||||
| 	UserSession *UserSessionClient | ||||
| 	// VerifyToken is the client for interacting with the VerifyToken builders. | ||||
| 	VerifyToken *VerifyTokenClient | ||||
|  | ||||
| 	// lazily loaded. | ||||
| 	client     *Client | ||||
| @@ -161,6 +163,7 @@ func (tx *Tx) init() { | ||||
| 	tx.Todo = NewTodoClient(tx.config) | ||||
| 	tx.User = NewUserClient(tx.config) | ||||
| 	tx.UserSession = NewUserSessionClient(tx.config) | ||||
| 	tx.VerifyToken = NewVerifyTokenClient(tx.config) | ||||
| } | ||||
|  | ||||
| // txDriver wraps the given dialect.Tx with a nop dialect.Driver implementation. | ||||
|   | ||||
| @@ -59,9 +59,11 @@ type UserEdges struct { | ||||
| 	Sessions []*UserSession `json:"sessions,omitempty"` | ||||
| 	// AuditLogs holds the value of the audit_logs edge. | ||||
| 	AuditLogs []*Audit `json:"audit_logs,omitempty"` | ||||
| 	// VerifyTokens holds the value of the verify_tokens edge. | ||||
| 	VerifyTokens []*VerifyToken `json:"verify_tokens,omitempty"` | ||||
| 	// loadedTypes holds the information for reporting if a | ||||
| 	// type was loaded (or requested) in eager-loading or not. | ||||
| 	loadedTypes [2]bool | ||||
| 	loadedTypes [3]bool | ||||
| } | ||||
|  | ||||
| // SessionsOrErr returns the Sessions value or an error if the edge | ||||
| @@ -82,6 +84,15 @@ func (e UserEdges) AuditLogsOrErr() ([]*Audit, error) { | ||||
| 	return nil, &NotLoadedError{edge: "audit_logs"} | ||||
| } | ||||
|  | ||||
| // VerifyTokensOrErr returns the VerifyTokens value or an error if the edge | ||||
| // was not loaded in eager-loading. | ||||
| func (e UserEdges) VerifyTokensOrErr() ([]*VerifyToken, error) { | ||||
| 	if e.loadedTypes[2] { | ||||
| 		return e.VerifyTokens, nil | ||||
| 	} | ||||
| 	return nil, &NotLoadedError{edge: "verify_tokens"} | ||||
| } | ||||
|  | ||||
| // scanValues returns the types for scanning values from sql.Rows. | ||||
| func (*User) scanValues(columns []string) ([]any, error) { | ||||
| 	values := make([]any, len(columns)) | ||||
| @@ -232,6 +243,11 @@ func (u *User) QueryAuditLogs() *AuditQuery { | ||||
| 	return NewUserClient(u.config).QueryAuditLogs(u) | ||||
| } | ||||
|  | ||||
| // QueryVerifyTokens queries the "verify_tokens" edge of the User entity. | ||||
| func (u *User) QueryVerifyTokens() *VerifyTokenQuery { | ||||
| 	return NewUserClient(u.config).QueryVerifyTokens(u) | ||||
| } | ||||
|  | ||||
| // Update returns a builder for updating this User. | ||||
| // Note that you need to call User.Unwrap() before calling this method if this User | ||||
| // was returned from a transaction, and the transaction was committed or rolled back. | ||||
|   | ||||
| @@ -49,6 +49,8 @@ const ( | ||||
| 	EdgeSessions = "sessions" | ||||
| 	// EdgeAuditLogs holds the string denoting the audit_logs edge name in mutations. | ||||
| 	EdgeAuditLogs = "audit_logs" | ||||
| 	// EdgeVerifyTokens holds the string denoting the verify_tokens edge name in mutations. | ||||
| 	EdgeVerifyTokens = "verify_tokens" | ||||
| 	// Table holds the table name of the user in the database. | ||||
| 	Table = "users" | ||||
| 	// SessionsTable is the table that holds the sessions relation/edge. | ||||
| @@ -65,6 +67,13 @@ const ( | ||||
| 	AuditLogsInverseTable = "audits" | ||||
| 	// AuditLogsColumn is the table column denoting the audit_logs relation/edge. | ||||
| 	AuditLogsColumn = "user_id" | ||||
| 	// VerifyTokensTable is the table that holds the verify_tokens relation/edge. | ||||
| 	VerifyTokensTable = "verify_tokens" | ||||
| 	// VerifyTokensInverseTable is the table name for the VerifyToken entity. | ||||
| 	// It exists in this package in order to avoid circular dependency with the "verifytoken" package. | ||||
| 	VerifyTokensInverseTable = "verify_tokens" | ||||
| 	// VerifyTokensColumn is the table column denoting the verify_tokens relation/edge. | ||||
| 	VerifyTokensColumn = "user_id" | ||||
| ) | ||||
|  | ||||
| // Columns holds all SQL columns for user fields. | ||||
| @@ -263,6 +272,20 @@ func ByAuditLogs(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { | ||||
| 		sqlgraph.OrderByNeighborTerms(s, newAuditLogsStep(), append([]sql.OrderTerm{term}, terms...)...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ByVerifyTokensCount orders the results by verify_tokens count. | ||||
| func ByVerifyTokensCount(opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return func(s *sql.Selector) { | ||||
| 		sqlgraph.OrderByNeighborsCount(s, newVerifyTokensStep(), opts...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ByVerifyTokens orders the results by verify_tokens terms. | ||||
| func ByVerifyTokens(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { | ||||
| 	return func(s *sql.Selector) { | ||||
| 		sqlgraph.OrderByNeighborTerms(s, newVerifyTokensStep(), append([]sql.OrderTerm{term}, terms...)...) | ||||
| 	} | ||||
| } | ||||
| func newSessionsStep() *sqlgraph.Step { | ||||
| 	return sqlgraph.NewStep( | ||||
| 		sqlgraph.From(Table, FieldID), | ||||
| @@ -277,3 +300,10 @@ func newAuditLogsStep() *sqlgraph.Step { | ||||
| 		sqlgraph.Edge(sqlgraph.O2M, false, AuditLogsTable, AuditLogsColumn), | ||||
| 	) | ||||
| } | ||||
| func newVerifyTokensStep() *sqlgraph.Step { | ||||
| 	return sqlgraph.NewStep( | ||||
| 		sqlgraph.From(Table, FieldID), | ||||
| 		sqlgraph.To(VerifyTokensInverseTable, FieldID), | ||||
| 		sqlgraph.Edge(sqlgraph.O2M, false, VerifyTokensTable, VerifyTokensColumn), | ||||
| 	) | ||||
| } | ||||
|   | ||||
| @@ -906,6 +906,29 @@ func HasAuditLogsWith(preds ...predicate.Audit) predicate.User { | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // HasVerifyTokens applies the HasEdge predicate on the "verify_tokens" edge. | ||||
| func HasVerifyTokens() predicate.User { | ||||
| 	return predicate.User(func(s *sql.Selector) { | ||||
| 		step := sqlgraph.NewStep( | ||||
| 			sqlgraph.From(Table, FieldID), | ||||
| 			sqlgraph.Edge(sqlgraph.O2M, false, VerifyTokensTable, VerifyTokensColumn), | ||||
| 		) | ||||
| 		sqlgraph.HasNeighbors(s, step) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // HasVerifyTokensWith applies the HasEdge predicate on the "verify_tokens" edge with a given conditions (other predicates). | ||||
| func HasVerifyTokensWith(preds ...predicate.VerifyToken) predicate.User { | ||||
| 	return predicate.User(func(s *sql.Selector) { | ||||
| 		step := newVerifyTokensStep() | ||||
| 		sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { | ||||
| 			for _, p := range preds { | ||||
| 				p(s) | ||||
| 			} | ||||
| 		}) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // And groups predicates with the AND operator between them. | ||||
| func And(predicates ...predicate.User) predicate.User { | ||||
| 	return predicate.User(sql.AndPredicates(predicates...)) | ||||
|   | ||||
| @@ -13,6 +13,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/audit" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // UserCreate is the builder for creating a User entity. | ||||
| @@ -220,6 +221,21 @@ func (uc *UserCreate) AddAuditLogs(a ...*Audit) *UserCreate { | ||||
| 	return uc.AddAuditLogIDs(ids...) | ||||
| } | ||||
|  | ||||
| // AddVerifyTokenIDs adds the "verify_tokens" edge to the VerifyToken entity by IDs. | ||||
| func (uc *UserCreate) AddVerifyTokenIDs(ids ...int64) *UserCreate { | ||||
| 	uc.mutation.AddVerifyTokenIDs(ids...) | ||||
| 	return uc | ||||
| } | ||||
|  | ||||
| // AddVerifyTokens adds the "verify_tokens" edges to the VerifyToken entity. | ||||
| func (uc *UserCreate) AddVerifyTokens(v ...*VerifyToken) *UserCreate { | ||||
| 	ids := make([]int64, len(v)) | ||||
| 	for i := range v { | ||||
| 		ids[i] = v[i].ID | ||||
| 	} | ||||
| 	return uc.AddVerifyTokenIDs(ids...) | ||||
| } | ||||
|  | ||||
| // Mutation returns the UserMutation object of the builder. | ||||
| func (uc *UserCreate) Mutation() *UserMutation { | ||||
| 	return uc.mutation | ||||
| @@ -480,6 +496,22 @@ func (uc *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) { | ||||
| 		} | ||||
| 		_spec.Edges = append(_spec.Edges, edge) | ||||
| 	} | ||||
| 	if nodes := uc.mutation.VerifyTokensIDs(); len(nodes) > 0 { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		for _, k := range nodes { | ||||
| 			edge.Target.Nodes = append(edge.Target.Nodes, k) | ||||
| 		} | ||||
| 		_spec.Edges = append(_spec.Edges, edge) | ||||
| 	} | ||||
| 	return _node, _spec | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // UserQuery is the builder for querying User entities. | ||||
| @@ -27,6 +28,7 @@ type UserQuery struct { | ||||
| 	predicates       []predicate.User | ||||
| 	withSessions     *UserSessionQuery | ||||
| 	withAuditLogs    *AuditQuery | ||||
| 	withVerifyTokens *VerifyTokenQuery | ||||
| 	// intermediate query (i.e. traversal path). | ||||
| 	sql  *sql.Selector | ||||
| 	path func(context.Context) (*sql.Selector, error) | ||||
| @@ -107,6 +109,28 @@ func (uq *UserQuery) QueryAuditLogs() *AuditQuery { | ||||
| 	return query | ||||
| } | ||||
|  | ||||
| // QueryVerifyTokens chains the current query on the "verify_tokens" edge. | ||||
| func (uq *UserQuery) QueryVerifyTokens() *VerifyTokenQuery { | ||||
| 	query := (&VerifyTokenClient{config: uq.config}).Query() | ||||
| 	query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { | ||||
| 		if err := uq.prepareQuery(ctx); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		selector := uq.sqlQuery(ctx) | ||||
| 		if err := selector.Err(); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		step := sqlgraph.NewStep( | ||||
| 			sqlgraph.From(user.Table, user.FieldID, selector), | ||||
| 			sqlgraph.To(verifytoken.Table, verifytoken.FieldID), | ||||
| 			sqlgraph.Edge(sqlgraph.O2M, false, user.VerifyTokensTable, user.VerifyTokensColumn), | ||||
| 		) | ||||
| 		fromU = sqlgraph.SetNeighbors(uq.driver.Dialect(), step) | ||||
| 		return fromU, nil | ||||
| 	} | ||||
| 	return query | ||||
| } | ||||
|  | ||||
| // First returns the first User entity from the query. | ||||
| // Returns a *NotFoundError when no User was found. | ||||
| func (uq *UserQuery) First(ctx context.Context) (*User, error) { | ||||
| @@ -301,6 +325,7 @@ func (uq *UserQuery) Clone() *UserQuery { | ||||
| 		predicates:       append([]predicate.User{}, uq.predicates...), | ||||
| 		withSessions:     uq.withSessions.Clone(), | ||||
| 		withAuditLogs:    uq.withAuditLogs.Clone(), | ||||
| 		withVerifyTokens: uq.withVerifyTokens.Clone(), | ||||
| 		// clone intermediate query. | ||||
| 		sql:  uq.sql.Clone(), | ||||
| 		path: uq.path, | ||||
| @@ -329,6 +354,17 @@ func (uq *UserQuery) WithAuditLogs(opts ...func(*AuditQuery)) *UserQuery { | ||||
| 	return uq | ||||
| } | ||||
|  | ||||
| // WithVerifyTokens tells the query-builder to eager-load the nodes that are connected to | ||||
| // the "verify_tokens" edge. The optional arguments are used to configure the query builder of the edge. | ||||
| func (uq *UserQuery) WithVerifyTokens(opts ...func(*VerifyTokenQuery)) *UserQuery { | ||||
| 	query := (&VerifyTokenClient{config: uq.config}).Query() | ||||
| 	for _, opt := range opts { | ||||
| 		opt(query) | ||||
| 	} | ||||
| 	uq.withVerifyTokens = query | ||||
| 	return uq | ||||
| } | ||||
|  | ||||
| // GroupBy is used to group vertices by one or more fields/columns. | ||||
| // It is often used with aggregate functions, like: count, max, mean, min, sum. | ||||
| // | ||||
| @@ -407,9 +443,10 @@ func (uq *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e | ||||
| 	var ( | ||||
| 		nodes       = []*User{} | ||||
| 		_spec       = uq.querySpec() | ||||
| 		loadedTypes = [2]bool{ | ||||
| 		loadedTypes = [3]bool{ | ||||
| 			uq.withSessions != nil, | ||||
| 			uq.withAuditLogs != nil, | ||||
| 			uq.withVerifyTokens != nil, | ||||
| 		} | ||||
| 	) | ||||
| 	_spec.ScanValues = func(columns []string) ([]any, error) { | ||||
| @@ -444,6 +481,13 @@ func (uq *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 	if query := uq.withVerifyTokens; query != nil { | ||||
| 		if err := uq.loadVerifyTokens(ctx, query, nodes, | ||||
| 			func(n *User) { n.Edges.VerifyTokens = []*VerifyToken{} }, | ||||
| 			func(n *User, e *VerifyToken) { n.Edges.VerifyTokens = append(n.Edges.VerifyTokens, e) }); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 	return nodes, nil | ||||
| } | ||||
|  | ||||
| @@ -509,6 +553,37 @@ func (uq *UserQuery) loadAuditLogs(ctx context.Context, query *AuditQuery, nodes | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (uq *UserQuery) loadVerifyTokens(ctx context.Context, query *VerifyTokenQuery, nodes []*User, init func(*User), assign func(*User, *VerifyToken)) 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]) | ||||
| 		} | ||||
| 	} | ||||
| 	query.withFKs = true | ||||
| 	query.Where(predicate.VerifyToken(func(s *sql.Selector) { | ||||
| 		s.Where(sql.InValues(s.C(user.VerifyTokensColumn), fks...)) | ||||
| 	})) | ||||
| 	neighbors, err := query.All(ctx) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, n := range neighbors { | ||||
| 		fk := n.user_id | ||||
| 		if fk == nil { | ||||
| 			return fmt.Errorf(`foreign-key "user_id" is nil for node %v`, n.ID) | ||||
| 		} | ||||
| 		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 (uq *UserQuery) sqlCount(ctx context.Context) (int, error) { | ||||
| 	_spec := uq.querySpec() | ||||
|   | ||||
| @@ -15,6 +15,7 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // UserUpdate is the builder for updating User entities. | ||||
| @@ -279,6 +280,21 @@ func (uu *UserUpdate) AddAuditLogs(a ...*Audit) *UserUpdate { | ||||
| 	return uu.AddAuditLogIDs(ids...) | ||||
| } | ||||
|  | ||||
| // AddVerifyTokenIDs adds the "verify_tokens" edge to the VerifyToken entity by IDs. | ||||
| func (uu *UserUpdate) AddVerifyTokenIDs(ids ...int64) *UserUpdate { | ||||
| 	uu.mutation.AddVerifyTokenIDs(ids...) | ||||
| 	return uu | ||||
| } | ||||
|  | ||||
| // AddVerifyTokens adds the "verify_tokens" edges to the VerifyToken entity. | ||||
| func (uu *UserUpdate) AddVerifyTokens(v ...*VerifyToken) *UserUpdate { | ||||
| 	ids := make([]int64, len(v)) | ||||
| 	for i := range v { | ||||
| 		ids[i] = v[i].ID | ||||
| 	} | ||||
| 	return uu.AddVerifyTokenIDs(ids...) | ||||
| } | ||||
|  | ||||
| // Mutation returns the UserMutation object of the builder. | ||||
| func (uu *UserUpdate) Mutation() *UserMutation { | ||||
| 	return uu.mutation | ||||
| @@ -326,6 +342,27 @@ func (uu *UserUpdate) RemoveAuditLogs(a ...*Audit) *UserUpdate { | ||||
| 	return uu.RemoveAuditLogIDs(ids...) | ||||
| } | ||||
|  | ||||
| // ClearVerifyTokens clears all "verify_tokens" edges to the VerifyToken entity. | ||||
| func (uu *UserUpdate) ClearVerifyTokens() *UserUpdate { | ||||
| 	uu.mutation.ClearVerifyTokens() | ||||
| 	return uu | ||||
| } | ||||
|  | ||||
| // RemoveVerifyTokenIDs removes the "verify_tokens" edge to VerifyToken entities by IDs. | ||||
| func (uu *UserUpdate) RemoveVerifyTokenIDs(ids ...int64) *UserUpdate { | ||||
| 	uu.mutation.RemoveVerifyTokenIDs(ids...) | ||||
| 	return uu | ||||
| } | ||||
|  | ||||
| // RemoveVerifyTokens removes "verify_tokens" edges to VerifyToken entities. | ||||
| func (uu *UserUpdate) RemoveVerifyTokens(v ...*VerifyToken) *UserUpdate { | ||||
| 	ids := make([]int64, len(v)) | ||||
| 	for i := range v { | ||||
| 		ids[i] = v[i].ID | ||||
| 	} | ||||
| 	return uu.RemoveVerifyTokenIDs(ids...) | ||||
| } | ||||
|  | ||||
| // Save executes the query and returns the number of nodes affected by the update operation. | ||||
| func (uu *UserUpdate) Save(ctx context.Context) (int, error) { | ||||
| 	uu.defaults() | ||||
| @@ -566,6 +603,51 @@ func (uu *UserUpdate) sqlSave(ctx context.Context) (n int, err error) { | ||||
| 		} | ||||
| 		_spec.Edges.Add = append(_spec.Edges.Add, edge) | ||||
| 	} | ||||
| 	if uu.mutation.VerifyTokensCleared() { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		_spec.Edges.Clear = append(_spec.Edges.Clear, edge) | ||||
| 	} | ||||
| 	if nodes := uu.mutation.RemovedVerifyTokensIDs(); len(nodes) > 0 && !uu.mutation.VerifyTokensCleared() { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.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 := uu.mutation.VerifyTokensIDs(); len(nodes) > 0 { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		for _, k := range nodes { | ||||
| 			edge.Target.Nodes = append(edge.Target.Nodes, k) | ||||
| 		} | ||||
| 		_spec.Edges.Add = append(_spec.Edges.Add, edge) | ||||
| 	} | ||||
| 	if n, err = sqlgraph.UpdateNodes(ctx, uu.driver, _spec); err != nil { | ||||
| 		if _, ok := err.(*sqlgraph.NotFoundError); ok { | ||||
| 			err = &NotFoundError{user.Label} | ||||
| @@ -835,6 +917,21 @@ func (uuo *UserUpdateOne) AddAuditLogs(a ...*Audit) *UserUpdateOne { | ||||
| 	return uuo.AddAuditLogIDs(ids...) | ||||
| } | ||||
|  | ||||
| // AddVerifyTokenIDs adds the "verify_tokens" edge to the VerifyToken entity by IDs. | ||||
| func (uuo *UserUpdateOne) AddVerifyTokenIDs(ids ...int64) *UserUpdateOne { | ||||
| 	uuo.mutation.AddVerifyTokenIDs(ids...) | ||||
| 	return uuo | ||||
| } | ||||
|  | ||||
| // AddVerifyTokens adds the "verify_tokens" edges to the VerifyToken entity. | ||||
| func (uuo *UserUpdateOne) AddVerifyTokens(v ...*VerifyToken) *UserUpdateOne { | ||||
| 	ids := make([]int64, len(v)) | ||||
| 	for i := range v { | ||||
| 		ids[i] = v[i].ID | ||||
| 	} | ||||
| 	return uuo.AddVerifyTokenIDs(ids...) | ||||
| } | ||||
|  | ||||
| // Mutation returns the UserMutation object of the builder. | ||||
| func (uuo *UserUpdateOne) Mutation() *UserMutation { | ||||
| 	return uuo.mutation | ||||
| @@ -882,6 +979,27 @@ func (uuo *UserUpdateOne) RemoveAuditLogs(a ...*Audit) *UserUpdateOne { | ||||
| 	return uuo.RemoveAuditLogIDs(ids...) | ||||
| } | ||||
|  | ||||
| // ClearVerifyTokens clears all "verify_tokens" edges to the VerifyToken entity. | ||||
| func (uuo *UserUpdateOne) ClearVerifyTokens() *UserUpdateOne { | ||||
| 	uuo.mutation.ClearVerifyTokens() | ||||
| 	return uuo | ||||
| } | ||||
|  | ||||
| // RemoveVerifyTokenIDs removes the "verify_tokens" edge to VerifyToken entities by IDs. | ||||
| func (uuo *UserUpdateOne) RemoveVerifyTokenIDs(ids ...int64) *UserUpdateOne { | ||||
| 	uuo.mutation.RemoveVerifyTokenIDs(ids...) | ||||
| 	return uuo | ||||
| } | ||||
|  | ||||
| // RemoveVerifyTokens removes "verify_tokens" edges to VerifyToken entities. | ||||
| func (uuo *UserUpdateOne) RemoveVerifyTokens(v ...*VerifyToken) *UserUpdateOne { | ||||
| 	ids := make([]int64, len(v)) | ||||
| 	for i := range v { | ||||
| 		ids[i] = v[i].ID | ||||
| 	} | ||||
| 	return uuo.RemoveVerifyTokenIDs(ids...) | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the UserUpdate builder. | ||||
| func (uuo *UserUpdateOne) Where(ps ...predicate.User) *UserUpdateOne { | ||||
| 	uuo.mutation.Where(ps...) | ||||
| @@ -1152,6 +1270,51 @@ func (uuo *UserUpdateOne) sqlSave(ctx context.Context) (_node *User, err error) | ||||
| 		} | ||||
| 		_spec.Edges.Add = append(_spec.Edges.Add, edge) | ||||
| 	} | ||||
| 	if uuo.mutation.VerifyTokensCleared() { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		_spec.Edges.Clear = append(_spec.Edges.Clear, edge) | ||||
| 	} | ||||
| 	if nodes := uuo.mutation.RemovedVerifyTokensIDs(); len(nodes) > 0 && !uuo.mutation.VerifyTokensCleared() { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.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 := uuo.mutation.VerifyTokensIDs(); len(nodes) > 0 { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.O2M, | ||||
| 			Inverse: false, | ||||
| 			Table:   user.VerifyTokensTable, | ||||
| 			Columns: []string{user.VerifyTokensColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(verifytoken.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: uuo.config} | ||||
| 	_spec.Assign = _node.assignValues | ||||
| 	_spec.ScanValues = _node.scanValues | ||||
|   | ||||
							
								
								
									
										178
									
								
								db/ent/verifytoken.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								db/ent/verifytoken.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package ent | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"entgo.io/ent" | ||||
| 	"entgo.io/ent/dialect/sql" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // VerifyToken is the model entity for the VerifyToken schema. | ||||
| type VerifyToken struct { | ||||
| 	config `json:"-"` | ||||
| 	// ID of the ent. | ||||
| 	ID int64 `json:"id,omitempty"` | ||||
| 	// CreatedAt holds the value of the "created_at" field. | ||||
| 	CreatedAt time.Time `json:"createdAt"` | ||||
| 	// ExpiresAt holds the value of the "expires_at" field. | ||||
| 	ExpiresAt time.Time `json:"expires_at,omitempty"` | ||||
| 	// Token holds the value of the "token" field. | ||||
| 	Token string `json:"token,omitempty"` | ||||
| 	// Purpose holds the value of the "purpose" field. | ||||
| 	Purpose string `json:"purpose,omitempty"` | ||||
| 	// Edges holds the relations/edges for other nodes in the graph. | ||||
| 	// The values are being populated by the VerifyTokenQuery when eager-loading is set. | ||||
| 	Edges        VerifyTokenEdges `json:"edges"` | ||||
| 	user_id      *int64 | ||||
| 	selectValues sql.SelectValues | ||||
| } | ||||
|  | ||||
| // VerifyTokenEdges holds the relations/edges for other nodes in the graph. | ||||
| type VerifyTokenEdges struct { | ||||
| 	// User holds the value of the user edge. | ||||
| 	User *User `json:"user,omitempty"` | ||||
| 	// loadedTypes holds the information for reporting if a | ||||
| 	// type was loaded (or requested) in eager-loading or not. | ||||
| 	loadedTypes [1]bool | ||||
| } | ||||
|  | ||||
| // UserOrErr returns the User value or an error if the edge | ||||
| // was not loaded in eager-loading, or loaded but was not found. | ||||
| func (e VerifyTokenEdges) UserOrErr() (*User, error) { | ||||
| 	if e.User != nil { | ||||
| 		return e.User, nil | ||||
| 	} else if e.loadedTypes[0] { | ||||
| 		return nil, &NotFoundError{label: user.Label} | ||||
| 	} | ||||
| 	return nil, &NotLoadedError{edge: "user"} | ||||
| } | ||||
|  | ||||
| // scanValues returns the types for scanning values from sql.Rows. | ||||
| func (*VerifyToken) scanValues(columns []string) ([]any, error) { | ||||
| 	values := make([]any, len(columns)) | ||||
| 	for i := range columns { | ||||
| 		switch columns[i] { | ||||
| 		case verifytoken.FieldID: | ||||
| 			values[i] = new(sql.NullInt64) | ||||
| 		case verifytoken.FieldToken, verifytoken.FieldPurpose: | ||||
| 			values[i] = new(sql.NullString) | ||||
| 		case verifytoken.FieldCreatedAt, verifytoken.FieldExpiresAt: | ||||
| 			values[i] = new(sql.NullTime) | ||||
| 		case verifytoken.ForeignKeys[0]: // user_id | ||||
| 			values[i] = new(sql.NullInt64) | ||||
| 		default: | ||||
| 			values[i] = new(sql.UnknownType) | ||||
| 		} | ||||
| 	} | ||||
| 	return values, nil | ||||
| } | ||||
|  | ||||
| // assignValues assigns the values that were returned from sql.Rows (after scanning) | ||||
| // to the VerifyToken fields. | ||||
| func (vt *VerifyToken) assignValues(columns []string, values []any) error { | ||||
| 	if m, n := len(values), len(columns); m < n { | ||||
| 		return fmt.Errorf("mismatch number of scan values: %d != %d", m, n) | ||||
| 	} | ||||
| 	for i := range columns { | ||||
| 		switch columns[i] { | ||||
| 		case verifytoken.FieldID: | ||||
| 			value, ok := values[i].(*sql.NullInt64) | ||||
| 			if !ok { | ||||
| 				return fmt.Errorf("unexpected type %T for field id", value) | ||||
| 			} | ||||
| 			vt.ID = int64(value.Int64) | ||||
| 		case verifytoken.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 { | ||||
| 				vt.CreatedAt = value.Time | ||||
| 			} | ||||
| 		case verifytoken.FieldExpiresAt: | ||||
| 			if value, ok := values[i].(*sql.NullTime); !ok { | ||||
| 				return fmt.Errorf("unexpected type %T for field expires_at", values[i]) | ||||
| 			} else if value.Valid { | ||||
| 				vt.ExpiresAt = value.Time | ||||
| 			} | ||||
| 		case verifytoken.FieldToken: | ||||
| 			if value, ok := values[i].(*sql.NullString); !ok { | ||||
| 				return fmt.Errorf("unexpected type %T for field token", values[i]) | ||||
| 			} else if value.Valid { | ||||
| 				vt.Token = value.String | ||||
| 			} | ||||
| 		case verifytoken.FieldPurpose: | ||||
| 			if value, ok := values[i].(*sql.NullString); !ok { | ||||
| 				return fmt.Errorf("unexpected type %T for field purpose", values[i]) | ||||
| 			} else if value.Valid { | ||||
| 				vt.Purpose = value.String | ||||
| 			} | ||||
| 		case verifytoken.ForeignKeys[0]: | ||||
| 			if value, ok := values[i].(*sql.NullInt64); !ok { | ||||
| 				return fmt.Errorf("unexpected type %T for edge-field user_id", value) | ||||
| 			} else if value.Valid { | ||||
| 				vt.user_id = new(int64) | ||||
| 				*vt.user_id = int64(value.Int64) | ||||
| 			} | ||||
| 		default: | ||||
| 			vt.selectValues.Set(columns[i], values[i]) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Value returns the ent.Value that was dynamically selected and assigned to the VerifyToken. | ||||
| // This includes values selected through modifiers, order, etc. | ||||
| func (vt *VerifyToken) Value(name string) (ent.Value, error) { | ||||
| 	return vt.selectValues.Get(name) | ||||
| } | ||||
|  | ||||
| // QueryUser queries the "user" edge of the VerifyToken entity. | ||||
| func (vt *VerifyToken) QueryUser() *UserQuery { | ||||
| 	return NewVerifyTokenClient(vt.config).QueryUser(vt) | ||||
| } | ||||
|  | ||||
| // Update returns a builder for updating this VerifyToken. | ||||
| // Note that you need to call VerifyToken.Unwrap() before calling this method if this VerifyToken | ||||
| // was returned from a transaction, and the transaction was committed or rolled back. | ||||
| func (vt *VerifyToken) Update() *VerifyTokenUpdateOne { | ||||
| 	return NewVerifyTokenClient(vt.config).UpdateOne(vt) | ||||
| } | ||||
|  | ||||
| // Unwrap unwraps the VerifyToken entity that was returned from a transaction after it was closed, | ||||
| // so that all future queries will be executed through the driver which created the transaction. | ||||
| func (vt *VerifyToken) Unwrap() *VerifyToken { | ||||
| 	_tx, ok := vt.config.driver.(*txDriver) | ||||
| 	if !ok { | ||||
| 		panic("ent: VerifyToken is not a transactional entity") | ||||
| 	} | ||||
| 	vt.config.driver = _tx.drv | ||||
| 	return vt | ||||
| } | ||||
|  | ||||
| // String implements the fmt.Stringer. | ||||
| func (vt *VerifyToken) String() string { | ||||
| 	var builder strings.Builder | ||||
| 	builder.WriteString("VerifyToken(") | ||||
| 	builder.WriteString(fmt.Sprintf("id=%v, ", vt.ID)) | ||||
| 	builder.WriteString("created_at=") | ||||
| 	builder.WriteString(vt.CreatedAt.Format(time.ANSIC)) | ||||
| 	builder.WriteString(", ") | ||||
| 	builder.WriteString("expires_at=") | ||||
| 	builder.WriteString(vt.ExpiresAt.Format(time.ANSIC)) | ||||
| 	builder.WriteString(", ") | ||||
| 	builder.WriteString("token=") | ||||
| 	builder.WriteString(vt.Token) | ||||
| 	builder.WriteString(", ") | ||||
| 	builder.WriteString("purpose=") | ||||
| 	builder.WriteString(vt.Purpose) | ||||
| 	builder.WriteByte(')') | ||||
| 	return builder.String() | ||||
| } | ||||
|  | ||||
| // VerifyTokens is a parsable slice of VerifyToken. | ||||
| type VerifyTokens []*VerifyToken | ||||
							
								
								
									
										117
									
								
								db/ent/verifytoken/verifytoken.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								db/ent/verifytoken/verifytoken.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package verifytoken | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"entgo.io/ent/dialect/sql" | ||||
| 	"entgo.io/ent/dialect/sql/sqlgraph" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Label holds the string label denoting the verifytoken type in the database. | ||||
| 	Label = "verify_token" | ||||
| 	// FieldID holds the string denoting the id field in the database. | ||||
| 	FieldID = "id" | ||||
| 	// FieldCreatedAt holds the string denoting the created_at field in the database. | ||||
| 	FieldCreatedAt = "created_at" | ||||
| 	// FieldExpiresAt holds the string denoting the expires_at field in the database. | ||||
| 	FieldExpiresAt = "expires_at" | ||||
| 	// FieldToken holds the string denoting the token field in the database. | ||||
| 	FieldToken = "token" | ||||
| 	// FieldPurpose holds the string denoting the purpose field in the database. | ||||
| 	FieldPurpose = "purpose" | ||||
| 	// EdgeUser holds the string denoting the user edge name in mutations. | ||||
| 	EdgeUser = "user" | ||||
| 	// Table holds the table name of the verifytoken in the database. | ||||
| 	Table = "verify_tokens" | ||||
| 	// UserTable is the table that holds the user relation/edge. | ||||
| 	UserTable = "verify_tokens" | ||||
| 	// UserInverseTable is the table name for the User entity. | ||||
| 	// 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 = "user_id" | ||||
| ) | ||||
|  | ||||
| // Columns holds all SQL columns for verifytoken fields. | ||||
| var Columns = []string{ | ||||
| 	FieldID, | ||||
| 	FieldCreatedAt, | ||||
| 	FieldExpiresAt, | ||||
| 	FieldToken, | ||||
| 	FieldPurpose, | ||||
| } | ||||
|  | ||||
| // ForeignKeys holds the SQL foreign-keys that are owned by the "verify_tokens" | ||||
| // table and are not defined as standalone fields in the schema. | ||||
| var ForeignKeys = []string{ | ||||
| 	"user_id", | ||||
| } | ||||
|  | ||||
| // ValidColumn reports if the column name is valid (part of the table columns). | ||||
| func ValidColumn(column string) bool { | ||||
| 	for i := range Columns { | ||||
| 		if column == Columns[i] { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range ForeignKeys { | ||||
| 		if column == ForeignKeys[i] { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	// DefaultCreatedAt holds the default value on creation for the "created_at" field. | ||||
| 	DefaultCreatedAt func() time.Time | ||||
| 	// TokenValidator is a validator for the "token" field. It is called by the builders before save. | ||||
| 	TokenValidator func(string) error | ||||
| 	// PurposeValidator is a validator for the "purpose" field. It is called by the builders before save. | ||||
| 	PurposeValidator func(string) error | ||||
| ) | ||||
|  | ||||
| // OrderOption defines the ordering options for the VerifyToken queries. | ||||
| type OrderOption func(*sql.Selector) | ||||
|  | ||||
| // ByID orders the results by the id field. | ||||
| func ByID(opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return sql.OrderByField(FieldID, opts...).ToFunc() | ||||
| } | ||||
|  | ||||
| // ByCreatedAt orders the results by the created_at field. | ||||
| func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return sql.OrderByField(FieldCreatedAt, opts...).ToFunc() | ||||
| } | ||||
|  | ||||
| // ByExpiresAt orders the results by the expires_at field. | ||||
| func ByExpiresAt(opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return sql.OrderByField(FieldExpiresAt, opts...).ToFunc() | ||||
| } | ||||
|  | ||||
| // ByToken orders the results by the token field. | ||||
| func ByToken(opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return sql.OrderByField(FieldToken, opts...).ToFunc() | ||||
| } | ||||
|  | ||||
| // ByPurpose orders the results by the purpose field. | ||||
| func ByPurpose(opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return sql.OrderByField(FieldPurpose, opts...).ToFunc() | ||||
| } | ||||
|  | ||||
| // ByUserField orders the results by user field. | ||||
| func ByUserField(field string, opts ...sql.OrderTermOption) OrderOption { | ||||
| 	return func(s *sql.Selector) { | ||||
| 		sqlgraph.OrderByNeighborTerms(s, newUserStep(), sql.OrderByField(field, opts...)) | ||||
| 	} | ||||
| } | ||||
| func newUserStep() *sqlgraph.Step { | ||||
| 	return sqlgraph.NewStep( | ||||
| 		sqlgraph.From(Table, FieldID), | ||||
| 		sqlgraph.To(UserInverseTable, FieldID), | ||||
| 		sqlgraph.Edge(sqlgraph.M2O, true, UserTable, UserColumn), | ||||
| 	) | ||||
| } | ||||
							
								
								
									
										334
									
								
								db/ent/verifytoken/where.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								db/ent/verifytoken/where.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,334 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package verifytoken | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"entgo.io/ent/dialect/sql" | ||||
| 	"entgo.io/ent/dialect/sql/sqlgraph" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||
| ) | ||||
|  | ||||
| // ID filters vertices based on their ID field. | ||||
| func ID(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // IDEQ applies the EQ predicate on the ID field. | ||||
| func IDEQ(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // IDNEQ applies the NEQ predicate on the ID field. | ||||
| func IDNEQ(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNEQ(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // IDIn applies the In predicate on the ID field. | ||||
| func IDIn(ids ...int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldIn(FieldID, ids...)) | ||||
| } | ||||
|  | ||||
| // IDNotIn applies the NotIn predicate on the ID field. | ||||
| func IDNotIn(ids ...int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNotIn(FieldID, ids...)) | ||||
| } | ||||
|  | ||||
| // IDGT applies the GT predicate on the ID field. | ||||
| func IDGT(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGT(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // IDGTE applies the GTE predicate on the ID field. | ||||
| func IDGTE(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGTE(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // IDLT applies the LT predicate on the ID field. | ||||
| func IDLT(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLT(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // IDLTE applies the LTE predicate on the ID field. | ||||
| func IDLTE(id int64) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLTE(FieldID, id)) | ||||
| } | ||||
|  | ||||
| // CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ. | ||||
| func CreatedAt(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAt applies equality check predicate on the "expires_at" field. It's identical to ExpiresAtEQ. | ||||
| func ExpiresAt(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // Token applies equality check predicate on the "token" field. It's identical to TokenEQ. | ||||
| func Token(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // Purpose applies equality check predicate on the "purpose" field. It's identical to PurposeEQ. | ||||
| func Purpose(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // CreatedAtEQ applies the EQ predicate on the "created_at" field. | ||||
| func CreatedAtEQ(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // CreatedAtNEQ applies the NEQ predicate on the "created_at" field. | ||||
| func CreatedAtNEQ(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNEQ(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // CreatedAtIn applies the In predicate on the "created_at" field. | ||||
| func CreatedAtIn(vs ...time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldIn(FieldCreatedAt, vs...)) | ||||
| } | ||||
|  | ||||
| // CreatedAtNotIn applies the NotIn predicate on the "created_at" field. | ||||
| func CreatedAtNotIn(vs ...time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNotIn(FieldCreatedAt, vs...)) | ||||
| } | ||||
|  | ||||
| // CreatedAtGT applies the GT predicate on the "created_at" field. | ||||
| func CreatedAtGT(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGT(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // CreatedAtGTE applies the GTE predicate on the "created_at" field. | ||||
| func CreatedAtGTE(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGTE(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // CreatedAtLT applies the LT predicate on the "created_at" field. | ||||
| func CreatedAtLT(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLT(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // CreatedAtLTE applies the LTE predicate on the "created_at" field. | ||||
| func CreatedAtLTE(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLTE(FieldCreatedAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtEQ applies the EQ predicate on the "expires_at" field. | ||||
| func ExpiresAtEQ(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtNEQ applies the NEQ predicate on the "expires_at" field. | ||||
| func ExpiresAtNEQ(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNEQ(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtIn applies the In predicate on the "expires_at" field. | ||||
| func ExpiresAtIn(vs ...time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldIn(FieldExpiresAt, vs...)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtNotIn applies the NotIn predicate on the "expires_at" field. | ||||
| func ExpiresAtNotIn(vs ...time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNotIn(FieldExpiresAt, vs...)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtGT applies the GT predicate on the "expires_at" field. | ||||
| func ExpiresAtGT(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGT(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtGTE applies the GTE predicate on the "expires_at" field. | ||||
| func ExpiresAtGTE(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGTE(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtLT applies the LT predicate on the "expires_at" field. | ||||
| func ExpiresAtLT(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLT(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // ExpiresAtLTE applies the LTE predicate on the "expires_at" field. | ||||
| func ExpiresAtLTE(v time.Time) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLTE(FieldExpiresAt, v)) | ||||
| } | ||||
|  | ||||
| // TokenEQ applies the EQ predicate on the "token" field. | ||||
| func TokenEQ(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenNEQ applies the NEQ predicate on the "token" field. | ||||
| func TokenNEQ(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNEQ(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenIn applies the In predicate on the "token" field. | ||||
| func TokenIn(vs ...string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldIn(FieldToken, vs...)) | ||||
| } | ||||
|  | ||||
| // TokenNotIn applies the NotIn predicate on the "token" field. | ||||
| func TokenNotIn(vs ...string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNotIn(FieldToken, vs...)) | ||||
| } | ||||
|  | ||||
| // TokenGT applies the GT predicate on the "token" field. | ||||
| func TokenGT(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGT(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenGTE applies the GTE predicate on the "token" field. | ||||
| func TokenGTE(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGTE(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenLT applies the LT predicate on the "token" field. | ||||
| func TokenLT(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLT(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenLTE applies the LTE predicate on the "token" field. | ||||
| func TokenLTE(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLTE(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenContains applies the Contains predicate on the "token" field. | ||||
| func TokenContains(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldContains(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenHasPrefix applies the HasPrefix predicate on the "token" field. | ||||
| func TokenHasPrefix(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldHasPrefix(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenHasSuffix applies the HasSuffix predicate on the "token" field. | ||||
| func TokenHasSuffix(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldHasSuffix(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenEqualFold applies the EqualFold predicate on the "token" field. | ||||
| func TokenEqualFold(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEqualFold(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // TokenContainsFold applies the ContainsFold predicate on the "token" field. | ||||
| func TokenContainsFold(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldContainsFold(FieldToken, v)) | ||||
| } | ||||
|  | ||||
| // PurposeEQ applies the EQ predicate on the "purpose" field. | ||||
| func PurposeEQ(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEQ(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeNEQ applies the NEQ predicate on the "purpose" field. | ||||
| func PurposeNEQ(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNEQ(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeIn applies the In predicate on the "purpose" field. | ||||
| func PurposeIn(vs ...string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldIn(FieldPurpose, vs...)) | ||||
| } | ||||
|  | ||||
| // PurposeNotIn applies the NotIn predicate on the "purpose" field. | ||||
| func PurposeNotIn(vs ...string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNotIn(FieldPurpose, vs...)) | ||||
| } | ||||
|  | ||||
| // PurposeGT applies the GT predicate on the "purpose" field. | ||||
| func PurposeGT(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGT(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeGTE applies the GTE predicate on the "purpose" field. | ||||
| func PurposeGTE(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldGTE(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeLT applies the LT predicate on the "purpose" field. | ||||
| func PurposeLT(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLT(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeLTE applies the LTE predicate on the "purpose" field. | ||||
| func PurposeLTE(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldLTE(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeContains applies the Contains predicate on the "purpose" field. | ||||
| func PurposeContains(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldContains(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeHasPrefix applies the HasPrefix predicate on the "purpose" field. | ||||
| func PurposeHasPrefix(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldHasPrefix(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeHasSuffix applies the HasSuffix predicate on the "purpose" field. | ||||
| func PurposeHasSuffix(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldHasSuffix(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeIsNil applies the IsNil predicate on the "purpose" field. | ||||
| func PurposeIsNil() predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldIsNull(FieldPurpose)) | ||||
| } | ||||
|  | ||||
| // PurposeNotNil applies the NotNil predicate on the "purpose" field. | ||||
| func PurposeNotNil() predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldNotNull(FieldPurpose)) | ||||
| } | ||||
|  | ||||
| // PurposeEqualFold applies the EqualFold predicate on the "purpose" field. | ||||
| func PurposeEqualFold(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldEqualFold(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // PurposeContainsFold applies the ContainsFold predicate on the "purpose" field. | ||||
| func PurposeContainsFold(v string) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.FieldContainsFold(FieldPurpose, v)) | ||||
| } | ||||
|  | ||||
| // HasUser applies the HasEdge predicate on the "user" edge. | ||||
| func HasUser() predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(func(s *sql.Selector) { | ||||
| 		step := sqlgraph.NewStep( | ||||
| 			sqlgraph.From(Table, FieldID), | ||||
| 			sqlgraph.Edge(sqlgraph.M2O, true, UserTable, UserColumn), | ||||
| 		) | ||||
| 		sqlgraph.HasNeighbors(s, step) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // HasUserWith applies the HasEdge predicate on the "user" edge with a given conditions (other predicates). | ||||
| func HasUserWith(preds ...predicate.User) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(func(s *sql.Selector) { | ||||
| 		step := newUserStep() | ||||
| 		sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { | ||||
| 			for _, p := range preds { | ||||
| 				p(s) | ||||
| 			} | ||||
| 		}) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // And groups predicates with the AND operator between them. | ||||
| func And(predicates ...predicate.VerifyToken) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.AndPredicates(predicates...)) | ||||
| } | ||||
|  | ||||
| // Or groups predicates with the OR operator between them. | ||||
| func Or(predicates ...predicate.VerifyToken) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.OrPredicates(predicates...)) | ||||
| } | ||||
|  | ||||
| // Not applies the not operator on the given predicate. | ||||
| func Not(p predicate.VerifyToken) predicate.VerifyToken { | ||||
| 	return predicate.VerifyToken(sql.NotPredicates(p)) | ||||
| } | ||||
							
								
								
									
										305
									
								
								db/ent/verifytoken_create.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								db/ent/verifytoken_create.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,305 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package ent | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
|  | ||||
| 	"entgo.io/ent/dialect/sql/sqlgraph" | ||||
| 	"entgo.io/ent/schema/field" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // VerifyTokenCreate is the builder for creating a VerifyToken entity. | ||||
| type VerifyTokenCreate struct { | ||||
| 	config | ||||
| 	mutation *VerifyTokenMutation | ||||
| 	hooks    []Hook | ||||
| } | ||||
|  | ||||
| // SetCreatedAt sets the "created_at" field. | ||||
| func (vtc *VerifyTokenCreate) SetCreatedAt(t time.Time) *VerifyTokenCreate { | ||||
| 	vtc.mutation.SetCreatedAt(t) | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetNillableCreatedAt sets the "created_at" field if the given value is not nil. | ||||
| func (vtc *VerifyTokenCreate) SetNillableCreatedAt(t *time.Time) *VerifyTokenCreate { | ||||
| 	if t != nil { | ||||
| 		vtc.SetCreatedAt(*t) | ||||
| 	} | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetExpiresAt sets the "expires_at" field. | ||||
| func (vtc *VerifyTokenCreate) SetExpiresAt(t time.Time) *VerifyTokenCreate { | ||||
| 	vtc.mutation.SetExpiresAt(t) | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetToken sets the "token" field. | ||||
| func (vtc *VerifyTokenCreate) SetToken(s string) *VerifyTokenCreate { | ||||
| 	vtc.mutation.SetToken(s) | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetPurpose sets the "purpose" field. | ||||
| func (vtc *VerifyTokenCreate) SetPurpose(s string) *VerifyTokenCreate { | ||||
| 	vtc.mutation.SetPurpose(s) | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetNillablePurpose sets the "purpose" field if the given value is not nil. | ||||
| func (vtc *VerifyTokenCreate) SetNillablePurpose(s *string) *VerifyTokenCreate { | ||||
| 	if s != nil { | ||||
| 		vtc.SetPurpose(*s) | ||||
| 	} | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetID sets the "id" field. | ||||
| func (vtc *VerifyTokenCreate) SetID(i int64) *VerifyTokenCreate { | ||||
| 	vtc.mutation.SetID(i) | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetUserID sets the "user" edge to the User entity by ID. | ||||
| func (vtc *VerifyTokenCreate) SetUserID(id int64) *VerifyTokenCreate { | ||||
| 	vtc.mutation.SetUserID(id) | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetNillableUserID sets the "user" edge to the User entity by ID if the given value is not nil. | ||||
| func (vtc *VerifyTokenCreate) SetNillableUserID(id *int64) *VerifyTokenCreate { | ||||
| 	if id != nil { | ||||
| 		vtc = vtc.SetUserID(*id) | ||||
| 	} | ||||
| 	return vtc | ||||
| } | ||||
|  | ||||
| // SetUser sets the "user" edge to the User entity. | ||||
| func (vtc *VerifyTokenCreate) SetUser(u *User) *VerifyTokenCreate { | ||||
| 	return vtc.SetUserID(u.ID) | ||||
| } | ||||
|  | ||||
| // Mutation returns the VerifyTokenMutation object of the builder. | ||||
| func (vtc *VerifyTokenCreate) Mutation() *VerifyTokenMutation { | ||||
| 	return vtc.mutation | ||||
| } | ||||
|  | ||||
| // Save creates the VerifyToken in the database. | ||||
| func (vtc *VerifyTokenCreate) Save(ctx context.Context) (*VerifyToken, error) { | ||||
| 	vtc.defaults() | ||||
| 	return withHooks(ctx, vtc.sqlSave, vtc.mutation, vtc.hooks) | ||||
| } | ||||
|  | ||||
| // SaveX calls Save and panics if Save returns an error. | ||||
| func (vtc *VerifyTokenCreate) SaveX(ctx context.Context) *VerifyToken { | ||||
| 	v, err := vtc.Save(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| // Exec executes the query. | ||||
| func (vtc *VerifyTokenCreate) Exec(ctx context.Context) error { | ||||
| 	_, err := vtc.Save(ctx) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // ExecX is like Exec, but panics if an error occurs. | ||||
| func (vtc *VerifyTokenCreate) ExecX(ctx context.Context) { | ||||
| 	if err := vtc.Exec(ctx); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // defaults sets the default values of the builder before save. | ||||
| func (vtc *VerifyTokenCreate) defaults() { | ||||
| 	if _, ok := vtc.mutation.CreatedAt(); !ok { | ||||
| 		v := verifytoken.DefaultCreatedAt() | ||||
| 		vtc.mutation.SetCreatedAt(v) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // check runs all checks and user-defined validators on the builder. | ||||
| func (vtc *VerifyTokenCreate) check() error { | ||||
| 	if _, ok := vtc.mutation.CreatedAt(); !ok { | ||||
| 		return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "VerifyToken.created_at"`)} | ||||
| 	} | ||||
| 	if _, ok := vtc.mutation.ExpiresAt(); !ok { | ||||
| 		return &ValidationError{Name: "expires_at", err: errors.New(`ent: missing required field "VerifyToken.expires_at"`)} | ||||
| 	} | ||||
| 	if _, ok := vtc.mutation.Token(); !ok { | ||||
| 		return &ValidationError{Name: "token", err: errors.New(`ent: missing required field "VerifyToken.token"`)} | ||||
| 	} | ||||
| 	if v, ok := vtc.mutation.Token(); ok { | ||||
| 		if err := verifytoken.TokenValidator(v); err != nil { | ||||
| 			return &ValidationError{Name: "token", err: fmt.Errorf(`ent: validator failed for field "VerifyToken.token": %w`, err)} | ||||
| 		} | ||||
| 	} | ||||
| 	if v, ok := vtc.mutation.Purpose(); ok { | ||||
| 		if err := verifytoken.PurposeValidator(v); err != nil { | ||||
| 			return &ValidationError{Name: "purpose", err: fmt.Errorf(`ent: validator failed for field "VerifyToken.purpose": %w`, err)} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (vtc *VerifyTokenCreate) sqlSave(ctx context.Context) (*VerifyToken, error) { | ||||
| 	if err := vtc.check(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_node, _spec := vtc.createSpec() | ||||
| 	if err := sqlgraph.CreateNode(ctx, vtc.driver, _spec); err != nil { | ||||
| 		if sqlgraph.IsConstraintError(err) { | ||||
| 			err = &ConstraintError{msg: err.Error(), wrap: err} | ||||
| 		} | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if _spec.ID.Value != _node.ID { | ||||
| 		id := _spec.ID.Value.(int64) | ||||
| 		_node.ID = int64(id) | ||||
| 	} | ||||
| 	vtc.mutation.id = &_node.ID | ||||
| 	vtc.mutation.done = true | ||||
| 	return _node, nil | ||||
| } | ||||
|  | ||||
| func (vtc *VerifyTokenCreate) createSpec() (*VerifyToken, *sqlgraph.CreateSpec) { | ||||
| 	var ( | ||||
| 		_node = &VerifyToken{config: vtc.config} | ||||
| 		_spec = sqlgraph.NewCreateSpec(verifytoken.Table, sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64)) | ||||
| 	) | ||||
| 	if id, ok := vtc.mutation.ID(); ok { | ||||
| 		_node.ID = id | ||||
| 		_spec.ID.Value = id | ||||
| 	} | ||||
| 	if value, ok := vtc.mutation.CreatedAt(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldCreatedAt, field.TypeTime, value) | ||||
| 		_node.CreatedAt = value | ||||
| 	} | ||||
| 	if value, ok := vtc.mutation.ExpiresAt(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldExpiresAt, field.TypeTime, value) | ||||
| 		_node.ExpiresAt = value | ||||
| 	} | ||||
| 	if value, ok := vtc.mutation.Token(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldToken, field.TypeString, value) | ||||
| 		_node.Token = value | ||||
| 	} | ||||
| 	if value, ok := vtc.mutation.Purpose(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldPurpose, field.TypeString, value) | ||||
| 		_node.Purpose = value | ||||
| 	} | ||||
| 	if nodes := vtc.mutation.UserIDs(); len(nodes) > 0 { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.M2O, | ||||
| 			Inverse: true, | ||||
| 			Table:   verifytoken.UserTable, | ||||
| 			Columns: []string{verifytoken.UserColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		for _, k := range nodes { | ||||
| 			edge.Target.Nodes = append(edge.Target.Nodes, k) | ||||
| 		} | ||||
| 		_node.user_id = &nodes[0] | ||||
| 		_spec.Edges = append(_spec.Edges, edge) | ||||
| 	} | ||||
| 	return _node, _spec | ||||
| } | ||||
|  | ||||
| // VerifyTokenCreateBulk is the builder for creating many VerifyToken entities in bulk. | ||||
| type VerifyTokenCreateBulk struct { | ||||
| 	config | ||||
| 	err      error | ||||
| 	builders []*VerifyTokenCreate | ||||
| } | ||||
|  | ||||
| // Save creates the VerifyToken entities in the database. | ||||
| func (vtcb *VerifyTokenCreateBulk) Save(ctx context.Context) ([]*VerifyToken, error) { | ||||
| 	if vtcb.err != nil { | ||||
| 		return nil, vtcb.err | ||||
| 	} | ||||
| 	specs := make([]*sqlgraph.CreateSpec, len(vtcb.builders)) | ||||
| 	nodes := make([]*VerifyToken, len(vtcb.builders)) | ||||
| 	mutators := make([]Mutator, len(vtcb.builders)) | ||||
| 	for i := range vtcb.builders { | ||||
| 		func(i int, root context.Context) { | ||||
| 			builder := vtcb.builders[i] | ||||
| 			builder.defaults() | ||||
| 			var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) { | ||||
| 				mutation, ok := m.(*VerifyTokenMutation) | ||||
| 				if !ok { | ||||
| 					return nil, fmt.Errorf("unexpected mutation type %T", m) | ||||
| 				} | ||||
| 				if err := builder.check(); err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				builder.mutation = mutation | ||||
| 				var err error | ||||
| 				nodes[i], specs[i] = builder.createSpec() | ||||
| 				if i < len(mutators)-1 { | ||||
| 					_, err = mutators[i+1].Mutate(root, vtcb.builders[i+1].mutation) | ||||
| 				} else { | ||||
| 					spec := &sqlgraph.BatchCreateSpec{Nodes: specs} | ||||
| 					// Invoke the actual operation on the latest mutation in the chain. | ||||
| 					if err = sqlgraph.BatchCreate(ctx, vtcb.driver, spec); err != nil { | ||||
| 						if sqlgraph.IsConstraintError(err) { | ||||
| 							err = &ConstraintError{msg: err.Error(), wrap: err} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				mutation.id = &nodes[i].ID | ||||
| 				if specs[i].ID.Value != nil && nodes[i].ID == 0 { | ||||
| 					id := specs[i].ID.Value.(int64) | ||||
| 					nodes[i].ID = int64(id) | ||||
| 				} | ||||
| 				mutation.done = true | ||||
| 				return nodes[i], nil | ||||
| 			}) | ||||
| 			for i := len(builder.hooks) - 1; i >= 0; i-- { | ||||
| 				mut = builder.hooks[i](mut) | ||||
| 			} | ||||
| 			mutators[i] = mut | ||||
| 		}(i, ctx) | ||||
| 	} | ||||
| 	if len(mutators) > 0 { | ||||
| 		if _, err := mutators[0].Mutate(ctx, vtcb.builders[0].mutation); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 	return nodes, nil | ||||
| } | ||||
|  | ||||
| // SaveX is like Save, but panics if an error occurs. | ||||
| func (vtcb *VerifyTokenCreateBulk) SaveX(ctx context.Context) []*VerifyToken { | ||||
| 	v, err := vtcb.Save(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| // Exec executes the query. | ||||
| func (vtcb *VerifyTokenCreateBulk) Exec(ctx context.Context) error { | ||||
| 	_, err := vtcb.Save(ctx) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // ExecX is like Exec, but panics if an error occurs. | ||||
| func (vtcb *VerifyTokenCreateBulk) ExecX(ctx context.Context) { | ||||
| 	if err := vtcb.Exec(ctx); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										88
									
								
								db/ent/verifytoken_delete.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								db/ent/verifytoken_delete.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package ent | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
|  | ||||
| 	"entgo.io/ent/dialect/sql" | ||||
| 	"entgo.io/ent/dialect/sql/sqlgraph" | ||||
| 	"entgo.io/ent/schema/field" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // VerifyTokenDelete is the builder for deleting a VerifyToken entity. | ||||
| type VerifyTokenDelete struct { | ||||
| 	config | ||||
| 	hooks    []Hook | ||||
| 	mutation *VerifyTokenMutation | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the VerifyTokenDelete builder. | ||||
| func (vtd *VerifyTokenDelete) Where(ps ...predicate.VerifyToken) *VerifyTokenDelete { | ||||
| 	vtd.mutation.Where(ps...) | ||||
| 	return vtd | ||||
| } | ||||
|  | ||||
| // Exec executes the deletion query and returns how many vertices were deleted. | ||||
| func (vtd *VerifyTokenDelete) Exec(ctx context.Context) (int, error) { | ||||
| 	return withHooks(ctx, vtd.sqlExec, vtd.mutation, vtd.hooks) | ||||
| } | ||||
|  | ||||
| // ExecX is like Exec, but panics if an error occurs. | ||||
| func (vtd *VerifyTokenDelete) ExecX(ctx context.Context) int { | ||||
| 	n, err := vtd.Exec(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (vtd *VerifyTokenDelete) sqlExec(ctx context.Context) (int, error) { | ||||
| 	_spec := sqlgraph.NewDeleteSpec(verifytoken.Table, sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64)) | ||||
| 	if ps := vtd.mutation.predicates; len(ps) > 0 { | ||||
| 		_spec.Predicate = func(selector *sql.Selector) { | ||||
| 			for i := range ps { | ||||
| 				ps[i](selector) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	affected, err := sqlgraph.DeleteNodes(ctx, vtd.driver, _spec) | ||||
| 	if err != nil && sqlgraph.IsConstraintError(err) { | ||||
| 		err = &ConstraintError{msg: err.Error(), wrap: err} | ||||
| 	} | ||||
| 	vtd.mutation.done = true | ||||
| 	return affected, err | ||||
| } | ||||
|  | ||||
| // VerifyTokenDeleteOne is the builder for deleting a single VerifyToken entity. | ||||
| type VerifyTokenDeleteOne struct { | ||||
| 	vtd *VerifyTokenDelete | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the VerifyTokenDelete builder. | ||||
| func (vtdo *VerifyTokenDeleteOne) Where(ps ...predicate.VerifyToken) *VerifyTokenDeleteOne { | ||||
| 	vtdo.vtd.mutation.Where(ps...) | ||||
| 	return vtdo | ||||
| } | ||||
|  | ||||
| // Exec executes the deletion query. | ||||
| func (vtdo *VerifyTokenDeleteOne) Exec(ctx context.Context) error { | ||||
| 	n, err := vtdo.vtd.Exec(ctx) | ||||
| 	switch { | ||||
| 	case err != nil: | ||||
| 		return err | ||||
| 	case n == 0: | ||||
| 		return &NotFoundError{verifytoken.Label} | ||||
| 	default: | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ExecX is like Exec, but panics if an error occurs. | ||||
| func (vtdo *VerifyTokenDeleteOne) ExecX(ctx context.Context) { | ||||
| 	if err := vtdo.Exec(ctx); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										614
									
								
								db/ent/verifytoken_query.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										614
									
								
								db/ent/verifytoken_query.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,614 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package ent | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
|  | ||||
| 	"entgo.io/ent" | ||||
| 	"entgo.io/ent/dialect/sql" | ||||
| 	"entgo.io/ent/dialect/sql/sqlgraph" | ||||
| 	"entgo.io/ent/schema/field" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // VerifyTokenQuery is the builder for querying VerifyToken entities. | ||||
| type VerifyTokenQuery struct { | ||||
| 	config | ||||
| 	ctx        *QueryContext | ||||
| 	order      []verifytoken.OrderOption | ||||
| 	inters     []Interceptor | ||||
| 	predicates []predicate.VerifyToken | ||||
| 	withUser   *UserQuery | ||||
| 	withFKs    bool | ||||
| 	// intermediate query (i.e. traversal path). | ||||
| 	sql  *sql.Selector | ||||
| 	path func(context.Context) (*sql.Selector, error) | ||||
| } | ||||
|  | ||||
| // Where adds a new predicate for the VerifyTokenQuery builder. | ||||
| func (vtq *VerifyTokenQuery) Where(ps ...predicate.VerifyToken) *VerifyTokenQuery { | ||||
| 	vtq.predicates = append(vtq.predicates, ps...) | ||||
| 	return vtq | ||||
| } | ||||
|  | ||||
| // Limit the number of records to be returned by this query. | ||||
| func (vtq *VerifyTokenQuery) Limit(limit int) *VerifyTokenQuery { | ||||
| 	vtq.ctx.Limit = &limit | ||||
| 	return vtq | ||||
| } | ||||
|  | ||||
| // Offset to start from. | ||||
| func (vtq *VerifyTokenQuery) Offset(offset int) *VerifyTokenQuery { | ||||
| 	vtq.ctx.Offset = &offset | ||||
| 	return vtq | ||||
| } | ||||
|  | ||||
| // Unique configures the query builder to filter duplicate records on query. | ||||
| // By default, unique is set to true, and can be disabled using this method. | ||||
| func (vtq *VerifyTokenQuery) Unique(unique bool) *VerifyTokenQuery { | ||||
| 	vtq.ctx.Unique = &unique | ||||
| 	return vtq | ||||
| } | ||||
|  | ||||
| // Order specifies how the records should be ordered. | ||||
| func (vtq *VerifyTokenQuery) Order(o ...verifytoken.OrderOption) *VerifyTokenQuery { | ||||
| 	vtq.order = append(vtq.order, o...) | ||||
| 	return vtq | ||||
| } | ||||
|  | ||||
| // QueryUser chains the current query on the "user" edge. | ||||
| func (vtq *VerifyTokenQuery) QueryUser() *UserQuery { | ||||
| 	query := (&UserClient{config: vtq.config}).Query() | ||||
| 	query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { | ||||
| 		if err := vtq.prepareQuery(ctx); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		selector := vtq.sqlQuery(ctx) | ||||
| 		if err := selector.Err(); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		step := sqlgraph.NewStep( | ||||
| 			sqlgraph.From(verifytoken.Table, verifytoken.FieldID, selector), | ||||
| 			sqlgraph.To(user.Table, user.FieldID), | ||||
| 			sqlgraph.Edge(sqlgraph.M2O, true, verifytoken.UserTable, verifytoken.UserColumn), | ||||
| 		) | ||||
| 		fromU = sqlgraph.SetNeighbors(vtq.driver.Dialect(), step) | ||||
| 		return fromU, nil | ||||
| 	} | ||||
| 	return query | ||||
| } | ||||
|  | ||||
| // First returns the first VerifyToken entity from the query. | ||||
| // Returns a *NotFoundError when no VerifyToken was found. | ||||
| func (vtq *VerifyTokenQuery) First(ctx context.Context) (*VerifyToken, error) { | ||||
| 	nodes, err := vtq.Limit(1).All(setContextOp(ctx, vtq.ctx, ent.OpQueryFirst)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if len(nodes) == 0 { | ||||
| 		return nil, &NotFoundError{verifytoken.Label} | ||||
| 	} | ||||
| 	return nodes[0], nil | ||||
| } | ||||
|  | ||||
| // FirstX is like First, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) FirstX(ctx context.Context) *VerifyToken { | ||||
| 	node, err := vtq.First(ctx) | ||||
| 	if err != nil && !IsNotFound(err) { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return node | ||||
| } | ||||
|  | ||||
| // FirstID returns the first VerifyToken ID from the query. | ||||
| // Returns a *NotFoundError when no VerifyToken ID was found. | ||||
| func (vtq *VerifyTokenQuery) FirstID(ctx context.Context) (id int64, err error) { | ||||
| 	var ids []int64 | ||||
| 	if ids, err = vtq.Limit(1).IDs(setContextOp(ctx, vtq.ctx, ent.OpQueryFirstID)); err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if len(ids) == 0 { | ||||
| 		err = &NotFoundError{verifytoken.Label} | ||||
| 		return | ||||
| 	} | ||||
| 	return ids[0], nil | ||||
| } | ||||
|  | ||||
| // FirstIDX is like FirstID, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) FirstIDX(ctx context.Context) int64 { | ||||
| 	id, err := vtq.FirstID(ctx) | ||||
| 	if err != nil && !IsNotFound(err) { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return id | ||||
| } | ||||
|  | ||||
| // Only returns a single VerifyToken entity found by the query, ensuring it only returns one. | ||||
| // Returns a *NotSingularError when more than one VerifyToken entity is found. | ||||
| // Returns a *NotFoundError when no VerifyToken entities are found. | ||||
| func (vtq *VerifyTokenQuery) Only(ctx context.Context) (*VerifyToken, error) { | ||||
| 	nodes, err := vtq.Limit(2).All(setContextOp(ctx, vtq.ctx, ent.OpQueryOnly)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	switch len(nodes) { | ||||
| 	case 1: | ||||
| 		return nodes[0], nil | ||||
| 	case 0: | ||||
| 		return nil, &NotFoundError{verifytoken.Label} | ||||
| 	default: | ||||
| 		return nil, &NotSingularError{verifytoken.Label} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // OnlyX is like Only, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) OnlyX(ctx context.Context) *VerifyToken { | ||||
| 	node, err := vtq.Only(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return node | ||||
| } | ||||
|  | ||||
| // OnlyID is like Only, but returns the only VerifyToken ID in the query. | ||||
| // Returns a *NotSingularError when more than one VerifyToken ID is found. | ||||
| // Returns a *NotFoundError when no entities are found. | ||||
| func (vtq *VerifyTokenQuery) OnlyID(ctx context.Context) (id int64, err error) { | ||||
| 	var ids []int64 | ||||
| 	if ids, err = vtq.Limit(2).IDs(setContextOp(ctx, vtq.ctx, ent.OpQueryOnlyID)); err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	switch len(ids) { | ||||
| 	case 1: | ||||
| 		id = ids[0] | ||||
| 	case 0: | ||||
| 		err = &NotFoundError{verifytoken.Label} | ||||
| 	default: | ||||
| 		err = &NotSingularError{verifytoken.Label} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // OnlyIDX is like OnlyID, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) OnlyIDX(ctx context.Context) int64 { | ||||
| 	id, err := vtq.OnlyID(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return id | ||||
| } | ||||
|  | ||||
| // All executes the query and returns a list of VerifyTokens. | ||||
| func (vtq *VerifyTokenQuery) All(ctx context.Context) ([]*VerifyToken, error) { | ||||
| 	ctx = setContextOp(ctx, vtq.ctx, ent.OpQueryAll) | ||||
| 	if err := vtq.prepareQuery(ctx); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	qr := querierAll[[]*VerifyToken, *VerifyTokenQuery]() | ||||
| 	return withInterceptors[[]*VerifyToken](ctx, vtq, qr, vtq.inters) | ||||
| } | ||||
|  | ||||
| // AllX is like All, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) AllX(ctx context.Context) []*VerifyToken { | ||||
| 	nodes, err := vtq.All(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return nodes | ||||
| } | ||||
|  | ||||
| // IDs executes the query and returns a list of VerifyToken IDs. | ||||
| func (vtq *VerifyTokenQuery) IDs(ctx context.Context) (ids []int64, err error) { | ||||
| 	if vtq.ctx.Unique == nil && vtq.path != nil { | ||||
| 		vtq.Unique(true) | ||||
| 	} | ||||
| 	ctx = setContextOp(ctx, vtq.ctx, ent.OpQueryIDs) | ||||
| 	if err = vtq.Select(verifytoken.FieldID).Scan(ctx, &ids); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return ids, nil | ||||
| } | ||||
|  | ||||
| // IDsX is like IDs, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) IDsX(ctx context.Context) []int64 { | ||||
| 	ids, err := vtq.IDs(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return ids | ||||
| } | ||||
|  | ||||
| // Count returns the count of the given query. | ||||
| func (vtq *VerifyTokenQuery) Count(ctx context.Context) (int, error) { | ||||
| 	ctx = setContextOp(ctx, vtq.ctx, ent.OpQueryCount) | ||||
| 	if err := vtq.prepareQuery(ctx); err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return withInterceptors[int](ctx, vtq, querierCount[*VerifyTokenQuery](), vtq.inters) | ||||
| } | ||||
|  | ||||
| // CountX is like Count, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) CountX(ctx context.Context) int { | ||||
| 	count, err := vtq.Count(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return count | ||||
| } | ||||
|  | ||||
| // Exist returns true if the query has elements in the graph. | ||||
| func (vtq *VerifyTokenQuery) Exist(ctx context.Context) (bool, error) { | ||||
| 	ctx = setContextOp(ctx, vtq.ctx, ent.OpQueryExist) | ||||
| 	switch _, err := vtq.FirstID(ctx); { | ||||
| 	case IsNotFound(err): | ||||
| 		return false, nil | ||||
| 	case err != nil: | ||||
| 		return false, fmt.Errorf("ent: check existence: %w", err) | ||||
| 	default: | ||||
| 		return true, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ExistX is like Exist, but panics if an error occurs. | ||||
| func (vtq *VerifyTokenQuery) ExistX(ctx context.Context) bool { | ||||
| 	exist, err := vtq.Exist(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return exist | ||||
| } | ||||
|  | ||||
| // Clone returns a duplicate of the VerifyTokenQuery builder, including all associated steps. It can be | ||||
| // used to prepare common query builders and use them differently after the clone is made. | ||||
| func (vtq *VerifyTokenQuery) Clone() *VerifyTokenQuery { | ||||
| 	if vtq == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return &VerifyTokenQuery{ | ||||
| 		config:     vtq.config, | ||||
| 		ctx:        vtq.ctx.Clone(), | ||||
| 		order:      append([]verifytoken.OrderOption{}, vtq.order...), | ||||
| 		inters:     append([]Interceptor{}, vtq.inters...), | ||||
| 		predicates: append([]predicate.VerifyToken{}, vtq.predicates...), | ||||
| 		withUser:   vtq.withUser.Clone(), | ||||
| 		// clone intermediate query. | ||||
| 		sql:  vtq.sql.Clone(), | ||||
| 		path: vtq.path, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithUser tells the query-builder to eager-load the nodes that are connected to | ||||
| // the "user" edge. The optional arguments are used to configure the query builder of the edge. | ||||
| func (vtq *VerifyTokenQuery) WithUser(opts ...func(*UserQuery)) *VerifyTokenQuery { | ||||
| 	query := (&UserClient{config: vtq.config}).Query() | ||||
| 	for _, opt := range opts { | ||||
| 		opt(query) | ||||
| 	} | ||||
| 	vtq.withUser = query | ||||
| 	return vtq | ||||
| } | ||||
|  | ||||
| // GroupBy is used to group vertices by one or more fields/columns. | ||||
| // It is often used with aggregate functions, like: count, max, mean, min, sum. | ||||
| // | ||||
| // Example: | ||||
| // | ||||
| //	var v []struct { | ||||
| //		CreatedAt time.Time `json:"createdAt"` | ||||
| //		Count int `json:"count,omitempty"` | ||||
| //	} | ||||
| // | ||||
| //	client.VerifyToken.Query(). | ||||
| //		GroupBy(verifytoken.FieldCreatedAt). | ||||
| //		Aggregate(ent.Count()). | ||||
| //		Scan(ctx, &v) | ||||
| func (vtq *VerifyTokenQuery) GroupBy(field string, fields ...string) *VerifyTokenGroupBy { | ||||
| 	vtq.ctx.Fields = append([]string{field}, fields...) | ||||
| 	grbuild := &VerifyTokenGroupBy{build: vtq} | ||||
| 	grbuild.flds = &vtq.ctx.Fields | ||||
| 	grbuild.label = verifytoken.Label | ||||
| 	grbuild.scan = grbuild.Scan | ||||
| 	return grbuild | ||||
| } | ||||
|  | ||||
| // Select allows the selection one or more fields/columns for the given query, | ||||
| // instead of selecting all fields in the entity. | ||||
| // | ||||
| // Example: | ||||
| // | ||||
| //	var v []struct { | ||||
| //		CreatedAt time.Time `json:"createdAt"` | ||||
| //	} | ||||
| // | ||||
| //	client.VerifyToken.Query(). | ||||
| //		Select(verifytoken.FieldCreatedAt). | ||||
| //		Scan(ctx, &v) | ||||
| func (vtq *VerifyTokenQuery) Select(fields ...string) *VerifyTokenSelect { | ||||
| 	vtq.ctx.Fields = append(vtq.ctx.Fields, fields...) | ||||
| 	sbuild := &VerifyTokenSelect{VerifyTokenQuery: vtq} | ||||
| 	sbuild.label = verifytoken.Label | ||||
| 	sbuild.flds, sbuild.scan = &vtq.ctx.Fields, sbuild.Scan | ||||
| 	return sbuild | ||||
| } | ||||
|  | ||||
| // Aggregate returns a VerifyTokenSelect configured with the given aggregations. | ||||
| func (vtq *VerifyTokenQuery) Aggregate(fns ...AggregateFunc) *VerifyTokenSelect { | ||||
| 	return vtq.Select().Aggregate(fns...) | ||||
| } | ||||
|  | ||||
| func (vtq *VerifyTokenQuery) prepareQuery(ctx context.Context) error { | ||||
| 	for _, inter := range vtq.inters { | ||||
| 		if inter == nil { | ||||
| 			return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)") | ||||
| 		} | ||||
| 		if trv, ok := inter.(Traverser); ok { | ||||
| 			if err := trv.Traverse(ctx, vtq); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for _, f := range vtq.ctx.Fields { | ||||
| 		if !verifytoken.ValidColumn(f) { | ||||
| 			return &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)} | ||||
| 		} | ||||
| 	} | ||||
| 	if vtq.path != nil { | ||||
| 		prev, err := vtq.path(ctx) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		vtq.sql = prev | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (vtq *VerifyTokenQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*VerifyToken, error) { | ||||
| 	var ( | ||||
| 		nodes       = []*VerifyToken{} | ||||
| 		withFKs     = vtq.withFKs | ||||
| 		_spec       = vtq.querySpec() | ||||
| 		loadedTypes = [1]bool{ | ||||
| 			vtq.withUser != nil, | ||||
| 		} | ||||
| 	) | ||||
| 	if vtq.withUser != nil { | ||||
| 		withFKs = true | ||||
| 	} | ||||
| 	if withFKs { | ||||
| 		_spec.Node.Columns = append(_spec.Node.Columns, verifytoken.ForeignKeys...) | ||||
| 	} | ||||
| 	_spec.ScanValues = func(columns []string) ([]any, error) { | ||||
| 		return (*VerifyToken).scanValues(nil, columns) | ||||
| 	} | ||||
| 	_spec.Assign = func(columns []string, values []any) error { | ||||
| 		node := &VerifyToken{config: vtq.config} | ||||
| 		nodes = append(nodes, node) | ||||
| 		node.Edges.loadedTypes = loadedTypes | ||||
| 		return node.assignValues(columns, values) | ||||
| 	} | ||||
| 	for i := range hooks { | ||||
| 		hooks[i](ctx, _spec) | ||||
| 	} | ||||
| 	if err := sqlgraph.QueryNodes(ctx, vtq.driver, _spec); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if len(nodes) == 0 { | ||||
| 		return nodes, nil | ||||
| 	} | ||||
| 	if query := vtq.withUser; query != nil { | ||||
| 		if err := vtq.loadUser(ctx, query, nodes, nil, | ||||
| 			func(n *VerifyToken, e *User) { n.Edges.User = e }); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 	return nodes, nil | ||||
| } | ||||
|  | ||||
| func (vtq *VerifyTokenQuery) loadUser(ctx context.Context, query *UserQuery, nodes []*VerifyToken, init func(*VerifyToken), assign func(*VerifyToken, *User)) error { | ||||
| 	ids := make([]int64, 0, len(nodes)) | ||||
| 	nodeids := make(map[int64][]*VerifyToken) | ||||
| 	for i := range nodes { | ||||
| 		if nodes[i].user_id == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		fk := *nodes[i].user_id | ||||
| 		if _, ok := nodeids[fk]; !ok { | ||||
| 			ids = append(ids, fk) | ||||
| 		} | ||||
| 		nodeids[fk] = append(nodeids[fk], nodes[i]) | ||||
| 	} | ||||
| 	if len(ids) == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	query.Where(user.IDIn(ids...)) | ||||
| 	neighbors, err := query.All(ctx) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, n := range neighbors { | ||||
| 		nodes, ok := nodeids[n.ID] | ||||
| 		if !ok { | ||||
| 			return fmt.Errorf(`unexpected foreign-key "user_id" returned %v`, n.ID) | ||||
| 		} | ||||
| 		for i := range nodes { | ||||
| 			assign(nodes[i], n) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (vtq *VerifyTokenQuery) sqlCount(ctx context.Context) (int, error) { | ||||
| 	_spec := vtq.querySpec() | ||||
| 	_spec.Node.Columns = vtq.ctx.Fields | ||||
| 	if len(vtq.ctx.Fields) > 0 { | ||||
| 		_spec.Unique = vtq.ctx.Unique != nil && *vtq.ctx.Unique | ||||
| 	} | ||||
| 	return sqlgraph.CountNodes(ctx, vtq.driver, _spec) | ||||
| } | ||||
|  | ||||
| func (vtq *VerifyTokenQuery) querySpec() *sqlgraph.QuerySpec { | ||||
| 	_spec := sqlgraph.NewQuerySpec(verifytoken.Table, verifytoken.Columns, sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64)) | ||||
| 	_spec.From = vtq.sql | ||||
| 	if unique := vtq.ctx.Unique; unique != nil { | ||||
| 		_spec.Unique = *unique | ||||
| 	} else if vtq.path != nil { | ||||
| 		_spec.Unique = true | ||||
| 	} | ||||
| 	if fields := vtq.ctx.Fields; len(fields) > 0 { | ||||
| 		_spec.Node.Columns = make([]string, 0, len(fields)) | ||||
| 		_spec.Node.Columns = append(_spec.Node.Columns, verifytoken.FieldID) | ||||
| 		for i := range fields { | ||||
| 			if fields[i] != verifytoken.FieldID { | ||||
| 				_spec.Node.Columns = append(_spec.Node.Columns, fields[i]) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if ps := vtq.predicates; len(ps) > 0 { | ||||
| 		_spec.Predicate = func(selector *sql.Selector) { | ||||
| 			for i := range ps { | ||||
| 				ps[i](selector) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if limit := vtq.ctx.Limit; limit != nil { | ||||
| 		_spec.Limit = *limit | ||||
| 	} | ||||
| 	if offset := vtq.ctx.Offset; offset != nil { | ||||
| 		_spec.Offset = *offset | ||||
| 	} | ||||
| 	if ps := vtq.order; len(ps) > 0 { | ||||
| 		_spec.Order = func(selector *sql.Selector) { | ||||
| 			for i := range ps { | ||||
| 				ps[i](selector) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return _spec | ||||
| } | ||||
|  | ||||
| func (vtq *VerifyTokenQuery) sqlQuery(ctx context.Context) *sql.Selector { | ||||
| 	builder := sql.Dialect(vtq.driver.Dialect()) | ||||
| 	t1 := builder.Table(verifytoken.Table) | ||||
| 	columns := vtq.ctx.Fields | ||||
| 	if len(columns) == 0 { | ||||
| 		columns = verifytoken.Columns | ||||
| 	} | ||||
| 	selector := builder.Select(t1.Columns(columns...)...).From(t1) | ||||
| 	if vtq.sql != nil { | ||||
| 		selector = vtq.sql | ||||
| 		selector.Select(selector.Columns(columns...)...) | ||||
| 	} | ||||
| 	if vtq.ctx.Unique != nil && *vtq.ctx.Unique { | ||||
| 		selector.Distinct() | ||||
| 	} | ||||
| 	for _, p := range vtq.predicates { | ||||
| 		p(selector) | ||||
| 	} | ||||
| 	for _, p := range vtq.order { | ||||
| 		p(selector) | ||||
| 	} | ||||
| 	if offset := vtq.ctx.Offset; offset != nil { | ||||
| 		// limit is mandatory for offset clause. We start | ||||
| 		// with default value, and override it below if needed. | ||||
| 		selector.Offset(*offset).Limit(math.MaxInt32) | ||||
| 	} | ||||
| 	if limit := vtq.ctx.Limit; limit != nil { | ||||
| 		selector.Limit(*limit) | ||||
| 	} | ||||
| 	return selector | ||||
| } | ||||
|  | ||||
| // VerifyTokenGroupBy is the group-by builder for VerifyToken entities. | ||||
| type VerifyTokenGroupBy struct { | ||||
| 	selector | ||||
| 	build *VerifyTokenQuery | ||||
| } | ||||
|  | ||||
| // Aggregate adds the given aggregation functions to the group-by query. | ||||
| func (vtgb *VerifyTokenGroupBy) Aggregate(fns ...AggregateFunc) *VerifyTokenGroupBy { | ||||
| 	vtgb.fns = append(vtgb.fns, fns...) | ||||
| 	return vtgb | ||||
| } | ||||
|  | ||||
| // Scan applies the selector query and scans the result into the given value. | ||||
| func (vtgb *VerifyTokenGroupBy) Scan(ctx context.Context, v any) error { | ||||
| 	ctx = setContextOp(ctx, vtgb.build.ctx, ent.OpQueryGroupBy) | ||||
| 	if err := vtgb.build.prepareQuery(ctx); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return scanWithInterceptors[*VerifyTokenQuery, *VerifyTokenGroupBy](ctx, vtgb.build, vtgb, vtgb.build.inters, v) | ||||
| } | ||||
|  | ||||
| func (vtgb *VerifyTokenGroupBy) sqlScan(ctx context.Context, root *VerifyTokenQuery, v any) error { | ||||
| 	selector := root.sqlQuery(ctx).Select() | ||||
| 	aggregation := make([]string, 0, len(vtgb.fns)) | ||||
| 	for _, fn := range vtgb.fns { | ||||
| 		aggregation = append(aggregation, fn(selector)) | ||||
| 	} | ||||
| 	if len(selector.SelectedColumns()) == 0 { | ||||
| 		columns := make([]string, 0, len(*vtgb.flds)+len(vtgb.fns)) | ||||
| 		for _, f := range *vtgb.flds { | ||||
| 			columns = append(columns, selector.C(f)) | ||||
| 		} | ||||
| 		columns = append(columns, aggregation...) | ||||
| 		selector.Select(columns...) | ||||
| 	} | ||||
| 	selector.GroupBy(selector.Columns(*vtgb.flds...)...) | ||||
| 	if err := selector.Err(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	rows := &sql.Rows{} | ||||
| 	query, args := selector.Query() | ||||
| 	if err := vtgb.build.driver.Query(ctx, query, args, rows); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer rows.Close() | ||||
| 	return sql.ScanSlice(rows, v) | ||||
| } | ||||
|  | ||||
| // VerifyTokenSelect is the builder for selecting fields of VerifyToken entities. | ||||
| type VerifyTokenSelect struct { | ||||
| 	*VerifyTokenQuery | ||||
| 	selector | ||||
| } | ||||
|  | ||||
| // Aggregate adds the given aggregation functions to the selector query. | ||||
| func (vts *VerifyTokenSelect) Aggregate(fns ...AggregateFunc) *VerifyTokenSelect { | ||||
| 	vts.fns = append(vts.fns, fns...) | ||||
| 	return vts | ||||
| } | ||||
|  | ||||
| // Scan applies the selector query and scans the result into the given value. | ||||
| func (vts *VerifyTokenSelect) Scan(ctx context.Context, v any) error { | ||||
| 	ctx = setContextOp(ctx, vts.ctx, ent.OpQuerySelect) | ||||
| 	if err := vts.prepareQuery(ctx); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return scanWithInterceptors[*VerifyTokenQuery, *VerifyTokenSelect](ctx, vts.VerifyTokenQuery, vts, vts.inters, v) | ||||
| } | ||||
|  | ||||
| func (vts *VerifyTokenSelect) sqlScan(ctx context.Context, root *VerifyTokenQuery, v any) error { | ||||
| 	selector := root.sqlQuery(ctx) | ||||
| 	aggregation := make([]string, 0, len(vts.fns)) | ||||
| 	for _, fn := range vts.fns { | ||||
| 		aggregation = append(aggregation, fn(selector)) | ||||
| 	} | ||||
| 	switch n := len(*vts.selector.flds); { | ||||
| 	case n == 0 && len(aggregation) > 0: | ||||
| 		selector.Select(aggregation...) | ||||
| 	case n != 0 && len(aggregation) > 0: | ||||
| 		selector.AppendSelect(aggregation...) | ||||
| 	} | ||||
| 	rows := &sql.Rows{} | ||||
| 	query, args := selector.Query() | ||||
| 	if err := vts.driver.Query(ctx, query, args, rows); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer rows.Close() | ||||
| 	return sql.ScanSlice(rows, v) | ||||
| } | ||||
							
								
								
									
										406
									
								
								db/ent/verifytoken_update.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										406
									
								
								db/ent/verifytoken_update.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,406 @@ | ||||
| // Code generated by ent, DO NOT EDIT. | ||||
|  | ||||
| package ent | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"entgo.io/ent/dialect/sql" | ||||
| 	"entgo.io/ent/dialect/sql/sqlgraph" | ||||
| 	"entgo.io/ent/schema/field" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| ) | ||||
|  | ||||
| // VerifyTokenUpdate is the builder for updating VerifyToken entities. | ||||
| type VerifyTokenUpdate struct { | ||||
| 	config | ||||
| 	hooks    []Hook | ||||
| 	mutation *VerifyTokenMutation | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the VerifyTokenUpdate builder. | ||||
| func (vtu *VerifyTokenUpdate) Where(ps ...predicate.VerifyToken) *VerifyTokenUpdate { | ||||
| 	vtu.mutation.Where(ps...) | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetToken sets the "token" field. | ||||
| func (vtu *VerifyTokenUpdate) SetToken(s string) *VerifyTokenUpdate { | ||||
| 	vtu.mutation.SetToken(s) | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetNillableToken sets the "token" field if the given value is not nil. | ||||
| func (vtu *VerifyTokenUpdate) SetNillableToken(s *string) *VerifyTokenUpdate { | ||||
| 	if s != nil { | ||||
| 		vtu.SetToken(*s) | ||||
| 	} | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetPurpose sets the "purpose" field. | ||||
| func (vtu *VerifyTokenUpdate) SetPurpose(s string) *VerifyTokenUpdate { | ||||
| 	vtu.mutation.SetPurpose(s) | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetNillablePurpose sets the "purpose" field if the given value is not nil. | ||||
| func (vtu *VerifyTokenUpdate) SetNillablePurpose(s *string) *VerifyTokenUpdate { | ||||
| 	if s != nil { | ||||
| 		vtu.SetPurpose(*s) | ||||
| 	} | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // ClearPurpose clears the value of the "purpose" field. | ||||
| func (vtu *VerifyTokenUpdate) ClearPurpose() *VerifyTokenUpdate { | ||||
| 	vtu.mutation.ClearPurpose() | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetUserID sets the "user" edge to the User entity by ID. | ||||
| func (vtu *VerifyTokenUpdate) SetUserID(id int64) *VerifyTokenUpdate { | ||||
| 	vtu.mutation.SetUserID(id) | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetNillableUserID sets the "user" edge to the User entity by ID if the given value is not nil. | ||||
| func (vtu *VerifyTokenUpdate) SetNillableUserID(id *int64) *VerifyTokenUpdate { | ||||
| 	if id != nil { | ||||
| 		vtu = vtu.SetUserID(*id) | ||||
| 	} | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // SetUser sets the "user" edge to the User entity. | ||||
| func (vtu *VerifyTokenUpdate) SetUser(u *User) *VerifyTokenUpdate { | ||||
| 	return vtu.SetUserID(u.ID) | ||||
| } | ||||
|  | ||||
| // Mutation returns the VerifyTokenMutation object of the builder. | ||||
| func (vtu *VerifyTokenUpdate) Mutation() *VerifyTokenMutation { | ||||
| 	return vtu.mutation | ||||
| } | ||||
|  | ||||
| // ClearUser clears the "user" edge to the User entity. | ||||
| func (vtu *VerifyTokenUpdate) ClearUser() *VerifyTokenUpdate { | ||||
| 	vtu.mutation.ClearUser() | ||||
| 	return vtu | ||||
| } | ||||
|  | ||||
| // Save executes the query and returns the number of nodes affected by the update operation. | ||||
| func (vtu *VerifyTokenUpdate) Save(ctx context.Context) (int, error) { | ||||
| 	return withHooks(ctx, vtu.sqlSave, vtu.mutation, vtu.hooks) | ||||
| } | ||||
|  | ||||
| // SaveX is like Save, but panics if an error occurs. | ||||
| func (vtu *VerifyTokenUpdate) SaveX(ctx context.Context) int { | ||||
| 	affected, err := vtu.Save(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return affected | ||||
| } | ||||
|  | ||||
| // Exec executes the query. | ||||
| func (vtu *VerifyTokenUpdate) Exec(ctx context.Context) error { | ||||
| 	_, err := vtu.Save(ctx) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // ExecX is like Exec, but panics if an error occurs. | ||||
| func (vtu *VerifyTokenUpdate) ExecX(ctx context.Context) { | ||||
| 	if err := vtu.Exec(ctx); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // check runs all checks and user-defined validators on the builder. | ||||
| func (vtu *VerifyTokenUpdate) check() error { | ||||
| 	if v, ok := vtu.mutation.Token(); ok { | ||||
| 		if err := verifytoken.TokenValidator(v); err != nil { | ||||
| 			return &ValidationError{Name: "token", err: fmt.Errorf(`ent: validator failed for field "VerifyToken.token": %w`, err)} | ||||
| 		} | ||||
| 	} | ||||
| 	if v, ok := vtu.mutation.Purpose(); ok { | ||||
| 		if err := verifytoken.PurposeValidator(v); err != nil { | ||||
| 			return &ValidationError{Name: "purpose", err: fmt.Errorf(`ent: validator failed for field "VerifyToken.purpose": %w`, err)} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (vtu *VerifyTokenUpdate) sqlSave(ctx context.Context) (n int, err error) { | ||||
| 	if err := vtu.check(); err != nil { | ||||
| 		return n, err | ||||
| 	} | ||||
| 	_spec := sqlgraph.NewUpdateSpec(verifytoken.Table, verifytoken.Columns, sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64)) | ||||
| 	if ps := vtu.mutation.predicates; len(ps) > 0 { | ||||
| 		_spec.Predicate = func(selector *sql.Selector) { | ||||
| 			for i := range ps { | ||||
| 				ps[i](selector) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if value, ok := vtu.mutation.Token(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldToken, field.TypeString, value) | ||||
| 	} | ||||
| 	if value, ok := vtu.mutation.Purpose(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldPurpose, field.TypeString, value) | ||||
| 	} | ||||
| 	if vtu.mutation.PurposeCleared() { | ||||
| 		_spec.ClearField(verifytoken.FieldPurpose, field.TypeString) | ||||
| 	} | ||||
| 	if vtu.mutation.UserCleared() { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.M2O, | ||||
| 			Inverse: true, | ||||
| 			Table:   verifytoken.UserTable, | ||||
| 			Columns: []string{verifytoken.UserColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		_spec.Edges.Clear = append(_spec.Edges.Clear, edge) | ||||
| 	} | ||||
| 	if nodes := vtu.mutation.UserIDs(); len(nodes) > 0 { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.M2O, | ||||
| 			Inverse: true, | ||||
| 			Table:   verifytoken.UserTable, | ||||
| 			Columns: []string{verifytoken.UserColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		for _, k := range nodes { | ||||
| 			edge.Target.Nodes = append(edge.Target.Nodes, k) | ||||
| 		} | ||||
| 		_spec.Edges.Add = append(_spec.Edges.Add, edge) | ||||
| 	} | ||||
| 	if n, err = sqlgraph.UpdateNodes(ctx, vtu.driver, _spec); err != nil { | ||||
| 		if _, ok := err.(*sqlgraph.NotFoundError); ok { | ||||
| 			err = &NotFoundError{verifytoken.Label} | ||||
| 		} else if sqlgraph.IsConstraintError(err) { | ||||
| 			err = &ConstraintError{msg: err.Error(), wrap: err} | ||||
| 		} | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	vtu.mutation.done = true | ||||
| 	return n, nil | ||||
| } | ||||
|  | ||||
| // VerifyTokenUpdateOne is the builder for updating a single VerifyToken entity. | ||||
| type VerifyTokenUpdateOne struct { | ||||
| 	config | ||||
| 	fields   []string | ||||
| 	hooks    []Hook | ||||
| 	mutation *VerifyTokenMutation | ||||
| } | ||||
|  | ||||
| // SetToken sets the "token" field. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetToken(s string) *VerifyTokenUpdateOne { | ||||
| 	vtuo.mutation.SetToken(s) | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // SetNillableToken sets the "token" field if the given value is not nil. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetNillableToken(s *string) *VerifyTokenUpdateOne { | ||||
| 	if s != nil { | ||||
| 		vtuo.SetToken(*s) | ||||
| 	} | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // SetPurpose sets the "purpose" field. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetPurpose(s string) *VerifyTokenUpdateOne { | ||||
| 	vtuo.mutation.SetPurpose(s) | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // SetNillablePurpose sets the "purpose" field if the given value is not nil. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetNillablePurpose(s *string) *VerifyTokenUpdateOne { | ||||
| 	if s != nil { | ||||
| 		vtuo.SetPurpose(*s) | ||||
| 	} | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // ClearPurpose clears the value of the "purpose" field. | ||||
| func (vtuo *VerifyTokenUpdateOne) ClearPurpose() *VerifyTokenUpdateOne { | ||||
| 	vtuo.mutation.ClearPurpose() | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // SetUserID sets the "user" edge to the User entity by ID. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetUserID(id int64) *VerifyTokenUpdateOne { | ||||
| 	vtuo.mutation.SetUserID(id) | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // SetNillableUserID sets the "user" edge to the User entity by ID if the given value is not nil. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetNillableUserID(id *int64) *VerifyTokenUpdateOne { | ||||
| 	if id != nil { | ||||
| 		vtuo = vtuo.SetUserID(*id) | ||||
| 	} | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // SetUser sets the "user" edge to the User entity. | ||||
| func (vtuo *VerifyTokenUpdateOne) SetUser(u *User) *VerifyTokenUpdateOne { | ||||
| 	return vtuo.SetUserID(u.ID) | ||||
| } | ||||
|  | ||||
| // Mutation returns the VerifyTokenMutation object of the builder. | ||||
| func (vtuo *VerifyTokenUpdateOne) Mutation() *VerifyTokenMutation { | ||||
| 	return vtuo.mutation | ||||
| } | ||||
|  | ||||
| // ClearUser clears the "user" edge to the User entity. | ||||
| func (vtuo *VerifyTokenUpdateOne) ClearUser() *VerifyTokenUpdateOne { | ||||
| 	vtuo.mutation.ClearUser() | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // Where appends a list predicates to the VerifyTokenUpdate builder. | ||||
| func (vtuo *VerifyTokenUpdateOne) Where(ps ...predicate.VerifyToken) *VerifyTokenUpdateOne { | ||||
| 	vtuo.mutation.Where(ps...) | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // Select allows selecting one or more fields (columns) of the returned entity. | ||||
| // The default is selecting all fields defined in the entity schema. | ||||
| func (vtuo *VerifyTokenUpdateOne) Select(field string, fields ...string) *VerifyTokenUpdateOne { | ||||
| 	vtuo.fields = append([]string{field}, fields...) | ||||
| 	return vtuo | ||||
| } | ||||
|  | ||||
| // Save executes the query and returns the updated VerifyToken entity. | ||||
| func (vtuo *VerifyTokenUpdateOne) Save(ctx context.Context) (*VerifyToken, error) { | ||||
| 	return withHooks(ctx, vtuo.sqlSave, vtuo.mutation, vtuo.hooks) | ||||
| } | ||||
|  | ||||
| // SaveX is like Save, but panics if an error occurs. | ||||
| func (vtuo *VerifyTokenUpdateOne) SaveX(ctx context.Context) *VerifyToken { | ||||
| 	node, err := vtuo.Save(ctx) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return node | ||||
| } | ||||
|  | ||||
| // Exec executes the query on the entity. | ||||
| func (vtuo *VerifyTokenUpdateOne) Exec(ctx context.Context) error { | ||||
| 	_, err := vtuo.Save(ctx) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // ExecX is like Exec, but panics if an error occurs. | ||||
| func (vtuo *VerifyTokenUpdateOne) ExecX(ctx context.Context) { | ||||
| 	if err := vtuo.Exec(ctx); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // check runs all checks and user-defined validators on the builder. | ||||
| func (vtuo *VerifyTokenUpdateOne) check() error { | ||||
| 	if v, ok := vtuo.mutation.Token(); ok { | ||||
| 		if err := verifytoken.TokenValidator(v); err != nil { | ||||
| 			return &ValidationError{Name: "token", err: fmt.Errorf(`ent: validator failed for field "VerifyToken.token": %w`, err)} | ||||
| 		} | ||||
| 	} | ||||
| 	if v, ok := vtuo.mutation.Purpose(); ok { | ||||
| 		if err := verifytoken.PurposeValidator(v); err != nil { | ||||
| 			return &ValidationError{Name: "purpose", err: fmt.Errorf(`ent: validator failed for field "VerifyToken.purpose": %w`, err)} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (vtuo *VerifyTokenUpdateOne) sqlSave(ctx context.Context) (_node *VerifyToken, err error) { | ||||
| 	if err := vtuo.check(); err != nil { | ||||
| 		return _node, err | ||||
| 	} | ||||
| 	_spec := sqlgraph.NewUpdateSpec(verifytoken.Table, verifytoken.Columns, sqlgraph.NewFieldSpec(verifytoken.FieldID, field.TypeInt64)) | ||||
| 	id, ok := vtuo.mutation.ID() | ||||
| 	if !ok { | ||||
| 		return nil, &ValidationError{Name: "id", err: errors.New(`ent: missing "VerifyToken.id" for update`)} | ||||
| 	} | ||||
| 	_spec.Node.ID.Value = id | ||||
| 	if fields := vtuo.fields; len(fields) > 0 { | ||||
| 		_spec.Node.Columns = make([]string, 0, len(fields)) | ||||
| 		_spec.Node.Columns = append(_spec.Node.Columns, verifytoken.FieldID) | ||||
| 		for _, f := range fields { | ||||
| 			if !verifytoken.ValidColumn(f) { | ||||
| 				return nil, &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)} | ||||
| 			} | ||||
| 			if f != verifytoken.FieldID { | ||||
| 				_spec.Node.Columns = append(_spec.Node.Columns, f) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if ps := vtuo.mutation.predicates; len(ps) > 0 { | ||||
| 		_spec.Predicate = func(selector *sql.Selector) { | ||||
| 			for i := range ps { | ||||
| 				ps[i](selector) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if value, ok := vtuo.mutation.Token(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldToken, field.TypeString, value) | ||||
| 	} | ||||
| 	if value, ok := vtuo.mutation.Purpose(); ok { | ||||
| 		_spec.SetField(verifytoken.FieldPurpose, field.TypeString, value) | ||||
| 	} | ||||
| 	if vtuo.mutation.PurposeCleared() { | ||||
| 		_spec.ClearField(verifytoken.FieldPurpose, field.TypeString) | ||||
| 	} | ||||
| 	if vtuo.mutation.UserCleared() { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.M2O, | ||||
| 			Inverse: true, | ||||
| 			Table:   verifytoken.UserTable, | ||||
| 			Columns: []string{verifytoken.UserColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		_spec.Edges.Clear = append(_spec.Edges.Clear, edge) | ||||
| 	} | ||||
| 	if nodes := vtuo.mutation.UserIDs(); len(nodes) > 0 { | ||||
| 		edge := &sqlgraph.EdgeSpec{ | ||||
| 			Rel:     sqlgraph.M2O, | ||||
| 			Inverse: true, | ||||
| 			Table:   verifytoken.UserTable, | ||||
| 			Columns: []string{verifytoken.UserColumn}, | ||||
| 			Bidi:    false, | ||||
| 			Target: &sqlgraph.EdgeTarget{ | ||||
| 				IDSpec: sqlgraph.NewFieldSpec(user.FieldID, field.TypeInt64), | ||||
| 			}, | ||||
| 		} | ||||
| 		for _, k := range nodes { | ||||
| 			edge.Target.Nodes = append(edge.Target.Nodes, k) | ||||
| 		} | ||||
| 		_spec.Edges.Add = append(_spec.Edges.Add, edge) | ||||
| 	} | ||||
| 	_node = &VerifyToken{config: vtuo.config} | ||||
| 	_spec.Assign = _node.assignValues | ||||
| 	_spec.ScanValues = _node.scanValues | ||||
| 	if err = sqlgraph.UpdateNode(ctx, vtuo.driver, _spec); err != nil { | ||||
| 		if _, ok := err.(*sqlgraph.NotFoundError); ok { | ||||
| 			err = &NotFoundError{verifytoken.Label} | ||||
| 		} else if sqlgraph.IsConstraintError(err) { | ||||
| 			err = &ConstraintError{msg: err.Error(), wrap: err} | ||||
| 		} | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	vtuo.mutation.done = true | ||||
| 	return _node, nil | ||||
| } | ||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -4,7 +4,9 @@ go 1.23.2 | ||||
|  | ||||
| require ( | ||||
| 	github.com/99designs/gqlgen v0.17.56 | ||||
| 	github.com/brianvoe/gofakeit/v7 v7.1.2 | ||||
| 	github.com/jackc/pgx/v5 v5.7.1 | ||||
| 	github.com/sqids/sqids-go v0.4.1 | ||||
| 	github.com/vektah/gqlparser/v2 v2.5.19 | ||||
| 	gitserver.in/patialtech/mux v0.3.1 | ||||
| 	golang.org/x/crypto v0.29.0 | ||||
|   | ||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								go.sum
									
									
									
									
									
								
							| @@ -32,6 +32,8 @@ github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig | ||||
| github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= | ||||
| github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= | ||||
| github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= | ||||
| github.com/brianvoe/gofakeit/v7 v7.1.2 h1:vSKaVScNhWVpf1rlyEKSvO8zKZfuDtGqoIHT//iNNb8= | ||||
| github.com/brianvoe/gofakeit/v7 v7.1.2/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | ||||
| @@ -134,8 +136,6 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= | ||||
| github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= | ||||
| github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= | ||||
| github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= | ||||
| github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | ||||
| github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= | ||||
| github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= | ||||
| github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= | ||||
| @@ -146,8 +146,6 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= | ||||
| github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= | ||||
| github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= | ||||
| github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= | ||||
| github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= | ||||
| github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= | ||||
| github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= | ||||
| github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= | ||||
| github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= | ||||
| @@ -165,10 +163,8 @@ github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= | ||||
| github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= | ||||
| github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= | ||||
| github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= | ||||
| github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= | ||||
| github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= | ||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||
| github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/sqids/sqids-go v0.4.1 h1:eQKYzmAZbLlRwHeHYPF35QhgxwZHLnlmVj9AkIj/rrw= | ||||
| github.com/sqids/sqids-go v0.4.1/go.mod h1:EMwHuPQgSNFS0A49jESTfIQS+066XQTVhukrzEPScl8= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||
| github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||
|   | ||||
| @@ -87,12 +87,13 @@ autobind: | ||||
| models: | ||||
|   ID: | ||||
|     model: | ||||
|       - github.com/99designs/gqlgen/graphql.ID | ||||
|       - github.com/99designs/gqlgen/graphql.Int | ||||
|       - github.com/99designs/gqlgen/graphql.Int64 | ||||
|       - github.com/99designs/gqlgen/graphql.Int32 | ||||
|   SQID: | ||||
|     model: | ||||
|       - github.com/99designs/gqlgen/graphql.ID | ||||
|   Int: | ||||
|     model: | ||||
|       - github.com/99designs/gqlgen/graphql.Int | ||||
|   Int64: | ||||
|     model: | ||||
|       - github.com/99designs/gqlgen/graphql.Int64 | ||||
|       - github.com/99designs/gqlgen/graphql.Int32 | ||||
|   | ||||
| @@ -1,6 +1,18 @@ | ||||
| extend type Mutation { | ||||
| 	login(email: String!, pwd: String!): AuthUser! | ||||
| 	logout: Boolean! | ||||
| 	""" | ||||
| 	Verify email token | ||||
| 	""" | ||||
| 	accountVerifyEmail(token: String): Boolean! | ||||
|  | ||||
| 	""" | ||||
| 	User account login | ||||
| 	""" | ||||
| 	accountLogin(email: String!, pwd: String!): AuthUser! | ||||
|  | ||||
| 	""" | ||||
| 	User account logout | ||||
| 	""" | ||||
| 	accountLogout: Boolean! | ||||
| } | ||||
|  | ||||
| extend type Query { | ||||
| @@ -8,8 +20,8 @@ extend type Query { | ||||
| } | ||||
|  | ||||
| type AuthUser { | ||||
| 	id: ID! | ||||
| 	id: UID! | ||||
| 	email: String! | ||||
| 	displayName: String! | ||||
| 	name: String! | ||||
| 	roleID: Int! | ||||
| } | ||||
|   | ||||
| @@ -11,14 +11,19 @@ import ( | ||||
| 	"gitserver.in/patialtech/rano/graph/model" | ||||
| ) | ||||
|  | ||||
| // Login is the resolver for the login field. | ||||
| func (r *mutationResolver) Login(ctx context.Context, email string, pwd string) (*model.AuthUser, error) { | ||||
| 	panic(fmt.Errorf("not implemented: Login - login")) | ||||
| // AccountVerifyEmail is the resolver for the accountVerifyEmail field. | ||||
| func (r *mutationResolver) AccountVerifyEmail(ctx context.Context, token *string) (bool, error) { | ||||
| 	panic(fmt.Errorf("not implemented: AccountVerifyEmail - accountVerifyEmail")) | ||||
| } | ||||
|  | ||||
| // Logout is the resolver for the logout field. | ||||
| func (r *mutationResolver) Logout(ctx context.Context) (bool, error) { | ||||
| 	panic(fmt.Errorf("not implemented: Logout - logout")) | ||||
| // AccountLogin is the resolver for the accountLogin field. | ||||
| func (r *mutationResolver) AccountLogin(ctx context.Context, email string, pwd string) (*model.AuthUser, error) { | ||||
| 	panic(fmt.Errorf("not implemented: AccountLogin - accountLogin")) | ||||
| } | ||||
|  | ||||
| // AccountLogout is the resolver for the accountLogout field. | ||||
| func (r *mutationResolver) AccountLogout(ctx context.Context) (bool, error) { | ||||
| 	panic(fmt.Errorf("not implemented: AccountLogout - accountLogout")) | ||||
| } | ||||
|  | ||||
| // Me is the resolver for the me field. | ||||
|   | ||||
| @@ -55,7 +55,7 @@ func (ec *executionContext) _AuthUser_id(ctx context.Context, field graphql.Coll | ||||
| 	} | ||||
| 	res := resTmp.(string) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNID2string(ctx, field.Selections, res) | ||||
| 	return ec.marshalNUID2string(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_AuthUser_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| @@ -65,7 +65,7 @@ func (ec *executionContext) fieldContext_AuthUser_id(_ context.Context, field gr | ||||
| 		IsMethod:   false, | ||||
| 		IsResolver: false, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			return nil, errors.New("field of type ID does not have child fields") | ||||
| 			return nil, errors.New("field of type UID does not have child fields") | ||||
| 		}, | ||||
| 	} | ||||
| 	return fc, nil | ||||
| @@ -115,8 +115,8 @@ func (ec *executionContext) fieldContext_AuthUser_email(_ context.Context, field | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _AuthUser_displayName(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_AuthUser_displayName(ctx, field) | ||||
| func (ec *executionContext) _AuthUser_name(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_AuthUser_name(ctx, field) | ||||
| 	if err != nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| @@ -129,7 +129,7 @@ func (ec *executionContext) _AuthUser_displayName(ctx context.Context, field gra | ||||
| 	}() | ||||
| 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||
| 		ctx = rctx // use context from middleware stack in children | ||||
| 		return obj.DisplayName, nil | ||||
| 		return obj.Name, nil | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| @@ -146,7 +146,7 @@ func (ec *executionContext) _AuthUser_displayName(ctx context.Context, field gra | ||||
| 	return ec.marshalNString2string(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_AuthUser_displayName(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| func (ec *executionContext) fieldContext_AuthUser_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "AuthUser", | ||||
| 		Field:      field, | ||||
| @@ -236,8 +236,8 @@ func (ec *executionContext) _AuthUser(ctx context.Context, sel ast.SelectionSet, | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		case "displayName": | ||||
| 			out.Values[i] = ec._AuthUser_displayName(ctx, field, obj) | ||||
| 		case "name": | ||||
| 			out.Values[i] = ec._AuthUser_name(ctx, field, obj) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
|   | ||||
| @@ -2256,21 +2256,6 @@ func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.Se | ||||
| 	return res | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) unmarshalNID2string(ctx context.Context, v interface{}) (string, error) { | ||||
| 	res, err := graphql.UnmarshalID(v) | ||||
| 	return res, graphql.ErrorOnPath(ctx, err) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) marshalNID2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { | ||||
| 	res := graphql.MarshalID(v) | ||||
| 	if res == graphql.Null { | ||||
| 		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { | ||||
| 			ec.Errorf(ctx, "the requested element is null which the schema does not allow") | ||||
| 		} | ||||
| 	} | ||||
| 	return res | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) unmarshalNInt2int(ctx context.Context, v interface{}) (int, error) { | ||||
| 	res, err := graphql.UnmarshalInt(v) | ||||
| 	return res, graphql.ErrorOnPath(ctx, err) | ||||
|   | ||||
| @@ -18,8 +18,9 @@ import ( | ||||
| // region    ************************** generated!.gotpl ************************** | ||||
|  | ||||
| type MutationResolver interface { | ||||
| 	Login(ctx context.Context, email string, pwd string) (*model.AuthUser, error) | ||||
| 	Logout(ctx context.Context) (bool, error) | ||||
| 	AccountVerifyEmail(ctx context.Context, token *string) (bool, error) | ||||
| 	AccountLogin(ctx context.Context, email string, pwd string) (*model.AuthUser, error) | ||||
| 	AccountLogout(ctx context.Context) (bool, error) | ||||
| } | ||||
| type QueryResolver interface { | ||||
| 	Me(ctx context.Context) (*model.AuthUser, error) | ||||
| @@ -29,22 +30,22 @@ type QueryResolver interface { | ||||
|  | ||||
| // region    ***************************** args.gotpl ***************************** | ||||
|  | ||||
| func (ec *executionContext) field_Mutation_login_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { | ||||
| func (ec *executionContext) field_Mutation_accountLogin_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { | ||||
| 	var err error | ||||
| 	args := map[string]interface{}{} | ||||
| 	arg0, err := ec.field_Mutation_login_argsEmail(ctx, rawArgs) | ||||
| 	arg0, err := ec.field_Mutation_accountLogin_argsEmail(ctx, rawArgs) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	args["email"] = arg0 | ||||
| 	arg1, err := ec.field_Mutation_login_argsPwd(ctx, rawArgs) | ||||
| 	arg1, err := ec.field_Mutation_accountLogin_argsPwd(ctx, rawArgs) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	args["pwd"] = arg1 | ||||
| 	return args, nil | ||||
| } | ||||
| func (ec *executionContext) field_Mutation_login_argsEmail( | ||||
| func (ec *executionContext) field_Mutation_accountLogin_argsEmail( | ||||
| 	ctx context.Context, | ||||
| 	rawArgs map[string]interface{}, | ||||
| ) (string, error) { | ||||
| @@ -57,7 +58,7 @@ func (ec *executionContext) field_Mutation_login_argsEmail( | ||||
| 	return zeroVal, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) field_Mutation_login_argsPwd( | ||||
| func (ec *executionContext) field_Mutation_accountLogin_argsPwd( | ||||
| 	ctx context.Context, | ||||
| 	rawArgs map[string]interface{}, | ||||
| ) (string, error) { | ||||
| @@ -70,6 +71,29 @@ func (ec *executionContext) field_Mutation_login_argsPwd( | ||||
| 	return zeroVal, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) field_Mutation_accountVerifyEmail_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { | ||||
| 	var err error | ||||
| 	args := map[string]interface{}{} | ||||
| 	arg0, err := ec.field_Mutation_accountVerifyEmail_argsToken(ctx, rawArgs) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	args["token"] = arg0 | ||||
| 	return args, nil | ||||
| } | ||||
| func (ec *executionContext) field_Mutation_accountVerifyEmail_argsToken( | ||||
| 	ctx context.Context, | ||||
| 	rawArgs map[string]interface{}, | ||||
| ) (*string, error) { | ||||
| 	ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("token")) | ||||
| 	if tmp, ok := rawArgs["token"]; ok { | ||||
| 		return ec.unmarshalOString2ᚖstring(ctx, tmp) | ||||
| 	} | ||||
|  | ||||
| 	var zeroVal *string | ||||
| 	return zeroVal, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { | ||||
| 	var err error | ||||
| 	args := map[string]interface{}{} | ||||
| @@ -101,8 +125,8 @@ func (ec *executionContext) field_Query___type_argsName( | ||||
|  | ||||
| // region    **************************** field.gotpl ***************************** | ||||
|  | ||||
| func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Mutation_login(ctx, field) | ||||
| func (ec *executionContext) _Mutation_accountVerifyEmail(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Mutation_accountVerifyEmail(ctx, field) | ||||
| 	if err != nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| @@ -115,72 +139,7 @@ func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.C | ||||
| 	}() | ||||
| 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||
| 		ctx = rctx // use context from middleware stack in children | ||||
| 		return ec.resolvers.Mutation().Login(rctx, fc.Args["email"].(string), fc.Args["pwd"].(string)) | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	if resTmp == nil { | ||||
| 		if !graphql.HasFieldError(ctx, fc) { | ||||
| 			ec.Errorf(ctx, "must not be null") | ||||
| 		} | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	res := resTmp.(*model.AuthUser) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNAuthUser2ᚖgitserverᚗinᚋpatialtechᚋranoᚋgraphᚋmodelᚐAuthUser(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "Mutation", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   true, | ||||
| 		IsResolver: true, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			switch field.Name { | ||||
| 			case "id": | ||||
| 				return ec.fieldContext_AuthUser_id(ctx, field) | ||||
| 			case "email": | ||||
| 				return ec.fieldContext_AuthUser_email(ctx, field) | ||||
| 			case "displayName": | ||||
| 				return ec.fieldContext_AuthUser_displayName(ctx, field) | ||||
| 			case "roleID": | ||||
| 				return ec.fieldContext_AuthUser_roleID(ctx, field) | ||||
| 			} | ||||
| 			return nil, fmt.Errorf("no field named %q was found under type AuthUser", field.Name) | ||||
| 		}, | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			err = ec.Recover(ctx, r) | ||||
| 			ec.Error(ctx, err) | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx = graphql.WithFieldContext(ctx, fc) | ||||
| 	if fc.Args, err = ec.field_Mutation_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return fc, err | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Mutation_logout(ctx, field) | ||||
| 	if err != nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	ctx = graphql.WithFieldContext(ctx, fc) | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ec.Error(ctx, ec.Recover(ctx, r)) | ||||
| 			ret = graphql.Null | ||||
| 		} | ||||
| 	}() | ||||
| 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||
| 		ctx = rctx // use context from middleware stack in children | ||||
| 		return ec.resolvers.Mutation().Logout(rctx) | ||||
| 		return ec.resolvers.Mutation().AccountVerifyEmail(rctx, fc.Args["token"].(*string)) | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| @@ -197,7 +156,127 @@ func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql. | ||||
| 	return ec.marshalNBoolean2bool(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_Mutation_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| func (ec *executionContext) fieldContext_Mutation_accountVerifyEmail(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "Mutation", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   true, | ||||
| 		IsResolver: true, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			return nil, errors.New("field of type Boolean does not have child fields") | ||||
| 		}, | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			err = ec.Recover(ctx, r) | ||||
| 			ec.Error(ctx, err) | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx = graphql.WithFieldContext(ctx, fc) | ||||
| 	if fc.Args, err = ec.field_Mutation_accountVerifyEmail_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return fc, err | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _Mutation_accountLogin(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Mutation_accountLogin(ctx, field) | ||||
| 	if err != nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	ctx = graphql.WithFieldContext(ctx, fc) | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ec.Error(ctx, ec.Recover(ctx, r)) | ||||
| 			ret = graphql.Null | ||||
| 		} | ||||
| 	}() | ||||
| 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||
| 		ctx = rctx // use context from middleware stack in children | ||||
| 		return ec.resolvers.Mutation().AccountLogin(rctx, fc.Args["email"].(string), fc.Args["pwd"].(string)) | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	if resTmp == nil { | ||||
| 		if !graphql.HasFieldError(ctx, fc) { | ||||
| 			ec.Errorf(ctx, "must not be null") | ||||
| 		} | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	res := resTmp.(*model.AuthUser) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNAuthUser2ᚖgitserverᚗinᚋpatialtechᚋranoᚋgraphᚋmodelᚐAuthUser(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_Mutation_accountLogin(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "Mutation", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   true, | ||||
| 		IsResolver: true, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			switch field.Name { | ||||
| 			case "id": | ||||
| 				return ec.fieldContext_AuthUser_id(ctx, field) | ||||
| 			case "email": | ||||
| 				return ec.fieldContext_AuthUser_email(ctx, field) | ||||
| 			case "name": | ||||
| 				return ec.fieldContext_AuthUser_name(ctx, field) | ||||
| 			case "roleID": | ||||
| 				return ec.fieldContext_AuthUser_roleID(ctx, field) | ||||
| 			} | ||||
| 			return nil, fmt.Errorf("no field named %q was found under type AuthUser", field.Name) | ||||
| 		}, | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			err = ec.Recover(ctx, r) | ||||
| 			ec.Error(ctx, err) | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx = graphql.WithFieldContext(ctx, fc) | ||||
| 	if fc.Args, err = ec.field_Mutation_accountLogin_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return fc, err | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _Mutation_accountLogout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Mutation_accountLogout(ctx, field) | ||||
| 	if err != nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	ctx = graphql.WithFieldContext(ctx, fc) | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ec.Error(ctx, ec.Recover(ctx, r)) | ||||
| 			ret = graphql.Null | ||||
| 		} | ||||
| 	}() | ||||
| 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||
| 		ctx = rctx // use context from middleware stack in children | ||||
| 		return ec.resolvers.Mutation().AccountLogout(rctx) | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	if resTmp == nil { | ||||
| 		if !graphql.HasFieldError(ctx, fc) { | ||||
| 			ec.Errorf(ctx, "must not be null") | ||||
| 		} | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	res := resTmp.(bool) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNBoolean2bool(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_Mutation_accountLogout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "Mutation", | ||||
| 		Field:      field, | ||||
| @@ -250,8 +329,8 @@ func (ec *executionContext) fieldContext_Query_me(_ context.Context, field graph | ||||
| 				return ec.fieldContext_AuthUser_id(ctx, field) | ||||
| 			case "email": | ||||
| 				return ec.fieldContext_AuthUser_email(ctx, field) | ||||
| 			case "displayName": | ||||
| 				return ec.fieldContext_AuthUser_displayName(ctx, field) | ||||
| 			case "name": | ||||
| 				return ec.fieldContext_AuthUser_name(ctx, field) | ||||
| 			case "roleID": | ||||
| 				return ec.fieldContext_AuthUser_roleID(ctx, field) | ||||
| 			} | ||||
| @@ -421,16 +500,23 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) | ||||
| 		switch field.Name { | ||||
| 		case "__typename": | ||||
| 			out.Values[i] = graphql.MarshalString("Mutation") | ||||
| 		case "login": | ||||
| 		case "accountVerifyEmail": | ||||
| 			out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { | ||||
| 				return ec._Mutation_login(ctx, field) | ||||
| 				return ec._Mutation_accountVerifyEmail(ctx, field) | ||||
| 			}) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		case "logout": | ||||
| 		case "accountLogin": | ||||
| 			out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { | ||||
| 				return ec._Mutation_logout(ctx, field) | ||||
| 				return ec._Mutation_accountLogin(ctx, field) | ||||
| 			}) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		case "accountLogout": | ||||
| 			out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { | ||||
| 				return ec._Mutation_accountLogout(ctx, field) | ||||
| 			}) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| @@ -531,4 +617,19 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr | ||||
|  | ||||
| // region    ***************************** type.gotpl ***************************** | ||||
|  | ||||
| func (ec *executionContext) unmarshalNUID2string(ctx context.Context, v interface{}) (string, error) { | ||||
| 	res, err := graphql.UnmarshalString(v) | ||||
| 	return res, graphql.ErrorOnPath(ctx, err) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) marshalNUID2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { | ||||
| 	res := graphql.MarshalString(v) | ||||
| 	if res == graphql.Null { | ||||
| 		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { | ||||
| 			ec.Errorf(ctx, "the requested element is null which the schema does not allow") | ||||
| 		} | ||||
| 	} | ||||
| 	return res | ||||
| } | ||||
|  | ||||
| // endregion ***************************** type.gotpl ***************************** | ||||
|   | ||||
| @@ -41,15 +41,16 @@ type DirectiveRoot struct { | ||||
|  | ||||
| type ComplexityRoot struct { | ||||
| 	AuthUser struct { | ||||
| 		DisplayName func(childComplexity int) int | ||||
| 		Email  func(childComplexity int) int | ||||
| 		ID     func(childComplexity int) int | ||||
| 		Name   func(childComplexity int) int | ||||
| 		RoleID func(childComplexity int) int | ||||
| 	} | ||||
|  | ||||
| 	Mutation struct { | ||||
| 		Login  func(childComplexity int, email string, pwd string) int | ||||
| 		Logout func(childComplexity int) int | ||||
| 		AccountLogin       func(childComplexity int, email string, pwd string) int | ||||
| 		AccountLogout      func(childComplexity int) int | ||||
| 		AccountVerifyEmail func(childComplexity int, token *string) int | ||||
| 	} | ||||
|  | ||||
| 	Query struct { | ||||
| @@ -76,13 +77,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | ||||
| 	_ = ec | ||||
| 	switch typeName + "." + field { | ||||
|  | ||||
| 	case "AuthUser.displayName": | ||||
| 		if e.complexity.AuthUser.DisplayName == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.AuthUser.DisplayName(childComplexity), true | ||||
|  | ||||
| 	case "AuthUser.email": | ||||
| 		if e.complexity.AuthUser.Email == nil { | ||||
| 			break | ||||
| @@ -97,6 +91,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | ||||
|  | ||||
| 		return e.complexity.AuthUser.ID(childComplexity), true | ||||
|  | ||||
| 	case "AuthUser.name": | ||||
| 		if e.complexity.AuthUser.Name == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.AuthUser.Name(childComplexity), true | ||||
|  | ||||
| 	case "AuthUser.roleID": | ||||
| 		if e.complexity.AuthUser.RoleID == nil { | ||||
| 			break | ||||
| @@ -104,24 +105,36 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | ||||
|  | ||||
| 		return e.complexity.AuthUser.RoleID(childComplexity), true | ||||
|  | ||||
| 	case "Mutation.login": | ||||
| 		if e.complexity.Mutation.Login == nil { | ||||
| 	case "Mutation.accountLogin": | ||||
| 		if e.complexity.Mutation.AccountLogin == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		args, err := ec.field_Mutation_login_args(context.TODO(), rawArgs) | ||||
| 		args, err := ec.field_Mutation_accountLogin_args(context.TODO(), rawArgs) | ||||
| 		if err != nil { | ||||
| 			return 0, false | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.Mutation.Login(childComplexity, args["email"].(string), args["pwd"].(string)), true | ||||
| 		return e.complexity.Mutation.AccountLogin(childComplexity, args["email"].(string), args["pwd"].(string)), true | ||||
|  | ||||
| 	case "Mutation.logout": | ||||
| 		if e.complexity.Mutation.Logout == nil { | ||||
| 	case "Mutation.accountLogout": | ||||
| 		if e.complexity.Mutation.AccountLogout == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.Mutation.Logout(childComplexity), true | ||||
| 		return e.complexity.Mutation.AccountLogout(childComplexity), true | ||||
|  | ||||
| 	case "Mutation.accountVerifyEmail": | ||||
| 		if e.complexity.Mutation.AccountVerifyEmail == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		args, err := ec.field_Mutation_accountVerifyEmail_args(context.TODO(), rawArgs) | ||||
| 		if err != nil { | ||||
| 			return 0, false | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.Mutation.AccountVerifyEmail(childComplexity, args["token"].(*string)), true | ||||
|  | ||||
| 	case "Query.me": | ||||
| 		if e.complexity.Query.Me == nil { | ||||
| @@ -235,8 +248,20 @@ func (ec *executionContext) introspectType(name string) (*introspection.Type, er | ||||
|  | ||||
| var sources = []*ast.Source{ | ||||
| 	{Name: "../account.graphql", Input: `extend type Mutation { | ||||
| 	login(email: String!, pwd: String!): AuthUser! | ||||
| 	logout: Boolean! | ||||
| 	""" | ||||
| 	Verify email token | ||||
| 	""" | ||||
| 	accountVerifyEmail(token: String): Boolean! | ||||
|  | ||||
| 	""" | ||||
| 	User account login | ||||
| 	""" | ||||
| 	accountLogin(email: String!, pwd: String!): AuthUser! | ||||
|  | ||||
| 	""" | ||||
| 	User account logout | ||||
| 	""" | ||||
| 	accountLogout: Boolean! | ||||
| } | ||||
|  | ||||
| extend type Query { | ||||
| @@ -244,9 +269,9 @@ extend type Query { | ||||
| } | ||||
|  | ||||
| type AuthUser { | ||||
| 	id: ID! | ||||
| 	id: UID! | ||||
| 	email: String! | ||||
| 	displayName: String! | ||||
| 	name: String! | ||||
| 	roleID: Int! | ||||
| } | ||||
| `, BuiltIn: false}, | ||||
| @@ -258,6 +283,10 @@ type Mutation | ||||
|  | ||||
| type Query | ||||
|  | ||||
| scalar UID | ||||
|  | ||||
| scalar Int64 | ||||
|  | ||||
| """ | ||||
| Maps a Time GraphQL scalar to a Go time.Time struct. | ||||
| """ | ||||
| @@ -272,6 +301,7 @@ scalar Map | ||||
| Go type interface{} | ||||
| """ | ||||
| scalar Any | ||||
|  | ||||
| scalar Void | ||||
|  | ||||
| """ | ||||
|   | ||||
| @@ -5,7 +5,7 @@ package model | ||||
| type AuthUser struct { | ||||
| 	ID     string `json:"id"` | ||||
| 	Email  string `json:"email"` | ||||
| 	DisplayName string `json:"displayName"` | ||||
| 	Name   string `json:"name"` | ||||
| 	RoleID int    `json:"roleID"` | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -6,6 +6,10 @@ type Mutation | ||||
|  | ||||
| type Query | ||||
|  | ||||
| scalar UID | ||||
|  | ||||
| scalar Int64 | ||||
|  | ||||
| """ | ||||
| Maps a Time GraphQL scalar to a Go time.Time struct. | ||||
| """ | ||||
| @@ -20,6 +24,7 @@ scalar Map | ||||
| Go type interface{} | ||||
| """ | ||||
| scalar Any | ||||
|  | ||||
| scalar Void | ||||
|  | ||||
| """ | ||||
|   | ||||
| @@ -1,16 +1,19 @@ | ||||
| package message | ||||
|  | ||||
| import _ "embed" | ||||
|  | ||||
| //go:embed welcome.html | ||||
| var welcomeHtml string | ||||
|  | ||||
| type Welcome struct { | ||||
| 	Name      string | ||||
| 	VerifyURL string | ||||
| } | ||||
|  | ||||
| func (e *Welcome) Subject() string { | ||||
| 	return "Welcome" | ||||
| 	return "Welcome, " + e.Name | ||||
| } | ||||
|  | ||||
| func (e *Welcome) HtmlBody() (string, error) { | ||||
| 	content := ` | ||||
| <p>Welcome {{.Name}}</p> | ||||
| ` | ||||
| 	return render(layout, content, e) | ||||
| 	return render(layout, welcomeHtml, e) | ||||
| } | ||||
|   | ||||
							
								
								
									
										4
									
								
								mailer/message/welcome.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								mailer/message/welcome.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| <h1>Welcome to My App</h1> | ||||
|  | ||||
| <p>To complete your registration, please click on the link below to verify your email address:</p> | ||||
| <a href="{{.VerifyURL}}" target="_blank" rel="noopener noreferrer">Verify Email Address</a> | ||||
| @@ -1,9 +0,0 @@ | ||||
| package auth | ||||
|  | ||||
| import "gitserver.in/patialtech/rano/graph/model" | ||||
|  | ||||
| type AuthUser = model.AuthUser | ||||
|  | ||||
| func authenticate(email, pwd string) (*AuthUser, error) { | ||||
| 	panic("not implemented") | ||||
| } | ||||
| @@ -1,28 +0,0 @@ | ||||
| package auth | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/config" | ||||
| ) | ||||
|  | ||||
| type SessionUser struct { | ||||
| 	ID          int64 | ||||
| 	Email       string | ||||
| 	DisplayName string | ||||
| 	RoleID      int | ||||
| } | ||||
|  | ||||
| func CtxWithUser(ctx context.Context, u *AuthUser) context.Context { | ||||
| 	return context.WithValue(ctx, config.AuthUserCtxKey, &SessionUser{ | ||||
| 		ID:          u.ID, | ||||
| 		Email:       u.Email, | ||||
| 		DisplayName: u.DisplayName, | ||||
| 		RoleID:      u.RoleID, | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func CtxUser(ctx context.Context) *SessionUser { | ||||
| 	u, _ := ctx.Value(config.AuthUserCtxKey).(*SessionUser) | ||||
| 	return u | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| package auth | ||||
|  | ||||
| // NewSession for user. | ||||
| // | ||||
| // Authenticated | ||||
| func NewSession(email, pwd string) (*AuthUser, error) { | ||||
| 	// authenticate. | ||||
|  | ||||
| 	// create sesion entry in db | ||||
|  | ||||
| 	panic("not implemented") | ||||
| } | ||||
|  | ||||
| // RemoveSession entry from DB | ||||
| func RemoveSession(sID uint) { | ||||
| 	panic("not implemented") | ||||
| } | ||||
| @@ -4,15 +4,16 @@ import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"log/slog" | ||||
| 	"net/mail" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/config" | ||||
| 	"gitserver.in/patialtech/rano/db" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/mailer" | ||||
| 	"gitserver.in/patialtech/rano/mailer/message" | ||||
| 	"gitserver.in/patialtech/rano/util/crypto" | ||||
| 	"gitserver.in/patialtech/rano/util/logger" | ||||
| 	"gitserver.in/patialtech/rano/util/validate" | ||||
| ) | ||||
|  | ||||
| @@ -36,17 +37,17 @@ var ( | ||||
| // | ||||
| // will return created userID on success | ||||
| func Create(ctx context.Context, inp *CreateInput) (int64, error) { | ||||
| 	// check for nil inp | ||||
| 	// Check for nil input. | ||||
| 	if inp == nil { | ||||
| 		return 0, ErrCreateInpNil | ||||
| 	} | ||||
|  | ||||
| 	// validate | ||||
| 	// Validate struct. | ||||
| 	if err := validate.Struct(inp); err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	// compare pwd and comparePwd | ||||
| 	// Compare pwd and comparePwd. | ||||
| 	if inp.Pwd != inp.ConfirmPwd { | ||||
| 		return 0, ErrWrongConfirmPwd | ||||
| 	} | ||||
| @@ -56,42 +57,73 @@ func Create(ctx context.Context, inp *CreateInput) (int64, error) { | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	// save record to DB | ||||
| 	client := db.Client() | ||||
| 	u, err := client.User.Create(). | ||||
| 	// Begin a transaction. | ||||
| 	tx, err := db.Client().BeginTx(ctx, nil) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	// Save User to DB. | ||||
| 	u, err := tx.User.Create(). | ||||
| 		SetEmail(inp.Email). | ||||
| 		SetPwdHash(h). | ||||
| 		SetPwdSalt(salt). | ||||
| 		SetFirstName(inp.FirstName). | ||||
| 		SetMiddleName(inp.MiddleName). | ||||
| 		SetLastName(inp.LastName). | ||||
| 		SetStatus(user.StatusActive). | ||||
| 		Save(ctx) | ||||
| 	if err != nil { | ||||
| 		logger.Error(err, slog.String("ref", "user: create error")) | ||||
| 		return 0, errors.New("failed to create user") | ||||
| 	} | ||||
|  | ||||
| 	// email | ||||
| 	// Get a new email-verification token | ||||
| 	tokenDuration := time.Hour * 6 | ||||
| 	token, err := newTokenToVerifyEmail(u.ID, tokenDuration) | ||||
| 	if err != nil { | ||||
| 		_ = tx.Rollback() | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	// Save token to DB | ||||
| 	err = tx.VerifyToken.Create(). | ||||
| 		SetToken(token). | ||||
| 		SetExpiresAt(time.Now().Add(tokenDuration).UTC()). | ||||
| 		SetPurpose("VerifyEmail"). | ||||
| 		SetUserID(u.ID).Exec(ctx) | ||||
| 	if err != nil { | ||||
| 		_ = tx.Rollback() | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	name := fullName(inp.FirstName, inp.MiddleName, inp.LastName) | ||||
| 	// Send a welcome email with a link to verigy email-address. | ||||
| 	err = mailer.Send( | ||||
| 		[]mail.Address{ | ||||
| 			{Name: inp.FullName(), Address: inp.Email}, | ||||
| 			{Name: name, Address: inp.Email}, | ||||
| 		}, | ||||
| 		&message.Welcome{ | ||||
| 			Name: inp.FullName(), | ||||
| 			Name:      name, | ||||
| 			VerifyURL: config.VerifyEmailURL(token), | ||||
| 		}, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		logger.Error(err, slog.String("ref", "user: send welcome email")) | ||||
| 		_ = tx.Rollback() | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	// Commit transaction | ||||
| 	err = tx.Commit() | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	// ALL Done! | ||||
| 	// Created a new user in system. | ||||
| 	return u.ID, nil | ||||
| } | ||||
|  | ||||
| func (inp *CreateInput) FullName() string { | ||||
| 	if inp == nil { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	name := fmt.Sprintf("%s %s %s", inp.FirstName, inp.MiddleName, inp.LastName) | ||||
| func fullName(fName, mName, lName string) string { | ||||
| 	name := fmt.Sprintf("%s %s %s", fName, mName, lName) | ||||
| 	return strings.Join(strings.Fields(name), " ") | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,8 @@ package user | ||||
| import ( | ||||
| 	"context" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/brianvoe/gofakeit/v7" | ||||
| ) | ||||
|  | ||||
| func TestCreate(t *testing.T) { | ||||
| @@ -22,12 +24,12 @@ func TestCreate(t *testing.T) { | ||||
|  | ||||
| 	t.Run("create", func(t *testing.T) { | ||||
| 		if _, err := Create(context.Background(), &CreateInput{ | ||||
| 			Email:      "aa@aa.com", | ||||
| 			Email:      gofakeit.Email(), | ||||
| 			Pwd:        "pwd123", | ||||
| 			ConfirmPwd: "pwd123", | ||||
| 			FirstName:  "Ankit", | ||||
| 			MiddleName: "Singh", | ||||
| 			LastName:   "Patial", | ||||
| 			FirstName:  gofakeit.FirstName(), | ||||
| 			MiddleName: gofakeit.MiddleName(), | ||||
| 			LastName:   gofakeit.LastName(), | ||||
| 			RoleID:     1, | ||||
| 		}); err != nil { | ||||
| 			t.Error(err) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| package auth | ||||
| package user | ||||
| 
 | ||||
| // EmailResetPWD link to user to reset password | ||||
| func EmailResetPWD(email string) { | ||||
							
								
								
									
										163
									
								
								pkg/user/session.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								pkg/user/session.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"log/slog" | ||||
| 	"time" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/config" | ||||
| 	"gitserver.in/patialtech/rano/db" | ||||
| 	"gitserver.in/patialtech/rano/db/ent" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | ||||
| 	"gitserver.in/patialtech/rano/graph/model" | ||||
| 	"gitserver.in/patialtech/rano/util/crypto" | ||||
| 	"gitserver.in/patialtech/rano/util/logger" | ||||
| ) | ||||
|  | ||||
| type ( | ||||
| 	SessionUser struct { | ||||
| 		ID     string | ||||
| 		Email  string | ||||
| 		Name   string | ||||
| 		RoleID int | ||||
| 	} | ||||
| 	AuthUser = model.AuthUser | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	ErrInvalidCred      = errors.New("invalid email or password") | ||||
| 	ErrAccountNotActive = errors.New("account is not active") | ||||
| 	ErrAccountLocked    = errors.New("account is locked, please try after sometime") | ||||
| 	ErrUnexpected       = errors.New("unexpected error has happened") | ||||
| ) | ||||
|  | ||||
| func CtxWithUser(ctx context.Context, u *AuthUser) context.Context { | ||||
| 	return context.WithValue(ctx, config.AuthUserCtxKey, &SessionUser{ | ||||
| 		ID:     u.ID, | ||||
| 		Email:  u.Email, | ||||
| 		Name:   u.Name, | ||||
| 		RoleID: u.RoleID, | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func CtxUser(ctx context.Context) *SessionUser { | ||||
| 	u, _ := ctx.Value(config.AuthUserCtxKey).(*SessionUser) | ||||
| 	return u | ||||
| } | ||||
|  | ||||
| // NewSession for user. | ||||
| // | ||||
| // Authenticated | ||||
| func NewSession(ctx context.Context, email, pwd string) (*AuthUser, error) { | ||||
| 	// authenticate. | ||||
| 	u, err := authenticate(ctx, email, pwd) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// 30 day token life | ||||
| 	until := time.Now().Add(time.Hour * 24 * 30).UTC() | ||||
|  | ||||
| 	// create sesion entry in db | ||||
| 	db.Client().UserSession.Create(). | ||||
| 		SetUserID(u.ID). | ||||
| 		SetIssuedAt(time.Now().UTC()). | ||||
| 		SetExpiresAt(until). | ||||
| 		SetIP(""). | ||||
| 		SetUserAgent("") | ||||
|  | ||||
| 	return &AuthUser{ | ||||
| 		Name: fullName(u.FirstName, *u.MiddleName, u.LastName), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| // RemoveSession entry from DB | ||||
| func RemoveSession(sID uint) { | ||||
| 	panic("not implemented") | ||||
| } | ||||
|  | ||||
| // authenticate user against DB | ||||
| func authenticate(ctx context.Context, email, pwd string) (*ent.User, error) { | ||||
| 	client := db.Client() | ||||
|  | ||||
| 	// incident email attr | ||||
| 	attrEmail := slog.String("email", email) | ||||
|  | ||||
| 	// get user by given email | ||||
| 	u, err := client.User. | ||||
| 		Query(). | ||||
| 		Where(user.EmailEQ(email)). | ||||
| 		Select( | ||||
| 			user.FieldEmail, user.FieldPwdHash, user.FieldPwdSalt, | ||||
| 			user.FieldLoginFailedCount, user.FieldLoginLockedUntil, user.FieldLoginAttemptOn, | ||||
| 			user.FieldFirstName, user.FieldMiddleName, user.FieldLastName, | ||||
| 			user.FieldStatus, | ||||
| 		). | ||||
| 		Only(ctx) | ||||
| 	if err != nil { | ||||
| 		if ent.IsNotFound(err) { | ||||
| 			logger.Incident(ctx, "Authenticate", "wrong email", attrEmail) | ||||
| 			return nil, ErrInvalidCred | ||||
| 		} | ||||
|  | ||||
| 		logger.Error(err) | ||||
| 		return nil, ErrUnexpected | ||||
| 	} | ||||
|  | ||||
| 	// check account is ready for authentication | ||||
| 	// ensure that user account is active or perform other needed checks | ||||
| 	if u.Status != user.StatusActive { | ||||
| 		logger.Incident(ctx, "Authenticate", "account issue", attrEmail) | ||||
| 		return nil, ErrAccountNotActive | ||||
| 	} | ||||
|  | ||||
| 	// check account is locked | ||||
| 	lck := u.LoginLockedUntil | ||||
| 	now := time.Now().UTC() | ||||
| 	if lck != nil && now.Before(lck.UTC()) { | ||||
| 		logger.Incident(ctx, "Authenticate", "account locked", attrEmail) | ||||
| 		return nil, ErrAccountLocked | ||||
| 	} | ||||
|  | ||||
| 	upQry := client.User.UpdateOneID(u.ID) | ||||
| 	// compare password | ||||
| 	// in-case password is wrong, lets increment failed attempt | ||||
| 	if !crypto.ComparePasswordHash(pwd, u.PwdHash, u.PwdSalt) { | ||||
| 		var locked bool | ||||
| 		u.LoginFailedCount++ | ||||
| 		upQry. | ||||
| 			SetLoginAttemptOn(time.Now().UTC()). | ||||
| 			SetLoginFailedCount(u.LoginFailedCount) | ||||
|  | ||||
| 		// lock user if count is more that 4 | ||||
| 		if u.LoginFailedCount > 4 { | ||||
| 			locked = true | ||||
| 			upQry.SetLoginLockedUntil(time.Now().Add(time.Hour * 6).UTC()) | ||||
| 		} | ||||
|  | ||||
| 		// update user login attempt status | ||||
| 		if err = upQry.Exec(ctx); err != nil { | ||||
| 			return nil, ErrUnexpected | ||||
| 		} | ||||
|  | ||||
| 		if locked { | ||||
| 			return nil, ErrAccountLocked | ||||
| 		} | ||||
|  | ||||
| 		return nil, ErrInvalidCred | ||||
| 	} | ||||
|  | ||||
| 	if u.LoginFailedCount > 0 { | ||||
| 		u.LoginFailedCount = 0 | ||||
| 		upQry.ClearLoginFailedCount() | ||||
| 		if err := upQry.Exec(ctx); err != nil { | ||||
| 			logger.Error(err, attrEmail) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// let's not get them out | ||||
| 	u.PwdHash = "" | ||||
| 	u.PwdSalt = "" | ||||
| 	return u, nil | ||||
| } | ||||
							
								
								
									
										50
									
								
								pkg/user/token.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								pkg/user/token.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"time" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/util/uid" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	ErrExpiredToken = errors.New("expired token") | ||||
| 	ErrInvalidToken = errors.New("invalid token") | ||||
| ) | ||||
|  | ||||
| // newTokenToVerifyEmail for a user for given duration | ||||
| func newTokenToVerifyEmail(userID int64, d time.Duration) (string, error) { | ||||
| 	expiresAt := time.Now().Add(d).UTC().UnixMilli() | ||||
| 	return uid.Encode([]uint64{ | ||||
| 		uint64(userID), | ||||
| 		1, // identifies that its token to verify email | ||||
| 		uint64(expiresAt), | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // tokenToVerifyEmail will check for valid email token that is yet not expired | ||||
| // | ||||
| // returns userID on success | ||||
| func tokenToVerifyEmail(token string) (int64, error) { | ||||
| 	ids, err := uid.Decode(token) | ||||
| 	if err != nil { | ||||
| 		return 0, nil | ||||
| 	} | ||||
|  | ||||
| 	// slice must have 3 entries | ||||
| 	if len(ids) != 3 { | ||||
| 		return 0, ErrInvalidToken | ||||
| 	} | ||||
|  | ||||
| 	// must be an email verify token | ||||
| 	if ids[1] != 1 { | ||||
| 		return 0, ErrInvalidToken | ||||
| 	} | ||||
|  | ||||
| 	// check expiry | ||||
| 	if int64(ids[2]) < time.Now().UTC().UnixMilli() { | ||||
| 		return 0, ErrExpiredToken | ||||
| 	} | ||||
|  | ||||
| 	return int64(ids[0]), nil | ||||
| } | ||||
							
								
								
									
										43
									
								
								pkg/user/token_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								pkg/user/token_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func FuzzNewVerifyEmailToken(f *testing.F) { | ||||
| 	f.Add(int64(123)) | ||||
| 	f.Fuzz(func(t *testing.T, userID int64) { | ||||
| 		_, err := newTokenToVerifyEmail(userID, time.Millisecond*100) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed for input %d, %v", userID, err) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestEmailToken(t *testing.T) { | ||||
| 	uID := int64(1234) | ||||
| 	// create a token | ||||
| 	t1, err := newTokenToVerifyEmail(uID, time.Millisecond*100) | ||||
| 	if err != nil { | ||||
| 		t.Error(err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// let decode token | ||||
| 	id, err := tokenToVerifyEmail(t1) | ||||
| 	if err != nil { | ||||
| 		t.Error(err) | ||||
| 		return | ||||
| 	} else if uID != id { | ||||
| 		t.Error("uid and decoded id are not same, ", uID, "!=", id) | ||||
| 	} | ||||
|  | ||||
| 	// lets wait and try decode again | ||||
| 	time.Sleep(time.Millisecond * 100) | ||||
| 	_, err = tokenToVerifyEmail(t1) | ||||
| 	if !errors.Is(err, ErrExpiredToken) { | ||||
| 		t.Error("expected expired token error") | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										60
									
								
								pkg/user/verify.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								pkg/user/verify.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"log/slog" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/db" | ||||
| 	"gitserver.in/patialtech/rano/db/ent" | ||||
| 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||
| 	"gitserver.in/patialtech/rano/util/logger" | ||||
| ) | ||||
|  | ||||
| // VerifyEmailAddress by a token | ||||
| func VerifyEmailAddress(ctx context.Context, token string) error { | ||||
| 	// decode token | ||||
| 	uid, err := tokenToVerifyEmail(token) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	client := db.Client() | ||||
|  | ||||
| 	// get token from DB | ||||
| 	vt, err := client.VerifyToken.Query().Where(verifytoken.TokenEQ(token)).Only(ctx) | ||||
| 	if err != nil { | ||||
| 		if ent.IsNotFound(err) { | ||||
| 			return ErrInvalidToken | ||||
| 		} | ||||
|  | ||||
| 		logger.Error(err, slog.String("ref", "pkg/user/verify.VerifyEmail")) | ||||
| 		return ErrInvalidToken | ||||
| 	} | ||||
|  | ||||
| 	// all good, lets do the following | ||||
| 	//  1. Update user email verify status | ||||
| 	//  2. Remvoe token from DB | ||||
| 	// do it in a transaction | ||||
|  | ||||
| 	tx, err := client.BeginTx(ctx, nil) | ||||
| 	if err != nil { | ||||
| 		logger.Error(err) | ||||
| 		return errors.New("unexpected error") | ||||
| 	} | ||||
|  | ||||
| 	// update user email verify status | ||||
| 	if err = tx.User.UpdateOneID(uid).SetEmailVerified(true).Exec(ctx); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// remove token from DB | ||||
| 	if err = tx.VerifyToken.DeleteOneID(vt.ID).Exec(ctx); err != nil { | ||||
| 		_ = tx.Rollback() | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// we are all done now, | ||||
| 	// let's commit | ||||
| 	return tx.Commit() | ||||
| } | ||||
| @@ -14,7 +14,7 @@ tasks: | ||||
|   start-graph: | ||||
|     desc: run graph server | ||||
|     cmds: | ||||
|       - cmd: go run ./graph/server | ||||
|       - cmd: go run ./cmd/server | ||||
|  | ||||
|   start-web: | ||||
|     desc: run web in dev mode | ||||
| @@ -36,7 +36,6 @@ tasks: | ||||
|   graph-gen: | ||||
|     desc: graph gen | ||||
|     cmds: | ||||
|       - go mod tidy | ||||
|       - go generate ./graph | ||||
|  | ||||
|   graph-codegen: | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package logger | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"log/slog" | ||||
| 	"os" | ||||
| @@ -16,6 +17,12 @@ func Warn(msg string, args ...any) { | ||||
| 	slog.Warn(fmt.Sprintf(msg, a...), b...) | ||||
| } | ||||
|  | ||||
| func Incident(ctx context.Context, name, msg string, args ...any) { | ||||
| 	a, b := getArgs(args) | ||||
| 	slog.Warn(fmt.Sprintf(msg, a...), b...) | ||||
| 	// TODO: save incident for alert purpose | ||||
| } | ||||
|  | ||||
| func Error(err error, args ...any) { | ||||
| 	a, b := getArgs(args) | ||||
| 	slog.Error(fmt.Sprintf(err.Error(), a...), b...) | ||||
|   | ||||
							
								
								
									
										29
									
								
								util/uid/sqid.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								util/uid/sqid.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| package uid | ||||
|  | ||||
| import "github.com/sqids/sqids-go" | ||||
|  | ||||
| // use your own random version of alphabets | ||||
| // there is online util at the bottomt of this page: https://sqids.org/go | ||||
| var opts sqids.Options = sqids.Options{ | ||||
| 	Alphabet: "fsvjrnGWiTk2Lt1l5MzEhFH73CIg60ByexQPYpX9Ro8ZKawAVUdNuDJbmqScO4", | ||||
| } | ||||
|  | ||||
| // Encode a slice of IDs into one unique ID | ||||
| func Encode(ids []uint64) (string, error) { | ||||
| 	s, err := sqids.New() | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return s.Encode(ids) // "86Rf07" | ||||
| } | ||||
|  | ||||
| // Decode an ID back to slice of IDs | ||||
| func Decode(id string) ([]uint64, error) { | ||||
| 	s, err := sqids.New() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return s.Decode(id), nil | ||||
| } | ||||
| @@ -3,11 +3,11 @@ | ||||
| 	import { updated } from '$app/stores'; | ||||
| 	import { setContextClient } from '@urql/svelte'; | ||||
| 	import { newClient } from '$lib/gql/client'; | ||||
| 	import { Me } from '$lib/gql/account.gql'; | ||||
| 	import '../app.css'; | ||||
| 	import { Me } from '$lib/gql/auth.gql'; | ||||
|  | ||||
| 	const { children } = $props(); | ||||
| 	const host = import.meta.env.VITE_GRAPH_URL ?? '' | ||||
| 	const host = import.meta.env.VITE_GRAPH_URL ?? ''; | ||||
| 	const client = newClient(`${host}/query`); | ||||
|  | ||||
| 	setContextClient(client); | ||||
|   | ||||
							
								
								
									
										7
									
								
								web/routes/account/verify-email/+page.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								web/routes/account/verify-email/+page.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <script lang="ts"> | ||||
| 	import { page } from '$app/stores'; | ||||
| 	const hash = $derived($page.url.hash); | ||||
| </script> | ||||
|  | ||||
| <p>hello</p> | ||||
| <p>{hash}</p> | ||||
		Reference in New Issue
	
	Block a user