Skip to content

Commit

Permalink
fix(api): Convert email to lowercase (#694)
Browse files Browse the repository at this point in the history
  • Loading branch information
csehatt741 authored Feb 8, 2025
1 parent e071a74 commit b41db33
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 58 deletions.
4 changes: 2 additions & 2 deletions apps/api/src/common/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export async function createUser(
const user = await prisma.user.create({
data: {
id: dto.id,
email: dto.email,
email: dto.email.toLowerCase(),
name: dto.name,
profilePictureUrl: dto.profilePictureUrl,
isActive: dto.isActive ?? true,
Expand Down Expand Up @@ -69,7 +69,7 @@ export async function getUserByEmailOrId(
const user =
(await prisma.user.findUnique({
where: {
email: input
email: input.toLowerCase()
}
})) ??
(await prisma.user.findUnique({
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/common/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export const generateOtp = async (
expiresAt: new Date(new Date().getTime() + OTP_EXPIRY),
user: {
connect: {
email
email: email.toLowerCase()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- Update table
UPDATE public."User"
SET "email" = LOWER("email");
2 changes: 1 addition & 1 deletion apps/api/src/project/project.e2e.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ describe('Project Controller Tests', () => {

expect(adminRole).toBeDefined()
expect(adminRole.projects).toHaveLength(2)
expect(adminRole.projects[0].projectId).toBe(project1.id)
expect(adminRole.projects).toContainEqual({ projectId: project1.id })
})

it('should not let non-member create a project', async () => {
Expand Down
32 changes: 16 additions & 16 deletions apps/api/src/user/service/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export class UserService {
const userExists =
(await this.prisma.user.count({
where: {
email: dto.email
email: dto.email.toLowerCase()
}
})) > 0

Expand All @@ -61,10 +61,10 @@ export class UserService {
otpId: otp.id
},
update: {
newEmail: dto.email
newEmail: dto.email.toLowerCase()
},
create: {
newEmail: dto.email,
newEmail: dto.email.toLowerCase(),
otpId: otp.id
}
})
Expand Down Expand Up @@ -101,7 +101,7 @@ export class UserService {
const userExists =
(await this.prisma.user.count({
where: {
email: dto.email
email: dto.email.toLowerCase()
}
})) > 0

Expand All @@ -115,7 +115,7 @@ export class UserService {
id: userId
},
data: {
email: dto.email,
email: dto.email.toLowerCase(),
authProvider: AuthProvider.EMAIL_OTP
}
})
Expand Down Expand Up @@ -169,7 +169,7 @@ export class UserService {
id: user.id
},
data: {
email: userEmailChange.newEmail,
email: userEmailChange.newEmail.toLowerCase(),
authProvider: AuthProvider.EMAIL_OTP
}
})
Expand Down Expand Up @@ -240,7 +240,7 @@ export class UserService {
},
{
email: {
contains: search
contains: search.toLowerCase()
}
}
]
Expand Down Expand Up @@ -277,31 +277,31 @@ export class UserService {
this.log.log(`Deleted user ${userId}`)
}

async createUser(user: CreateUserDto) {
this.log.log(`Creating user with email ${user.email}`)
async createUser(dto: CreateUserDto) {
this.log.log(`Creating user with email ${dto.email}`)

// Check for duplicate user
const checkDuplicateUser =
(await this.prisma.user.count({
where: {
email: user.email
email: dto.email.toLowerCase()
}
})) > 0
if (checkDuplicateUser) {
throw new ConflictException('User already exists with this email')
}

// Create the user's default workspace along with user
const userWithWorkspace = await createUser(
{ authProvider: AuthProvider.EMAIL_OTP, ...user },
const createdUser = await createUser(
{ authProvider: AuthProvider.EMAIL_OTP, ...dto },
this.prisma
)
this.log.log(`Created user with email ${user.email}`)
this.log.log(`Created user with email ${createdUser.email}`)

await this.mailService.accountLoginEmail(userWithWorkspace.email)
this.log.log(`Sent login email to ${user.email}`)
await this.mailService.accountLoginEmail(createdUser.email)
this.log.log(`Sent login email to ${createdUser.email}`)

return userWithWorkspace
return createdUser
}

private async createDummyUser() {
Expand Down
12 changes: 6 additions & 6 deletions apps/api/src/user/user.e2e.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ describe('User Controller Tests', () => {
})

regularUser = await userService.createUser({
email: 'john@keyshade.xyz',
email: 'John@keyshade.xyz',
name: 'John',
isActive: true,
isAdmin: false,
Expand Down Expand Up @@ -259,8 +259,8 @@ describe('User Controller Tests', () => {
'x-e2e-user-email': adminUser.email
},
payload: {
email: adminUser.email,
name: 'Admin',
email: regularUser.email.toUpperCase(),
name: regularUser.name,
isAdmin: false,
isActive: true,
isOnboardingFinished: true
Expand Down Expand Up @@ -375,7 +375,7 @@ describe('User Controller Tests', () => {
userId: regularUser.id,
AND: {
emailChange: {
newEmail: 'newEmail@keyshade.xyz'
newEmail: 'newemail@keyshade.xyz'
}
}
}
Expand All @@ -399,7 +399,7 @@ describe('User Controller Tests', () => {
expect(result.statusCode).toEqual(200)
expect(JSON.parse(result.body)).toEqual({
...regularUser,
email: 'newEmail@keyshade.xyz'
email: 'newemail@keyshade.xyz'
})

const updatedUser = await prisma.user.findUnique({
Expand All @@ -408,7 +408,7 @@ describe('User Controller Tests', () => {
}
})

expect(updatedUser.email).toEqual('newEmail@keyshade.xyz')
expect(updatedUser.email).toEqual('newemail@keyshade.xyz')
})

it('should give error when new email is used by an existing user', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ export class WorkspaceMembershipService {
.findMany({
where: {
email: {
in: userEmails
in: userEmails.map((email) => email.toLowerCase())
}
},
select: {
Expand Down Expand Up @@ -489,7 +489,7 @@ export class WorkspaceMembershipService {
},
{
email: {
contains: search
contains: search.toLowerCase()
}
}
]
Expand Down Expand Up @@ -534,7 +534,7 @@ export class WorkspaceMembershipService {
},
{
email: {
contains: search
contains: search.toLowerCase()
}
}
]
Expand Down Expand Up @@ -841,7 +841,7 @@ export class WorkspaceMembershipService {

const memberUser: User | null = await this.prisma.user.findUnique({
where: {
email: member.email
email: member.email.toLowerCase()
}
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,7 @@ function VariablePage(): React.JSX.Element {
) : null}

{/* Edit variable sheet */}
{isEditVariableOpen && selectedVariable ? (
<EditVariablSheet />
) : null}
{isEditVariableOpen && selectedVariable ? <EditVariablSheet /> : null}
</div>
)}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,23 @@ import { Button } from '@/components/ui/button'
import { Label } from '@/components/ui/label'
import { Input } from '@/components/ui/input'
import { Switch } from '@/components/ui/switch'
import {
editProjectOpenAtom,
import {
editProjectOpenAtom,
selectedProjectAtom,
projectsOfWorkspaceAtom
projectsOfWorkspaceAtom
} from '@/store'
import ControllerInstance from '@/lib/controller-instance'

export default function EditProjectSheet(): JSX.Element {
const [isEditProjectSheetOpen, setIsEditProjectSheetOpen] = useAtom(editProjectOpenAtom)
const [selectedProject , setSelectedProject] = useAtom(selectedProjectAtom)
const [isEditProjectSheetOpen, setIsEditProjectSheetOpen] =
useAtom(editProjectOpenAtom)
const [selectedProject, setSelectedProject] = useAtom(selectedProjectAtom)
const [projects, setProjects] = useAtom(projectsOfWorkspaceAtom)
const [isLoading, setIsLoading] = useState(false)

const [formData, setFormData] = useState<Omit<UpdateProjectRequest, 'projectSlug'>>({
const [formData, setFormData] = useState<
Omit<UpdateProjectRequest, 'projectSlug'>
>({
name: '',
description: '',
storePrivateKey: false
Expand Down Expand Up @@ -64,11 +67,14 @@ export default function EditProjectSheet(): JSX.Element {

const changes: Partial<Omit<UpdateProjectRequest, 'projectSlug'>> = {}

if (formData.name !== undefined && formData.name !== selectedProject.name) {
changes.name = formData.name.trim()
if (formData.name !== undefined && formData.name !== selectedProject.name) {
changes.name = formData.name.trim()
}

if (formData.description !== undefined && formData.description!== selectedProject.description) {

if (
formData.description !== undefined &&
formData.description !== selectedProject.description
) {
changes.description = formData.description.trim()
}
if (formData.storePrivateKey !== selectedProject.storePrivateKey) {
Expand Down Expand Up @@ -97,22 +103,26 @@ export default function EditProjectSheet(): JSX.Element {
}

setIsLoading(true)

const updateRequest: UpdateProjectRequest = {
projectSlug: selectedProject.slug,
...changes
}

const { data, error, success } = await ControllerInstance.getInstance()
.projectController.updateProject(updateRequest)
const { data, error, success } =
await ControllerInstance.getInstance().projectController.updateProject(
updateRequest
)

if (success && data) {
setProjects(projects.map(project =>
project.slug === selectedProject.slug
? { ...project, ...data }
: project
))

setProjects(
projects.map((project) =>
project.slug === selectedProject.slug
? { ...project, ...data }
: project
)
)

toast.success('Project updated successfully')
setIsEditProjectSheetOpen(false)
setSelectedProject(null)
Expand Down Expand Up @@ -195,4 +205,4 @@ export default function EditProjectSheet(): JSX.Element {
</SheetContent>
</Sheet>
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,4 @@ export default function ProjectCard({
</ContextMenuContent>
</ContextMenu>
)
}
}
8 changes: 4 additions & 4 deletions apps/web/src/instrumentation.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import * as Sentry from '@sentry/nextjs';
import * as Sentry from '@sentry/nextjs'

export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('../sentry.server.config');
await import('../sentry.server.config')
}

if (process.env.NEXT_RUNTIME === 'edge') {
await import('../sentry.edge.config');
await import('../sentry.edge.config')
}
}

export const onRequestError = Sentry.captureRequestError;
export const onRequestError = Sentry.captureRequestError

0 comments on commit b41db33

Please sign in to comment.