@@ -1220,211 +1220,6 @@ export default function HomePage() {
12201220` ;
12211221} ;
12221222
1223- export const clerkUserModel = ( language ) => {
1224- return `import mongoose${ language === 'ts' ? ', { Document, Model, Schema }' : '' } from "mongoose";
1225-
1226- ${ language === 'ts' ? `export interface IUser extends Document {
1227- clerkId: string;
1228- email: string;
1229- username?: string;
1230- photo: string;
1231- firstName?: string;
1232- lastName?: string;
1233- createdAt?: Date;
1234- updatedAt?: Date;
1235- }` : '' }
1236-
1237- const UserSchema = new Schema${ language === 'ts' ? '<IUser>' : '' } (
1238- {
1239- clerkId: {
1240- type: String,
1241- required: true,
1242- },
1243- email: {
1244- type: String,
1245- required: true,
1246- },
1247- username: {
1248- type: String,
1249- default: null,
1250- },
1251- photo: {
1252- type: String,
1253- required: true,
1254- },
1255- firstName: {
1256- type: String,
1257- },
1258- lastName: {
1259- type: String,
1260- },
1261- },
1262- {
1263- timestamps: true,
1264- }
1265- );
1266-
1267- const UserModel${ language === 'ts' ? ': Model<IUser>' : '' } =
1268- mongoose.models.User ${ language === 'ts' ? 'as Model<IUser>' : '' } || mongoose.model${ language === 'ts' ? '<IUser>' : '' } ("User", UserSchema);
1269-
1270- export default UserModel;` ;
1271- } ;
1272-
1273- export const clerkUserController = ( language , framework ) => {
1274- return `${ language === 'ts' ? `${ framework === 'next' ? `import type { IUser } from "../database/models/user.model";` : `import type { IUser } from "lib/database/models/user.model";` } ` : `` }
1275- ${ framework === 'next'
1276- ? `import UserModel from "../database/models/user.model";
1277- import { connectToDatabase } from "../database/mongoose";`
1278- : `import UserModel from "lib/database/models/user.model";
1279- import { connectToDatabase } from "lib/database/mongoose";` }
1280-
1281- ${ language === 'ts' ? `export interface ClerkUserPayload {
1282- id: string;
1283- email_addresses?: { email_address: string }[];
1284- username?: string;
1285- profile_image_url?: string;
1286- first_name?: string;
1287- last_name?: string;
1288- }` : `` }
1289-
1290- export async function createUser(${ language === 'ts' ? 'payload: ClerkUserPayload' : 'payload' } ) {
1291- try {
1292- await connectToDatabase();
1293- console.log("Payload:", payload);
1294-
1295- ${ language === 'ts' ? 'const userData: Partial<IUser> = {' : 'const userData = {' }
1296- clerkId: payload.id,
1297- email: payload.email_addresses?.[0]?.email_address || "",
1298- username: payload.username || "",
1299- photo: payload.profile_image_url || "",
1300- firstName: payload.first_name || "",
1301- lastName: payload.last_name || "",
1302- };
1303-
1304- const newUser = await UserModel.create(userData);
1305- return JSON.parse(JSON.stringify(newUser));
1306- } catch (error) {
1307- console.error("Error creating user:", error);
1308- throw error;
1309- }
1310- }
1311-
1312- export async function updateUser(${ language === 'ts' ? 'payload: ClerkUserPayload' : 'payload' } ) {
1313- try {
1314- await connectToDatabase();
1315-
1316- const updatedUser = await UserModel.findOneAndUpdate(
1317- { clerkId: payload.id },
1318- {
1319- email: payload.email_addresses?.[0]?.email_address,
1320- username: payload.username,
1321- photo: payload.profile_image_url,
1322- firstName: payload.first_name,
1323- lastName: payload.last_name,
1324- },
1325- { new: true }
1326- );
1327-
1328- return updatedUser ? JSON.parse(JSON.stringify(updatedUser)) : null;
1329- } catch (error) {
1330- console.error("Error updating user:", error);
1331- throw error;
1332- }
1333- }
1334-
1335- export async function deleteUser(${ language === 'ts' ? 'payload: Pick<ClerkUserPayload, "id">' : 'payload' } ) {
1336- try {
1337- await connectToDatabase();
1338- await UserModel.findOneAndDelete({ clerkId: payload.id });
1339- } catch (error) {
1340- console.error("Error deleting user:", error);
1341- throw error;
1342- }
1343- }` ;
1344- } ;
1345-
1346- export const clerkWebhookRoute = ( language , framework ) => {
1347- return framework === 'next'
1348- ? `${ language === 'ts' ? `import { verifyWebhook } from "@clerk/nextjs/webhooks";
1349- import { NextRequest } from "next/server";
1350- import { ClerkUserPayload, createUser, deleteUser, updateUser } from "../../../../../lib/actions/user.actions";` : `import { verifyWebhook } from "@clerk/nextjs/webhooks";
1351- import { createUser, deleteUser, updateUser } from "../../../../../lib/actions/user.actions";` }
1352-
1353- export const POST${ language === 'ts' ? ': (req: NextRequest) => Promise<Response>' : '' } = async (req${ language === 'ts' ? ': NextRequest' : '' } ) => {
1354- try {
1355- const evt = await verifyWebhook(req);
1356-
1357- const eventType = evt.type;
1358- ${ language === 'ts' ? 'const data = evt.data as ClerkUserPayload;' : 'const data = evt.data;' }
1359-
1360- switch (eventType) {
1361- case "user.created":
1362- await createUser(data);
1363- console.log("User created:", data);
1364- break;
1365-
1366- case "user.updated":
1367- await updateUser(data);
1368- console.log("User updated:", data);
1369- break;
1370-
1371- case "user.deleted":
1372- await deleteUser(data);
1373- console.log("User deleted:", data.id);
1374- break;
1375-
1376- default:
1377- console.log(\`Unhandled Clerk event type: \${eventType}\`);
1378- }
1379-
1380- return new Response('Webhook received', { status: 200 });
1381- } catch (err) {
1382- console.error('Error verifying webhook:', err);
1383- return new Response('Error verifying webhook', { status: 400 });
1384- }
1385- };`
1386- : `${ language === 'ts' ? `import { verifyWebhook } from '@clerk/astro/webhooks';
1387- import type { APIRoute } from 'astro';
1388- import { createUser, deleteUser, updateUser, type ClerkUserPayload } from '../../../lib/actions/user.action';` : `
1389- import { verifyWebhook } from '@clerk/astro/webhooks';
1390- import { createUser, deleteUser, updateUser } from '../../../lib/actions/user.action';` }
1391-
1392- export const POST${ language === 'ts' ? ': APIRoute' : '' } = async ({ request }) => {
1393- try {
1394- const evt = await verifyWebhook(request, {
1395- signingSecret: import.meta.env.CLERK_WEBHOOK_SIGNING_SECRET,
1396- });
1397-
1398- const eventType = evt.type;
1399- ${ language === 'ts' ? 'const data = evt.data as ClerkUserPayload;' : 'const data = evt.data;' }
1400-
1401- switch (eventType) {
1402- case "user.created":
1403- await createUser(data);
1404- console.log("User created:", data);
1405- break;
1406-
1407- case "user.updated":
1408- await updateUser(data);
1409- console.log("User updated:", data);
1410- break;
1411-
1412- case "user.deleted":
1413- await deleteUser(data);
1414- console.log("User deleted:", data.id);
1415- break;
1416-
1417- default:
1418- console.log(\`Unhandled Clerk event type: \${eventType}\`);
1419- }
1420-
1421- return new Response('Webhook received', { status: 200 });
1422- } catch (err) {
1423- console.error('Error verifying webhook:', err);
1424- return new Response('Error verifying webhook', { status: 400 });
1425- }
1426- };` ;
1427- } ;
14281223
14291224export const ProtectedRouteContent = ( language ) => {
14301225 return `// src/components/ProtectedRoute.tsx
@@ -1699,8 +1494,8 @@ export default UserModel;`;
16991494} ;
17001495
17011496export const clerkUserController = ( framework , language ) => {
1702- return `${ language === 'ts' && ( framework === "astro" || framework === "nuxt" ) ? `import type { IUser } from "../database/models/user.model";` : `` }
1703- ${ ( framework === "astro" || framework === "nuxt" ) ? `import UserModel from "../database/models/user.model";
1497+ return `${ language === 'ts' && ( framework === "astro" || framework === "nuxt" || framework === "next ") ? `import type { IUser } from "../database/models/user.model";` : `` }
1498+ ${ ( framework === "astro" || framework === "nuxt" || framework === "next" ) ? `import UserModel from "../database/models/user.model";
17041499import { connectToDatabase } from "../database/mongoose";
17051500` : "" }
17061501${ language === 'ts' ? `export interface ClerkUserPayload {
@@ -1769,11 +1564,93 @@ export async function deleteUser(${language === 'ts' ? 'payload: Pick<ClerkUserP
17691564} ;
17701565
17711566export const clerkWebhookRoute = ( framework , language ) => {
1772- return `${ language === 'ts' && ( framework === "astro" || framework === "nuxt" ) ? `import { verifyWebhook } from '@clerk/astro/webhooks';
1567+ if ( framework === 'next' ) {
1568+ return framework === 'next'
1569+ ? `${ language === 'ts' ? `import { verifyWebhook } from "@clerk/nextjs/webhooks";
1570+ import { NextRequest } from "next/server";
1571+ import { ClerkUserPayload, createUser, deleteUser, updateUser } from "../../../../../lib/actions/user.actions";` : `import { verifyWebhook } from "@clerk/nextjs/webhooks";
1572+ import { createUser, deleteUser, updateUser } from "../../../../../lib/actions/user.actions";` }
1573+
1574+ export const POST${ language === 'ts' ? ': (req: NextRequest) => Promise<Response>' : '' } = async (req${ language === 'ts' ? ': NextRequest' : '' } ) => {
1575+ try {
1576+ const evt = await verifyWebhook(req);
1577+
1578+ const eventType = evt.type;
1579+ ${ language === 'ts' ? 'const data = evt.data as ClerkUserPayload;' : 'const data = evt.data;' }
1580+
1581+ switch (eventType) {
1582+ case "user.created":
1583+ await createUser(data);
1584+ console.log("User created:", data);
1585+ break;
1586+
1587+ case "user.updated":
1588+ await updateUser(data);
1589+ console.log("User updated:", data);
1590+ break;
1591+
1592+ case "user.deleted":
1593+ await deleteUser(data);
1594+ console.log("User deleted:", data.id);
1595+ break;
1596+
1597+ default:
1598+ console.log(\`Unhandled Clerk event type: \${eventType}\`);
1599+ }
1600+
1601+ return new Response('Webhook received', { status: 200 });
1602+ } catch (err) {
1603+ console.error('Error verifying webhook:', err);
1604+ return new Response('Error verifying webhook', { status: 400 });
1605+ }
1606+ };`
1607+ : `${ language === 'ts' ? `import { verifyWebhook } from '@clerk/astro/webhooks';
1608+ import type { APIRoute } from 'astro';
1609+ import { createUser, deleteUser, updateUser, type ClerkUserPayload } from '../../../lib/actions/user.action';` : `
1610+ import { verifyWebhook } from '@clerk/astro/webhooks';
1611+ import { createUser, deleteUser, updateUser } from '../../../lib/actions/user.action';` }
1612+
1613+ export const POST${ language === 'ts' ? ': APIRoute' : '' } = async ({ request }) => {
1614+ try {
1615+ const evt = await verifyWebhook(request, {
1616+ signingSecret: import.meta.env.CLERK_WEBHOOK_SIGNING_SECRET,
1617+ });
1618+
1619+ const eventType = evt.type;
1620+ ${ language === 'ts' ? 'const data = evt.data as ClerkUserPayload;' : 'const data = evt.data;' }
1621+
1622+ switch (eventType) {
1623+ case "user.created":
1624+ await createUser(data);
1625+ console.log("User created:", data);
1626+ break;
1627+
1628+ case "user.updated":
1629+ await updateUser(data);
1630+ console.log("User updated:", data);
1631+ break;
1632+
1633+ case "user.deleted":
1634+ await deleteUser(data);
1635+ console.log("User deleted:", data.id);
1636+ break;
1637+
1638+ default:
1639+ console.log(\`Unhandled Clerk event type: \${eventType}\`);
1640+ }
1641+
1642+ return new Response('Webhook received', { status: 200 });
1643+ } catch (err) {
1644+ console.error('Error verifying webhook:', err);
1645+ return new Response('Error verifying webhook', { status: 400 });
1646+ }
1647+ };` ;
1648+ }
1649+ return `${ language === 'ts' && ( framework === "astro" || framework === "nuxt" ) ? `import { verifyWebhook } from '@clerk/astro/webhooks';
17731650import type { APIRoute } from 'astro';
1774- import { createUser, deleteUser, updateUser, type ClerkUserPayload } from '../../../lib/actions/user.action';` : ( framework === "astro" || framework === "nuxt" ) ? `
1651+ import { createUser, deleteUser, updateUser, type ClerkUserPayload } from '../../../lib/actions/user.action';` : ( framework === "astro" || framework === "nuxt" ) ? `
17751652import { verifyWebhook } from '@clerk/astro/webhooks';
1776- import { createUser, deleteUser, updateUser } from '../../../lib/actions/user.action';` :'' }
1653+ import { createUser, deleteUser, updateUser } from '../../../lib/actions/user.action';` : '' }
17771654
17781655export const POST${ language === 'ts' ? ': APIRoute' : '' } = async ({ request }) => {
17791656 try {
@@ -1810,4 +1687,5 @@ export const POST${language === 'ts' ? ': APIRoute' : ''} = async ({ request })
18101687 return new Response('Error verifying webhook', { status: 400 });
18111688 }
18121689};` ;
1813- } ;
1690+ } ;
1691+
0 commit comments