11import { clerkClient } from "@clerk/nextjs/server"
22import { TRPCError } from "@trpc/server"
3- import { eq } from "drizzle-orm"
3+ import { eq , sql } from "drizzle-orm"
44import { z } from "zod"
55
66import { adminProcedure } from "~/server/api/trpc"
7- import { User } from "~/server/db/schema"
7+ import { Project , User } from "~/server/db/schema"
88
9+ // deprecated, only for admin to update user email
10+ // users should use the updateEmail procedure in users router to update their own email
911export const updateEmail = adminProcedure
1012 . input ( z . object ( { userId : z . string ( ) , oldEmail : z . string ( ) . email ( ) , newEmail : z . string ( ) . email ( ) } ) )
1113 . mutation ( async ( { ctx, input } ) => {
1214 const clerk = await clerkClient ( )
1315 const user_data = await ctx . db . query . User . findFirst ( {
1416 where : eq ( User . email , input . oldEmail ) ,
1517 } )
18+
1619 if ( ! user_data ) {
1720 throw new TRPCError ( { code : "NOT_FOUND" , message : `User with email: ${ input . oldEmail } does not exist` } )
1821 }
22+
1923 const user_email_data = await ctx . db . query . User . findFirst ( {
2024 where : eq ( User . email , input . newEmail ) ,
2125 } )
26+
2227 if ( user_email_data ) {
2328 throw new TRPCError ( { code : "FORBIDDEN" , message : `User with email: ${ input . newEmail } already exist` } )
2429 }
30+
2531 const user = await ctx . db . query . User . findFirst ( {
2632 where : eq ( User . id , input . userId ) ,
2733 } )
34+
2835 if ( ! user ) {
2936 throw new TRPCError ( { code : "NOT_FOUND" , message : `User with id: ${ input . userId } does not exist` } )
3037 }
@@ -46,6 +53,12 @@ export const updateEmail = adminProcedure
4653 console . error ( err )
4754 throw new TRPCError ( { code : "INTERNAL_SERVER_ERROR" , message : "Failed to update email" } )
4855 }
56+ await ctx . db
57+ . update ( Project )
58+ . set ( {
59+ members : sql `array_replace(${ Project . members } , ${ input . oldEmail } , ${ input . newEmail } )` ,
60+ } )
61+ . where ( sql `${ input . oldEmail } = ANY(${ Project . members } )` )
4962
5063 return user
5164 } )
0 commit comments