@@ -6,6 +6,7 @@ import { hashPassword } from "@calcom/features/auth/lib/hashPassword";
6
6
import { sendEmailVerification } from "@calcom/features/auth/lib/verifyEmail" ;
7
7
import slugify from "@calcom/lib/slugify" ;
8
8
import { closeComUpsertTeamUser } from "@calcom/lib/sync/SyncServiceManager" ;
9
+ import { validateUsernameInOrg } from "@calcom/lib/validateUsernameInOrg" ;
9
10
import prisma from "@calcom/prisma" ;
10
11
import { IdentityProvider } from "@calcom/prisma/enums" ;
11
12
import { teamMetadataSchema } from "@calcom/prisma/zod-utils" ;
@@ -70,6 +71,35 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
70
71
return res . status ( 409 ) . json ( { message } ) ;
71
72
}
72
73
74
+ let foundToken : { id : number ; teamId : number | null ; expires : Date } | null = null ;
75
+ if ( token ) {
76
+ foundToken = await prisma . verificationToken . findFirst ( {
77
+ where : {
78
+ token,
79
+ } ,
80
+ select : {
81
+ id : true ,
82
+ expires : true ,
83
+ teamId : true ,
84
+ } ,
85
+ } ) ;
86
+
87
+ if ( ! foundToken ) {
88
+ return res . status ( 401 ) . json ( { message : "Invalid Token" } ) ;
89
+ }
90
+
91
+ if ( dayjs ( foundToken ?. expires ) . isBefore ( dayjs ( ) ) ) {
92
+ return res . status ( 401 ) . json ( { message : "Token expired" } ) ;
93
+ }
94
+ if ( foundToken ?. teamId ) {
95
+ const isValidUsername = await validateUsernameInOrg ( username , foundToken ?. teamId ) ;
96
+
97
+ if ( ! isValidUsername ) {
98
+ return res . status ( 409 ) . json ( { message : "Username already taken" } ) ;
99
+ }
100
+ }
101
+ }
102
+
73
103
const hashedPassword = await hashPassword ( password ) ;
74
104
75
105
const user = await prisma . user . upsert ( {
@@ -88,91 +118,75 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
88
118
} ,
89
119
} ) ;
90
120
91
- if ( token ) {
92
- const foundToken = await prisma . verificationToken . findFirst ( {
121
+ if ( foundToken && foundToken ?. teamId ) {
122
+ const team = await prisma . team . findUnique ( {
93
123
where : {
94
- token ,
124
+ id : foundToken . teamId ,
95
125
} ,
96
126
} ) ;
97
127
98
- if ( ! foundToken ) {
99
- return res . status ( 401 ) . json ( { message : "Invalid Token" } ) ;
100
- }
101
-
102
- if ( dayjs ( foundToken ?. expires ) . isBefore ( dayjs ( ) ) ) {
103
- return res . status ( 401 ) . json ( { message : "Token expired" } ) ;
104
- }
128
+ if ( team ) {
129
+ const teamMetadata = teamMetadataSchema . parse ( team ?. metadata ) ;
130
+ if ( teamMetadata ?. isOrganization ) {
131
+ await prisma . user . update ( {
132
+ where : {
133
+ id : user . id ,
134
+ } ,
135
+ data : {
136
+ organizationId : team . id ,
137
+ } ,
138
+ } ) ;
139
+ }
105
140
106
- if ( foundToken . teamId ) {
107
- const team = await prisma . team . findUnique ( {
141
+ const membership = await prisma . membership . update ( {
108
142
where : {
109
- id : foundToken . teamId ,
143
+ userId_teamId : { userId : user . id , teamId : team . id } ,
144
+ } ,
145
+ data : {
146
+ accepted : true ,
110
147
} ,
111
148
} ) ;
149
+ closeComUpsertTeamUser ( team , user , membership . role ) ;
112
150
113
- if ( team ) {
114
- const teamMetadata = teamMetadataSchema . parse ( team ?. metadata ) ;
115
- if ( teamMetadata ?. isOrganization ) {
116
- await prisma . user . update ( {
117
- where : {
118
- id : user . id ,
119
- } ,
120
- data : {
121
- organizationId : team . id ,
122
- } ,
123
- } ) ;
124
- }
151
+ // Accept any child team invites for orgs.
152
+ if ( team . parentId ) {
153
+ // Join ORG
154
+ await prisma . user . update ( {
155
+ where : {
156
+ id : user . id ,
157
+ } ,
158
+ data : {
159
+ organizationId : team . parentId ,
160
+ } ,
161
+ } ) ;
125
162
126
- const membership = await prisma . membership . update ( {
163
+ /** We do a membership update twice so we can join the ORG invite if the user is invited to a team witin a ORG. */
164
+ await prisma . membership . updateMany ( {
127
165
where : {
128
- userId_teamId : { userId : user . id , teamId : team . id } ,
166
+ userId : user . id ,
167
+ team : {
168
+ id : team . parentId ,
169
+ } ,
170
+ accepted : false ,
129
171
} ,
130
172
data : {
131
173
accepted : true ,
132
174
} ,
133
175
} ) ;
134
- closeComUpsertTeamUser ( team , user , membership . role ) ;
135
-
136
- // Accept any child team invites for orgs.
137
- if ( team . parentId ) {
138
- // Join ORG
139
- await prisma . user . update ( {
140
- where : {
141
- id : user . id ,
142
- } ,
143
- data : {
144
- organizationId : team . parentId ,
145
- } ,
146
- } ) ;
147
-
148
- /** We do a membership update twice so we can join the ORG invite if the user is invited to a team witin a ORG. */
149
- await prisma . membership . updateMany ( {
150
- where : {
151
- userId : user . id ,
152
- team : {
153
- id : team . parentId ,
154
- } ,
155
- accepted : false ,
156
- } ,
157
- data : {
158
- accepted : true ,
159
- } ,
160
- } ) ;
161
-
162
- // Join any other invites
163
- await prisma . membership . updateMany ( {
164
- where : {
165
- userId : user . id ,
166
- team : {
167
- parentId : team . parentId ,
168
- } ,
169
- accepted : false ,
170
- } ,
171
- data : {
172
- accepted : true ,
176
+
177
+ // Join any other invites
178
+ await prisma . membership . updateMany ( {
179
+ where : {
180
+ userId : user . id ,
181
+ team : {
182
+ parentId : team . parentId ,
173
183
} ,
174
- } ) ;
175
- }
184
+ accepted : false ,
185
+ } ,
186
+ data : {
187
+ accepted : true ,
188
+ } ,
189
+ } ) ;
176
190
}
177
191
}
178
192
0 commit comments