added in graphql client
This commit is contained in:
		
							
								
								
									
										4
									
								
								.env.development
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.env.development
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| WEB_PORT = 3006 | ||||
| GRAPH_PORT = 3009 | ||||
| GRAPH_URL = http://localhost:3009/query | ||||
| VITE_GRAPH_URL = http://localhost:3009/query | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -20,6 +20,3 @@ Thumbs.db | ||||
| # Vite | ||||
| vite.config.js.timestamp-* | ||||
| vite.config.ts.timestamp-* | ||||
|  | ||||
| # Houdini | ||||
| $houdini | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| projects: | ||||
|   default: | ||||
|     schema: | ||||
|       - ./graph/*.graphql | ||||
|       - ./$houdini/graphql/schema.graphql | ||||
|     documents: | ||||
|       - './web/**/*.gql' | ||||
|       - './web/**/*.svelte' | ||||
|       - ./$houdini/graphql/documents.gql | ||||
							
								
								
									
										13
									
								
								codegen.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								codegen.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| import { CodegenConfig } from '@graphql-codegen/cli'; | ||||
|  | ||||
| const config: CodegenConfig = { | ||||
| 	schema: process.env.GRAPH_URL, | ||||
| 	documents: ['./graph/*.ts'], | ||||
| 	generates: { | ||||
| 		'./graph/d.ts': { | ||||
| 			plugins: ['typescript', 'typescript-operations'] | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default config; | ||||
| @@ -1,3 +1,33 @@ | ||||
| import prettier from 'eslint-config-prettier'; | ||||
| import eslint from '@eslint/js'; | ||||
| import svelte from 'eslint-plugin-svelte'; | ||||
| export default [prettier, ...svelte.configs['flat/prettier']]; | ||||
| import globals from 'globals'; | ||||
| import tseslint from 'typescript-eslint'; | ||||
|  | ||||
| export default tseslint.config( | ||||
| 	eslint.configs.recommended, | ||||
| 	...tseslint.configs.recommended, | ||||
| 	...svelte.configs['flat/recommended'], | ||||
| 	prettier, | ||||
| 	...svelte.configs['flat/prettier'], | ||||
| 	{ | ||||
| 		languageOptions: { | ||||
| 			globals: { | ||||
| 				...globals.browser, | ||||
| 				...globals.node, | ||||
| 				process: true | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		files: ['**/*.svelte'], | ||||
| 		languageOptions: { | ||||
| 			parserOptions: { | ||||
| 				parser: tseslint.parser | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	{ | ||||
| 		ignores: ['.svelte-kit/', 'web/public/build'] | ||||
| 	} | ||||
| ); | ||||
|   | ||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @@ -43,8 +43,6 @@ github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= | ||||
| github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= | ||||
| github.com/vektah/gqlparser v1.3.1 h1:8b0IcD3qZKWJQHSzynbDlrtP3IxVydZ2DZepCGofqfU= | ||||
| github.com/vektah/gqlparser v1.3.1/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74= | ||||
| github.com/vektah/gqlparser/v2 v2.5.17 h1:9At7WblLV7/36nulgekUgIaqHZWn5hxqluxrxGUhOmI= | ||||
| github.com/vektah/gqlparser/v2 v2.5.17/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= | ||||
| github.com/vektah/gqlparser/v2 v2.5.18 h1:zSND3GtutylAQ1JpWnTHcqtaRZjl+y3NROeW8vuNo6Y= | ||||
| github.com/vektah/gqlparser/v2 v2.5.18/go.mod h1:6HLzf7JKv9Fi3APymudztFQNmLXR5qJeEo6BOFcXVfc= | ||||
| github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= | ||||
|   | ||||
							
								
								
									
										9
									
								
								graph/auth.gql.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								graph/auth.gql.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| import { gql } from '@urql/svelte'; | ||||
| export const QryMe = gql` | ||||
| 	query Me { | ||||
| 		me { | ||||
| 			id | ||||
| 			displayName | ||||
| 		} | ||||
| 	} | ||||
| `; | ||||
| @@ -2,3 +2,17 @@ extend type Mutation { | ||||
| 	login(username: String!, email: String!): Boolean! | ||||
| 	logout: Boolean! | ||||
| } | ||||
|  | ||||
| extend type Query { | ||||
| 	""" | ||||
| 	me, is current AuthUser info | ||||
| 	""" | ||||
| 	me: AuthUser | ||||
| } | ||||
|  | ||||
| type AuthUser { | ||||
| 	id: ID! | ||||
| 	email: String! | ||||
| 	displayName: String! | ||||
| 	roleID: Int! | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,8 @@ package graph | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"gitserver.in/patialtech/rano/graph/model" | ||||
| ) | ||||
|  | ||||
| // Login is the resolver for the login field. | ||||
| @@ -18,3 +20,8 @@ func (r *mutationResolver) Login(ctx context.Context, username string, email str | ||||
| func (r *mutationResolver) Logout(ctx context.Context) (bool, error) { | ||||
| 	panic(fmt.Errorf("not implemented: Logout - logout")) | ||||
| } | ||||
|  | ||||
| // Me is the resolver for the me field. | ||||
| func (r *queryResolver) Me(ctx context.Context) (*model.AuthUser, error) { | ||||
| 	panic(fmt.Errorf("not implemented: Me - me")) | ||||
| } | ||||
|   | ||||
							
								
								
									
										51
									
								
								graph/d.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								graph/d.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| export type Maybe<T> = T | null; | ||||
| export type InputMaybe<T> = Maybe<T>; | ||||
| export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] }; | ||||
| export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> }; | ||||
| export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> }; | ||||
| export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never }; | ||||
| export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; | ||||
| /** All built-in and custom scalars, mapped to their actual values */ | ||||
| export type Scalars = { | ||||
|   ID: { input: string; output: string; } | ||||
|   String: { input: string; output: string; } | ||||
|   Boolean: { input: boolean; output: boolean; } | ||||
|   Int: { input: number; output: number; } | ||||
|   Float: { input: number; output: number; } | ||||
|   Any: { input: any; output: any; } | ||||
|   Map: { input: any; output: any; } | ||||
|   Time: { input: any; output: any; } | ||||
|   Void: { input: any; output: any; } | ||||
| }; | ||||
|  | ||||
| export type AuthUser = { | ||||
|   __typename?: 'AuthUser'; | ||||
|   displayName: Scalars['String']['output']; | ||||
|   email: Scalars['String']['output']; | ||||
|   id: Scalars['ID']['output']; | ||||
|   roleID: Scalars['Int']['output']; | ||||
| }; | ||||
|  | ||||
| export type Mutation = { | ||||
|   __typename?: 'Mutation'; | ||||
|   login: Scalars['Boolean']['output']; | ||||
|   logout: Scalars['Boolean']['output']; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type MutationLoginArgs = { | ||||
|   email: Scalars['String']['input']; | ||||
|   username: Scalars['String']['input']; | ||||
| }; | ||||
|  | ||||
| export type Query = { | ||||
|   __typename?: 'Query'; | ||||
|   heartBeat: Scalars['Boolean']['output']; | ||||
|   /** me, is current AuthUser info */ | ||||
|   me?: Maybe<AuthUser>; | ||||
| }; | ||||
|  | ||||
| export type MeQueryVariables = Exact<{ [key: string]: never; }>; | ||||
|  | ||||
|  | ||||
| export type MeQuery = { __typename?: 'Query', me?: { __typename?: 'AuthUser', id: string, displayName: string } | null }; | ||||
							
								
								
									
										283
									
								
								graph/generated/auth.generated.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								graph/generated/auth.generated.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,283 @@ | ||||
| // Code generated by github.com/99designs/gqlgen, DO NOT EDIT. | ||||
|  | ||||
| package generated | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"strconv" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"github.com/99designs/gqlgen/graphql" | ||||
| 	"github.com/vektah/gqlparser/v2/ast" | ||||
| 	"gitserver.in/patialtech/rano/graph/model" | ||||
| ) | ||||
|  | ||||
| // region    ************************** generated!.gotpl ************************** | ||||
|  | ||||
| // endregion ************************** generated!.gotpl ************************** | ||||
|  | ||||
| // region    ***************************** args.gotpl ***************************** | ||||
|  | ||||
| // endregion ***************************** args.gotpl ***************************** | ||||
|  | ||||
| // region    ************************** directives.gotpl ************************** | ||||
|  | ||||
| // endregion ************************** directives.gotpl ************************** | ||||
|  | ||||
| // region    **************************** field.gotpl ***************************** | ||||
|  | ||||
| func (ec *executionContext) _AuthUser_id(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_AuthUser_id(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 obj.ID, nil | ||||
| 	}) | ||||
| 	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.(string) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNID2string(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_AuthUser_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "AuthUser", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   false, | ||||
| 		IsResolver: false, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			return nil, errors.New("field of type ID does not have child fields") | ||||
| 		}, | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _AuthUser_email(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_AuthUser_email(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 obj.Email, nil | ||||
| 	}) | ||||
| 	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.(string) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNString2string(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_AuthUser_email(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "AuthUser", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   false, | ||||
| 		IsResolver: false, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			return nil, errors.New("field of type String does not have child fields") | ||||
| 		}, | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _AuthUser_displayName(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_AuthUser_displayName(ctx, field) | ||||
| 	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 obj.DisplayName, nil | ||||
| 	}) | ||||
| 	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.(string) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNString2string(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_AuthUser_displayName(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "AuthUser", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   false, | ||||
| 		IsResolver: false, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			return nil, errors.New("field of type String does not have child fields") | ||||
| 		}, | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _AuthUser_roleID(ctx context.Context, field graphql.CollectedField, obj *model.AuthUser) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_AuthUser_roleID(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 obj.RoleID, nil | ||||
| 	}) | ||||
| 	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.(int) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalNInt2int(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_AuthUser_roleID(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "AuthUser", | ||||
| 		Field:      field, | ||||
| 		IsMethod:   false, | ||||
| 		IsResolver: false, | ||||
| 		Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { | ||||
| 			return nil, errors.New("field of type Int does not have child fields") | ||||
| 		}, | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| // endregion **************************** field.gotpl ***************************** | ||||
|  | ||||
| // region    **************************** input.gotpl ***************************** | ||||
|  | ||||
| // endregion **************************** input.gotpl ***************************** | ||||
|  | ||||
| // region    ************************** interface.gotpl *************************** | ||||
|  | ||||
| // endregion ************************** interface.gotpl *************************** | ||||
|  | ||||
| // region    **************************** object.gotpl **************************** | ||||
|  | ||||
| var authUserImplementors = []string{"AuthUser"} | ||||
|  | ||||
| func (ec *executionContext) _AuthUser(ctx context.Context, sel ast.SelectionSet, obj *model.AuthUser) graphql.Marshaler { | ||||
| 	fields := graphql.CollectFields(ec.OperationContext, sel, authUserImplementors) | ||||
|  | ||||
| 	out := graphql.NewFieldSet(fields) | ||||
| 	deferred := make(map[string]*graphql.FieldSet) | ||||
| 	for i, field := range fields { | ||||
| 		switch field.Name { | ||||
| 		case "__typename": | ||||
| 			out.Values[i] = graphql.MarshalString("AuthUser") | ||||
| 		case "id": | ||||
| 			out.Values[i] = ec._AuthUser_id(ctx, field, obj) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		case "email": | ||||
| 			out.Values[i] = ec._AuthUser_email(ctx, field, obj) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		case "displayName": | ||||
| 			out.Values[i] = ec._AuthUser_displayName(ctx, field, obj) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		case "roleID": | ||||
| 			out.Values[i] = ec._AuthUser_roleID(ctx, field, obj) | ||||
| 			if out.Values[i] == graphql.Null { | ||||
| 				out.Invalids++ | ||||
| 			} | ||||
| 		default: | ||||
| 			panic("unknown field " + strconv.Quote(field.Name)) | ||||
| 		} | ||||
| 	} | ||||
| 	out.Dispatch(ctx) | ||||
| 	if out.Invalids > 0 { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
|  | ||||
| 	atomic.AddInt32(&ec.deferred, int32(len(deferred))) | ||||
|  | ||||
| 	for label, dfs := range deferred { | ||||
| 		ec.processDeferredGroup(graphql.DeferredGroup{ | ||||
| 			Label:    label, | ||||
| 			Path:     graphql.GetPath(ctx), | ||||
| 			FieldSet: dfs, | ||||
| 			Context:  ctx, | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // endregion **************************** object.gotpl **************************** | ||||
|  | ||||
| // region    ***************************** type.gotpl ***************************** | ||||
|  | ||||
| func (ec *executionContext) marshalOAuthUser2ᚖgitserverᚗinᚋpatialtechᚋranoᚋgraphᚋmodelᚐAuthUser(ctx context.Context, sel ast.SelectionSet, v *model.AuthUser) graphql.Marshaler { | ||||
| 	if v == nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	return ec._AuthUser(ctx, sel, v) | ||||
| } | ||||
|  | ||||
| // endregion ***************************** type.gotpl ***************************** | ||||
| @@ -12,6 +12,7 @@ import ( | ||||
| 	"github.com/99designs/gqlgen/graphql" | ||||
| 	"github.com/99designs/gqlgen/graphql/introspection" | ||||
| 	"github.com/vektah/gqlparser/v2/ast" | ||||
| 	"gitserver.in/patialtech/rano/graph/model" | ||||
| ) | ||||
|  | ||||
| // region    ************************** generated!.gotpl ************************** | ||||
| @@ -22,6 +23,7 @@ type MutationResolver interface { | ||||
| } | ||||
| type QueryResolver interface { | ||||
| 	HeartBeat(ctx context.Context) (bool, error) | ||||
| 	Me(ctx context.Context) (*model.AuthUser, error) | ||||
| } | ||||
|  | ||||
| // endregion ************************** generated!.gotpl ************************** | ||||
| @@ -243,6 +245,57 @@ func (ec *executionContext) fieldContext_Query_heartBeat(_ context.Context, fiel | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _Query_me(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Query_me(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.Query().Me(rctx) | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		ec.Error(ctx, err) | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	if resTmp == nil { | ||||
| 		return graphql.Null | ||||
| 	} | ||||
| 	res := resTmp.(*model.AuthUser) | ||||
| 	fc.Result = res | ||||
| 	return ec.marshalOAuthUser2ᚖgitserverᚗinᚋpatialtechᚋranoᚋgraphᚋmodelᚐAuthUser(ctx, field.Selections, res) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) fieldContext_Query_me(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { | ||||
| 	fc = &graphql.FieldContext{ | ||||
| 		Object:     "Query", | ||||
| 		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) | ||||
| 		}, | ||||
| 	} | ||||
| 	return fc, nil | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { | ||||
| 	fc, err := ec.fieldContext_Query___type(ctx, field) | ||||
| 	if err != nil { | ||||
| @@ -480,6 +533,25 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr | ||||
| 					func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) | ||||
| 			} | ||||
|  | ||||
| 			out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) | ||||
| 		case "me": | ||||
| 			field := field | ||||
|  | ||||
| 			innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { | ||||
| 				defer func() { | ||||
| 					if r := recover(); r != nil { | ||||
| 						ec.Error(ctx, ec.Recover(ctx, r)) | ||||
| 					} | ||||
| 				}() | ||||
| 				res = ec._Query_me(ctx, field) | ||||
| 				return res | ||||
| 			} | ||||
|  | ||||
| 			rrm := func(ctx context.Context) graphql.Marshaler { | ||||
| 				return ec.OperationContext.RootResolverMiddleware(ctx, | ||||
| 					func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) | ||||
| 			} | ||||
|  | ||||
| 			out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) | ||||
| 		case "__type": | ||||
| 			out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { | ||||
|   | ||||
| @@ -2256,6 +2256,36 @@ func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.Se | ||||
| 	return res | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) unmarshalNID2string(ctx context.Context, v interface{}) (string, error) { | ||||
| 	res, err := graphql.UnmarshalID(v) | ||||
| 	return res, graphql.ErrorOnPath(ctx, err) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) marshalNID2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { | ||||
| 	res := graphql.MarshalID(v) | ||||
| 	if res == graphql.Null { | ||||
| 		if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { | ||||
| 			ec.Errorf(ctx, "the requested element is null which the schema does not allow") | ||||
| 		} | ||||
| 	} | ||||
| 	return res | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) unmarshalNInt2int(ctx context.Context, v interface{}) (int, error) { | ||||
| 	res, err := graphql.UnmarshalInt(v) | ||||
| 	return res, graphql.ErrorOnPath(ctx, err) | ||||
| } | ||||
|  | ||||
| func (ec *executionContext) marshalNInt2int(ctx context.Context, sel ast.SelectionSet, v int) graphql.Marshaler { | ||||
| 	res := graphql.MarshalInt(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) unmarshalNString2string(ctx context.Context, v interface{}) (string, error) { | ||||
| 	res, err := graphql.UnmarshalString(v) | ||||
| 	return res, graphql.ErrorOnPath(ctx, err) | ||||
|   | ||||
| @@ -40,6 +40,13 @@ type DirectiveRoot struct { | ||||
| } | ||||
|  | ||||
| type ComplexityRoot struct { | ||||
| 	AuthUser struct { | ||||
| 		DisplayName func(childComplexity int) int | ||||
| 		Email       func(childComplexity int) int | ||||
| 		ID          func(childComplexity int) int | ||||
| 		RoleID      func(childComplexity int) int | ||||
| 	} | ||||
|  | ||||
| 	Mutation struct { | ||||
| 		Login  func(childComplexity int, username string, email string) int | ||||
| 		Logout func(childComplexity int) int | ||||
| @@ -47,6 +54,7 @@ type ComplexityRoot struct { | ||||
|  | ||||
| 	Query struct { | ||||
| 		HeartBeat func(childComplexity int) int | ||||
| 		Me        func(childComplexity int) int | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -69,6 +77,34 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | ||||
| 	_ = ec | ||||
| 	switch typeName + "." + field { | ||||
|  | ||||
| 	case "AuthUser.displayName": | ||||
| 		if e.complexity.AuthUser.DisplayName == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.AuthUser.DisplayName(childComplexity), true | ||||
|  | ||||
| 	case "AuthUser.email": | ||||
| 		if e.complexity.AuthUser.Email == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.AuthUser.Email(childComplexity), true | ||||
|  | ||||
| 	case "AuthUser.id": | ||||
| 		if e.complexity.AuthUser.ID == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.AuthUser.ID(childComplexity), true | ||||
|  | ||||
| 	case "AuthUser.roleID": | ||||
| 		if e.complexity.AuthUser.RoleID == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.AuthUser.RoleID(childComplexity), true | ||||
|  | ||||
| 	case "Mutation.login": | ||||
| 		if e.complexity.Mutation.Login == nil { | ||||
| 			break | ||||
| @@ -95,6 +131,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in | ||||
|  | ||||
| 		return e.complexity.Query.HeartBeat(childComplexity), true | ||||
|  | ||||
| 	case "Query.me": | ||||
| 		if e.complexity.Query.Me == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		return e.complexity.Query.Me(childComplexity), true | ||||
|  | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
| @@ -203,6 +246,20 @@ var sources = []*ast.Source{ | ||||
| 	login(username: String!, email: String!): Boolean! | ||||
| 	logout: Boolean! | ||||
| } | ||||
|  | ||||
| extend type Query { | ||||
| 	""" | ||||
| 	me, is current AuthUser info | ||||
| 	""" | ||||
| 	me: AuthUser | ||||
| } | ||||
|  | ||||
| type AuthUser { | ||||
| 	id: ID! | ||||
| 	email: String! | ||||
| 	displayName: String! | ||||
| 	roleID: Int! | ||||
| } | ||||
| `, BuiltIn: false}, | ||||
| 	{Name: "../index.graphql", Input: `# GraphQL schema example | ||||
| # | ||||
|   | ||||
| @@ -2,6 +2,13 @@ | ||||
|  | ||||
| package model | ||||
|  | ||||
| type AuthUser struct { | ||||
| 	ID          string `json:"id"` | ||||
| 	Email       string `json:"email"` | ||||
| 	DisplayName string `json:"displayName"` | ||||
| 	RoleID      int    `json:"roleID"` | ||||
| } | ||||
|  | ||||
| type Mutation struct { | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,23 +0,0 @@ | ||||
| /// <references types="houdini-svelte"> | ||||
|  | ||||
| /** @type {import('houdini').ConfigFile} */ | ||||
| const config = { | ||||
| 	watchSchema: { | ||||
| 		url: process.env.GRAPH_HOST, | ||||
| 		headers: { | ||||
| 			Authentication() { | ||||
| 				const token = localStorage.getItem('AUTH_TOKEN') ?? ''; | ||||
| 				return `Bearer ${token}`; | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	plugins: { | ||||
| 		'houdini-svelte': { | ||||
| 			projectDir: './web', | ||||
| 			client: './web/lib/gqlClient', | ||||
| 			include: './web/**/*.{svelte,graphql,gql,ts,js}' | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default config; | ||||
							
								
								
									
										85
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,43 +1,46 @@ | ||||
| { | ||||
|   "name": "rano", | ||||
|   "type": "module", | ||||
|   "version": "0.0.1", | ||||
|   "private": true, | ||||
|   "scripts": { | ||||
|     "dev": "vite dev", | ||||
|     "build": "vite build", | ||||
|     "preview": "vite preview", | ||||
|     "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", | ||||
|     "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch", | ||||
|     "format": "prettier --write .", | ||||
|     "lint": "prettier --check . && eslint ." | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@sveltejs/adapter-static": "^3.0.5", | ||||
|     "@sveltejs/kit": "^2.7.2", | ||||
|     "@sveltejs/vite-plugin-svelte": "^4.0.0-next.8", | ||||
|     "@tailwindcss/aspect-ratio": "^0.4.2", | ||||
|     "@tailwindcss/container-queries": "^0.1.1", | ||||
|     "@tailwindcss/forms": "^0.5.9", | ||||
|     "@tailwindcss/typography": "^0.5.15", | ||||
|     "@types/eslint": "^9.6.0", | ||||
|     "autoprefixer": "^10.4.20", | ||||
|     "daisyui": "^4.12.13", | ||||
|     "eslint": "^9.7.0", | ||||
|     "eslint-config-prettier": "^9.1.0", | ||||
|     "eslint-plugin-svelte": "^2.36.0", | ||||
|     "globals": "^15.0.0", | ||||
|     "graphql": "^16.9.0", | ||||
|     "houdini": "^1.3.0", | ||||
|     "houdini-svelte": "^2.0.0", | ||||
|     "prettier": "^3.3.2", | ||||
|     "prettier-plugin-svelte": "^3.2.6", | ||||
|     "prettier-plugin-tailwindcss": "^0.6.5", | ||||
|     "svelte": "^5.0.5", | ||||
|     "svelte-check": "^4.0.5", | ||||
|     "tailwindcss": "^3.4.14", | ||||
|     "typescript": "^5.0.0", | ||||
|     "typescript-eslint": "^8.0.0", | ||||
|     "vite": "^5.0.3" | ||||
|   } | ||||
| 	"name": "rano", | ||||
| 	"type": "module", | ||||
| 	"version": "0.0.1", | ||||
| 	"private": true, | ||||
| 	"scripts": { | ||||
| 		"dev": "vite dev", | ||||
| 		"build": "vite build", | ||||
| 		"preview": "vite preview", | ||||
| 		"codegen": "graphql-codegen --config codegen.ts", | ||||
| 		"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", | ||||
| 		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch", | ||||
| 		"format": "prettier --write .", | ||||
| 		"lint": "prettier --check . && eslint ." | ||||
| 	}, | ||||
| 	"devDependencies": { | ||||
| 		"@graphql-codegen/cli": "^5.0.3", | ||||
| 		"@graphql-codegen/typescript": "^4.1.1", | ||||
| 		"@graphql-codegen/typescript-operations": "^4.3.1", | ||||
| 		"@sveltejs/adapter-static": "^3.0.5", | ||||
| 		"@sveltejs/kit": "^2.7.2", | ||||
| 		"@sveltejs/vite-plugin-svelte": "^4.0.0-next.8", | ||||
| 		"@tailwindcss/aspect-ratio": "^0.4.2", | ||||
| 		"@tailwindcss/container-queries": "^0.1.1", | ||||
| 		"@tailwindcss/forms": "^0.5.9", | ||||
| 		"@tailwindcss/typography": "^0.5.15", | ||||
| 		"@types/eslint": "^9.6.0", | ||||
| 		"@urql/svelte": "^4.2.1", | ||||
| 		"autoprefixer": "^10.4.20", | ||||
| 		"daisyui": "^4.12.13", | ||||
| 		"eslint": "^9.7.0", | ||||
| 		"eslint-config-prettier": "^9.1.0", | ||||
| 		"eslint-plugin-svelte": "^2.36.0", | ||||
| 		"globals": "^15.0.0", | ||||
| 		"graphql": "^16.9.0", | ||||
| 		"prettier": "^3.3.2", | ||||
| 		"prettier-plugin-svelte": "^3.2.6", | ||||
| 		"prettier-plugin-tailwindcss": "^0.6.5", | ||||
| 		"svelte": "^5.0.5", | ||||
| 		"svelte-check": "^4.0.5", | ||||
| 		"tailwindcss": "^3.4.14", | ||||
| 		"typescript": "^5.0.0", | ||||
| 		"typescript-eslint": "^8.0.0", | ||||
| 		"vite": "^5.0.3" | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,58 +0,0 @@ | ||||
| """ | ||||
| The @defer directive may be specified on a fragment spread to imply de-prioritization, that causes the fragment to be omitted in the initial response, and delivered as a subsequent response afterward. A query with @defer directive will cause the request to potentially return multiple responses, where non-deferred data is delivered in the initial response and data deferred delivered in a subsequent response. @include and @skip take precedence over @defer. | ||||
| """ | ||||
| directive @defer(if: Boolean = true, label: String) on FRAGMENT_SPREAD | INLINE_FRAGMENT | ||||
|  | ||||
| """ | ||||
| directive to map Go type | ||||
| """ | ||||
| directive @goField( | ||||
| 	forceResolver: Boolean | ||||
| 	name: String | ||||
| 	omittable: Boolean | ||||
| ) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ||||
|  | ||||
| """ | ||||
| directive to map Go type | ||||
| example:- | ||||
| type User @goModel(model: "github.com/my/app/models.User") { | ||||
| 	id: ID! @goField(name: "todoId") | ||||
| 	name: String! | ||||
| 		@goField(forceResolver: true) | ||||
| 		@goTag(key: "xorm", value: "-") | ||||
| 		@goTag(key: "yaml") | ||||
| } | ||||
| """ | ||||
| directive @goModel( | ||||
| 	forceGenerate: Boolean | ||||
| 	model: String | ||||
| 	models: [String!] | ||||
| ) on ENUM | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION | ||||
|  | ||||
| directive @goTag(key: String!, value: String) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ||||
|  | ||||
| """ | ||||
| Go type interface{} | ||||
| """ | ||||
| scalar Any | ||||
|  | ||||
| """ | ||||
| type Map(Go type: map[string]interface{}) | ||||
| """ | ||||
| scalar Map | ||||
|  | ||||
| type Mutation { | ||||
| 	login(email: String!, username: String!): Boolean! | ||||
| 	logout: Boolean! | ||||
| } | ||||
|  | ||||
| type Query { | ||||
| 	heartBeat: Boolean! | ||||
| } | ||||
|  | ||||
| """ | ||||
| Maps a Time GraphQL scalar to a Go time.Time struct. | ||||
| """ | ||||
| scalar Time | ||||
|  | ||||
| scalar Void | ||||
| @@ -17,9 +17,9 @@ const config = { | ||||
| 			assets: path.resolve(webDir, 'public') | ||||
| 		}, | ||||
| 		alias: { | ||||
| 			$graph: path.resolve(webDir, 'graph'), | ||||
| 			$image: path.resolve(webDir, 'assets', 'image'), | ||||
| 			$svg: path.resolve(webDir, 'assets', 'svg'), | ||||
| 			$houdini: path.resolve('.', '$houdini') | ||||
| 			$svg: path.resolve(webDir, 'assets', 'svg') | ||||
| 		}, | ||||
| 		paths: { | ||||
| 			assets: process.env.ASSETS_HOST ?? '' | ||||
|   | ||||
							
								
								
									
										14
									
								
								taskfile.yml
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								taskfile.yml
									
									
									
									
									
								
							| @@ -1,6 +1,10 @@ | ||||
| version: '3' | ||||
|  | ||||
| env: | ||||
|   ENV: development | ||||
|  | ||||
| dotenv: ['.env.{{.ENV}}'] | ||||
|  | ||||
| tasks: | ||||
|   gen: | ||||
|     desc: use go generate, for graph files | ||||
| @@ -23,13 +27,13 @@ tasks: | ||||
|     desc: run graph server | ||||
|     cmds: | ||||
|       - cmd: go run ./graph/server | ||||
|     env: | ||||
|       GRAPH_PORT: 3009 | ||||
|  | ||||
|   codegen: | ||||
|     desc: generate graph types | ||||
|     cmds: | ||||
|       - cmd: deno task codegen | ||||
|  | ||||
|   web: | ||||
|     desc: run web in dev mode | ||||
|     cmds: | ||||
|       - cmd: deno task dev | ||||
|     env: | ||||
|       WEB_PORT: 3006 | ||||
|       GRAPH_HOST: http://localhost:3009/query | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| 		"sourceMap": true, | ||||
| 		"strict": true, | ||||
| 		"moduleResolution": "bundler", | ||||
| 		"rootDirs": ["./web", "./.svelte-kit/types", "./$houdini/types"] | ||||
| 		"rootDirs": [".", "./.svelte-kit/types"] | ||||
| 	} | ||||
| 	// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias | ||||
| 	// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files | ||||
|   | ||||
| @@ -1,9 +1,8 @@ | ||||
| import { sveltekit } from '@sveltejs/kit/vite'; | ||||
| import houdini from 'houdini/vite'; | ||||
| import { defineConfig } from 'vite'; | ||||
|  | ||||
| export default defineConfig({ | ||||
| 	plugins: [houdini(), sveltekit()], | ||||
| 	plugins: [sveltekit()], | ||||
| 	server: { | ||||
| 		port: parseInt(process.env.WEB_PORT ?? '3001'), | ||||
| 		fs: { | ||||
|   | ||||
							
								
								
									
										8
									
								
								web/lib/client.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								web/lib/client.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| import { Client, cacheExchange, fetchExchange } from '@urql/svelte'; | ||||
|  | ||||
| export function newClient(url: string) { | ||||
| 	return new Client({ | ||||
| 		url, | ||||
| 		exchanges: [cacheExchange, fetchExchange] | ||||
| 	}); | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| import { HoudiniClient } from '$houdini'; | ||||
|  | ||||
| export default new HoudiniClient({ | ||||
| 	url: process.env.GRAPH_HOST | ||||
| }); | ||||
| @@ -1,3 +0,0 @@ | ||||
| export function hello() { | ||||
|   console.log("hello"); | ||||
| } | ||||
							
								
								
									
										0
									
								
								web/lib/stores/alert.svelte.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								web/lib/stores/alert.svelte.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								web/lib/stores/auth.svelte.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								web/lib/stores/auth.svelte.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| export let authUser = $state(); | ||||
| @@ -1,6 +1,10 @@ | ||||
| <script> | ||||
|   import "../app.css"; | ||||
|   const { children } = $props(); | ||||
| <script lang="ts"> | ||||
| 	import { setContextClient } from '@urql/svelte'; | ||||
| 	import { newClient } from '$lib/client'; | ||||
| 	import '../app.css'; | ||||
|  | ||||
| 	const { children } = $props(); | ||||
| 	setContextClient(newClient(import.meta.env.VITE_GRAPH_URL ?? '')); | ||||
| </script> | ||||
|  | ||||
| {@render children()} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user