11import { v } from 'convex/values' ;
22import { mutation , query } from './_generated/server' ;
3- import * as jose from 'jose' ;
4-
5- // Shared helper function to verify JWT and return payload
6- async function verifyJwtAndGetPayload ( jwt : string ) {
7- if ( ! process . env . CLERK_JWT_KEY ) {
8- throw new Error ( 'Missing CLERK_JWT_KEY environment variable' ) ;
9- }
10- const publicKey = await jose . importSPKI ( process . env . CLERK_JWT_KEY , 'RS256' ) ;
11- if ( jwt . length === 0 ) {
12- throw new Error ( 'Missing JWT' ) ;
13- }
14- const { payload } = await jose . jwtVerify ( jwt , publicKey , { } ) ;
15- if ( ! payload . sub ) {
16- throw new Error ( 'Invalid JWT' ) ;
17- }
18- return payload ;
19- }
3+ import { getAndUpdateUser , getUser , verifyJwtAndGetPayload } from './utils' ;
204
215export const get = query ( {
226 args : {
237 jwt : v . string ( )
248 } ,
259 handler : async ( ctx , args ) => {
2610 const payload = await verifyJwtAndGetPayload ( args . jwt ) ;
11+ const userInfo = await getUser ( ctx , payload ) ;
12+ if ( ! userInfo ) {
13+ return [ ] ;
14+ }
2715 const backups = await ctx . db
2816 . query ( 'backup' )
2917 . order ( 'desc' )
30- . filter ( ( q ) => q . eq ( q . field ( 'user' ) , payload . sub ) )
31- . take ( 100 ) ;
18+ . filter ( ( q ) => q . eq ( q . field ( 'user' ) , userInfo . _id ) )
19+ . collect ( ) ;
3220 return backups . map ( ( backup ) => ( {
3321 name : backup . name ,
3422 data : backup . data ,
@@ -49,8 +37,12 @@ export const create = mutation({
4937 if ( ! payload . sub ) {
5038 throw new Error ( 'Invalid JWT: missing subject' ) ;
5139 }
40+ const userInfo = await getAndUpdateUser ( ctx , payload ) ;
41+ if ( ! userInfo ?. _id ) {
42+ throw new Error ( 'Something went wrong' ) ;
43+ }
5244 await ctx . db . insert ( 'backup' , {
53- user : payload . sub ,
45+ user : userInfo ?. _id ,
5446 name : args . name ,
5547 data : args . data
5648 } ) ;
@@ -65,9 +57,12 @@ export const remove = mutation({
6557 handler : async ( ctx , args ) => {
6658 const payload = await verifyJwtAndGetPayload ( args . jwt ) ;
6759 const backup = await ctx . db . get ( args . id ) ;
68- if ( backup ?. user !== payload . sub ) {
60+ const userInfo = await getAndUpdateUser ( ctx , payload ) ;
61+
62+ if ( backup ?. user !== userInfo ?. _id ) {
6963 throw new Error ( 'Unauthorized' ) ;
7064 }
65+ await getAndUpdateUser ( ctx , payload ) ;
7166 await ctx . db . delete ( args . id ) ;
7267 }
7368} ) ;
0 commit comments