feature: verify tokens
This commit is contained in:
		
							
								
								
									
										39
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| # RANO | # RANO | ||||||
|  |  | ||||||
| "Reliable And Nonstop Operations" for | Reliable And Nonstop Operations | ||||||
|  |  | ||||||
| ## Prerequisites | ## Prerequisites | ||||||
|  |  | ||||||
| @@ -12,11 +12,45 @@ | |||||||
| - [golang-migrate](https://github.com/golang-migrate/migrate) for manual migrations. | - [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) |   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/) | - [gqlgen](https://gqlgen.com/) | ||||||
| - [mux](https://gitserver.in/patialtech/mux) | - [mux](https://gitserver.in/patialtech/mux) | ||||||
| - [ent. Go](https://entgo.io/docs/tutorial-setup) ORM | - [ent. Go](https://entgo.io/docs/tutorial-setup) ORM | ||||||
|  | - | ||||||
|  |  | ||||||
| ## Web modules | ## Web modules | ||||||
|  |  | ||||||
| @@ -25,3 +59,4 @@ | |||||||
| - [daisyui](https://daisyui.com/docs/install/) | - [daisyui](https://daisyui.com/docs/install/) | ||||||
| - [urql](https://commerce.nearform.com/open-source/urql/docs/basics/svelte/) | - [urql](https://commerce.nearform.com/open-source/urql/docs/basics/svelte/) | ||||||
| - [GraphQL Codegen](https://the-guild.dev/graphql/codegen) | - [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" | ||||||
| 	"gitserver.in/patialtech/mux/middleware" | 	"gitserver.in/patialtech/mux/middleware" | ||||||
|  | 	"gitserver.in/patialtech/rano/cmd/server/handler" | ||||||
| 	"gitserver.in/patialtech/rano/config" | 	"gitserver.in/patialtech/rano/config" | ||||||
| 	"gitserver.in/patialtech/rano/graph" | 	"gitserver.in/patialtech/rano/graph" | ||||||
| 	"gitserver.in/patialtech/rano/util/logger" | 	"gitserver.in/patialtech/rano/util/logger" | ||||||
| @@ -13,6 +14,9 @@ import ( | |||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
| 	r := mux.NewRouter() | 	r := mux.NewRouter() | ||||||
|  | 
 | ||||||
|  | 	r.Use(handler.Request()) | ||||||
|  | 
 | ||||||
| 	// CORS | 	// CORS | ||||||
| 	r.Use(middleware.CORS(middleware.CORSOption{ | 	r.Use(middleware.CORS(middleware.CORSOption{ | ||||||
| 		AllowedHeaders: []string{"Content-Type"}, | 		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 { | func New() *sql.DB { | ||||||
| 	databaseUrl := config.Read().DbURL | 	databaseUrl := config.Read().DbURL | ||||||
| 	db := sql.OpenDB(connector{dsn: databaseUrl}) | 	db := sql.OpenDB(connector{dsn: databaseUrl}) | ||||||
| 	db.SetMaxIdleConns(5) |  | ||||||
| 	db.SetMaxOpenConns(50) | 	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 | 	return db | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -56,20 +56,28 @@ func Client() *ent.Client { | |||||||
|  |  | ||||||
| // A AuditHook is an example for audit-log hook. | // A AuditHook is an example for audit-log hook. | ||||||
| func AuditHook(next ent.Mutator) ent.Mutator { | 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) { | 	return ent.MutateFunc(func(ctx context.Context, m ent.Mutation) (v ent.Value, err error) { | ||||||
|  | 		var id int64 | ||||||
| 		start := time.Now() | 		start := time.Now() | ||||||
| 		defer func() { | 		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) | 		v, err = next.Mutate(ctx, m) | ||||||
|  |  | ||||||
|  | 		if en, ok := v.(Entity); ok { | ||||||
|  | 			id, _ = en.GetID() | ||||||
|  | 		} | ||||||
| 		logger.Info("** %v", v) | 		logger.Info("** %v", v) | ||||||
| 		return | 		return | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func saveAudit(_ context.Context, entT, op string, d time.Duration, err error) { | func saveAudit(_ context.Context, entID int64, entT, op string, d time.Duration, err error) { | ||||||
| 	logger.Info("audit: %s %s %s %v", entT, op, d, err) | 	logger.Info("audit: %d, %s, %s, %s, %v", entID, entT, op, d, err) | ||||||
| 	// ml.SetCreatedAt(time.Now()) | 	// ml.SetCreatedAt(time.Now()) | ||||||
| 	// if usr := auth.CtxUser(ctx); usr != nil { | 	// if usr := auth.CtxUser(ctx); usr != nil { | ||||||
| 	// 	ml.SetByID(usr.ID) | 	// 	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/todo" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Client is the client that holds all ent builders. | // Client is the client that holds all ent builders. | ||||||
| @@ -40,6 +41,8 @@ type Client struct { | |||||||
| 	User *UserClient | 	User *UserClient | ||||||
| 	// UserSession is the client for interacting with the UserSession builders. | 	// UserSession is the client for interacting with the UserSession builders. | ||||||
| 	UserSession *UserSessionClient | 	UserSession *UserSessionClient | ||||||
|  | 	// VerifyToken is the client for interacting with the VerifyToken builders. | ||||||
|  | 	VerifyToken *VerifyTokenClient | ||||||
| } | } | ||||||
|  |  | ||||||
| // NewClient creates a new client configured with the given options. | // NewClient creates a new client configured with the given options. | ||||||
| @@ -57,6 +60,7 @@ func (c *Client) init() { | |||||||
| 	c.Todo = NewTodoClient(c.config) | 	c.Todo = NewTodoClient(c.config) | ||||||
| 	c.User = NewUserClient(c.config) | 	c.User = NewUserClient(c.config) | ||||||
| 	c.UserSession = NewUserSessionClient(c.config) | 	c.UserSession = NewUserSessionClient(c.config) | ||||||
|  | 	c.VerifyToken = NewVerifyTokenClient(c.config) | ||||||
| } | } | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -155,6 +159,7 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) { | |||||||
| 		Todo:          NewTodoClient(cfg), | 		Todo:          NewTodoClient(cfg), | ||||||
| 		User:          NewUserClient(cfg), | 		User:          NewUserClient(cfg), | ||||||
| 		UserSession:   NewUserSessionClient(cfg), | 		UserSession:   NewUserSessionClient(cfg), | ||||||
|  | 		VerifyToken:   NewVerifyTokenClient(cfg), | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -180,6 +185,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) | |||||||
| 		Todo:          NewTodoClient(cfg), | 		Todo:          NewTodoClient(cfg), | ||||||
| 		User:          NewUserClient(cfg), | 		User:          NewUserClient(cfg), | ||||||
| 		UserSession:   NewUserSessionClient(cfg), | 		UserSession:   NewUserSessionClient(cfg), | ||||||
|  | 		VerifyToken:   NewVerifyTokenClient(cfg), | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -209,7 +215,7 @@ func (c *Client) Close() error { | |||||||
| // In order to add hooks to a specific client, call: `client.Node.Use(...)`. | // In order to add hooks to a specific client, call: `client.Node.Use(...)`. | ||||||
| func (c *Client) Use(hooks ...Hook) { | func (c *Client) Use(hooks ...Hook) { | ||||||
| 	for _, n := range []interface{ Use(...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...) | 		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(...)`. | // In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`. | ||||||
| func (c *Client) Intercept(interceptors ...Interceptor) { | func (c *Client) Intercept(interceptors ...Interceptor) { | ||||||
| 	for _, n := range []interface{ Intercept(...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...) | 		n.Intercept(interceptors...) | ||||||
| 	} | 	} | ||||||
| @@ -240,6 +246,8 @@ func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) { | |||||||
| 		return c.User.mutate(ctx, m) | 		return c.User.mutate(ctx, m) | ||||||
| 	case *UserSessionMutation: | 	case *UserSessionMutation: | ||||||
| 		return c.UserSession.mutate(ctx, m) | 		return c.UserSession.mutate(ctx, m) | ||||||
|  | 	case *VerifyTokenMutation: | ||||||
|  | 		return c.VerifyToken.mutate(ctx, m) | ||||||
| 	default: | 	default: | ||||||
| 		return nil, fmt.Errorf("ent: unknown mutation type %T", m) | 		return nil, fmt.Errorf("ent: unknown mutation type %T", m) | ||||||
| 	} | 	} | ||||||
| @@ -933,6 +941,22 @@ func (c *UserClient) QueryAuditLogs(u *User) *AuditQuery { | |||||||
| 	return query | 	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. | // Hooks returns the client hooks. | ||||||
| func (c *UserClient) Hooks() []Hook { | func (c *UserClient) Hooks() []Hook { | ||||||
| 	return c.hooks.User | 	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. | // hooks and interceptors per client, for fast access. | ||||||
| type ( | type ( | ||||||
| 	hooks struct { | 	hooks struct { | ||||||
| 		AccessControl, Audit, Role, Todo, User, UserSession []ent.Hook | 		AccessControl, Audit, Role, Todo, User, UserSession, VerifyToken []ent.Hook | ||||||
| 	} | 	} | ||||||
| 	inters struct { | 	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/todo" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ent aliases to avoid import conflicts in user's code. | // ent aliases to avoid import conflicts in user's code. | ||||||
| @@ -84,6 +85,7 @@ func checkColumn(table, column string) error { | |||||||
| 			todo.Table:          todo.ValidColumn, | 			todo.Table:          todo.ValidColumn, | ||||||
| 			user.Table:          user.ValidColumn, | 			user.Table:          user.ValidColumn, | ||||||
| 			usersession.Table:   usersession.ValidColumn, | 			usersession.Table:   usersession.ValidColumn, | ||||||
|  | 			verifytoken.Table:   verifytoken.ValidColumn, | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
| 	return columnCheck(table, column) | 	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) | 	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. | // Condition is a hook condition function. | ||||||
| type Condition func(context.Context, ent.Mutation) bool | type Condition func(context.Context, ent.Mutation) bool | ||||||
|  |  | ||||||
|   | |||||||
| @@ -101,8 +101,8 @@ var ( | |||||||
| 		{Name: "email_verified", Type: field.TypeBool, Default: false}, | 		{Name: "email_verified", Type: field.TypeBool, Default: false}, | ||||||
| 		{Name: "phone", Type: field.TypeString, Nullable: true, Size: 20}, | 		{Name: "phone", Type: field.TypeString, Nullable: true, Size: 20}, | ||||||
| 		{Name: "phone_verified", Type: field.TypeBool, Default: false}, | 		{Name: "phone_verified", Type: field.TypeBool, Default: false}, | ||||||
| 		{Name: "pwd_salt", Type: field.TypeString, Size: 250}, | 		{Name: "pwd_salt", Type: field.TypeString, Size: 100}, | ||||||
| 		{Name: "pwd_hash", Type: field.TypeString, Size: 250}, | 		{Name: "pwd_hash", Type: field.TypeString, Size: 100}, | ||||||
| 		{Name: "login_failed_count", Type: field.TypeUint8, Nullable: true, Default: 0}, | 		{Name: "login_failed_count", Type: field.TypeUint8, Nullable: true, Default: 0}, | ||||||
| 		{Name: "login_attempt_on", Type: field.TypeTime, Nullable: true}, | 		{Name: "login_attempt_on", Type: field.TypeTime, Nullable: true}, | ||||||
| 		{Name: "login_locked_until", 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 holds all the tables in the schema. | ||||||
| 	Tables = []*schema.Table{ | 	Tables = []*schema.Table{ | ||||||
| 		AccessControlsTable, | 		AccessControlsTable, | ||||||
| @@ -194,10 +217,12 @@ var ( | |||||||
| 		TodosTable, | 		TodosTable, | ||||||
| 		UsersTable, | 		UsersTable, | ||||||
| 		UserSessionsTable, | 		UserSessionsTable, | ||||||
|  | 		VerifyTokensTable, | ||||||
| 	} | 	} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	AuditsTable.ForeignKeys[0].RefTable = UsersTable | 	AuditsTable.ForeignKeys[0].RefTable = UsersTable | ||||||
| 	UserSessionsTable.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/role" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -34,6 +35,7 @@ const ( | |||||||
| 	TypeTodo          = "Todo" | 	TypeTodo          = "Todo" | ||||||
| 	TypeUser          = "User" | 	TypeUser          = "User" | ||||||
| 	TypeUserSession   = "UserSession" | 	TypeUserSession   = "UserSession" | ||||||
|  | 	TypeVerifyToken   = "VerifyToken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // AccessControlMutation represents an operation that mutates the AccessControl nodes in the graph. | // AccessControlMutation represents an operation that mutates the AccessControl nodes in the graph. | ||||||
| @@ -2225,6 +2227,9 @@ type UserMutation struct { | |||||||
| 	audit_logs            map[int64]struct{} | 	audit_logs            map[int64]struct{} | ||||||
| 	removedaudit_logs     map[int64]struct{} | 	removedaudit_logs     map[int64]struct{} | ||||||
| 	clearedaudit_logs     bool | 	clearedaudit_logs     bool | ||||||
|  | 	verify_tokens         map[int64]struct{} | ||||||
|  | 	removedverify_tokens  map[int64]struct{} | ||||||
|  | 	clearedverify_tokens  bool | ||||||
| 	done                  bool | 	done                  bool | ||||||
| 	oldValue              func(context.Context) (*User, error) | 	oldValue              func(context.Context) (*User, error) | ||||||
| 	predicates            []predicate.User | 	predicates            []predicate.User | ||||||
| @@ -3055,6 +3060,60 @@ func (m *UserMutation) ResetAuditLogs() { | |||||||
| 	m.removedaudit_logs = nil | 	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. | // Where appends a list predicates to the UserMutation builder. | ||||||
| func (m *UserMutation) Where(ps ...predicate.User) { | func (m *UserMutation) Where(ps ...predicate.User) { | ||||||
| 	m.predicates = append(m.predicates, ps...) | 	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. | // AddedEdges returns all edge names that were set/added in this mutation. | ||||||
| func (m *UserMutation) AddedEdges() []string { | func (m *UserMutation) AddedEdges() []string { | ||||||
| 	edges := make([]string, 0, 2) | 	edges := make([]string, 0, 3) | ||||||
| 	if m.sessions != nil { | 	if m.sessions != nil { | ||||||
| 		edges = append(edges, user.EdgeSessions) | 		edges = append(edges, user.EdgeSessions) | ||||||
| 	} | 	} | ||||||
| 	if m.audit_logs != nil { | 	if m.audit_logs != nil { | ||||||
| 		edges = append(edges, user.EdgeAuditLogs) | 		edges = append(edges, user.EdgeAuditLogs) | ||||||
| 	} | 	} | ||||||
|  | 	if m.verify_tokens != nil { | ||||||
|  | 		edges = append(edges, user.EdgeVerifyTokens) | ||||||
|  | 	} | ||||||
| 	return edges | 	return edges | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -3494,19 +3556,28 @@ func (m *UserMutation) AddedIDs(name string) []ent.Value { | |||||||
| 			ids = append(ids, id) | 			ids = append(ids, id) | ||||||
| 		} | 		} | ||||||
| 		return ids | 		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 | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // RemovedEdges returns all edge names that were removed in this mutation. | // RemovedEdges returns all edge names that were removed in this mutation. | ||||||
| func (m *UserMutation) RemovedEdges() []string { | func (m *UserMutation) RemovedEdges() []string { | ||||||
| 	edges := make([]string, 0, 2) | 	edges := make([]string, 0, 3) | ||||||
| 	if m.removedsessions != nil { | 	if m.removedsessions != nil { | ||||||
| 		edges = append(edges, user.EdgeSessions) | 		edges = append(edges, user.EdgeSessions) | ||||||
| 	} | 	} | ||||||
| 	if m.removedaudit_logs != nil { | 	if m.removedaudit_logs != nil { | ||||||
| 		edges = append(edges, user.EdgeAuditLogs) | 		edges = append(edges, user.EdgeAuditLogs) | ||||||
| 	} | 	} | ||||||
|  | 	if m.removedverify_tokens != nil { | ||||||
|  | 		edges = append(edges, user.EdgeVerifyTokens) | ||||||
|  | 	} | ||||||
| 	return edges | 	return edges | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -3526,19 +3597,28 @@ func (m *UserMutation) RemovedIDs(name string) []ent.Value { | |||||||
| 			ids = append(ids, id) | 			ids = append(ids, id) | ||||||
| 		} | 		} | ||||||
| 		return ids | 		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 | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // ClearedEdges returns all edge names that were cleared in this mutation. | // ClearedEdges returns all edge names that were cleared in this mutation. | ||||||
| func (m *UserMutation) ClearedEdges() []string { | func (m *UserMutation) ClearedEdges() []string { | ||||||
| 	edges := make([]string, 0, 2) | 	edges := make([]string, 0, 3) | ||||||
| 	if m.clearedsessions { | 	if m.clearedsessions { | ||||||
| 		edges = append(edges, user.EdgeSessions) | 		edges = append(edges, user.EdgeSessions) | ||||||
| 	} | 	} | ||||||
| 	if m.clearedaudit_logs { | 	if m.clearedaudit_logs { | ||||||
| 		edges = append(edges, user.EdgeAuditLogs) | 		edges = append(edges, user.EdgeAuditLogs) | ||||||
| 	} | 	} | ||||||
|  | 	if m.clearedverify_tokens { | ||||||
|  | 		edges = append(edges, user.EdgeVerifyTokens) | ||||||
|  | 	} | ||||||
| 	return edges | 	return edges | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -3550,6 +3630,8 @@ func (m *UserMutation) EdgeCleared(name string) bool { | |||||||
| 		return m.clearedsessions | 		return m.clearedsessions | ||||||
| 	case user.EdgeAuditLogs: | 	case user.EdgeAuditLogs: | ||||||
| 		return m.clearedaudit_logs | 		return m.clearedaudit_logs | ||||||
|  | 	case user.EdgeVerifyTokens: | ||||||
|  | 		return m.clearedverify_tokens | ||||||
| 	} | 	} | ||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
| @@ -3572,6 +3654,9 @@ func (m *UserMutation) ResetEdge(name string) error { | |||||||
| 	case user.EdgeAuditLogs: | 	case user.EdgeAuditLogs: | ||||||
| 		m.ResetAuditLogs() | 		m.ResetAuditLogs() | ||||||
| 		return nil | 		return nil | ||||||
|  | 	case user.EdgeVerifyTokens: | ||||||
|  | 		m.ResetVerifyTokens() | ||||||
|  | 		return nil | ||||||
| 	} | 	} | ||||||
| 	return fmt.Errorf("unknown User edge %s", name) | 	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) | 	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. | // UserSession is the predicate function for usersession builders. | ||||||
| type UserSession func(*sql.Selector) | 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/schema" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // The init function reads all schema descriptors with runtime code | // The init function reads all schema descriptors with runtime code | ||||||
| @@ -176,4 +177,18 @@ func init() { | |||||||
| 	usersessionDescIP := usersessionFields[5].Descriptor() | 	usersessionDescIP := usersessionFields[5].Descriptor() | ||||||
| 	// usersession.IPValidator is a validator for the "ip" field. It is called by the builders before save. | 	// 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) | 	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.Bool("email_verified").Default(false), | ||||||
| 		field.String("phone").MaxLen(20).Optional(), | 		field.String("phone").MaxLen(20).Optional(), | ||||||
| 		field.Bool("phone_verified").Default(false), | 		field.Bool("phone_verified").Default(false), | ||||||
| 		field.String("pwd_salt").MaxLen(250).NotEmpty(), | 		field.String("pwd_salt").MaxLen(100).NotEmpty(), | ||||||
| 		field.String("pwd_hash").MaxLen(250).NotEmpty(), | 		field.String("pwd_hash").MaxLen(100).NotEmpty(), | ||||||
| 		field.Uint8("login_failed_count").Optional().Default(0), | 		field.Uint8("login_failed_count").Optional().Default(0), | ||||||
| 		field.Time("login_attempt_on").Optional().Nillable(), | 		field.Time("login_attempt_on").Optional().Nillable(), | ||||||
| 		field.Time("login_locked_until").Optional().Nillable(), | 		field.Time("login_locked_until").Optional().Nillable(), | ||||||
| @@ -40,6 +40,7 @@ func (User) Edges() []ent.Edge { | |||||||
| 	return []ent.Edge{ | 	return []ent.Edge{ | ||||||
| 		edge.To("sessions", UserSession.Type).StorageKey(edge.Column("user_id")), | 		edge.To("sessions", UserSession.Type).StorageKey(edge.Column("user_id")), | ||||||
| 		edge.To("audit_logs", Audit.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 | 	User *UserClient | ||||||
| 	// UserSession is the client for interacting with the UserSession builders. | 	// UserSession is the client for interacting with the UserSession builders. | ||||||
| 	UserSession *UserSessionClient | 	UserSession *UserSessionClient | ||||||
|  | 	// VerifyToken is the client for interacting with the VerifyToken builders. | ||||||
|  | 	VerifyToken *VerifyTokenClient | ||||||
|  |  | ||||||
| 	// lazily loaded. | 	// lazily loaded. | ||||||
| 	client     *Client | 	client     *Client | ||||||
| @@ -161,6 +163,7 @@ func (tx *Tx) init() { | |||||||
| 	tx.Todo = NewTodoClient(tx.config) | 	tx.Todo = NewTodoClient(tx.config) | ||||||
| 	tx.User = NewUserClient(tx.config) | 	tx.User = NewUserClient(tx.config) | ||||||
| 	tx.UserSession = NewUserSessionClient(tx.config) | 	tx.UserSession = NewUserSessionClient(tx.config) | ||||||
|  | 	tx.VerifyToken = NewVerifyTokenClient(tx.config) | ||||||
| } | } | ||||||
|  |  | ||||||
| // txDriver wraps the given dialect.Tx with a nop dialect.Driver implementation. | // txDriver wraps the given dialect.Tx with a nop dialect.Driver implementation. | ||||||
|   | |||||||
| @@ -59,9 +59,11 @@ type UserEdges struct { | |||||||
| 	Sessions []*UserSession `json:"sessions,omitempty"` | 	Sessions []*UserSession `json:"sessions,omitempty"` | ||||||
| 	// AuditLogs holds the value of the audit_logs edge. | 	// AuditLogs holds the value of the audit_logs edge. | ||||||
| 	AuditLogs []*Audit `json:"audit_logs,omitempty"` | 	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 | 	// loadedTypes holds the information for reporting if a | ||||||
| 	// type was loaded (or requested) in eager-loading or not. | 	// 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 | // 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"} | 	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. | // scanValues returns the types for scanning values from sql.Rows. | ||||||
| func (*User) scanValues(columns []string) ([]any, error) { | func (*User) scanValues(columns []string) ([]any, error) { | ||||||
| 	values := make([]any, len(columns)) | 	values := make([]any, len(columns)) | ||||||
| @@ -232,6 +243,11 @@ func (u *User) QueryAuditLogs() *AuditQuery { | |||||||
| 	return NewUserClient(u.config).QueryAuditLogs(u) | 	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. | // Update returns a builder for updating this User. | ||||||
| // Note that you need to call User.Unwrap() before calling this method if 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. | // was returned from a transaction, and the transaction was committed or rolled back. | ||||||
|   | |||||||
| @@ -49,6 +49,8 @@ const ( | |||||||
| 	EdgeSessions = "sessions" | 	EdgeSessions = "sessions" | ||||||
| 	// EdgeAuditLogs holds the string denoting the audit_logs edge name in mutations. | 	// EdgeAuditLogs holds the string denoting the audit_logs edge name in mutations. | ||||||
| 	EdgeAuditLogs = "audit_logs" | 	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 holds the table name of the user in the database. | ||||||
| 	Table = "users" | 	Table = "users" | ||||||
| 	// SessionsTable is the table that holds the sessions relation/edge. | 	// SessionsTable is the table that holds the sessions relation/edge. | ||||||
| @@ -65,6 +67,13 @@ const ( | |||||||
| 	AuditLogsInverseTable = "audits" | 	AuditLogsInverseTable = "audits" | ||||||
| 	// AuditLogsColumn is the table column denoting the audit_logs relation/edge. | 	// AuditLogsColumn is the table column denoting the audit_logs relation/edge. | ||||||
| 	AuditLogsColumn = "user_id" | 	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. | // 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...)...) | 		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 { | func newSessionsStep() *sqlgraph.Step { | ||||||
| 	return sqlgraph.NewStep( | 	return sqlgraph.NewStep( | ||||||
| 		sqlgraph.From(Table, FieldID), | 		sqlgraph.From(Table, FieldID), | ||||||
| @@ -277,3 +300,10 @@ func newAuditLogsStep() *sqlgraph.Step { | |||||||
| 		sqlgraph.Edge(sqlgraph.O2M, false, AuditLogsTable, AuditLogsColumn), | 		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. | // And groups predicates with the AND operator between them. | ||||||
| func And(predicates ...predicate.User) predicate.User { | func And(predicates ...predicate.User) predicate.User { | ||||||
| 	return predicate.User(sql.AndPredicates(predicates...)) | 	return predicate.User(sql.AndPredicates(predicates...)) | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ import ( | |||||||
| 	"gitserver.in/patialtech/rano/db/ent/audit" | 	"gitserver.in/patialtech/rano/db/ent/audit" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // UserCreate is the builder for creating a User entity. | // UserCreate is the builder for creating a User entity. | ||||||
| @@ -220,6 +221,21 @@ func (uc *UserCreate) AddAuditLogs(a ...*Audit) *UserCreate { | |||||||
| 	return uc.AddAuditLogIDs(ids...) | 	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. | // Mutation returns the UserMutation object of the builder. | ||||||
| func (uc *UserCreate) Mutation() *UserMutation { | func (uc *UserCreate) Mutation() *UserMutation { | ||||||
| 	return uc.mutation | 	return uc.mutation | ||||||
| @@ -480,6 +496,22 @@ func (uc *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) { | |||||||
| 		} | 		} | ||||||
| 		_spec.Edges = append(_spec.Edges, edge) | 		_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 | 	return _node, _spec | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ import ( | |||||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // UserQuery is the builder for querying User entities. | // UserQuery is the builder for querying User entities. | ||||||
| @@ -27,6 +28,7 @@ type UserQuery struct { | |||||||
| 	predicates       []predicate.User | 	predicates       []predicate.User | ||||||
| 	withSessions     *UserSessionQuery | 	withSessions     *UserSessionQuery | ||||||
| 	withAuditLogs    *AuditQuery | 	withAuditLogs    *AuditQuery | ||||||
|  | 	withVerifyTokens *VerifyTokenQuery | ||||||
| 	// intermediate query (i.e. traversal path). | 	// intermediate query (i.e. traversal path). | ||||||
| 	sql  *sql.Selector | 	sql  *sql.Selector | ||||||
| 	path func(context.Context) (*sql.Selector, error) | 	path func(context.Context) (*sql.Selector, error) | ||||||
| @@ -107,6 +109,28 @@ func (uq *UserQuery) QueryAuditLogs() *AuditQuery { | |||||||
| 	return query | 	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. | // First returns the first User entity from the query. | ||||||
| // Returns a *NotFoundError when no User was found. | // Returns a *NotFoundError when no User was found. | ||||||
| func (uq *UserQuery) First(ctx context.Context) (*User, error) { | func (uq *UserQuery) First(ctx context.Context) (*User, error) { | ||||||
| @@ -301,6 +325,7 @@ func (uq *UserQuery) Clone() *UserQuery { | |||||||
| 		predicates:       append([]predicate.User{}, uq.predicates...), | 		predicates:       append([]predicate.User{}, uq.predicates...), | ||||||
| 		withSessions:     uq.withSessions.Clone(), | 		withSessions:     uq.withSessions.Clone(), | ||||||
| 		withAuditLogs:    uq.withAuditLogs.Clone(), | 		withAuditLogs:    uq.withAuditLogs.Clone(), | ||||||
|  | 		withVerifyTokens: uq.withVerifyTokens.Clone(), | ||||||
| 		// clone intermediate query. | 		// clone intermediate query. | ||||||
| 		sql:  uq.sql.Clone(), | 		sql:  uq.sql.Clone(), | ||||||
| 		path: uq.path, | 		path: uq.path, | ||||||
| @@ -329,6 +354,17 @@ func (uq *UserQuery) WithAuditLogs(opts ...func(*AuditQuery)) *UserQuery { | |||||||
| 	return uq | 	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. | // 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. | // 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 ( | 	var ( | ||||||
| 		nodes       = []*User{} | 		nodes       = []*User{} | ||||||
| 		_spec       = uq.querySpec() | 		_spec       = uq.querySpec() | ||||||
| 		loadedTypes = [2]bool{ | 		loadedTypes = [3]bool{ | ||||||
| 			uq.withSessions != nil, | 			uq.withSessions != nil, | ||||||
| 			uq.withAuditLogs != nil, | 			uq.withAuditLogs != nil, | ||||||
|  | 			uq.withVerifyTokens != nil, | ||||||
| 		} | 		} | ||||||
| 	) | 	) | ||||||
| 	_spec.ScanValues = func(columns []string) ([]any, error) { | 	_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 | 			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 | 	return nodes, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -509,6 +553,37 @@ func (uq *UserQuery) loadAuditLogs(ctx context.Context, query *AuditQuery, nodes | |||||||
| 	} | 	} | ||||||
| 	return nil | 	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) { | func (uq *UserQuery) sqlCount(ctx context.Context) (int, error) { | ||||||
| 	_spec := uq.querySpec() | 	_spec := uq.querySpec() | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ import ( | |||||||
| 	"gitserver.in/patialtech/rano/db/ent/predicate" | 	"gitserver.in/patialtech/rano/db/ent/predicate" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/user" | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/db/ent/usersession" | 	"gitserver.in/patialtech/rano/db/ent/usersession" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/verifytoken" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // UserUpdate is the builder for updating User entities. | // UserUpdate is the builder for updating User entities. | ||||||
| @@ -279,6 +280,21 @@ func (uu *UserUpdate) AddAuditLogs(a ...*Audit) *UserUpdate { | |||||||
| 	return uu.AddAuditLogIDs(ids...) | 	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. | // Mutation returns the UserMutation object of the builder. | ||||||
| func (uu *UserUpdate) Mutation() *UserMutation { | func (uu *UserUpdate) Mutation() *UserMutation { | ||||||
| 	return uu.mutation | 	return uu.mutation | ||||||
| @@ -326,6 +342,27 @@ func (uu *UserUpdate) RemoveAuditLogs(a ...*Audit) *UserUpdate { | |||||||
| 	return uu.RemoveAuditLogIDs(ids...) | 	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. | // Save executes the query and returns the number of nodes affected by the update operation. | ||||||
| func (uu *UserUpdate) Save(ctx context.Context) (int, error) { | func (uu *UserUpdate) Save(ctx context.Context) (int, error) { | ||||||
| 	uu.defaults() | 	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) | 		_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 n, err = sqlgraph.UpdateNodes(ctx, uu.driver, _spec); err != nil { | ||||||
| 		if _, ok := err.(*sqlgraph.NotFoundError); ok { | 		if _, ok := err.(*sqlgraph.NotFoundError); ok { | ||||||
| 			err = &NotFoundError{user.Label} | 			err = &NotFoundError{user.Label} | ||||||
| @@ -835,6 +917,21 @@ func (uuo *UserUpdateOne) AddAuditLogs(a ...*Audit) *UserUpdateOne { | |||||||
| 	return uuo.AddAuditLogIDs(ids...) | 	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. | // Mutation returns the UserMutation object of the builder. | ||||||
| func (uuo *UserUpdateOne) Mutation() *UserMutation { | func (uuo *UserUpdateOne) Mutation() *UserMutation { | ||||||
| 	return uuo.mutation | 	return uuo.mutation | ||||||
| @@ -882,6 +979,27 @@ func (uuo *UserUpdateOne) RemoveAuditLogs(a ...*Audit) *UserUpdateOne { | |||||||
| 	return uuo.RemoveAuditLogIDs(ids...) | 	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. | // Where appends a list predicates to the UserUpdate builder. | ||||||
| func (uuo *UserUpdateOne) Where(ps ...predicate.User) *UserUpdateOne { | func (uuo *UserUpdateOne) Where(ps ...predicate.User) *UserUpdateOne { | ||||||
| 	uuo.mutation.Where(ps...) | 	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) | 		_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} | 	_node = &User{config: uuo.config} | ||||||
| 	_spec.Assign = _node.assignValues | 	_spec.Assign = _node.assignValues | ||||||
| 	_spec.ScanValues = _node.scanValues | 	_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 ( | require ( | ||||||
| 	github.com/99designs/gqlgen v0.17.56 | 	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/jackc/pgx/v5 v5.7.1 | ||||||
|  | 	github.com/sqids/sqids-go v0.4.1 | ||||||
| 	github.com/vektah/gqlparser/v2 v2.5.19 | 	github.com/vektah/gqlparser/v2 v2.5.19 | ||||||
| 	gitserver.in/patialtech/mux v0.3.1 | 	gitserver.in/patialtech/mux v0.3.1 | ||||||
| 	golang.org/x/crypto v0.29.0 | 	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/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 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= | ||||||
| github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= | 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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | 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= | 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/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 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= | ||||||
| github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | 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 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= | ||||||
| github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= | 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= | 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/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 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= | ||||||
| github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= | 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 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= | ||||||
| github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= | 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= | 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/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 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= | ||||||
| github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= | 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/sqids/sqids-go v0.4.1 h1:eQKYzmAZbLlRwHeHYPF35QhgxwZHLnlmVj9AkIj/rrw= | ||||||
| github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= | github.com/sqids/sqids-go v0.4.1/go.mod h1:EMwHuPQgSNFS0A49jESTfIQS+066XQTVhukrzEPScl8= | ||||||
| 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||||
| github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||||
|   | |||||||
| @@ -87,12 +87,13 @@ autobind: | |||||||
| models: | models: | ||||||
|   ID: |   ID: | ||||||
|     model: |     model: | ||||||
|       - github.com/99designs/gqlgen/graphql.ID |  | ||||||
|       - github.com/99designs/gqlgen/graphql.Int |  | ||||||
|       - github.com/99designs/gqlgen/graphql.Int64 |       - github.com/99designs/gqlgen/graphql.Int64 | ||||||
|       - github.com/99designs/gqlgen/graphql.Int32 |   SQID: | ||||||
|  |     model: | ||||||
|  |       - github.com/99designs/gqlgen/graphql.ID | ||||||
|   Int: |   Int: | ||||||
|     model: |     model: | ||||||
|       - github.com/99designs/gqlgen/graphql.Int |       - github.com/99designs/gqlgen/graphql.Int | ||||||
|  |   Int64: | ||||||
|  |     model: | ||||||
|       - github.com/99designs/gqlgen/graphql.Int64 |       - github.com/99designs/gqlgen/graphql.Int64 | ||||||
|       - github.com/99designs/gqlgen/graphql.Int32 |  | ||||||
|   | |||||||
| @@ -1,6 +1,18 @@ | |||||||
| extend type Mutation { | 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 { | extend type Query { | ||||||
| @@ -8,8 +20,8 @@ extend type Query { | |||||||
| } | } | ||||||
|  |  | ||||||
| type AuthUser { | type AuthUser { | ||||||
| 	id: ID! | 	id: UID! | ||||||
| 	email: String! | 	email: String! | ||||||
| 	displayName: String! | 	name: String! | ||||||
| 	roleID: Int! | 	roleID: Int! | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,14 +11,19 @@ import ( | |||||||
| 	"gitserver.in/patialtech/rano/graph/model" | 	"gitserver.in/patialtech/rano/graph/model" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Login is the resolver for the login field. | // AccountVerifyEmail is the resolver for the accountVerifyEmail field. | ||||||
| func (r *mutationResolver) Login(ctx context.Context, email string, pwd string) (*model.AuthUser, error) { | func (r *mutationResolver) AccountVerifyEmail(ctx context.Context, token *string) (bool, error) { | ||||||
| 	panic(fmt.Errorf("not implemented: Login - login")) | 	panic(fmt.Errorf("not implemented: AccountVerifyEmail - accountVerifyEmail")) | ||||||
| } | } | ||||||
|  |  | ||||||
| // Logout is the resolver for the logout field. | // AccountLogin is the resolver for the accountLogin field. | ||||||
| func (r *mutationResolver) Logout(ctx context.Context) (bool, error) { | func (r *mutationResolver) AccountLogin(ctx context.Context, email string, pwd string) (*model.AuthUser, error) { | ||||||
| 	panic(fmt.Errorf("not implemented: Logout - logout")) | 	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. | // 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) | 	res := resTmp.(string) | ||||||
| 	fc.Result = res | 	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) { | 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, | 		IsMethod:   false, | ||||||
| 		IsResolver: false, | 		IsResolver: false, | ||||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | 		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 | 	return fc, nil | ||||||
| @@ -115,8 +115,8 @@ func (ec *executionContext) fieldContext_AuthUser_email(_ context.Context, field | |||||||
| 	return fc, nil | 	return fc, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (ec *executionContext) _AuthUser_displayName(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | func (ec *executionContext) _AuthUser_name(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||||
| 	fc, err := ec.fieldContext_AuthUser_displayName(ctx, field) | 	fc, err := ec.fieldContext_AuthUser_name(ctx, field) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return graphql.Null | 		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) { | 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||||
| 		ctx = rctx // use context from middleware stack in children | 		ctx = rctx // use context from middleware stack in children | ||||||
| 		return obj.DisplayName, nil | 		return obj.Name, nil | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ec.Error(ctx, err) | 		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) | 	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{ | 	fc = &graphql.FieldContext{ | ||||||
| 		Object:     "AuthUser", | 		Object:     "AuthUser", | ||||||
| 		Field:      field, | 		Field:      field, | ||||||
| @@ -236,8 +236,8 @@ func (ec *executionContext) _AuthUser(ctx context.Context, sel ast.SelectionSet, | |||||||
| 			if out.Values[i] == graphql.Null { | 			if out.Values[i] == graphql.Null { | ||||||
| 				out.Invalids++ | 				out.Invalids++ | ||||||
| 			} | 			} | ||||||
| 		case "displayName": | 		case "name": | ||||||
| 			out.Values[i] = ec._AuthUser_displayName(ctx, field, obj) | 			out.Values[i] = ec._AuthUser_name(ctx, field, obj) | ||||||
| 			if out.Values[i] == graphql.Null { | 			if out.Values[i] == graphql.Null { | ||||||
| 				out.Invalids++ | 				out.Invalids++ | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -2256,21 +2256,6 @@ func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.Se | |||||||
| 	return res | 	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) { | func (ec *executionContext) unmarshalNInt2int(ctx context.Context, v interface{}) (int, error) { | ||||||
| 	res, err := graphql.UnmarshalInt(v) | 	res, err := graphql.UnmarshalInt(v) | ||||||
| 	return res, graphql.ErrorOnPath(ctx, err) | 	return res, graphql.ErrorOnPath(ctx, err) | ||||||
|   | |||||||
| @@ -18,8 +18,9 @@ import ( | |||||||
| // region    ************************** generated!.gotpl ************************** | // region    ************************** generated!.gotpl ************************** | ||||||
|  |  | ||||||
| type MutationResolver interface { | type MutationResolver interface { | ||||||
| 	Login(ctx context.Context, email string, pwd string) (*model.AuthUser, error) | 	AccountVerifyEmail(ctx context.Context, token *string) (bool, error) | ||||||
| 	Logout(ctx context.Context) (bool, error) | 	AccountLogin(ctx context.Context, email string, pwd string) (*model.AuthUser, error) | ||||||
|  | 	AccountLogout(ctx context.Context) (bool, error) | ||||||
| } | } | ||||||
| type QueryResolver interface { | type QueryResolver interface { | ||||||
| 	Me(ctx context.Context) (*model.AuthUser, error) | 	Me(ctx context.Context) (*model.AuthUser, error) | ||||||
| @@ -29,22 +30,22 @@ type QueryResolver interface { | |||||||
|  |  | ||||||
| // region    ***************************** args.gotpl ***************************** | // 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 | 	var err error | ||||||
| 	args := map[string]interface{}{} | 	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 { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	args["email"] = arg0 | 	args["email"] = arg0 | ||||||
| 	arg1, err := ec.field_Mutation_login_argsPwd(ctx, rawArgs) | 	arg1, err := ec.field_Mutation_accountLogin_argsPwd(ctx, rawArgs) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	args["pwd"] = arg1 | 	args["pwd"] = arg1 | ||||||
| 	return args, nil | 	return args, nil | ||||||
| } | } | ||||||
| func (ec *executionContext) field_Mutation_login_argsEmail( | func (ec *executionContext) field_Mutation_accountLogin_argsEmail( | ||||||
| 	ctx context.Context, | 	ctx context.Context, | ||||||
| 	rawArgs map[string]interface{}, | 	rawArgs map[string]interface{}, | ||||||
| ) (string, error) { | ) (string, error) { | ||||||
| @@ -57,7 +58,7 @@ func (ec *executionContext) field_Mutation_login_argsEmail( | |||||||
| 	return zeroVal, nil | 	return zeroVal, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (ec *executionContext) field_Mutation_login_argsPwd( | func (ec *executionContext) field_Mutation_accountLogin_argsPwd( | ||||||
| 	ctx context.Context, | 	ctx context.Context, | ||||||
| 	rawArgs map[string]interface{}, | 	rawArgs map[string]interface{}, | ||||||
| ) (string, error) { | ) (string, error) { | ||||||
| @@ -70,6 +71,29 @@ func (ec *executionContext) field_Mutation_login_argsPwd( | |||||||
| 	return zeroVal, nil | 	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) { | func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { | ||||||
| 	var err error | 	var err error | ||||||
| 	args := map[string]interface{}{} | 	args := map[string]interface{}{} | ||||||
| @@ -101,8 +125,8 @@ func (ec *executionContext) field_Query___type_argsName( | |||||||
|  |  | ||||||
| // region    **************************** field.gotpl ***************************** | // region    **************************** field.gotpl ***************************** | ||||||
|  |  | ||||||
| func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | func (ec *executionContext) _Mutation_accountVerifyEmail(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||||
| 	fc, err := ec.fieldContext_Mutation_login(ctx, field) | 	fc, err := ec.fieldContext_Mutation_accountVerifyEmail(ctx, field) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return graphql.Null | 		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) { | 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { | ||||||
| 		ctx = rctx // use context from middleware stack in children | 		ctx = rctx // use context from middleware stack in children | ||||||
| 		return ec.resolvers.Mutation().Login(rctx, fc.Args["email"].(string), fc.Args["pwd"].(string)) | 		return ec.resolvers.Mutation().AccountVerifyEmail(rctx, fc.Args["token"].(*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) |  | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ec.Error(ctx, err) | 		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) | 	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{ | 	fc = &graphql.FieldContext{ | ||||||
| 		Object:     "Mutation", | 		Object:     "Mutation", | ||||||
| 		Field:      field, | 		Field:      field, | ||||||
| @@ -250,8 +329,8 @@ func (ec *executionContext) fieldContext_Query_me(_ context.Context, field graph | |||||||
| 				return ec.fieldContext_AuthUser_id(ctx, field) | 				return ec.fieldContext_AuthUser_id(ctx, field) | ||||||
| 			case "email": | 			case "email": | ||||||
| 				return ec.fieldContext_AuthUser_email(ctx, field) | 				return ec.fieldContext_AuthUser_email(ctx, field) | ||||||
| 			case "displayName": | 			case "name": | ||||||
| 				return ec.fieldContext_AuthUser_displayName(ctx, field) | 				return ec.fieldContext_AuthUser_name(ctx, field) | ||||||
| 			case "roleID": | 			case "roleID": | ||||||
| 				return ec.fieldContext_AuthUser_roleID(ctx, field) | 				return ec.fieldContext_AuthUser_roleID(ctx, field) | ||||||
| 			} | 			} | ||||||
| @@ -421,16 +500,23 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) | |||||||
| 		switch field.Name { | 		switch field.Name { | ||||||
| 		case "__typename": | 		case "__typename": | ||||||
| 			out.Values[i] = graphql.MarshalString("Mutation") | 			out.Values[i] = graphql.MarshalString("Mutation") | ||||||
| 		case "login": | 		case "accountVerifyEmail": | ||||||
| 			out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { | 			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 { | 			if out.Values[i] == graphql.Null { | ||||||
| 				out.Invalids++ | 				out.Invalids++ | ||||||
| 			} | 			} | ||||||
| 		case "logout": | 		case "accountLogin": | ||||||
| 			out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { | 			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 { | 			if out.Values[i] == graphql.Null { | ||||||
| 				out.Invalids++ | 				out.Invalids++ | ||||||
| @@ -531,4 +617,19 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr | |||||||
|  |  | ||||||
| // region    ***************************** type.gotpl ***************************** | // 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 ***************************** | // endregion ***************************** type.gotpl ***************************** | ||||||
|   | |||||||
| @@ -41,15 +41,16 @@ type DirectiveRoot struct { | |||||||
|  |  | ||||||
| type ComplexityRoot struct { | type ComplexityRoot struct { | ||||||
| 	AuthUser struct { | 	AuthUser struct { | ||||||
| 		DisplayName func(childComplexity int) int |  | ||||||
| 		Email  func(childComplexity int) int | 		Email  func(childComplexity int) int | ||||||
| 		ID     func(childComplexity int) int | 		ID     func(childComplexity int) int | ||||||
|  | 		Name   func(childComplexity int) int | ||||||
| 		RoleID func(childComplexity int) int | 		RoleID func(childComplexity int) int | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	Mutation struct { | 	Mutation struct { | ||||||
| 		Login  func(childComplexity int, email string, pwd string) int | 		AccountLogin       func(childComplexity int, email string, pwd string) int | ||||||
| 		Logout func(childComplexity int) int | 		AccountLogout      func(childComplexity int) int | ||||||
|  | 		AccountVerifyEmail func(childComplexity int, token *string) int | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	Query struct { | 	Query struct { | ||||||
| @@ -76,13 +77,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | |||||||
| 	_ = ec | 	_ = ec | ||||||
| 	switch typeName + "." + field { | 	switch typeName + "." + field { | ||||||
|  |  | ||||||
| 	case "AuthUser.displayName": |  | ||||||
| 		if e.complexity.AuthUser.DisplayName == nil { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		return e.complexity.AuthUser.DisplayName(childComplexity), true |  | ||||||
|  |  | ||||||
| 	case "AuthUser.email": | 	case "AuthUser.email": | ||||||
| 		if e.complexity.AuthUser.Email == nil { | 		if e.complexity.AuthUser.Email == nil { | ||||||
| 			break | 			break | ||||||
| @@ -97,6 +91,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | |||||||
|  |  | ||||||
| 		return e.complexity.AuthUser.ID(childComplexity), true | 		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": | 	case "AuthUser.roleID": | ||||||
| 		if e.complexity.AuthUser.RoleID == nil { | 		if e.complexity.AuthUser.RoleID == nil { | ||||||
| 			break | 			break | ||||||
| @@ -104,24 +105,36 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | |||||||
|  |  | ||||||
| 		return e.complexity.AuthUser.RoleID(childComplexity), true | 		return e.complexity.AuthUser.RoleID(childComplexity), true | ||||||
|  |  | ||||||
| 	case "Mutation.login": | 	case "Mutation.accountLogin": | ||||||
| 		if e.complexity.Mutation.Login == nil { | 		if e.complexity.Mutation.AccountLogin == nil { | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		args, err := ec.field_Mutation_login_args(context.TODO(), rawArgs) | 		args, err := ec.field_Mutation_accountLogin_args(context.TODO(), rawArgs) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return 0, false | 			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": | 	case "Mutation.accountLogout": | ||||||
| 		if e.complexity.Mutation.Logout == nil { | 		if e.complexity.Mutation.AccountLogout == nil { | ||||||
| 			break | 			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": | 	case "Query.me": | ||||||
| 		if e.complexity.Query.Me == nil { | 		if e.complexity.Query.Me == nil { | ||||||
| @@ -235,8 +248,20 @@ func (ec *executionContext) introspectType(name string) (*introspection.Type, er | |||||||
|  |  | ||||||
| var sources = []*ast.Source{ | var sources = []*ast.Source{ | ||||||
| 	{Name: "../account.graphql", Input: `extend type Mutation { | 	{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 { | extend type Query { | ||||||
| @@ -244,9 +269,9 @@ extend type Query { | |||||||
| } | } | ||||||
|  |  | ||||||
| type AuthUser { | type AuthUser { | ||||||
| 	id: ID! | 	id: UID! | ||||||
| 	email: String! | 	email: String! | ||||||
| 	displayName: String! | 	name: String! | ||||||
| 	roleID: Int! | 	roleID: Int! | ||||||
| } | } | ||||||
| `, BuiltIn: false}, | `, BuiltIn: false}, | ||||||
| @@ -258,6 +283,10 @@ type Mutation | |||||||
|  |  | ||||||
| type Query | type Query | ||||||
|  |  | ||||||
|  | scalar UID | ||||||
|  |  | ||||||
|  | scalar Int64 | ||||||
|  |  | ||||||
| """ | """ | ||||||
| Maps a Time GraphQL scalar to a Go time.Time struct. | Maps a Time GraphQL scalar to a Go time.Time struct. | ||||||
| """ | """ | ||||||
| @@ -272,6 +301,7 @@ scalar Map | |||||||
| Go type interface{} | Go type interface{} | ||||||
| """ | """ | ||||||
| scalar Any | scalar Any | ||||||
|  |  | ||||||
| scalar Void | scalar Void | ||||||
|  |  | ||||||
| """ | """ | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ package model | |||||||
| type AuthUser struct { | type AuthUser struct { | ||||||
| 	ID     string `json:"id"` | 	ID     string `json:"id"` | ||||||
| 	Email  string `json:"email"` | 	Email  string `json:"email"` | ||||||
| 	DisplayName string `json:"displayName"` | 	Name   string `json:"name"` | ||||||
| 	RoleID int    `json:"roleID"` | 	RoleID int    `json:"roleID"` | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,6 +6,10 @@ type Mutation | |||||||
|  |  | ||||||
| type Query | type Query | ||||||
|  |  | ||||||
|  | scalar UID | ||||||
|  |  | ||||||
|  | scalar Int64 | ||||||
|  |  | ||||||
| """ | """ | ||||||
| Maps a Time GraphQL scalar to a Go time.Time struct. | Maps a Time GraphQL scalar to a Go time.Time struct. | ||||||
| """ | """ | ||||||
| @@ -20,6 +24,7 @@ scalar Map | |||||||
| Go type interface{} | Go type interface{} | ||||||
| """ | """ | ||||||
| scalar Any | scalar Any | ||||||
|  |  | ||||||
| scalar Void | scalar Void | ||||||
|  |  | ||||||
| """ | """ | ||||||
|   | |||||||
| @@ -1,16 +1,19 @@ | |||||||
| package message | package message | ||||||
|  |  | ||||||
|  | import _ "embed" | ||||||
|  |  | ||||||
|  | //go:embed welcome.html | ||||||
|  | var welcomeHtml string | ||||||
|  |  | ||||||
| type Welcome struct { | type Welcome struct { | ||||||
| 	Name      string | 	Name      string | ||||||
|  | 	VerifyURL string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (e *Welcome) Subject() string { | func (e *Welcome) Subject() string { | ||||||
| 	return "Welcome" | 	return "Welcome, " + e.Name | ||||||
| } | } | ||||||
|  |  | ||||||
| func (e *Welcome) HtmlBody() (string, error) { | func (e *Welcome) HtmlBody() (string, error) { | ||||||
| 	content := ` | 	return render(layout, welcomeHtml, e) | ||||||
| <p>Welcome {{.Name}}</p> |  | ||||||
| ` |  | ||||||
| 	return render(layout, content, 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" | 	"context" | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"log/slog" |  | ||||||
| 	"net/mail" | 	"net/mail" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"gitserver.in/patialtech/rano/config" | ||||||
| 	"gitserver.in/patialtech/rano/db" | 	"gitserver.in/patialtech/rano/db" | ||||||
|  | 	"gitserver.in/patialtech/rano/db/ent/user" | ||||||
| 	"gitserver.in/patialtech/rano/mailer" | 	"gitserver.in/patialtech/rano/mailer" | ||||||
| 	"gitserver.in/patialtech/rano/mailer/message" | 	"gitserver.in/patialtech/rano/mailer/message" | ||||||
| 	"gitserver.in/patialtech/rano/util/crypto" | 	"gitserver.in/patialtech/rano/util/crypto" | ||||||
| 	"gitserver.in/patialtech/rano/util/logger" |  | ||||||
| 	"gitserver.in/patialtech/rano/util/validate" | 	"gitserver.in/patialtech/rano/util/validate" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -36,17 +37,17 @@ var ( | |||||||
| // | // | ||||||
| // will return created userID on success | // will return created userID on success | ||||||
| func Create(ctx context.Context, inp *CreateInput) (int64, error) { | func Create(ctx context.Context, inp *CreateInput) (int64, error) { | ||||||
| 	// check for nil inp | 	// Check for nil input. | ||||||
| 	if inp == nil { | 	if inp == nil { | ||||||
| 		return 0, ErrCreateInpNil | 		return 0, ErrCreateInpNil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// validate | 	// Validate struct. | ||||||
| 	if err := validate.Struct(inp); err != nil { | 	if err := validate.Struct(inp); err != nil { | ||||||
| 		return 0, err | 		return 0, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// compare pwd and comparePwd | 	// Compare pwd and comparePwd. | ||||||
| 	if inp.Pwd != inp.ConfirmPwd { | 	if inp.Pwd != inp.ConfirmPwd { | ||||||
| 		return 0, ErrWrongConfirmPwd | 		return 0, ErrWrongConfirmPwd | ||||||
| 	} | 	} | ||||||
| @@ -56,42 +57,73 @@ func Create(ctx context.Context, inp *CreateInput) (int64, error) { | |||||||
| 		return 0, err | 		return 0, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// save record to DB | 	// Begin a transaction. | ||||||
| 	client := db.Client() | 	tx, err := db.Client().BeginTx(ctx, nil) | ||||||
| 	u, err := client.User.Create(). | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Save User to DB. | ||||||
|  | 	u, err := tx.User.Create(). | ||||||
| 		SetEmail(inp.Email). | 		SetEmail(inp.Email). | ||||||
| 		SetPwdHash(h). | 		SetPwdHash(h). | ||||||
| 		SetPwdSalt(salt). | 		SetPwdSalt(salt). | ||||||
| 		SetFirstName(inp.FirstName). | 		SetFirstName(inp.FirstName). | ||||||
| 		SetMiddleName(inp.MiddleName). | 		SetMiddleName(inp.MiddleName). | ||||||
| 		SetLastName(inp.LastName). | 		SetLastName(inp.LastName). | ||||||
|  | 		SetStatus(user.StatusActive). | ||||||
| 		Save(ctx) | 		Save(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Error(err, slog.String("ref", "user: create error")) |  | ||||||
| 		return 0, errors.New("failed to create user") | 		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( | 	err = mailer.Send( | ||||||
| 		[]mail.Address{ | 		[]mail.Address{ | ||||||
| 			{Name: inp.FullName(), Address: inp.Email}, | 			{Name: name, Address: inp.Email}, | ||||||
| 		}, | 		}, | ||||||
| 		&message.Welcome{ | 		&message.Welcome{ | ||||||
| 			Name: inp.FullName(), | 			Name:      name, | ||||||
|  | 			VerifyURL: config.VerifyEmailURL(token), | ||||||
| 		}, | 		}, | ||||||
| 	) | 	) | ||||||
| 	if err != nil { | 	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 | 	return u.ID, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (inp *CreateInput) FullName() string { | func fullName(fName, mName, lName string) string { | ||||||
| 	if inp == nil { | 	name := fmt.Sprintf("%s %s %s", fName, mName, lName) | ||||||
| 		return "" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	name := fmt.Sprintf("%s %s %s", inp.FirstName, inp.MiddleName, inp.LastName) |  | ||||||
| 	return strings.Join(strings.Fields(name), " ") | 	return strings.Join(strings.Fields(name), " ") | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ package user | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
|  | 	"github.com/brianvoe/gofakeit/v7" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestCreate(t *testing.T) { | func TestCreate(t *testing.T) { | ||||||
| @@ -22,12 +24,12 @@ func TestCreate(t *testing.T) { | |||||||
|  |  | ||||||
| 	t.Run("create", func(t *testing.T) { | 	t.Run("create", func(t *testing.T) { | ||||||
| 		if _, err := Create(context.Background(), &CreateInput{ | 		if _, err := Create(context.Background(), &CreateInput{ | ||||||
| 			Email:      "aa@aa.com", | 			Email:      gofakeit.Email(), | ||||||
| 			Pwd:        "pwd123", | 			Pwd:        "pwd123", | ||||||
| 			ConfirmPwd: "pwd123", | 			ConfirmPwd: "pwd123", | ||||||
| 			FirstName:  "Ankit", | 			FirstName:  gofakeit.FirstName(), | ||||||
| 			MiddleName: "Singh", | 			MiddleName: gofakeit.MiddleName(), | ||||||
| 			LastName:   "Patial", | 			LastName:   gofakeit.LastName(), | ||||||
| 			RoleID:     1, | 			RoleID:     1, | ||||||
| 		}); err != nil { | 		}); err != nil { | ||||||
| 			t.Error(err) | 			t.Error(err) | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| package auth | package user | ||||||
| 
 | 
 | ||||||
| // EmailResetPWD link to user to reset password | // EmailResetPWD link to user to reset password | ||||||
| func EmailResetPWD(email string) { | 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: |   start-graph: | ||||||
|     desc: run graph server |     desc: run graph server | ||||||
|     cmds: |     cmds: | ||||||
|       - cmd: go run ./graph/server |       - cmd: go run ./cmd/server | ||||||
|  |  | ||||||
|   start-web: |   start-web: | ||||||
|     desc: run web in dev mode |     desc: run web in dev mode | ||||||
| @@ -36,7 +36,6 @@ tasks: | |||||||
|   graph-gen: |   graph-gen: | ||||||
|     desc: graph gen |     desc: graph gen | ||||||
|     cmds: |     cmds: | ||||||
|       - go mod tidy |  | ||||||
|       - go generate ./graph |       - go generate ./graph | ||||||
|  |  | ||||||
|   graph-codegen: |   graph-codegen: | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package logger | package logger | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"log/slog" | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| @@ -16,6 +17,12 @@ func Warn(msg string, args ...any) { | |||||||
| 	slog.Warn(fmt.Sprintf(msg, a...), b...) | 	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) { | func Error(err error, args ...any) { | ||||||
| 	a, b := getArgs(args) | 	a, b := getArgs(args) | ||||||
| 	slog.Error(fmt.Sprintf(err.Error(), a...), b...) | 	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 { updated } from '$app/stores'; | ||||||
| 	import { setContextClient } from '@urql/svelte'; | 	import { setContextClient } from '@urql/svelte'; | ||||||
| 	import { newClient } from '$lib/gql/client'; | 	import { newClient } from '$lib/gql/client'; | ||||||
|  | 	import { Me } from '$lib/gql/account.gql'; | ||||||
| 	import '../app.css'; | 	import '../app.css'; | ||||||
| 	import { Me } from '$lib/gql/auth.gql'; |  | ||||||
|  |  | ||||||
| 	const { children } = $props(); | 	const { children } = $props(); | ||||||
| 	const host = import.meta.env.VITE_GRAPH_URL ?? '' | 	const host = import.meta.env.VITE_GRAPH_URL ?? ''; | ||||||
| 	const client = newClient(`${host}/query`); | 	const client = newClient(`${host}/query`); | ||||||
|  |  | ||||||
| 	setContextClient(client); | 	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