From bc2c78dc031a9e86c08e7cf320ffb3db9bf2c3ee Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:12:09 +0900 Subject: [PATCH 01/11] =?UTF-8?q?users=E3=83=86=E3=83=BC=E3=83=96=E3=83=AB?= =?UTF-8?q?=E3=81=ABemail=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atlas/migrations/20241126070859_add_users_email_column.sql | 2 ++ .../migrations/20241126071105_change_users_email_non_null.sql | 2 ++ atlas/migrations/atlas.sum | 4 +++- atlas/schema.hcl | 3 +++ 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 atlas/migrations/20241126070859_add_users_email_column.sql create mode 100644 atlas/migrations/20241126071105_change_users_email_non_null.sql diff --git a/atlas/migrations/20241126070859_add_users_email_column.sql b/atlas/migrations/20241126070859_add_users_email_column.sql new file mode 100644 index 00000000..8ac7d5e7 --- /dev/null +++ b/atlas/migrations/20241126070859_add_users_email_column.sql @@ -0,0 +1,2 @@ +-- Modify "users" table +ALTER TABLE "public"."users" ADD COLUMN "email" character varying(255) NULL; diff --git a/atlas/migrations/20241126071105_change_users_email_non_null.sql b/atlas/migrations/20241126071105_change_users_email_non_null.sql new file mode 100644 index 00000000..a3ca6f93 --- /dev/null +++ b/atlas/migrations/20241126071105_change_users_email_non_null.sql @@ -0,0 +1,2 @@ +-- Modify "users" table +ALTER TABLE "public"."users" ALTER COLUMN "email" SET NOT NULL; diff --git a/atlas/migrations/atlas.sum b/atlas/migrations/atlas.sum index 82ff314c..93fb95d1 100644 --- a/atlas/migrations/atlas.sum +++ b/atlas/migrations/atlas.sum @@ -1,6 +1,8 @@ -h1:33BOoFIDyYBMfpcF5tQDv+RBNRH0fTenBPHUnlnSCaI= +h1:6bImAg+IZdr0QvjuAuD6uLaGkDILt/i7SzZPZVEug4g= 20241021163015_create_user.sql h1:gCgeqsR5gC7HN2P2UeGrpMNAW5b9zJNSwPtURtwws1A= 20241021163211_create_client.sql h1:Zk3Nd8qUAnS7v7eIvNaADHK8D0RqIcpkCjUT/Guxt1o= 20241021163446_create_redirect_uri.sql h1:K1C6Q4XOQKbChyejJ/M7F3JHVOgu6DTweXnnX/fOjJ0= 20241024084524_create_approvals.sql h1:7ar7WTyOGflX99Dpm5JiiCInKNrvPk+3UM6yHC+o4Sw= 20241112154715_create_auth_codes.sql h1:GV/eitiRSfHDM1t1YDxKNKsNsrv35QPNSXDZPPKA+Ns= +20241126070859_add_users_email_column.sql h1:GYcZ1691ITh4mAs6cCdT1j+s/k9BhzWepZm9J4nUvAw= +20241126071105_change_users_email_non_null.sql h1:OJZMRPdsV097ioDrPFXkf5fIjW6iBhmNlk5lfn08vwM= diff --git a/atlas/schema.hcl b/atlas/schema.hcl index ac40a22d..b32204c0 100644 --- a/atlas/schema.hcl +++ b/atlas/schema.hcl @@ -5,6 +5,9 @@ table "users" { column "id" { type = bigserial } + column "email" { + type = varchar(255) + } column "name" { type = varchar(255) } From 602ed35bd4a22b31df6a36a9f11a52cd5589281d Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:14:26 +0900 Subject: [PATCH 02/11] =?UTF-8?q?email=E3=81=ABindex=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/20241126071105_change_users_email_non_null.sql | 2 -- .../migrations/20241126071402_change_user_email_not_null.sql | 4 ++++ atlas/migrations/atlas.sum | 4 ++-- atlas/schema.hcl | 4 ++++ 4 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 atlas/migrations/20241126071105_change_users_email_non_null.sql create mode 100644 atlas/migrations/20241126071402_change_user_email_not_null.sql diff --git a/atlas/migrations/20241126071105_change_users_email_non_null.sql b/atlas/migrations/20241126071105_change_users_email_non_null.sql deleted file mode 100644 index a3ca6f93..00000000 --- a/atlas/migrations/20241126071105_change_users_email_non_null.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Modify "users" table -ALTER TABLE "public"."users" ALTER COLUMN "email" SET NOT NULL; diff --git a/atlas/migrations/20241126071402_change_user_email_not_null.sql b/atlas/migrations/20241126071402_change_user_email_not_null.sql new file mode 100644 index 00000000..d7a0a769 --- /dev/null +++ b/atlas/migrations/20241126071402_change_user_email_not_null.sql @@ -0,0 +1,4 @@ +-- Modify "users" table +ALTER TABLE "public"."users" ALTER COLUMN "email" SET NOT NULL; +-- Create index "email" to table: "users" +CREATE UNIQUE INDEX "email" ON "public"."users" ("email"); diff --git a/atlas/migrations/atlas.sum b/atlas/migrations/atlas.sum index 93fb95d1..beff2b81 100644 --- a/atlas/migrations/atlas.sum +++ b/atlas/migrations/atlas.sum @@ -1,8 +1,8 @@ -h1:6bImAg+IZdr0QvjuAuD6uLaGkDILt/i7SzZPZVEug4g= +h1:SBITIO3AI7kVB1NJQRg9VuUaIhUegH2f1g6Ds+UuB3c= 20241021163015_create_user.sql h1:gCgeqsR5gC7HN2P2UeGrpMNAW5b9zJNSwPtURtwws1A= 20241021163211_create_client.sql h1:Zk3Nd8qUAnS7v7eIvNaADHK8D0RqIcpkCjUT/Guxt1o= 20241021163446_create_redirect_uri.sql h1:K1C6Q4XOQKbChyejJ/M7F3JHVOgu6DTweXnnX/fOjJ0= 20241024084524_create_approvals.sql h1:7ar7WTyOGflX99Dpm5JiiCInKNrvPk+3UM6yHC+o4Sw= 20241112154715_create_auth_codes.sql h1:GV/eitiRSfHDM1t1YDxKNKsNsrv35QPNSXDZPPKA+Ns= 20241126070859_add_users_email_column.sql h1:GYcZ1691ITh4mAs6cCdT1j+s/k9BhzWepZm9J4nUvAw= -20241126071105_change_users_email_non_null.sql h1:OJZMRPdsV097ioDrPFXkf5fIjW6iBhmNlk5lfn08vwM= +20241126071402_change_user_email_not_null.sql h1:fWsI6cpE4mFmkX8UqsVNmosEwHJ77rk6dOv0pnQdvdg= diff --git a/atlas/schema.hcl b/atlas/schema.hcl index b32204c0..711bcff1 100644 --- a/atlas/schema.hcl +++ b/atlas/schema.hcl @@ -27,6 +27,10 @@ table "users" { columns = [column.name] unique = true } + index "email" { + columns = [column.email] + unique = true + } } table "clients" { schema = schema.public From 95e440f72ada829d5947b7dd1ac8b3623096b80c Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:49:42 +0900 Subject: [PATCH 03/11] =?UTF-8?q?users=E3=83=86=E3=83=BC=E3=83=96=E3=83=AB?= =?UTF-8?q?=E3=81=ABemail=E3=82=AB=E3=83=A9=E3=83=A0=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...column.sql => 20241126073229_add_column_users_email.sql} | 2 +- ...ll.sql => 20241126073311_change_user_email_not_null.sql} | 2 +- atlas/migrations/atlas.sum | 6 +++--- atlas/schema.hcl | 4 ++++ 4 files changed, 9 insertions(+), 5 deletions(-) rename atlas/migrations/{20241126070859_add_users_email_column.sql => 20241126073229_add_column_users_email.sql} (56%) rename atlas/migrations/{20241126071402_change_user_email_not_null.sql => 20241126073311_change_user_email_not_null.sql} (53%) diff --git a/atlas/migrations/20241126070859_add_users_email_column.sql b/atlas/migrations/20241126073229_add_column_users_email.sql similarity index 56% rename from atlas/migrations/20241126070859_add_users_email_column.sql rename to atlas/migrations/20241126073229_add_column_users_email.sql index 8ac7d5e7..b4f96fdd 100644 --- a/atlas/migrations/20241126070859_add_users_email_column.sql +++ b/atlas/migrations/20241126073229_add_column_users_email.sql @@ -1,2 +1,2 @@ -- Modify "users" table -ALTER TABLE "public"."users" ADD COLUMN "email" character varying(255) NULL; +ALTER TABLE "public"."users" ADD COLUMN "email" character varying(255) NULL, ADD COLUMN "email_verified" boolean NULL DEFAULT false; diff --git a/atlas/migrations/20241126071402_change_user_email_not_null.sql b/atlas/migrations/20241126073311_change_user_email_not_null.sql similarity index 53% rename from atlas/migrations/20241126071402_change_user_email_not_null.sql rename to atlas/migrations/20241126073311_change_user_email_not_null.sql index d7a0a769..3f4e82ef 100644 --- a/atlas/migrations/20241126071402_change_user_email_not_null.sql +++ b/atlas/migrations/20241126073311_change_user_email_not_null.sql @@ -1,4 +1,4 @@ -- Modify "users" table -ALTER TABLE "public"."users" ALTER COLUMN "email" SET NOT NULL; +ALTER TABLE "public"."users" ALTER COLUMN "email" SET NOT NULL, ALTER COLUMN "email_verified" SET NOT NULL; -- Create index "email" to table: "users" CREATE UNIQUE INDEX "email" ON "public"."users" ("email"); diff --git a/atlas/migrations/atlas.sum b/atlas/migrations/atlas.sum index beff2b81..0a1d2f5e 100644 --- a/atlas/migrations/atlas.sum +++ b/atlas/migrations/atlas.sum @@ -1,8 +1,8 @@ -h1:SBITIO3AI7kVB1NJQRg9VuUaIhUegH2f1g6Ds+UuB3c= +h1:5aYCq2wr+qJ4ckP53Fj+f/l0JFFOQG7C9ictTx6NvPo= 20241021163015_create_user.sql h1:gCgeqsR5gC7HN2P2UeGrpMNAW5b9zJNSwPtURtwws1A= 20241021163211_create_client.sql h1:Zk3Nd8qUAnS7v7eIvNaADHK8D0RqIcpkCjUT/Guxt1o= 20241021163446_create_redirect_uri.sql h1:K1C6Q4XOQKbChyejJ/M7F3JHVOgu6DTweXnnX/fOjJ0= 20241024084524_create_approvals.sql h1:7ar7WTyOGflX99Dpm5JiiCInKNrvPk+3UM6yHC+o4Sw= 20241112154715_create_auth_codes.sql h1:GV/eitiRSfHDM1t1YDxKNKsNsrv35QPNSXDZPPKA+Ns= -20241126070859_add_users_email_column.sql h1:GYcZ1691ITh4mAs6cCdT1j+s/k9BhzWepZm9J4nUvAw= -20241126071402_change_user_email_not_null.sql h1:fWsI6cpE4mFmkX8UqsVNmosEwHJ77rk6dOv0pnQdvdg= +20241126073229_add_column_users_email.sql h1:st3u0Yl/fpXgr3JHyeT2/PHo5gywJY7lxm5l12Wd7u8= +20241126073311_change_user_email_not_null.sql h1:crChtzneQLh7UXWKfEezju1d8/mAK+JzzfFgOHkq6MM= diff --git a/atlas/schema.hcl b/atlas/schema.hcl index 711bcff1..02a63475 100644 --- a/atlas/schema.hcl +++ b/atlas/schema.hcl @@ -8,6 +8,10 @@ table "users" { column "email" { type = varchar(255) } + column "email_verified" { + type = boolean + default = false + } column "name" { type = varchar(255) } From bdaccbd4f9743329c2e3e9a5c2dce3953bfd28ef Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:50:03 +0900 Subject: [PATCH 04/11] =?UTF-8?q?signup=20api=E3=81=ABemail=E3=83=95?= =?UTF-8?q?=E3=82=A3=E3=83=BC=E3=83=AB=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spec/schema/@typespec/openapi3/openapi.yaml | 5 +++++ spec/specs/users.tsp | 3 +++ 2 files changed, 8 insertions(+) diff --git a/spec/schema/@typespec/openapi3/openapi.yaml b/spec/schema/@typespec/openapi3/openapi.yaml index d16453c3..daa1b255 100644 --- a/spec/schema/@typespec/openapi3/openapi.yaml +++ b/spec/schema/@typespec/openapi3/openapi.yaml @@ -713,10 +713,13 @@ components: Users.ReqSignup: type: object required: + - email - name - password - password_confirmation properties: + email: + type: string name: type: string password: @@ -728,6 +731,8 @@ components: enum: - name_length_not_enough - name_already_used + - email_already_used + - email_format_invalid - password_length_not_enough - password_confirmation_not_match securitySchemes: diff --git a/spec/specs/users.tsp b/spec/specs/users.tsp index 4c251ad5..2e9215b6 100644 --- a/spec/specs/users.tsp +++ b/spec/specs/users.tsp @@ -8,6 +8,7 @@ using TypeSpec.Rest; namespace Auth.Users; model ReqSignup { + email: string; name: string; password: string; password_confirmation: string; @@ -16,6 +17,8 @@ model ReqSignup { enum SignupErr { name_length_not_enough, name_already_used, + email_already_used, + email_format_invalid, password_length_not_enough, password_confirmation_not_match, } From 330af1d1de54d55595facb52b3efe14802a28866 Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:50:26 +0900 Subject: [PATCH 05/11] =?UTF-8?q?sign=20up=20api=E3=81=A7email=E3=82=92?= =?UTF-8?q?=E9=80=81=E4=BF=A1=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/SignupForm.tsx | 31 +++++++++++++++++++++++++- frontend/src/utils/api.d.ts | 3 +++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/SignupForm.tsx b/frontend/src/components/SignupForm.tsx index 96f37800..b3c87d4e 100644 --- a/frontend/src/components/SignupForm.tsx +++ b/frontend/src/components/SignupForm.tsx @@ -9,6 +9,7 @@ import { Controller, useForm } from 'react-hook-form' type SignupInput = { name: string + email: string password: string passwordConfirmation: string } @@ -20,13 +21,19 @@ export const SignupForm = ({ next }: SignupFormProps): JSX.Element => { const router = useRouter() const query = useSearchParams() const { control, handleSubmit, setError } = useForm({ - defaultValues: { name: '', password: '', passwordConfirmation: '' }, + defaultValues: { + name: '', + email: '', + password: '', + passwordConfirmation: '', + }, }) const submit = useCallback( async (data: SignupInput) => { const { error } = await client.POST('/users/signup', { body: { name: data.name, + email: data.email, password: data.password, password_confirmation: data.passwordConfirmation, }, @@ -34,6 +41,11 @@ export const SignupForm = ({ next }: SignupFormProps): JSX.Element => { if (!!error) { if (error.error === 'name_already_used') { setError('name', { message: error.error }) + } else if ( + error.error === 'email_already_used' || + error.error === 'email_format_invalid' + ) { + setError('email', { message: error.error_description }) } else if (error.error === 'password_length_not_enough') { setError('password', { message: error.error_description }) } else if (error.error === 'password_confirmation_not_match') { @@ -76,6 +88,23 @@ export const SignupForm = ({ next }: SignupFormProps): JSX.Element => { )} /> + + ( + + )} + /> + Date: Tue, 26 Nov 2024 16:50:38 +0900 Subject: [PATCH 06/11] =?UTF-8?q?email=E3=83=95=E3=82=A3=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=83=89=E3=82=92backend=E3=81=A7=E5=87=A6=E7=90=86=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/api/gen.go | 71 ++++++++++--------- internal/api/user.go | 2 +- internal/domain/oauth/mock_test.go | 2 +- internal/domain/user.go | 3 +- .../infrastructure/gateway/auth_code_test.go | 6 +- .../infrastructure/gateway/client_test.go | 10 +-- internal/infrastructure/gateway/user.go | 4 +- internal/infrastructure/gateway/user_test.go | 11 ++- internal/infrastructure/model/users.gen.go | 1 + internal/infrastructure/query/users.gen.go | 6 +- internal/usecase/user.go | 4 +- test/e2e/oauth_test.go | 4 +- test/e2e/user_test.go | 2 + 13 files changed, 72 insertions(+), 54 deletions(-) diff --git a/internal/api/gen.go b/internal/api/gen.go index c82b8387..7386592a 100644 --- a/internal/api/gen.go +++ b/internal/api/gen.go @@ -91,6 +91,8 @@ const ( // Defines values for UsersSignupErr. const ( + EmailAlreadyUsed UsersSignupErr = "email_already_used" + EmailFormatInvalid UsersSignupErr = "email_format_invalid" NameAlreadyUsed UsersSignupErr = "name_already_used" NameLengthNotEnough UsersSignupErr = "name_length_not_enough" PasswordConfirmationNotMatch UsersSignupErr = "password_confirmation_not_match" @@ -219,6 +221,7 @@ type User struct { // UsersReqSignup defines model for Users.ReqSignup. type UsersReqSignup struct { + Email string `json:"email"` Name string `json:"name"` Password string `json:"password"` PasswordConfirmation string `json:"password_confirmation"` @@ -1578,40 +1581,40 @@ func (sh *strictHandler) UsersInterfaceSignup(ctx echo.Context) error { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "R3e/4tXN6u8AAAD//xkvUt4LNgAA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/api/user.go b/internal/api/user.go index e3cd9c1b..846068fd 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -8,7 +8,7 @@ import ( func (s *Server) UsersInterfaceSignup(ctx context.Context, request UsersInterfaceSignupRequestObject) (UsersInterfaceSignupResponseObject, error) { user, err := s.UserUsecase.SignUp( - request.Body.Name, request.Body.Password, request.Body.PasswordConfirmation, + request.Body.Email, request.Body.Name, request.Body.Password, request.Body.PasswordConfirmation, ) if errors.Is(err, domain.ErrNameLengthNotEnough) { s.logger.Infof("name length not enough: %v", err) diff --git a/internal/domain/oauth/mock_test.go b/internal/domain/oauth/mock_test.go index ea2fa435..9f36be72 100644 --- a/internal/domain/oauth/mock_test.go +++ b/internal/domain/oauth/mock_test.go @@ -95,7 +95,7 @@ type userRepo struct{ Users []*domain.User } var _ domain.IUserRepo = &userRepo{} // Create implements domain.IUserRepo. -func (u *userRepo) Create(name string, encryptedPassword string) error { +func (u *userRepo) Create(email, name, encryptedPassword string) error { panic("unimplemented") } diff --git a/internal/domain/user.go b/internal/domain/user.go index a22675df..b3aaebf3 100644 --- a/internal/domain/user.go +++ b/internal/domain/user.go @@ -11,6 +11,7 @@ import ( type UserID int64 type User struct { ID UserID + Email string Name string EncryptedPassword string CreatedAt time.Time @@ -19,7 +20,7 @@ type User struct { type IUserRepo interface { FindByID(id UserID) (*User, error) FindByName(name string) (*User, error) - Create(name, encryptedPassword string) error + Create(email, name, encryptedPassword string) error } type UserService struct { diff --git a/internal/infrastructure/gateway/auth_code_test.go b/internal/infrastructure/gateway/auth_code_test.go index 4a787888..d787e384 100644 --- a/internal/infrastructure/gateway/auth_code_test.go +++ b/internal/infrastructure/gateway/auth_code_test.go @@ -22,8 +22,8 @@ func TestAuthCodeCreate(t *testing.T) { authTime := time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC) clientID := "test_client_id" userID := int64(1) - query.User.Create(&model.User{ID: userID, Name: "test", EncryptedPassword: "test"}) - query.User.Create(&model.User{ID: 2, Name: "test2", EncryptedPassword: "test2"}) + query.User.Create(&model.User{ID: userID, Email: "test1@example.com", Name: "test", EncryptedPassword: "test"}) + query.User.Create(&model.User{ID: 2, Email: "test2@example.com", Name: "test2", EncryptedPassword: "test2"}) query.Client.Create(&model.Client{ ID: clientID, EncryptedSecret: "", @@ -89,7 +89,7 @@ func TestAuthCodeFind(t *testing.T) { clientID := "test_client_id" userID := int64(1) value := "test_value" - query.User.Create(&model.User{ID: userID, Name: "test", EncryptedPassword: "test"}) + query.User.Create(&model.User{ID: userID, Email: "test1@example.com", Name: "test", EncryptedPassword: "test"}) query.Client.Create(&model.Client{ID: clientID, EncryptedSecret: "", UserID: 1}) err := authCodeRepo.Create(value, oauth.ClientID(clientID), domain.UserID(userID), scopes, expiresAt, authTime, "test_redirect_uri") if err != nil { diff --git a/internal/infrastructure/gateway/client_test.go b/internal/infrastructure/gateway/client_test.go index 612faa52..5bd4b711 100644 --- a/internal/infrastructure/gateway/client_test.go +++ b/internal/infrastructure/gateway/client_test.go @@ -125,8 +125,8 @@ func TestClientFindWithUserID(t *testing.T) { const user2ID = 45329 const clientID = "client1" initialUsers := []*model.User{ - {Name: "test1", ID: userID, EncryptedPassword: "password"}, - {Name: "test2", ID: user2ID, EncryptedPassword: "password"}, + {Name: "test1", Email: "test1@example.com", ID: userID, EncryptedPassword: "password"}, + {Name: "test2", Email: "test2@example.com", ID: user2ID, EncryptedPassword: "password"}, } suites := []struct { name string @@ -283,9 +283,9 @@ func TestClientList(t *testing.T) { const user2ID = 45329 const user3ID = 45330 initialUsers := []*model.User{ - {Name: "with clients", ID: userID, EncryptedPassword: "password"}, - {Name: "with no client", ID: user2ID, EncryptedPassword: "password"}, - {Name: "dummy user", ID: user3ID, EncryptedPassword: "password"}, + {Name: "with clients", ID: userID, Email: "test1@example.com", EncryptedPassword: "password"}, + {Name: "with no client", ID: user2ID, Email: "test2@example.com", EncryptedPassword: "password"}, + {Name: "dummy user", ID: user3ID, Email: "test3@example.com", EncryptedPassword: "password"}, } initialClients := []*oauth.ClientInput{ {ID: "with two uris", UserID: userID, RedirectURIs: []string{"http://example.com", "http://example1.com"}}, diff --git a/internal/infrastructure/gateway/user.go b/internal/infrastructure/gateway/user.go index d1327298..2b959e9f 100644 --- a/internal/infrastructure/gateway/user.go +++ b/internal/infrastructure/gateway/user.go @@ -47,8 +47,9 @@ func (u *userRepo) FindByName(name string) (*domain.User, error) { return toDomainUser(user), nil } -func (u *userRepo) Create(name, encryptedPassword string) error { +func (u *userRepo) Create(email, name, encryptedPassword string) error { return u.query.User.Create(&model.User{ + Email: email, Name: name, EncryptedPassword: encryptedPassword, }) @@ -58,6 +59,7 @@ func toDomainUser(user *model.User) *domain.User { return &domain.User{ ID: domain.UserID(user.ID), Name: user.Name, + Email: user.Email, EncryptedPassword: user.EncryptedPassword, CreatedAt: user.CreatedAt, UpdatedAt: user.UpdatedAt, diff --git a/internal/infrastructure/gateway/user_test.go b/internal/infrastructure/gateway/user_test.go index 905a7fd2..71c16ec0 100644 --- a/internal/infrastructure/gateway/user_test.go +++ b/internal/infrastructure/gateway/user_test.go @@ -14,7 +14,7 @@ func TestUserCreate(t *testing.T) { db := infrastructure.GetDB() query := query.Use(db.Client) userRepo := NewUserRepo(db) - err := userRepo.Create("test", "test") + err := userRepo.Create("test@example.com", "test", "test") if err != nil { t.Fatal(err) } @@ -25,17 +25,21 @@ func TestUserCreate(t *testing.T) { if user.EncryptedPassword != "test" { t.Errorf("unexpected user.EncryptedPassword: %s", user.EncryptedPassword) } + if user.Email != "test@example.com" { + t.Errorf("unexpected user.Email: %s", user.Email) + } } func TestUserFindById(t *testing.T) { setup(t) + const email = "test@example.com" const name = "test" const password = "test" db := infrastructure.GetDB() query := query.Use(db.Client) userRepo := NewUserRepo(db) - err := userRepo.Create(name, password) + err := userRepo.Create(email, name, password) if err != nil { t.Fatal(err) } @@ -69,12 +73,13 @@ func TestUserFindByIdNotFound(t *testing.T) { func TestUserFindByName(t *testing.T) { setup(t) + const email = "test@example.com" const name = "test" const password = "test" db := infrastructure.GetDB() userRepo := NewUserRepo(db) - err := userRepo.Create(name, password) + err := userRepo.Create(email, name, password) if err != nil { t.Fatal(err) } diff --git a/internal/infrastructure/model/users.gen.go b/internal/infrastructure/model/users.gen.go index a8c0a9b1..4914031d 100644 --- a/internal/infrastructure/model/users.gen.go +++ b/internal/infrastructure/model/users.gen.go @@ -17,6 +17,7 @@ type User struct { EncryptedPassword string `gorm:"column:encrypted_password;not null" json:"encrypted_password"` CreatedAt time.Time `gorm:"column:created_at;not null" json:"created_at"` UpdatedAt time.Time `gorm:"column:updated_at;not null" json:"updated_at"` + Email string `gorm:"column:email;not null" json:"email"` } // TableName User's table name diff --git a/internal/infrastructure/query/users.gen.go b/internal/infrastructure/query/users.gen.go index 150ac9fc..19677137 100644 --- a/internal/infrastructure/query/users.gen.go +++ b/internal/infrastructure/query/users.gen.go @@ -32,6 +32,7 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user { _user.EncryptedPassword = field.NewString(tableName, "encrypted_password") _user.CreatedAt = field.NewTime(tableName, "created_at") _user.UpdatedAt = field.NewTime(tableName, "updated_at") + _user.Email = field.NewString(tableName, "email") _user.fillFieldMap() @@ -47,6 +48,7 @@ type user struct { EncryptedPassword field.String CreatedAt field.Time UpdatedAt field.Time + Email field.String fieldMap map[string]field.Expr } @@ -68,6 +70,7 @@ func (u *user) updateTableName(table string) *user { u.EncryptedPassword = field.NewString(table, "encrypted_password") u.CreatedAt = field.NewTime(table, "created_at") u.UpdatedAt = field.NewTime(table, "updated_at") + u.Email = field.NewString(table, "email") u.fillFieldMap() @@ -84,12 +87,13 @@ func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (u *user) fillFieldMap() { - u.fieldMap = make(map[string]field.Expr, 5) + u.fieldMap = make(map[string]field.Expr, 6) u.fieldMap["id"] = u.ID u.fieldMap["name"] = u.Name u.fieldMap["encrypted_password"] = u.EncryptedPassword u.fieldMap["created_at"] = u.CreatedAt u.fieldMap["updated_at"] = u.UpdatedAt + u.fieldMap["email"] = u.Email } func (u user) clone(db *gorm.DB) user { diff --git a/internal/usecase/user.go b/internal/usecase/user.go index 78e11415..93f195a5 100644 --- a/internal/usecase/user.go +++ b/internal/usecase/user.go @@ -34,7 +34,7 @@ func (u *UserUsecase) Login(username, password string) (*domain.User, error) { return user, nil } -func (u *UserUsecase) SignUp(username, password, passwordConfirmation string) (*domain.User, error) { +func (u *UserUsecase) SignUp(email, username, password, passwordConfirmation string) (*domain.User, error) { if err := u.UserService.Validate(username, password, passwordConfirmation); err != nil { return nil, err } @@ -42,7 +42,7 @@ func (u *UserUsecase) SignUp(username, password, passwordConfirmation string) (* if err != nil { return nil, err } - err = u.UserRepo.Create(username, hash) + err = u.UserRepo.Create(email, username, hash) if err != nil { return nil, err } diff --git a/test/e2e/oauth_test.go b/test/e2e/oauth_test.go index d23dd2c0..a388be13 100644 --- a/test/e2e/oauth_test.go +++ b/test/e2e/oauth_test.go @@ -34,8 +34,8 @@ func TestOAuthAuthorize(t *testing.T) { const client2ID = "client2" const client3ID = "client3" initialUsers := []*model.User{ - {ID: userID, Name: username, EncryptedPassword: string(hashed)}, - {ID: clientOwnerID, Name: "client owner", EncryptedPassword: string(hashed)}, + {ID: userID, Email: "test1@example.com", Name: username, EncryptedPassword: string(hashed)}, + {ID: clientOwnerID, Email: "test2@example.com", Name: "client owner", EncryptedPassword: string(hashed)}, } initialClients := []*model.Client{ {ID: client1ID, Name: "approved", EncryptedSecret: "secret", UserID: clientOwnerID}, diff --git a/test/e2e/user_test.go b/test/e2e/user_test.go index cd9c9f69..4df7fa98 100644 --- a/test/e2e/user_test.go +++ b/test/e2e/user_test.go @@ -12,11 +12,13 @@ func TestSignupLogin(t *testing.T) { defer s.Close() name := randomString(t, 10) + email := randomString(t, 10) + "@example.com" password := randomString(t, 16) { // signup signupInput := &api.UsersReqSignup{ Name: name, + Email: email, Password: password, PasswordConfirmation: password, } From 3ae9ff8eeaefad47f567a13697033476d085aca7 Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:05:56 +0900 Subject: [PATCH 07/11] =?UTF-8?q?email=20verified=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/infrastructure/model/users.gen.go | 1 + internal/infrastructure/query/users.gen.go | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/infrastructure/model/users.gen.go b/internal/infrastructure/model/users.gen.go index 4914031d..a67c7316 100644 --- a/internal/infrastructure/model/users.gen.go +++ b/internal/infrastructure/model/users.gen.go @@ -18,6 +18,7 @@ type User struct { CreatedAt time.Time `gorm:"column:created_at;not null" json:"created_at"` UpdatedAt time.Time `gorm:"column:updated_at;not null" json:"updated_at"` Email string `gorm:"column:email;not null" json:"email"` + EmailVerified bool `gorm:"column:email_verified;not null" json:"email_verified"` } // TableName User's table name diff --git a/internal/infrastructure/query/users.gen.go b/internal/infrastructure/query/users.gen.go index 19677137..dc54eeb1 100644 --- a/internal/infrastructure/query/users.gen.go +++ b/internal/infrastructure/query/users.gen.go @@ -33,6 +33,7 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user { _user.CreatedAt = field.NewTime(tableName, "created_at") _user.UpdatedAt = field.NewTime(tableName, "updated_at") _user.Email = field.NewString(tableName, "email") + _user.EmailVerified = field.NewBool(tableName, "email_verified") _user.fillFieldMap() @@ -49,6 +50,7 @@ type user struct { CreatedAt field.Time UpdatedAt field.Time Email field.String + EmailVerified field.Bool fieldMap map[string]field.Expr } @@ -71,6 +73,7 @@ func (u *user) updateTableName(table string) *user { u.CreatedAt = field.NewTime(table, "created_at") u.UpdatedAt = field.NewTime(table, "updated_at") u.Email = field.NewString(table, "email") + u.EmailVerified = field.NewBool(table, "email_verified") u.fillFieldMap() @@ -87,13 +90,14 @@ func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (u *user) fillFieldMap() { - u.fieldMap = make(map[string]field.Expr, 6) + u.fieldMap = make(map[string]field.Expr, 7) u.fieldMap["id"] = u.ID u.fieldMap["name"] = u.Name u.fieldMap["encrypted_password"] = u.EncryptedPassword u.fieldMap["created_at"] = u.CreatedAt u.fieldMap["updated_at"] = u.UpdatedAt u.fieldMap["email"] = u.Email + u.fieldMap["email_verified"] = u.EmailVerified } func (u user) clone(db *gorm.DB) user { From 6e87a6982d494c2436163ee93ab1da6bf6f12ea1 Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:06:08 +0900 Subject: [PATCH 08/11] =?UTF-8?q?sign=20up=E3=81=A7=E3=81=AF=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=97=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/utils/api.d.ts | 1 - internal/api/gen.go | 74 ++++++++++----------- internal/api/user.go | 13 +--- spec/schema/@typespec/openapi3/openapi.yaml | 5 -- spec/specs/users.tsp | 1 - 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/frontend/src/utils/api.d.ts b/frontend/src/utils/api.d.ts index fa297623..55e6fb45 100644 --- a/frontend/src/utils/api.d.ts +++ b/frontend/src/utils/api.d.ts @@ -792,7 +792,6 @@ export interface operations { /** @description There is no content to send for this request, but the headers may be useful. */ 204: { headers: { - 'set-cookie': string [name: string]: unknown } content?: never diff --git a/internal/api/gen.go b/internal/api/gen.go index 7386592a..169e0c55 100644 --- a/internal/api/gen.go +++ b/internal/api/gen.go @@ -1062,16 +1062,10 @@ type UsersInterfaceSignupResponseObject interface { VisitUsersInterfaceSignupResponse(w http.ResponseWriter) error } -type UsersInterfaceSignup204ResponseHeaders struct { - SetCookie string -} - type UsersInterfaceSignup204Response struct { - Headers UsersInterfaceSignup204ResponseHeaders } func (response UsersInterfaceSignup204Response) VisitUsersInterfaceSignupResponse(w http.ResponseWriter) error { - w.Header().Set("set-cookie", fmt.Sprint(response.Headers.SetCookie)) w.WriteHeader(204) return nil } @@ -1581,40 +1575,40 @@ func (sh *strictHandler) UsersInterfaceSignup(ctx echo.Context) error { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/api/user.go b/internal/api/user.go index 846068fd..8ac9abd5 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -7,7 +7,7 @@ import ( ) func (s *Server) UsersInterfaceSignup(ctx context.Context, request UsersInterfaceSignupRequestObject) (UsersInterfaceSignupResponseObject, error) { - user, err := s.UserUsecase.SignUp( + _, err := s.UserUsecase.SignUp( request.Body.Email, request.Body.Name, request.Body.Password, request.Body.PasswordConfirmation, ) if errors.Is(err, domain.ErrNameLengthNotEnough) { @@ -42,14 +42,5 @@ func (s *Server) UsersInterfaceSignup(ctx context.Context, request UsersInterfac s.logger.Errorf("failed to signup: %v", err) return nil, err } - cookie, err := Login(ctx, user) - if err != nil { - s.logger.Errorf("failed to login: %v", err) - return nil, err - } - return &UsersInterfaceSignup204Response{ - Headers: UsersInterfaceSignup204ResponseHeaders{ - SetCookie: cookie.String(), - }, - }, nil + return &UsersInterfaceSignup204Response{}, nil } diff --git a/spec/schema/@typespec/openapi3/openapi.yaml b/spec/schema/@typespec/openapi3/openapi.yaml index daa1b255..37c1c427 100644 --- a/spec/schema/@typespec/openapi3/openapi.yaml +++ b/spec/schema/@typespec/openapi3/openapi.yaml @@ -463,11 +463,6 @@ paths: responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' - headers: - set-cookie: - required: true - schema: - type: string '400': description: The server could not understand the request due to invalid syntax. content: diff --git a/spec/specs/users.tsp b/spec/specs/users.tsp index 2e9215b6..26609bf9 100644 --- a/spec/specs/users.tsp +++ b/spec/specs/users.tsp @@ -30,7 +30,6 @@ interface UsersInterface { @summary("Signup") signup(@body body: ReqSignup): { @statusCode statusCode: 204; - @header setCookie: string; } | { @statusCode statusCode: 400; error: SignupErr; From b1a2795cbcf7b1fdd852ad81edfc0be6a014cdf9 Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:43:31 +0900 Subject: [PATCH 09/11] =?UTF-8?q?me=E3=81=A7email=E3=82=82=E8=BF=94?= =?UTF-8?q?=E3=81=99=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/utils/api.d.ts | 1 + internal/api/gen.go | 73 +++++++++++---------- internal/api/session.go | 5 +- spec/schema/@typespec/openapi3/openapi.yaml | 3 + spec/specs/model.tsp | 1 + test/e2e/user_test.go | 3 + 6 files changed, 48 insertions(+), 38 deletions(-) diff --git a/frontend/src/utils/api.d.ts b/frontend/src/utils/api.d.ts index 55e6fb45..dcba281d 100644 --- a/frontend/src/utils/api.d.ts +++ b/frontend/src/utils/api.d.ts @@ -277,6 +277,7 @@ export interface components { /** Format: int64 */ id: number name: string + email: string } 'Users.ReqSignup': { email: string diff --git a/internal/api/gen.go b/internal/api/gen.go index 169e0c55..ef4643ff 100644 --- a/internal/api/gen.go +++ b/internal/api/gen.go @@ -215,8 +215,9 @@ type SessionMeRes struct { // User defines model for User. type User struct { - Id int64 `json:"id"` - Name string `json:"name"` + Email string `json:"email"` + Id int64 `json:"id"` + Name string `json:"name"` } // UsersReqSignup defines model for Users.ReqSignup. @@ -1575,40 +1576,40 @@ func (sh *strictHandler) UsersInterfaceSignup(ctx echo.Context) error { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/api/session.go b/internal/api/session.go index 26c6474c..a1dfd72f 100644 --- a/internal/api/session.go +++ b/internal/api/session.go @@ -60,8 +60,9 @@ func (s *Server) SessionInterfaceMe(ctx context.Context, request SessionInterfac } return &SessionInterfaceMe200JSONResponse{ User: &User{ - Id: int64(session.User.ID), - Name: session.User.Name, + Id: int64(session.User.ID), + Name: session.User.Name, + Email: session.User.Email, }, }, nil } diff --git a/spec/schema/@typespec/openapi3/openapi.yaml b/spec/schema/@typespec/openapi3/openapi.yaml index 37c1c427..a08b93e2 100644 --- a/spec/schema/@typespec/openapi3/openapi.yaml +++ b/spec/schema/@typespec/openapi3/openapi.yaml @@ -699,12 +699,15 @@ components: required: - id - name + - email properties: id: type: integer format: int64 name: type: string + email: + type: string Users.ReqSignup: type: object required: diff --git a/spec/specs/model.tsp b/spec/specs/model.tsp index 2d50d1df..738b410a 100644 --- a/spec/specs/model.tsp +++ b/spec/specs/model.tsp @@ -3,6 +3,7 @@ model User { id: int64; name: string; + email: string; @visibility("create") password: string; diff --git a/test/e2e/user_test.go b/test/e2e/user_test.go index 4df7fa98..55a4949c 100644 --- a/test/e2e/user_test.go +++ b/test/e2e/user_test.go @@ -58,4 +58,7 @@ func TestSignupLogin(t *testing.T) { if resBody.User.Name != name { t.Fatalf("unexpected name: %v", resBody.User.Name) } + if resBody.User.Email != email { + t.Fatalf("unexpected email: %v", resBody.User.Email) + } } From 49eced5e47b90b44061d5c56df81013d44b097b0 Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:50:09 +0900 Subject: [PATCH 10/11] =?UTF-8?q?=E3=83=80=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=83=9C=E3=83=BC=E3=83=89=E3=81=A7id,=20name,=20email?= =?UTF-8?q?=E3=82=92=E7=A2=BA=E8=AA=8D=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/app/member/page.tsx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/member/page.tsx b/frontend/src/app/member/page.tsx index 030c1230..85e42048 100644 --- a/frontend/src/app/member/page.tsx +++ b/frontend/src/app/member/page.tsx @@ -14,8 +14,26 @@ export default function Page() { return ( *': { margin: 2 } }}> - ダッシュボード - {user.name} + ダッシュボード + + + + Account + + + + + ID: {user.id} + + + Name: {user.name} + + + Email: {user.email} + + + From 6a20a16144fdd29ec57121971a0384db916d5d30 Mon Sep 17 00:00:00 2001 From: piny940 <83708535+piny940@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:58:22 +0900 Subject: [PATCH 11/11] fix test --- test/e2e/oauth_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/e2e/oauth_test.go b/test/e2e/oauth_test.go index a388be13..05cb4435 100644 --- a/test/e2e/oauth_test.go +++ b/test/e2e/oauth_test.go @@ -185,8 +185,8 @@ func TestOAuthToken(t *testing.T) { t.Fatalf("failed to hash password: %v", err) } initialUsers := []*model.User{ - {ID: userID, Name: username, EncryptedPassword: string(hashed)}, - {ID: clientOwnerID, Name: "client owner", EncryptedPassword: "password"}, + {ID: userID, Name: username, Email: "test1@example.com", EncryptedPassword: string(hashed)}, + {ID: clientOwnerID, Name: "client owner", Email: "test2@example.com", EncryptedPassword: "password"}, } const client1ID = "client1" const client2ID = "client2" @@ -361,8 +361,8 @@ func TestAuthTime(t *testing.T) { } const clientOwnerID = 32478 initialUsers := []*model.User{ - {ID: clientOwnerID, Name: "client owner", EncryptedPassword: "password"}, - {ID: userID, Name: username, EncryptedPassword: string(hashed)}, + {ID: clientOwnerID, Name: "client owner", Email: "test1@example.com", EncryptedPassword: "password"}, + {ID: userID, Name: username, Email: "test2@example.com", EncryptedPassword: string(hashed)}, } const clientID = "client1" const clientSecret = "secret"