From 416640ac136f5cdfb7e69e5241afe94e272e205b Mon Sep 17 00:00:00 2001 From: to Date: Thu, 1 Feb 2024 10:35:11 +0000 Subject: [PATCH 01/23] Update server/graph/schema.graphqls --- server/graph/schema.graphqls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls index 9fc5919..46a68a9 100644 --- a/server/graph/schema.graphqls +++ b/server/graph/schema.graphqls @@ -610,7 +610,6 @@ input GetUserRequest { } type Mutation { - is_registered(email: String): AuthResponse! # custom api signup(params: SignUpInput!): AuthResponse! # Deprecated from v1.2.0 mobile_signup(params: MobileSignUpInput): AuthResponse! @@ -652,6 +651,7 @@ type Query { meta: Meta! session(params: SessionQueryInput): AuthResponse! profile: User! + is_registered(email: String): AuthResponse! # custom api validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! validate_session(params: ValidateSessionInput): ValidateSessionResponse! # admin only apis From 83bb18ae79a3e56c31462971705b831fb286a3c5 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 1 Feb 2024 16:21:53 +0300 Subject: [PATCH 02/23] is-registered-fix --- server/resolvers/is_registered.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 92bd8ec..5faaba6 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -32,11 +32,11 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.AuthRespons if existingUser.EmailVerifiedAt != nil { res.Message = "verified" log.Debug("Email is already verified and signed up.") - return res, fmt.Errorf(`%s has already signed up`, email) + return res, nil // fmt.Errorf(`%s has already signed up`, email) } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { res.Message = "not verified" log.Debug("Email is already signed up. Verification pending...") - return res, fmt.Errorf("%s has already signed up. please complete the email verification process or reset the password", email) + return res, nil // Errorf("%s has already signed up. please complete the email verification process or reset the password", email) } } From 4b249d643f8c2f434624e95e069e42ea832f8e43 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 1 Feb 2024 16:37:49 +0300 Subject: [PATCH 03/23] is-registered-fix-2 --- server/resolvers/is_registered.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 5faaba6..2e11041 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -11,8 +11,8 @@ import ( ) // IsRegisteredResolver is a resolver for registered checkup query -func IsRegisteredResolver(ctx context.Context, email string) (*model.AuthResponse, error) { - var res *model.AuthResponse +func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, error) { + var res *model.Response email = strings.TrimSpace(refs.StringValue(&email)) if email == "" { log.Debug("Email is required") From 40b8e020a3711112864c4b9bdd17ddd0ddb98a60 Mon Sep 17 00:00:00 2001 From: Untone Date: Fri, 2 Feb 2024 16:06:57 +0300 Subject: [PATCH 04/23] fixfix --- server/graph/schema.resolvers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/graph/schema.resolvers.go b/server/graph/schema.resolvers.go index bec4ae3..83c53b3 100644 --- a/server/graph/schema.resolvers.go +++ b/server/graph/schema.resolvers.go @@ -13,7 +13,7 @@ import ( ) // Signup is the resolver for the signup field. -func (r *queryResolver) IsRegistered(ctx context.Context, email string) (*model.AuthResponse, error) { +func (r *queryResolver) IsRegistered(ctx context.Context, email string) (*model.Response, error) { return resolvers.IsRegisteredResolver(ctx, email) } From db25ceb0b5fe35d78c606ed3ce8844a4c2aca201 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 11:34:00 +0300 Subject: [PATCH 05/23] is-registered-hotfix --- server/graph/schema.graphqls | 2 +- server/graph/schema.resolvers.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls index 46a68a9..9ad1b4b 100644 --- a/server/graph/schema.graphqls +++ b/server/graph/schema.graphqls @@ -651,7 +651,7 @@ type Query { meta: Meta! session(params: SessionQueryInput): AuthResponse! profile: User! - is_registered(email: String): AuthResponse! # custom api + is_registered(email: String!): Response! # custom api validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! validate_session(params: ValidateSessionInput): ValidateSessionResponse! # admin only apis diff --git a/server/graph/schema.resolvers.go b/server/graph/schema.resolvers.go index 83c53b3..c115155 100644 --- a/server/graph/schema.resolvers.go +++ b/server/graph/schema.resolvers.go @@ -12,7 +12,7 @@ import ( "github.com/authorizerdev/authorizer/server/resolvers" ) -// Signup is the resolver for the signup field. +// IsRegistered is the resolver for the signup field. func (r *queryResolver) IsRegistered(ctx context.Context, email string) (*model.Response, error) { return resolvers.IsRegisteredResolver(ctx, email) } From 7a6ae24aaaaaaf56359169a55502f06574a448e2 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 11:35:48 +0300 Subject: [PATCH 06/23] is-registered-hotfix-2 --- server/resolvers/is_registered.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 2e11041..d72e17d 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -27,8 +27,8 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e log.Debug("Failed to get user by email: ", err) } + res.Message = "registered" if existingUser != nil { - res.Message = "registered" if existingUser.EmailVerifiedAt != nil { res.Message = "verified" log.Debug("Email is already verified and signed up.") From c4472340ef5a2ce50dcb336f555919aa36b20478 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 11:38:45 +0300 Subject: [PATCH 07/23] is-registered-hotfix-3 --- server/resolvers/is_registered.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index d72e17d..2e11041 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -27,8 +27,8 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e log.Debug("Failed to get user by email: ", err) } - res.Message = "registered" if existingUser != nil { + res.Message = "registered" if existingUser.EmailVerifiedAt != nil { res.Message = "verified" log.Debug("Email is already verified and signed up.") From 570436e6e81d92927b804af507b8075f83a03b34 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 12:03:42 +0300 Subject: [PATCH 08/23] schema-regen --- server/go.mod | 2 +- server/go.sum | 3 + server/graph/generated/generated.go | 111 ++++++++++++++++++++++++++++ server/graph/schema.resolvers.go | 10 +-- 4 files changed, 120 insertions(+), 6 deletions(-) diff --git a/server/go.mod b/server/go.mod index 08e4744..0f9343a 100644 --- a/server/go.mod +++ b/server/go.mod @@ -19,6 +19,7 @@ require ( github.com/google/uuid v1.3.1 github.com/guregu/dynamo v1.20.2 github.com/joho/godotenv v1.5.1 + github.com/mailgun/mailgun-go/v4 v4.12.0 github.com/pquerna/otp v1.4.0 github.com/redis/go-redis/v9 v9.2.1 github.com/robertkrimen/otto v0.2.1 @@ -83,7 +84,6 @@ require ( github.com/leodido/go-urn v1.2.4 // indirect github.com/libsql/libsql-client-go v0.0.0-20231026052543-fce76c0f39a7 // indirect github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 // indirect - github.com/mailgun/mailgun-go/v4 v4.12.0 // indirect github.com/maruel/rs v1.1.0 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/microsoft/go-mssqldb v1.6.0 // indirect diff --git a/server/go.sum b/server/go.sum index 4351793..4364aa0 100644 --- a/server/go.sum +++ b/server/go.sum @@ -81,8 +81,11 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ekristen/gorm-libsql v0.0.0-20231101204708-6e113112bcc2 h1:3f6DAUkYKbZSJ1bBM0/RiX5NHVt7YgmB0BWzKWUd45g= github.com/ekristen/gorm-libsql v0.0.0-20231101204708-6e113112bcc2/go.mod h1:5g9wSYpR/MvkR6W7SumX9zdha7Yt1iM4nxOAWfRfcPA= +github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= diff --git a/server/graph/generated/generated.go b/server/graph/generated/generated.go index 3ed5ffe..7ab6fc6 100644 --- a/server/graph/generated/generated.go +++ b/server/graph/generated/generated.go @@ -236,6 +236,7 @@ type ComplexityRoot struct { AdminSession func(childComplexity int) int EmailTemplates func(childComplexity int, params *model.PaginatedInput) int Env func(childComplexity int) int + IsRegistered func(childComplexity int, email string) int Meta func(childComplexity int) int Profile func(childComplexity int) int Session func(childComplexity int, params *model.SessionQueryInput) int @@ -392,6 +393,7 @@ type QueryResolver interface { Meta(ctx context.Context) (*model.Meta, error) Session(ctx context.Context, params *model.SessionQueryInput) (*model.AuthResponse, error) Profile(ctx context.Context) (*model.User, error) + IsRegistered(ctx context.Context, email string) (*model.Response, error) ValidateJwtToken(ctx context.Context, params model.ValidateJWTTokenInput) (*model.ValidateJWTTokenResponse, error) ValidateSession(ctx context.Context, params *model.ValidateSessionInput) (*model.ValidateSessionResponse, error) Users(ctx context.Context, params *model.PaginatedInput) (*model.Users, error) @@ -1666,6 +1668,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.Env(childComplexity), true + case "Query.is_registered": + if e.complexity.Query.IsRegistered == nil { + break + } + + args, err := ec.field_Query_is_registered_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.IsRegistered(childComplexity, args["email"].(string)), true + case "Query.meta": if e.complexity.Query.Meta == nil { break @@ -3036,6 +3050,7 @@ type Query { meta: Meta! session(params: SessionQueryInput): AuthResponse! profile: User! + is_registered(email: String!): Response! # custom api validate_jwt_token(params: ValidateJWTTokenInput!): ValidateJWTTokenResponse! validate_session(params: ValidateSessionInput): ValidateSessionResponse! # admin only apis @@ -3612,6 +3627,21 @@ func (ec *executionContext) field_Query__webhooks_args(ctx context.Context, rawA return args, nil } +func (ec *executionContext) field_Query_is_registered_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["email"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["email"] = arg0 + return args, nil +} + func (ec *executionContext) field_Query_session_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -11208,6 +11238,65 @@ func (ec *executionContext) fieldContext_Query_profile(ctx context.Context, fiel return fc, nil } +func (ec *executionContext) _Query_is_registered(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_is_registered(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().IsRegistered(rctx, fc.Args["email"].(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.Response) + fc.Result = res + return ec.marshalNResponse2ᚖgithubᚗcomᚋauthorizerdevᚋauthorizerᚋserverᚋgraphᚋmodelᚐResponse(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_is_registered(ctx 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 "message": + return ec.fieldContext_Response_message(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Response", 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_Query_is_registered_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query_validate_jwt_token(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_validate_jwt_token(ctx, field) if err != nil { @@ -20511,6 +20600,28 @@ 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 "is_registered": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_is_registered(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + 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 "validate_jwt_token": field := field diff --git a/server/graph/schema.resolvers.go b/server/graph/schema.resolvers.go index c115155..e23a074 100644 --- a/server/graph/schema.resolvers.go +++ b/server/graph/schema.resolvers.go @@ -12,11 +12,6 @@ import ( "github.com/authorizerdev/authorizer/server/resolvers" ) -// IsRegistered is the resolver for the signup field. -func (r *queryResolver) IsRegistered(ctx context.Context, email string) (*model.Response, error) { - return resolvers.IsRegisteredResolver(ctx, email) -} - // Signup is the resolver for the signup field. func (r *mutationResolver) Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse, error) { return resolvers.SignupResolver(ctx, params) @@ -192,6 +187,11 @@ func (r *queryResolver) Profile(ctx context.Context) (*model.User, error) { return resolvers.ProfileResolver(ctx) } +// IsRegistered is the resolver for the signup field. +func (r *queryResolver) IsRegistered(ctx context.Context, email string) (*model.Response, error) { + return resolvers.IsRegisteredResolver(ctx, email) +} + // ValidateJwtToken is the resolver for the validate_jwt_token field. func (r *queryResolver) ValidateJwtToken(ctx context.Context, params model.ValidateJWTTokenInput) (*model.ValidateJWTTokenResponse, error) { return resolvers.ValidateJwtTokenResolver(ctx, params) From e963f325f8142713e04dacb052398ae5f952c3bb Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 12:12:34 +0300 Subject: [PATCH 09/23] is-registered-hotfix-4 --- go.mod | 20 ++++++++++++++++++++ go.sum | 31 +++++++++++++++++++++++++++++++ server/resolvers/is_registered.go | 1 + 3 files changed, 52 insertions(+) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4c1b698 --- /dev/null +++ b/go.mod @@ -0,0 +1,20 @@ +module server + +go 1.21.5 + +require ( + github.com/99designs/gqlgen v0.17.43 // indirect + github.com/agnivade/levenshtein v1.1.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sosodev/duration v1.1.0 // indirect + github.com/urfave/cli/v2 v2.25.5 // indirect + github.com/vektah/gqlparser/v2 v2.5.11 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + golang.org/x/mod v0.10.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.9.3 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c7b9fc6 --- /dev/null +++ b/go.sum @@ -0,0 +1,31 @@ +github.com/99designs/gqlgen v0.17.43 h1:I4SYg6ahjowErAQcHFVKy5EcWuwJ3+Xw9z2fLpuFCPo= +github.com/99designs/gqlgen v0.17.43/go.mod h1:lO0Zjy8MkZgBdv4T1U91x09r0e0WFOdhVUutlQs1Rsc= +github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sosodev/duration v1.1.0 h1:kQcaiGbJaIsRqgQy7VGlZrVw1giWO+lDoX3MCPnpVO4= +github.com/sosodev/duration v1.1.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc= +github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8= +github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 2e11041..0366d1e 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -13,6 +13,7 @@ import ( // IsRegisteredResolver is a resolver for registered checkup query func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, error) { var res *model.Response + res.Message = "" email = strings.TrimSpace(refs.StringValue(&email)) if email == "" { log.Debug("Email is required") From a66393e7549dc7d01d85fb8842530dad0c2da9b9 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 12:20:01 +0300 Subject: [PATCH 10/23] resolver-fix --- server/resolvers/is_registered.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 0366d1e..194197f 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -10,19 +10,24 @@ import ( "strings" ) +// IsRegisteredResolver is a resolver for registered checkup query // IsRegisteredResolver is a resolver for registered checkup query func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, error) { - var res *model.Response + // Initialize the response object + res := &model.Response{} res.Message = "" - email = strings.TrimSpace(refs.StringValue(&email)) + + // Convert email to lowercase + email = strings.ToLower(strings.TrimSpace(refs.StringValue(&email))) if email == "" { log.Debug("Email is required") - return res, fmt.Errorf(`email is required`) + return res, fmt.Errorf("email is required") } + // Initialize logger with a field log := log.WithField("email", email) - // find user with email + // Find user with email existingUser, err := db.Provider.GetUserByEmail(ctx, email) if err != nil { log.Debug("Failed to get user by email: ", err) @@ -33,11 +38,11 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e if existingUser.EmailVerifiedAt != nil { res.Message = "verified" log.Debug("Email is already verified and signed up.") - return res, nil // fmt.Errorf(`%s has already signed up`, email) + return res, nil } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { res.Message = "not verified" log.Debug("Email is already signed up. Verification pending...") - return res, nil // Errorf("%s has already signed up. please complete the email verification process or reset the password", email) + return res, nil } } From b20f5986c1948d7e666f103128bf6f79002abe05 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 6 Feb 2024 12:25:40 +0300 Subject: [PATCH 11/23] is-registered-debug --- server/resolvers/is_registered.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 194197f..213ded1 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -10,7 +10,6 @@ import ( "strings" ) -// IsRegisteredResolver is a resolver for registered checkup query // IsRegisteredResolver is a resolver for registered checkup query func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, error) { // Initialize the response object @@ -31,18 +30,19 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e existingUser, err := db.Provider.GetUserByEmail(ctx, email) if err != nil { log.Debug("Failed to get user by email: ", err) - } - - if existingUser != nil { - res.Message = "registered" - if existingUser.EmailVerifiedAt != nil { - res.Message = "verified" - log.Debug("Email is already verified and signed up.") - return res, nil - } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { - res.Message = "not verified" - log.Debug("Email is already signed up. Verification pending...") - return res, nil + } else { + log.Debug("Found user by email: ", existingUser) + if existingUser != nil { + res.Message = "registered" + if existingUser.EmailVerifiedAt != nil { + res.Message = "verified" + log.Debug("Email is already verified and signed up.") + return res, nil + } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { + res.Message = "not verified" + log.Debug("Email is already signed up. Verification pending...") + return res, nil + } } } From 7bc9fca4c43d99e24e10389520718d699f42e07c Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 8 Feb 2024 18:05:08 +0300 Subject: [PATCH 12/23] magic --- server/resolvers/is_registered.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 213ded1..bd42c39 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -33,15 +33,17 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e } else { log.Debug("Found user by email: ", existingUser) if existingUser != nil { - res.Message = "registered" - if existingUser.EmailVerifiedAt != nil { - res.Message = "verified" - log.Debug("Email is already verified and signed up.") - return res, nil - } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { - res.Message = "not verified" - log.Debug("Email is already signed up. Verification pending...") - return res, nil + if strings.Contains(existingUser.SignupMethods, "magic") { + res.Message = "registered" + if existingUser.EmailVerifiedAt != nil { + res.Message = "verified" + log.Debug("Email is already verified and signed up.") + return res, nil + } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { + res.Message = "not verified" + log.Debug("Email is already signed up. Verification pending...") + return res, nil + } } } } From 42efbc232b2c071d469dbcea97e726d25833cd34 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 8 Feb 2024 18:54:44 +0300 Subject: [PATCH 13/23] check-not-basic --- server/resolvers/is_registered.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index bd42c39..973261b 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -33,18 +33,21 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e } else { log.Debug("Found user by email: ", existingUser) if existingUser != nil { - if strings.Contains(existingUser.SignupMethods, "magic") { - res.Message = "registered" - if existingUser.EmailVerifiedAt != nil { - res.Message = "verified" - log.Debug("Email is already verified and signed up.") - return res, nil - } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { - res.Message = "not verified" - log.Debug("Email is already signed up. Verification pending...") - return res, nil - } - } + if strings.Contains(existingUser.SignupMethods, "magic") && !strings.Contains(existingUser.SignupMethods, "basic") { + res.Message = "registered" + } else if existingUser.EmailVerifiedAt != nil { + res.Message = "verified" + log.Debug("Email is already verified and signed up.") + return res, nil + } else if existingUser.ID != "" && existingUser.EmailVerifiedAt == nil { + res.Message = "not verified" + log.Debug("Email is already signed up. Verification pending...") + return res, nil + } else { + res.Message = "unknown" + log.Debug("Unknown signup method.") + return res, nil + } } } From 02deafa879ce520c283e91c30b739eaab60b0279 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 8 Feb 2024 19:04:24 +0300 Subject: [PATCH 14/23] magic-lnk-login-only --- server/resolvers/is_registered.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/resolvers/is_registered.go b/server/resolvers/is_registered.go index 973261b..69e19ac 100644 --- a/server/resolvers/is_registered.go +++ b/server/resolvers/is_registered.go @@ -33,7 +33,7 @@ func IsRegisteredResolver(ctx context.Context, email string) (*model.Response, e } else { log.Debug("Found user by email: ", existingUser) if existingUser != nil { - if strings.Contains(existingUser.SignupMethods, "magic") && !strings.Contains(existingUser.SignupMethods, "basic") { + if existingUser.SignupMethods == "magic_link_login" { res.Message = "registered" } else if existingUser.EmailVerifiedAt != nil { res.Message = "verified" From 19f5e7e174bf3eea6289c13cab61ad09fe3b29ee Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 8 Feb 2024 19:18:31 +0300 Subject: [PATCH 15/23] forgot-resolver-patch --- .gitea/workflows/main.yml | 8 ++------ server/resolvers/forgot_password.go | 10 ++++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 3bdc6a4..57423b2 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -4,12 +4,8 @@ on: [push] jobs: deploy: runs-on: ubuntu-latest - if: github.ref == 'refs/heads/mailgun' steps: - - name: Cloning repo - uses: actions/checkout@v2 - with: - fetch-depth: 0 + - uses: actions/checkout@v3 - name: Get Repo Name id: repo_name @@ -24,4 +20,4 @@ jobs: with: branch: 'main' git_remote_url: 'ssh://dokku@v2.discours.io:22/authorizer' - ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} \ No newline at end of file + ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} diff --git a/server/resolvers/forgot_password.go b/server/resolvers/forgot_password.go index 624955e..cd156b8 100644 --- a/server/resolvers/forgot_password.go +++ b/server/resolvers/forgot_password.go @@ -83,6 +83,16 @@ func ForgotPasswordResolver(ctx context.Context, params model.ForgotPasswordInpu log.Debug("Failed to get user: ", err) return nil, fmt.Errorf(`bad user credentials`) } + + if user.SignupMethods == "magic_link_login" { + user.SignupMethods = "basic_auth" + + user, err = db.Provider.UpdateUser(ctx, user) + if err != nil { + log.Debug("Failed to update user signup method: ", err) + } + } + hostname := parsers.GetHost(gc) _, nonceHash, err := utils.GenerateNonce() if err != nil { From e0db7c1051b550a53f088dfed1d95edd62d6a99e Mon Sep 17 00:00:00 2001 From: Untone Date: Sat, 17 Feb 2024 14:21:45 +0300 Subject: [PATCH 16/23] ci --- .gitea/workflows/main.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .gitea/workflows/main.yml diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml new file mode 100644 index 0000000..420626b --- /dev/null +++ b/.gitea/workflows/main.yml @@ -0,0 +1,27 @@ +name: 'deploy' +on: [push] + +jobs: + deploy: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/mailgun' + steps: + - name: Cloning repo + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Get Repo Name + id: repo_name + run: echo "::set-output name=repo::$(echo ${GITHUB_REPOSITORY##*/})" + + - name: Get Branch Name + id: branch_name + run: echo "::set-output name=branch::$(echo ${GITHUB_REF##*/})" + + - name: Push to dokku + uses: dokku/github-action@master + with: + branch: 'main' + git_remote_url: 'ssh://dokku@v2.discours.io:22/authorizer' + ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} From 871c65b9dd69b5d752087121b56cc26422e15933 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 22 Feb 2024 00:29:46 +0300 Subject: [PATCH 17/23] app-data-patch --- server/memorystore/providers/redis/core.go | 27 ++++++++++++++++++++ server/resolvers/session.go | 29 ++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 server/memorystore/providers/redis/core.go diff --git a/server/memorystore/providers/redis/core.go b/server/memorystore/providers/redis/core.go new file mode 100644 index 0000000..82a0b88 --- /dev/null +++ b/server/memorystore/providers/redis/core.go @@ -0,0 +1,27 @@ +package redis + +import ( + "fmt" +) + +// GetUserProfile возвращает профиль пользователя в виде сырого JSON +func (c *provider) GetUserProfile(userId string) (string, error) { + key := fmt.Sprintf("user:%s:profile", userId) + profileJSON, err := c.store.Get(c.ctx, key).Result() + if err != nil { + return "", err + } + + return profileJSON, nil +} + +// GetUserFollows возвращает список подписок пользователя в виде сырого JSON +func (c *provider) GetUserFollows(userId string) (string, error) { + key := fmt.Sprintf("user:%s:follows", userId) + followsJSON, err := c.store.Get(c.ctx, key).Result() + if err != nil { + return "", err + } + + return followsJSON, nil +} diff --git a/server/resolvers/session.go b/server/resolvers/session.go index 964d1b5..be09b6d 100644 --- a/server/resolvers/session.go +++ b/server/resolvers/session.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "time" + "os" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -14,6 +15,7 @@ import ( "github.com/authorizerdev/authorizer/server/db" "github.com/authorizerdev/authorizer/server/graph/model" "github.com/authorizerdev/authorizer/server/memorystore" + "github.com/authorizerdev/authorizer/server/memorystore/providers/redis" "github.com/authorizerdev/authorizer/server/token" "github.com/authorizerdev/authorizer/server/utils" ) @@ -102,6 +104,33 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeSessionToken+"_"+authToken.FingerPrint, authToken.FingerPrintHash, authToken.SessionTokenExpiresAt) memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeAccessToken+"_"+authToken.FingerPrint, authToken.AccessToken.Token, authToken.AccessToken.ExpiresAt) + redisURL := os.Getenv(constants.EnvKeyRedisURL) + if redisURL != "" { + log.Info("Initializing Redis provider") + Provider, _ := redis.NewRedisProvider(redisURL) + if err != nil { + log.Debug("Failed to init Redis: ", err) + } + + if res.User.AppData == nil { + res.User.AppData = make(map[string]interface{}) + } + + follows, err := Provider.GetUserFollows(userID) + if err != nil { + log.Debug("Failed to get follows from Redis: ", err) + } else { + res.User.AppData["follows"] = follows + } + + author, err := Provider.GetUserProfile(userID) + if err != nil { + log.Debug("Failed to get author from Redis: ", err) + } else { + res.User.AppData["author"] = author + } + } + if authToken.RefreshToken != nil { res.RefreshToken = &authToken.RefreshToken.Token memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeRefreshToken+"_"+authToken.FingerPrint, authToken.RefreshToken.Token, authToken.RefreshToken.ExpiresAt) From 0f9b95cafe83753d201af11f0d7c0b072fb028ef Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 22 Feb 2024 00:33:24 +0300 Subject: [PATCH 18/23] core-api-redis --- server/resolvers/session.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/server/resolvers/session.go b/server/resolvers/session.go index be09b6d..e2bde46 100644 --- a/server/resolvers/session.go +++ b/server/resolvers/session.go @@ -107,7 +107,7 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod redisURL := os.Getenv(constants.EnvKeyRedisURL) if redisURL != "" { log.Info("Initializing Redis provider") - Provider, _ := redis.NewRedisProvider(redisURL) + Provider, err := redis.NewRedisProvider(redisURL) if err != nil { log.Debug("Failed to init Redis: ", err) } @@ -120,14 +120,22 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod if err != nil { log.Debug("Failed to get follows from Redis: ", err) } else { - res.User.AppData["follows"] = follows + if follows != "" { + res.User.AppData["follows"] = follows + } else { + log.Debug("Follows data from Redis is empty") + } } author, err := Provider.GetUserProfile(userID) if err != nil { log.Debug("Failed to get author from Redis: ", err) } else { - res.User.AppData["author"] = author + if author != "" { + res.User.AppData["author"] = author + } else { + log.Debug("Author data from Redis is empty") + } } } From 94917e77357175427d0dcef4e85b324d38aaef32 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 22 Feb 2024 09:13:56 +0300 Subject: [PATCH 19/23] login-patched --- server/resolvers/login.go | 37 +++++++++++++++++++ server/resolvers/session.go | 72 +++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 35 deletions(-) diff --git a/server/resolvers/login.go b/server/resolvers/login.go index fa5d409..e0583ce 100644 --- a/server/resolvers/login.go +++ b/server/resolvers/login.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" "time" + "os" "github.com/google/uuid" @@ -19,6 +20,7 @@ import ( mailService "github.com/authorizerdev/authorizer/server/email" "github.com/authorizerdev/authorizer/server/graph/model" "github.com/authorizerdev/authorizer/server/memorystore" + "github.com/authorizerdev/authorizer/server/memorystore/providers/redis" "github.com/authorizerdev/authorizer/server/refs" "github.com/authorizerdev/authorizer/server/smsproviders" "github.com/authorizerdev/authorizer/server/token" @@ -316,6 +318,41 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes expiresIn = 1 } + redisURL := os.Getenv(constants.EnvKeyRedisURL) + if redisURL != "" { + log.Info("Initializing Redis provider") + Provider, err := redis.NewRedisProvider(redisURL) + if err != nil { + log.Debug("Failed to init Redis: ", err) + } + + if user.AppData == nil { + user.AppData = make(map[string]interface{}) + } + + follows, err := Provider.GetUserFollows(user.ID) + if err != nil { + log.Debug("Failed to get follows from Redis: ", err) + } else { + if follows != "" { + user.AppData["follows"] = follows + } else { + log.Debug("Follows data from Redis is empty") + } + } + + author, err := Provider.GetUserProfile(user.ID) + if err != nil { + log.Debug("Failed to get author from Redis: ", err) + } else { + if author != "" { + user.AppData["author"] = author + } else { + log.Debug("Author data from Redis is empty") + } + } + } + res = &model.AuthResponse{ Message: `Logged in successfully`, AccessToken: &authToken.AccessToken.Token, diff --git a/server/resolvers/session.go b/server/resolvers/session.go index e2bde46..0f9f172 100644 --- a/server/resolvers/session.go +++ b/server/resolvers/session.go @@ -4,8 +4,9 @@ import ( "context" "errors" "fmt" - "time" "os" + "os/user" + "time" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -92,6 +93,41 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod expiresIn = 1 } + redisURL := os.Getenv(constants.EnvKeyRedisURL) + if redisURL != "" { + log.Info("Initializing Redis provider") + Provider, err := redis.NewRedisProvider(redisURL) + if err != nil { + log.Debug("Failed to init Redis: ", err) + } + + if user.AppData == nil { + user.AppData = make(map[string]interface{}) + } + + follows, err := Provider.GetUserFollows(user.ID) + if err != nil { + log.Debug("Failed to get follows from Redis: ", err) + } else { + if follows != "" { + user.AppData["follows"] = follows + } else { + log.Debug("Follows data from Redis is empty") + } + } + + author, err := Provider.GetUserProfile(user.ID) + if err != nil { + log.Debug("Failed to get author from Redis: ", err) + } else { + if author != "" { + user.AppData["author"] = author + } else { + log.Debug("Author data from Redis is empty") + } + } + } + res = &model.AuthResponse{ Message: `Session token refreshed`, AccessToken: &authToken.AccessToken.Token, @@ -104,40 +140,6 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeSessionToken+"_"+authToken.FingerPrint, authToken.FingerPrintHash, authToken.SessionTokenExpiresAt) memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeAccessToken+"_"+authToken.FingerPrint, authToken.AccessToken.Token, authToken.AccessToken.ExpiresAt) - redisURL := os.Getenv(constants.EnvKeyRedisURL) - if redisURL != "" { - log.Info("Initializing Redis provider") - Provider, err := redis.NewRedisProvider(redisURL) - if err != nil { - log.Debug("Failed to init Redis: ", err) - } - - if res.User.AppData == nil { - res.User.AppData = make(map[string]interface{}) - } - - follows, err := Provider.GetUserFollows(userID) - if err != nil { - log.Debug("Failed to get follows from Redis: ", err) - } else { - if follows != "" { - res.User.AppData["follows"] = follows - } else { - log.Debug("Follows data from Redis is empty") - } - } - - author, err := Provider.GetUserProfile(userID) - if err != nil { - log.Debug("Failed to get author from Redis: ", err) - } else { - if author != "" { - res.User.AppData["author"] = author - } else { - log.Debug("Author data from Redis is empty") - } - } - } if authToken.RefreshToken != nil { res.RefreshToken = &authToken.RefreshToken.Token From 8fca4cf4c0f092481897bda74331b9baf6f556f7 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 22 Feb 2024 10:40:39 +0300 Subject: [PATCH 20/23] appdata-patch --- server/memorystore/providers/redis/core.go | 27 ------------ server/memorystore/providers/redis/store.go | 23 ++++++++++ server/resolvers/login.go | 45 ++++++-------------- server/resolvers/session.go | 47 ++++++--------------- 4 files changed, 47 insertions(+), 95 deletions(-) delete mode 100644 server/memorystore/providers/redis/core.go diff --git a/server/memorystore/providers/redis/core.go b/server/memorystore/providers/redis/core.go deleted file mode 100644 index 82a0b88..0000000 --- a/server/memorystore/providers/redis/core.go +++ /dev/null @@ -1,27 +0,0 @@ -package redis - -import ( - "fmt" -) - -// GetUserProfile возвращает профиль пользователя в виде сырого JSON -func (c *provider) GetUserProfile(userId string) (string, error) { - key := fmt.Sprintf("user:%s:profile", userId) - profileJSON, err := c.store.Get(c.ctx, key).Result() - if err != nil { - return "", err - } - - return profileJSON, nil -} - -// GetUserFollows возвращает список подписок пользователя в виде сырого JSON -func (c *provider) GetUserFollows(userId string) (string, error) { - key := fmt.Sprintf("user:%s:follows", userId) - followsJSON, err := c.store.Get(c.ctx, key).Result() - if err != nil { - return "", err - } - - return followsJSON, nil -} diff --git a/server/memorystore/providers/redis/store.go b/server/memorystore/providers/redis/store.go index a1b21db..b7e3642 100644 --- a/server/memorystore/providers/redis/store.go +++ b/server/memorystore/providers/redis/store.go @@ -218,3 +218,26 @@ func (c *provider) GetBoolStoreEnvVariable(key string) (bool, error) { return data == "1", nil } + +// GetUserAppDataFromRedis retrieves user profile and follows from Redis, combines them into a JSON format, +// and assigns the JSON string to the provided user's ID. +func (c *provider) GetUserAppDataFromRedis(userId string) (string, error) { + + // Retrieve user data from Redis + key := fmt.Sprintf("user:%s:author", userId) + authorJSON, err := c.store.Get(c.ctx, key).Result() + if err != nil { + return "", err + } + + key = fmt.Sprintf("user:%s:follows", userId) + followsJSON, err := c.store.Get(c.ctx, key).Result() + if err != nil { + return "", err + } + + // Combine user data into a JSON string + combinedData := fmt.Sprintf(`{"profile": %s, "follows": %s}`, authorJSON, followsJSON) + + return combinedData, nil +} diff --git a/server/resolvers/login.go b/server/resolvers/login.go index e0583ce..997f625 100644 --- a/server/resolvers/login.go +++ b/server/resolvers/login.go @@ -318,41 +318,20 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes expiresIn = 1 } - redisURL := os.Getenv(constants.EnvKeyRedisURL) - if redisURL != "" { - log.Info("Initializing Redis provider") - Provider, err := redis.NewRedisProvider(redisURL) - if err != nil { - log.Debug("Failed to init Redis: ", err) - } + redisURL := os.Getenv("REDIS_URL") + if redisURL != "" { + log.Info("Initializing Redis memory store") + RedisProvider, err := redis.NewRedisProvider(redisURL) + if err == nil { + appData, err := RedisProvider.GetUserAppDataFromRedis(user.ID) + if err == nil { + // Assign the combined data to the provided pointer + user.AppData = &appData + } + } - if user.AppData == nil { - user.AppData = make(map[string]interface{}) - } + } - follows, err := Provider.GetUserFollows(user.ID) - if err != nil { - log.Debug("Failed to get follows from Redis: ", err) - } else { - if follows != "" { - user.AppData["follows"] = follows - } else { - log.Debug("Follows data from Redis is empty") - } - } - - author, err := Provider.GetUserProfile(user.ID) - if err != nil { - log.Debug("Failed to get author from Redis: ", err) - } else { - if author != "" { - user.AppData["author"] = author - } else { - log.Debug("Author data from Redis is empty") - } - } - } - res = &model.AuthResponse{ Message: `Logged in successfully`, AccessToken: &authToken.AccessToken.Token, diff --git a/server/resolvers/session.go b/server/resolvers/session.go index 0f9f172..750249d 100644 --- a/server/resolvers/session.go +++ b/server/resolvers/session.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "os" - "os/user" "time" "github.com/google/uuid" @@ -93,40 +92,18 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod expiresIn = 1 } - redisURL := os.Getenv(constants.EnvKeyRedisURL) - if redisURL != "" { - log.Info("Initializing Redis provider") - Provider, err := redis.NewRedisProvider(redisURL) - if err != nil { - log.Debug("Failed to init Redis: ", err) - } - - if user.AppData == nil { - user.AppData = make(map[string]interface{}) - } - - follows, err := Provider.GetUserFollows(user.ID) - if err != nil { - log.Debug("Failed to get follows from Redis: ", err) - } else { - if follows != "" { - user.AppData["follows"] = follows - } else { - log.Debug("Follows data from Redis is empty") - } - } - - author, err := Provider.GetUserProfile(user.ID) - if err != nil { - log.Debug("Failed to get author from Redis: ", err) - } else { - if author != "" { - user.AppData["author"] = author - } else { - log.Debug("Author data from Redis is empty") - } - } - } + redisURL := os.Getenv("REDIS_URL") + if redisURL != "" { + log.Info("Initializing Redis memory store") + RedisProvider, err := redis.NewRedisProvider(redisURL) + if err != nil { + appData, err := RedisProvider.GetUserAppDataFromRedis(user.ID) + if err == nil { + // Assign the combined data to the provided pointer + user.AppData = &appData + } + } + } res = &model.AuthResponse{ Message: `Session token refreshed`, From 31079f2628ebebda379fc88732e09b8fc88eb017 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 22 Feb 2024 11:51:20 +0300 Subject: [PATCH 21/23] redis-provider-fix --- .../memorystore/providers/inmemory/store.go | 25 +++++++++++++++++++ server/memorystore/providers/providers.go | 2 ++ server/memorystore/providers/redis/store.go | 16 +++--------- server/resolvers/login.go | 20 ++++----------- server/resolvers/session.go | 21 +++++----------- 5 files changed, 41 insertions(+), 43 deletions(-) diff --git a/server/memorystore/providers/inmemory/store.go b/server/memorystore/providers/inmemory/store.go index b20fb62..a92fcff 100644 --- a/server/memorystore/providers/inmemory/store.go +++ b/server/memorystore/providers/inmemory/store.go @@ -3,8 +3,11 @@ package inmemory import ( "fmt" "os" + "errors" + log "github.com/sirupsen/logrus" "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/memorystore/providers/redis" ) // SetUserSession sets the user session for given user identifier in form recipe:user_id @@ -119,3 +122,25 @@ func (c *provider) GetBoolStoreEnvVariable(key string) (bool, error) { } return res.(bool), nil } + +// GetUserAppDataFromRedis retrieves user profile and follows from Redis, combines them into a JSON format, +// and assigns the JSON string to the provided user's ID. +func (c *provider) GetUserAppDataFromRedis(userId string) (string, error) { + redisURL := os.Getenv(constants.EnvKeyRedisURL) + if redisURL == "" { + return "", errors.New("Redis URL not found") + } + + log.Info("Initializing Redis provider") + red, err := redis.NewRedisProvider(redisURL) + if err != nil { + return "", fmt.Errorf("failed to initialize Redis provider: %w", err) + } + + combinedData, err := red.GetUserAppDataFromRedis(userId) + if err != nil { + return "", fmt.Errorf("failed to get Redis app data: %w", err) + } + + return combinedData, nil +} diff --git a/server/memorystore/providers/providers.go b/server/memorystore/providers/providers.go index 331e34a..b1e7153 100644 --- a/server/memorystore/providers/providers.go +++ b/server/memorystore/providers/providers.go @@ -38,4 +38,6 @@ type Provider interface { GetStringStoreEnvVariable(key string) (string, error) // GetBoolStoreEnvVariable to get the bool env variable from env store GetBoolStoreEnvVariable(key string) (bool, error) + + GetUserAppDataFromRedis(userId string) (string, error) } diff --git a/server/memorystore/providers/redis/store.go b/server/memorystore/providers/redis/store.go index b7e3642..4ed66c4 100644 --- a/server/memorystore/providers/redis/store.go +++ b/server/memorystore/providers/redis/store.go @@ -222,22 +222,12 @@ func (c *provider) GetBoolStoreEnvVariable(key string) (bool, error) { // GetUserAppDataFromRedis retrieves user profile and follows from Redis, combines them into a JSON format, // and assigns the JSON string to the provided user's ID. func (c *provider) GetUserAppDataFromRedis(userId string) (string, error) { - // Retrieve user data from Redis - key := fmt.Sprintf("user:%s:author", userId) - authorJSON, err := c.store.Get(c.ctx, key).Result() - if err != nil { - return "", err - } - - key = fmt.Sprintf("user:%s:follows", userId) - followsJSON, err := c.store.Get(c.ctx, key).Result() - if err != nil { - return "", err - } + userProfile := c.store.Get(c.ctx, fmt.Sprintf(`user:%s:author`, userId)) + userFollows := c.store.Get(c.ctx, fmt.Sprintf(`user:%s:follows`, userId)) // Combine user data into a JSON string - combinedData := fmt.Sprintf(`{"profile": %s, "follows": %s}`, authorJSON, followsJSON) + combinedData := fmt.Sprintf(`{"profile": %s, "follows": %s}`, userProfile, userFollows) return combinedData, nil } diff --git a/server/resolvers/login.go b/server/resolvers/login.go index 997f625..b79ddfe 100644 --- a/server/resolvers/login.go +++ b/server/resolvers/login.go @@ -5,7 +5,6 @@ import ( "fmt" "strings" "time" - "os" "github.com/google/uuid" @@ -20,7 +19,6 @@ import ( mailService "github.com/authorizerdev/authorizer/server/email" "github.com/authorizerdev/authorizer/server/graph/model" "github.com/authorizerdev/authorizer/server/memorystore" - "github.com/authorizerdev/authorizer/server/memorystore/providers/redis" "github.com/authorizerdev/authorizer/server/refs" "github.com/authorizerdev/authorizer/server/smsproviders" "github.com/authorizerdev/authorizer/server/token" @@ -318,19 +316,11 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes expiresIn = 1 } - redisURL := os.Getenv("REDIS_URL") - if redisURL != "" { - log.Info("Initializing Redis memory store") - RedisProvider, err := redis.NewRedisProvider(redisURL) - if err == nil { - appData, err := RedisProvider.GetUserAppDataFromRedis(user.ID) - if err == nil { - // Assign the combined data to the provided pointer - user.AppData = &appData - } - } - - } + appData, err := memorystore.Provider.GetUserAppDataFromRedis(user.ID) + if err == nil { + // Assign the combined data to the provided pointer + user.AppData = &appData + } res = &model.AuthResponse{ Message: `Logged in successfully`, diff --git a/server/resolvers/session.go b/server/resolvers/session.go index 750249d..f359782 100644 --- a/server/resolvers/session.go +++ b/server/resolvers/session.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "os" "time" "github.com/google/uuid" @@ -15,7 +14,6 @@ import ( "github.com/authorizerdev/authorizer/server/db" "github.com/authorizerdev/authorizer/server/graph/model" "github.com/authorizerdev/authorizer/server/memorystore" - "github.com/authorizerdev/authorizer/server/memorystore/providers/redis" "github.com/authorizerdev/authorizer/server/token" "github.com/authorizerdev/authorizer/server/utils" ) @@ -92,19 +90,12 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod expiresIn = 1 } - redisURL := os.Getenv("REDIS_URL") - if redisURL != "" { - log.Info("Initializing Redis memory store") - RedisProvider, err := redis.NewRedisProvider(redisURL) - if err != nil { - appData, err := RedisProvider.GetUserAppDataFromRedis(user.ID) - if err == nil { - // Assign the combined data to the provided pointer - user.AppData = &appData - } - } - } - + appData, err := memorystore.Provider.GetUserAppDataFromRedis(user.ID) + if err == nil { + // Assign the combined data to the provided pointer + user.AppData = &appData + } + res = &model.AuthResponse{ Message: `Session token refreshed`, AccessToken: &authToken.AccessToken.Token, From 4990a77786979adaca17b1ec00a5b4de998f17d5 Mon Sep 17 00:00:00 2001 From: Stepan Vladovskiy Date: Thu, 11 Apr 2024 17:09:38 -0300 Subject: [PATCH 22/23] feat: CI mailgun->v2 and dev->staging --- .gitea/workflows/main.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 57423b2..3744b44 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -5,7 +5,10 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Cloning repo + uses: actions/checkout@v2 + with: + fetch-depth: 0 - name: Get Repo Name id: repo_name @@ -15,9 +18,18 @@ jobs: id: branch_name run: echo "::set-output name=branch::$(echo ${GITHUB_REF##*/})" - - name: Push to dokku + - name: Push to dokku for main branch + if: steps.branch_name.outputs.branch == 'mailgun' uses: dokku/github-action@master with: branch: 'main' git_remote_url: 'ssh://dokku@v2.discours.io:22/authorizer' ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} + + - name: Push to dokku for dev branch + if: steps.branch_name.outputs.branch == 'dev' + uses: dokku/github-action@master + with: + branch: 'main' + git_remote_url: 'ssh://dokku@staging.discours.io:22/authorizer' + ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} \ No newline at end of file From cfaf6c49b4de7c6eb8985a5e754ed34d7069405d Mon Sep 17 00:00:00 2001 From: Stepan Vladovskiy Date: Thu, 11 Apr 2024 17:10:55 -0300 Subject: [PATCH 23/23] feat: CI mailgun->v2 and dev->staging --- .gitea/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 3744b44..b2cae71 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -25,6 +25,7 @@ jobs: branch: 'main' git_remote_url: 'ssh://dokku@v2.discours.io:22/authorizer' ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} + git_push_flags: '--force' - name: Push to dokku for dev branch if: steps.branch_name.outputs.branch == 'dev' @@ -32,4 +33,5 @@ jobs: with: branch: 'main' git_remote_url: 'ssh://dokku@staging.discours.io:22/authorizer' - ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} \ No newline at end of file + ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} + git_push_flags: '--force' \ No newline at end of file