From c8413665ae95a3f9e60e04237a46272595cc7227 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 22 Jan 2024 14:29:32 +0300 Subject: [PATCH 01/19] logs-fix --- server/logs/logs.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/server/logs/logs.go b/server/logs/logs.go index 924548c..d5b8846 100644 --- a/server/logs/logs.go +++ b/server/logs/logs.go @@ -1,28 +1,31 @@ package logs import ( + "fmt" "os" + "path/filepath" + "time" "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" ) -// LogUTCFormatter hels in setting UTC time format for the logs +// LogUTCFormatter helps in setting UTC time format for the logs type LogUTCFormatter struct { log.Formatter } -// Format helps fomratting time to UTC +// Format helps formatting time to UTC func (u LogUTCFormatter) Format(e *log.Entry) ([]byte, error) { e.Time = e.Time.UTC() - return u.Formatter.Format(e) + file := filepath.Base(e.Caller.File) + return []byte(fmt.Sprintf("[%s] %s:%d %s\n", e.Time.Format(time.RFC3339), file, e.Caller.Line, e.Message)), nil } func InitLog(cliLogLevel string) *log.Logger { - - // log instance for gin server + // log instance for the gin server log := logrus.New() - log.SetFormatter(LogUTCFormatter{&logrus.JSONFormatter{}}) + log.SetFormatter(LogUTCFormatter{&logrus.TextFormatter{}}) if cliLogLevel == "" { cliLogLevel = os.Getenv("LOG_LEVEL") From 07a26991e9c6c63f228d1daadcf159de9cd2abd8 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 22 Jan 2024 14:32:27 +0300 Subject: [PATCH 02/19] logs-fix-2 --- server/logs/logs.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/server/logs/logs.go b/server/logs/logs.go index d5b8846..31fa111 100644 --- a/server/logs/logs.go +++ b/server/logs/logs.go @@ -1,29 +1,26 @@ package logs import ( - "fmt" "os" - "path/filepath" - "time" "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" ) -// LogUTCFormatter helps in setting UTC time format for the logs +// LogUTCFormatter hels in setting UTC time format for the logs type LogUTCFormatter struct { log.Formatter } -// Format helps formatting time to UTC +// Format helps fomratting time to UTC func (u LogUTCFormatter) Format(e *log.Entry) ([]byte, error) { e.Time = e.Time.UTC() - file := filepath.Base(e.Caller.File) - return []byte(fmt.Sprintf("[%s] %s:%d %s\n", e.Time.Format(time.RFC3339), file, e.Caller.Line, e.Message)), nil + return u.Formatter.Format(e) } func InitLog(cliLogLevel string) *log.Logger { - // log instance for the gin server + + // log instance for gin server log := logrus.New() log.SetFormatter(LogUTCFormatter{&logrus.TextFormatter{}}) From c53ada95eb2427da65f86412c013f3e48de27243 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 22 Jan 2024 14:49:58 +0300 Subject: [PATCH 03/19] logs-fix-3 --- server/logs/fmt.go | 60 +++++++++++++++++++++++++++++++++++++++++++++ server/logs/logs.go | 2 +- server/main.go | 2 +- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 server/logs/fmt.go diff --git a/server/logs/fmt.go b/server/logs/fmt.go new file mode 100644 index 0000000..fdff3ab --- /dev/null +++ b/server/logs/fmt.go @@ -0,0 +1,60 @@ +package logs + +import ( + "encoding/json" + "fmt" + "time" + + "github.com/sirupsen/logrus" +) + +// LogJSONFormatter is a custom log formatter for JSON output +type LogJSONFormatter struct { +} + +// Format formats the log entry to JSON +func (f *LogJSONFormatter) Format(entry *logrus.Entry) ([]byte, error) { + data := make(logrus.Fields) + + // Include the log level, message, and time in the JSON output + data["level"] = entry.Level.String() + data["msg"] = entry.Message + data["time"] = entry.Time.UTC().Format(time.RFC3339) + + // Include additional fields from the entry + for k, v := range entry.Data { + data[k] = v + } + + // Marshal the JSON data + jsonData, err := json.Marshal(data) + if err != nil { + return nil, fmt.Errorf("failed to marshal log entry to JSON: %v", err) + } + + // Append a newline to the JSON data + return append(jsonData, '\n'), nil +} + +// ParseLogLine parses the log line and extracts the log level, message, and time +func ParseLogLine(line string) (logrus.Level, string, time.Time, error) { + var entry struct { + Level string `json:"level"` + Msg string `json:"msg"` + Time time.Time `json:"time"` + } + + // Unmarshal the JSON data + err := json.Unmarshal([]byte(line), &entry) + if err != nil { + return logrus.InfoLevel, "", time.Time{}, fmt.Errorf("failed to unmarshal log line: %v", err) + } + + // Convert the log level string to logrus.Level + level, err := logrus.ParseLevel(entry.Level) + if err != nil { + return logrus.InfoLevel, "", time.Time{}, fmt.Errorf("failed to parse log level: %v", err) + } + + return level, entry.Msg, entry.Time, nil +} diff --git a/server/logs/logs.go b/server/logs/logs.go index 31fa111..449f050 100644 --- a/server/logs/logs.go +++ b/server/logs/logs.go @@ -22,7 +22,7 @@ func InitLog(cliLogLevel string) *log.Logger { // log instance for gin server log := logrus.New() - log.SetFormatter(LogUTCFormatter{&logrus.TextFormatter{}}) + log.SetFormatter(&LogJSONFormatter{}) if cliLogLevel == "" { cliLogLevel = os.Getenv("LOG_LEVEL") diff --git a/server/main.go b/server/main.go index 0348d2a..b801e33 100644 --- a/server/main.go +++ b/server/main.go @@ -28,7 +28,7 @@ func main() { flag.Parse() // global log level - logrus.SetFormatter(logs.LogUTCFormatter{&logrus.JSONFormatter{}}) + logrus.SetFormatter(&logs.LogJSONFormatter{}) constants.VERSION = VERSION From bdcf2c39f798f6a87809d17f400d7f7393874d19 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 22 Jan 2024 15:02:22 +0300 Subject: [PATCH 04/19] logs-fix-4 --- server/logs/fmt.go | 60 --------------------------------------------- server/logs/logs.go | 13 +--------- server/logs/text.go | 18 ++++++++++++++ server/logs/utc.go | 16 ++++++++++++ server/main.go | 2 +- 5 files changed, 36 insertions(+), 73 deletions(-) delete mode 100644 server/logs/fmt.go create mode 100644 server/logs/text.go create mode 100644 server/logs/utc.go diff --git a/server/logs/fmt.go b/server/logs/fmt.go deleted file mode 100644 index fdff3ab..0000000 --- a/server/logs/fmt.go +++ /dev/null @@ -1,60 +0,0 @@ -package logs - -import ( - "encoding/json" - "fmt" - "time" - - "github.com/sirupsen/logrus" -) - -// LogJSONFormatter is a custom log formatter for JSON output -type LogJSONFormatter struct { -} - -// Format formats the log entry to JSON -func (f *LogJSONFormatter) Format(entry *logrus.Entry) ([]byte, error) { - data := make(logrus.Fields) - - // Include the log level, message, and time in the JSON output - data["level"] = entry.Level.String() - data["msg"] = entry.Message - data["time"] = entry.Time.UTC().Format(time.RFC3339) - - // Include additional fields from the entry - for k, v := range entry.Data { - data[k] = v - } - - // Marshal the JSON data - jsonData, err := json.Marshal(data) - if err != nil { - return nil, fmt.Errorf("failed to marshal log entry to JSON: %v", err) - } - - // Append a newline to the JSON data - return append(jsonData, '\n'), nil -} - -// ParseLogLine parses the log line and extracts the log level, message, and time -func ParseLogLine(line string) (logrus.Level, string, time.Time, error) { - var entry struct { - Level string `json:"level"` - Msg string `json:"msg"` - Time time.Time `json:"time"` - } - - // Unmarshal the JSON data - err := json.Unmarshal([]byte(line), &entry) - if err != nil { - return logrus.InfoLevel, "", time.Time{}, fmt.Errorf("failed to unmarshal log line: %v", err) - } - - // Convert the log level string to logrus.Level - level, err := logrus.ParseLevel(entry.Level) - if err != nil { - return logrus.InfoLevel, "", time.Time{}, fmt.Errorf("failed to parse log level: %v", err) - } - - return level, entry.Msg, entry.Time, nil -} diff --git a/server/logs/logs.go b/server/logs/logs.go index 449f050..77db4cf 100644 --- a/server/logs/logs.go +++ b/server/logs/logs.go @@ -7,22 +7,11 @@ import ( log "github.com/sirupsen/logrus" ) -// LogUTCFormatter hels in setting UTC time format for the logs -type LogUTCFormatter struct { - log.Formatter -} - -// Format helps fomratting time to UTC -func (u LogUTCFormatter) Format(e *log.Entry) ([]byte, error) { - e.Time = e.Time.UTC() - return u.Formatter.Format(e) -} - func InitLog(cliLogLevel string) *log.Logger { // log instance for gin server log := logrus.New() - log.SetFormatter(&LogJSONFormatter{}) + log.SetFormatter(&LogTextFormatter{}) if cliLogLevel == "" { cliLogLevel = os.Getenv("LOG_LEVEL") diff --git a/server/logs/text.go b/server/logs/text.go new file mode 100644 index 0000000..f7ed2d1 --- /dev/null +++ b/server/logs/text.go @@ -0,0 +1,18 @@ +package logs + +import ( + "fmt" + "strings" + + "github.com/sirupsen/logrus" +) + +// LogTextFormatter is a custom log formatter for text output +type LogTextFormatter struct { + logrus.Formatter +} + +// Format helps fomratting time to UTC +func (u LogTextFormatter) Format(e *logrus.Entry) ([]byte, error) { + return []byte(fmt.Sprintf("[%s] %s", strings.ToUpper(e.Level.String()), e.Message)), nil +} diff --git a/server/logs/utc.go b/server/logs/utc.go new file mode 100644 index 0000000..585b879 --- /dev/null +++ b/server/logs/utc.go @@ -0,0 +1,16 @@ +package logs + +import ( + log "github.com/sirupsen/logrus" +) + +// LogUTCFormatter hels in setting UTC time format for the logs +type LogUTCFormatter struct { + log.Formatter +} + +// Format helps fomratting time to UTC +func (u LogUTCFormatter) Format(e *log.Entry) ([]byte, error) { + e.Time = e.Time.UTC() + return u.Formatter.Format(e) +} diff --git a/server/main.go b/server/main.go index b801e33..79b924c 100644 --- a/server/main.go +++ b/server/main.go @@ -28,7 +28,7 @@ func main() { flag.Parse() // global log level - logrus.SetFormatter(&logs.LogJSONFormatter{}) + logrus.SetFormatter(&logs.LogTextFormatter{}) constants.VERSION = VERSION From 853f8c44bb49e7a81d8bbae93ab55c4569bd27c8 Mon Sep 17 00:00:00 2001 From: Stepan Vladovskii Date: Sun, 28 Jan 2024 19:33:27 -0300 Subject: [PATCH 05/19] feat: add CI pipline to mailgun brunch with check is this branch is mailgun --- .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..3bdc6a4 --- /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 }} \ No newline at end of file From 416640ac136f5cdfb7e69e5241afe94e272e205b Mon Sep 17 00:00:00 2001 From: to Date: Thu, 1 Feb 2024 10:35:11 +0000 Subject: [PATCH 06/19] 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 07/19] 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 08/19] 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 09/19] 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 10/19] 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 11/19] 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 12/19] 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 13/19] 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 14/19] 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 15/19] 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 16/19] 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 17/19] 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 18/19] 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 19/19] 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"