Skip to content

Commit 58949cc

Browse files
Fix OTP sign-in failure caused by email case-sensitivity on portal (#1623)
* fix(app): store emails to be lowercase * fix(portal): prevent automatic user creation on OTP sign-in * fix(portal): don't show OTP input when sending OTP code is failed --------- Co-authored-by: chasprowebdev <chasgarciaprowebdev@gmail.com>
1 parent 1010214 commit 58949cc

5 files changed

Lines changed: 21 additions & 9 deletions

File tree

‎apps/app/src/app/(app)/[orgId]/people/all/actions/addEmployeeWithoutInvite.ts‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ export const addEmployeeWithoutInvite = async ({
3636
}
3737

3838
let userId = '';
39-
const existingUser = await db.user.findUnique({
39+
const existingUser = await db.user.findFirst({
4040
where: {
41-
email,
41+
email: {
42+
equals: email,
43+
mode: 'insensitive',
44+
},
4245
},
4346
});
4447

‎apps/app/src/app/(app)/[orgId]/people/all/components/InviteMembersModal.tsx‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,13 @@ export function InviteMembersModal({
164164
if (hasEmployeeRoleAndNoAdmin) {
165165
await addEmployeeWithoutInvite({
166166
organizationId,
167-
email: invite.email,
167+
email: invite.email.toLowerCase(),
168168
roles: invite.roles,
169169
});
170170
} else {
171171
// Use authClient to send the invitation
172172
await authClient.organization.inviteMember({
173-
email: invite.email,
173+
email: invite.email.toLowerCase(),
174174
role: invite.roles.length === 1 ? invite.roles[0] : invite.roles,
175175
});
176176
}
@@ -325,12 +325,12 @@ export function InviteMembersModal({
325325
if (hasEmployeeRoleAndNoAdmin) {
326326
await addEmployeeWithoutInvite({
327327
organizationId,
328-
email,
328+
email: email.toLowerCase(),
329329
roles: validRoles,
330330
});
331331
} else {
332332
await authClient.organization.inviteMember({
333-
email,
333+
email: email.toLowerCase(),
334334
role: validRoles,
335335
});
336336
}

‎apps/app/src/lib/db/employee.ts‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,13 @@ export async function completeEmployeeCreation(params: {
2525
console.log(`Starting employee creation for ${email}`);
2626

2727
// Check if the user already exists
28-
const existingUser = await db.user.findUnique({
29-
where: { email },
28+
const existingUser = await db.user.findFirst({
29+
where: {
30+
email: {
31+
equals: email,
32+
mode: 'insensitive',
33+
},
34+
},
3035
});
3136

3237
let employee: Member;

‎apps/portal/src/app/components/otp.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ export function OtpSignIn({ className }: Props) {
4545
if (error) {
4646
setLoading(false);
4747
toast.error(error.message);
48+
setSent(false);
49+
} else {
50+
setSent(true);
4851
}
4952

50-
setSent(true);
5153
setLoading(false);
5254
}
5355

‎apps/portal/src/app/lib/auth.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ export const auth = betterAuth({
5656
emailOTP({
5757
otpLength: 6,
5858
expiresIn: 10 * 60,
59+
// Prevent automatic user creation on OTP sign-in
60+
disableSignUp: true,
5961
async sendVerificationOTP({ email, otp }) {
6062
await sendEmail({
6163
to: email,

0 commit comments

Comments
 (0)