diff --git a/server/graph/generated/generated.go b/server/graph/generated/generated.go index f0d22c8..5d91dd6 100644 --- a/server/graph/generated/generated.go +++ b/server/graph/generated/generated.go @@ -63,8 +63,9 @@ type ComplexityRoot struct { } Query struct { - Token func(childComplexity int) int - Users func(childComplexity int) int + Profile func(childComplexity int) int + Token func(childComplexity int) int + Users func(childComplexity int) int } Response struct { @@ -109,6 +110,7 @@ type MutationResolver interface { type QueryResolver interface { Users(ctx context.Context) ([]*model.User, error) Token(ctx context.Context) (*model.LoginResponse, error) + Profile(ctx context.Context) (*model.User, error) } type executableSchema struct { @@ -211,6 +213,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.VerifySignupToken(childComplexity, args["params"].(model.VerifySignupTokenInput)), true + case "Query.profile": + if e.complexity.Query.Profile == nil { + break + } + + return e.complexity.Query.Profile(childComplexity), true + case "Query.token": if e.complexity.Query.Token == nil { break @@ -506,6 +515,7 @@ type Mutation { type Query { users: [User!]! token: LoginResponse + profile: User! } `, BuiltIn: false}, } @@ -1042,6 +1052,41 @@ func (ec *executionContext) _Query_token(ctx context.Context, field graphql.Coll return ec.marshalOLoginResponse2ᚖgithubᚗcomᚋyauthdevᚋyauthᚋserverᚋgraphᚋmodelᚐLoginResponse(ctx, field.Selections, res) } +func (ec *executionContext) _Query_profile(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Query", + Field: field, + Args: nil, + IsMethod: true, + IsResolver: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().Profile(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.(*model.User) + fc.Result = res + return ec.marshalNUser2ᚖgithubᚗcomᚋyauthdevᚋyauthᚋserverᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) +} + func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -3125,6 +3170,20 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr res = ec._Query_token(ctx, field) return res }) + case "profile": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_profile(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) case "__type": out.Values[i] = ec._Query___type(ctx, field) case "__schema": @@ -3628,6 +3687,10 @@ func (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.S return res } +func (ec *executionContext) marshalNUser2githubᚗcomᚋyauthdevᚋyauthᚋserverᚋgraphᚋmodelᚐUser(ctx context.Context, sel ast.SelectionSet, v model.User) graphql.Marshaler { + return ec._User(ctx, sel, &v) +} + func (ec *executionContext) marshalNUser2ᚕᚖgithubᚗcomᚋyauthdevᚋyauthᚋserverᚋgraphᚋmodelᚐUserᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.User) graphql.Marshaler { ret := make(graphql.Array, len(v)) var wg sync.WaitGroup diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls index 00913be..8d5f517 100644 --- a/server/graph/schema.graphqls +++ b/server/graph/schema.graphqls @@ -75,4 +75,5 @@ type Mutation { type Query { users: [User!]! token: LoginResponse + profile: User! } diff --git a/server/graph/schema.resolvers.go b/server/graph/schema.resolvers.go index 939daad..68afbb9 100644 --- a/server/graph/schema.resolvers.go +++ b/server/graph/schema.resolvers.go @@ -35,11 +35,17 @@ func (r *queryResolver) Token(ctx context.Context) (*model.LoginResponse, error) return resolvers.Token(ctx) } +func (r *queryResolver) Profile(ctx context.Context) (*model.User, error) { + return resolvers.Profile(ctx) +} + // Mutation returns generated.MutationResolver implementation. func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} } // Query returns generated.QueryResolver implementation. func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } -type mutationResolver struct{ *Resolver } -type queryResolver struct{ *Resolver } +type ( + mutationResolver struct{ *Resolver } + queryResolver struct{ *Resolver } +) diff --git a/server/resolvers/profile.go b/server/resolvers/profile.go new file mode 100644 index 0000000..a9ecf70 --- /dev/null +++ b/server/resolvers/profile.go @@ -0,0 +1,47 @@ +package resolvers + +import ( + "context" + "fmt" + + "github.com/yauthdev/yauth/server/db" + "github.com/yauthdev/yauth/server/graph/model" + "github.com/yauthdev/yauth/server/utils" +) + +func Profile(ctx context.Context) (*model.User, error) { + gc, err := utils.GinContextFromContext(ctx) + var res *model.User + if err != nil { + return res, err + } + + token, err := utils.GetAuthToken(gc) + if err != nil { + return res, err + } + + claim, err := utils.VerifyAuthToken(token) + if err != nil { + return res, err + } + + user, err := db.Mgr.GetUserByEmail(claim.Email) + if err != nil { + return res, err + } + + userIdStr := fmt.Sprintf("%d", user.ID) + + res = &model.User{ + ID: userIdStr, + Email: user.Email, + Image: &user.Image, + FirstName: &user.FirstName, + LastName: &user.LastName, + SignupMethod: user.SignupMethod, + EmailVerifiedAt: &user.EmailVerifiedAt, + } + + return res, nil +}