From 38f9b4bf78331c25d6a9050b8e5f9ec1d9924bcb Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 24 Oct 2023 20:49:34 +0300 Subject: [PATCH] create_user-api --- server/graph/generated/generated.go | 42 +++++++++++++++++++++- server/graph/model/mod.go | 1 + server/graph/model/models_gen.go | 20 ++++++----- server/graph/schema.graphqls | 4 +++ server/resolvers/create_user.go | 54 ++++++++++++++++++----------- 5 files changed, 91 insertions(+), 30 deletions(-) create mode 100644 server/graph/model/mod.go diff --git a/server/graph/generated/generated.go b/server/graph/generated/generated.go index f07af78..20ccfbd 100644 --- a/server/graph/generated/generated.go +++ b/server/graph/generated/generated.go @@ -2679,6 +2679,8 @@ input UpdateProfileInput { input CreateUserInput { email: String + email_verified: Boolean + email_verified_at: Int64 password: String given_name: String family_name: String @@ -2686,6 +2688,8 @@ input CreateUserInput { nickname: String phone_number: String picture: String + created_at: Int64 + updated_at: Int64 } @@ -16256,7 +16260,7 @@ func (ec *executionContext) unmarshalInputCreateUserInput(ctx context.Context, o asMap[k] = v } - fieldsInOrder := [...]string{"email", "password", "given_name", "family_name", "middle_name", "nickname", "phone_number", "picture"} + fieldsInOrder := [...]string{"email", "email_verified", "email_verified_at", "password", "given_name", "family_name", "middle_name", "nickname", "phone_number", "picture", "created_at", "updated_at"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -16272,6 +16276,24 @@ func (ec *executionContext) unmarshalInputCreateUserInput(ctx context.Context, o return it, err } it.Email = data + case "email_verified": + var err error + + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email_verified")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err + } + it.EmailVerified = data + case "email_verified_at": + var err error + + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email_verified_at")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + if err != nil { + return it, err + } + it.EmailVerifiedAt = data case "password": var err error @@ -16335,6 +16357,24 @@ func (ec *executionContext) unmarshalInputCreateUserInput(ctx context.Context, o return it, err } it.Picture = data + case "created_at": + var err error + + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("created_at")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + if err != nil { + return it, err + } + it.CreatedAt = data + case "updated_at": + var err error + + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("updated_at")) + data, err := ec.unmarshalOInt642ᚖint64(ctx, v) + if err != nil { + return it, err + } + it.UpdatedAt = data } } diff --git a/server/graph/model/mod.go b/server/graph/model/mod.go new file mode 100644 index 0000000..0c3b4f2 --- /dev/null +++ b/server/graph/model/mod.go @@ -0,0 +1 @@ +package model \ No newline at end of file diff --git a/server/graph/model/models_gen.go b/server/graph/model/models_gen.go index 567a566..72030de 100644 --- a/server/graph/model/models_gen.go +++ b/server/graph/model/models_gen.go @@ -37,14 +37,18 @@ type AuthResponse struct { } type CreateUserInput struct { - Email *string `json:"email,omitempty"` - Password *string `json:"password,omitempty"` - GivenName *string `json:"given_name,omitempty"` - FamilyName *string `json:"family_name,omitempty"` - MiddleName *string `json:"middle_name,omitempty"` - Nickname *string `json:"nickname,omitempty"` - PhoneNumber *string `json:"phone_number,omitempty"` - Picture *string `json:"picture,omitempty"` + Email *string `json:"email,omitempty"` + EmailVerified *bool `json:"email_verified,omitempty"` + EmailVerifiedAt *int64 `json:"email_verified_at,omitempty"` + Password *string `json:"password,omitempty"` + GivenName *string `json:"given_name,omitempty"` + FamilyName *string `json:"family_name,omitempty"` + MiddleName *string `json:"middle_name,omitempty"` + Nickname *string `json:"nickname,omitempty"` + PhoneNumber *string `json:"phone_number,omitempty"` + Picture *string `json:"picture,omitempty"` + CreatedAt *int64 `json:"created_at,omitempty"` + UpdatedAt *int64 `json:"updated_at,omitempty"` } type DeleteEmailTemplateRequest struct { diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls index 4a51933..eb1570c 100644 --- a/server/graph/schema.graphqls +++ b/server/graph/schema.graphqls @@ -410,6 +410,8 @@ input UpdateProfileInput { input CreateUserInput { email: String + email_verified: Boolean + email_verified_at: Int64 password: String given_name: String family_name: String @@ -417,6 +419,8 @@ input CreateUserInput { nickname: String phone_number: String picture: String + created_at: Int64 + updated_at: Int64 } diff --git a/server/resolvers/create_user.go b/server/resolvers/create_user.go index 0a838a2..07da02d 100644 --- a/server/resolvers/create_user.go +++ b/server/resolvers/create_user.go @@ -37,7 +37,7 @@ func CreateUserResolver(ctx context.Context, params model.CreateUserInput) (*mod return res, fmt.Errorf("unauthorized") } - log := log.New(); + log := log.New() if params.PhoneNumber != nil { // verify if phone number is unique @@ -47,6 +47,15 @@ func CreateUserResolver(ctx context.Context, params model.CreateUserInput) (*mod } } + if params.EmailVerified != nil { + if *params.EmailVerified { + now := time.Now().Unix() + params.EmailVerifiedAt = &now + } else { + params.EmailVerifiedAt = nil + } + } + if params.Email != nil { // check if valid email if !validators.IsValidEmail(*params.Email) { @@ -64,6 +73,7 @@ func CreateUserResolver(ctx context.Context, params model.CreateUserInput) (*mod hostname := parsers.GetHost(gc) params.Email = &newEmail + params.EmailVerifiedAt = nil // insert verification request _, nonceHash, err := utils.GenerateNonce() if err != nil { @@ -100,36 +110,38 @@ func CreateUserResolver(ctx context.Context, params model.CreateUserInput) (*mod // json-typed model to store in database userdata := models.User{ - Email: *params.Email, - Password: params.Password, - GivenName: params.GivenName, - FamilyName: params.FamilyName, - MiddleName: params.MiddleName, - Nickname: params.Nickname, // slug - PhoneNumber: params.PhoneNumber, - Picture: params.Picture, + Email: *params.Email, + EmailVerifiedAt: params.EmailVerifiedAt, + CreatedAt: *params.CreatedAt, + UpdatedAt: *params.UpdatedAt, + Password: params.Password, + GivenName: params.GivenName, + FamilyName: params.FamilyName, + MiddleName: params.MiddleName, + Nickname: params.Nickname, // slug + PhoneNumber: params.PhoneNumber, + Picture: params.Picture, } var user *models.User user, err = db.Provider.AddUser(ctx, &userdata) if err != nil { - log.Debug("Failed to create user: ", err) + log.Debug("Failed to update user: ", err) return res, err } - // Convert the user data to the appropriate type for the GraphQL response + createdAt := user.CreatedAt + updatedAt := user.UpdatedAt res = &model.User{ - ID: user.ID, - Email: user.Email, - GivenName: user.GivenName, - FamilyName: user.FamilyName, - MiddleName: user.MiddleName, - Nickname: user.Nickname, - PhoneNumber: user.PhoneNumber, - Picture: user.Picture, + ID: user.ID, + Email: user.Email, + Picture: user.Picture, + GivenName: user.GivenName, + FamilyName: user.FamilyName, + Roles: strings.Split(user.Roles, ","), + CreatedAt: &createdAt, + UpdatedAt: &updatedAt, } - - return res, nil }