Skip to content

Commit 1b69260

Browse files
fixes bug in backend(ts)
1 parent 4c365f4 commit 1b69260

5 files changed

Lines changed: 109 additions & 221 deletions

File tree

lib/authentication/utils/clerkvue.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ export default defineConfig({
617617
if (!/import\s+webhooksRoute/.test(indexContent)) {
618618
indexContent = indexContent.replace(
619619
importRegex,
620-
`$1import webhooksRoute from "./routes/webhooks.route.js";\n`
620+
`$1import webhooksRoute from "./routes/webhooks.route.${language==="ts"?'ts':'js'}";\n`
621621
);
622622
}
623623
// for js
@@ -632,8 +632,7 @@ export default defineConfig({
632632
if (!/app\.use\(\s*['"]\/api\/webhooks/.test(indexContent)) {
633633
indexContent = indexContent.replace(
634634
expressRegex,
635-
`const app = express();\napp.use('/api/webhooks', webhooksRoute);`
636-
);
635+
(language==='ts'?`const app: express.Application = express()\napp.use('/api/webhooks', webhooksRoute);\n`:`const app = express();\napp.use('/api/webhooks', webhooksRoute);`));
637636
}
638637

639638
fs.writeFileSync(indexPath, indexContent, "utf8");

lib/authentication/utils/utility.js

Lines changed: 89 additions & 211 deletions
Original file line numberDiff line numberDiff line change
@@ -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

14291224
export const ProtectedRouteContent = (language) => {
14301225
return `// src/components/ProtectedRoute.tsx
@@ -1699,8 +1494,8 @@ export default UserModel;`;
16991494
};
17001495

17011496
export 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";
17041499
import { 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

17711566
export 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';
17731650
import 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") ? `
17751652
import { 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
17781655
export 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+

lib/backend/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import path from "path";
44
import chalk from "chalk";
55
import { execa } from "execa";
66
import inquirer from "inquirer";
7-
import { apiContent, dbConnectContent, dbConnectContentNuxt, envExampleContent, indexContent, mongodbNextContent, packageJsonContent, PostgresindexContent, postgresJsonContent, postgreSqlRoute, prismaClientContent, schemaContent, svelteApiRouteContent, svelteMongoDbContent, sveltePackageJsonMongo, sveltePackageJsonPostgres, sveltePostgresApiContent, sveltePrismaContent, svelteUserModelContent, userModel } from "./utils/utility.js";
7+
import { apiContent, dbConnectContent, dbConnectContentNuxt, envExampleContent, indexContent, mongodbNextContent, packageJsonContent, PostgresindexContent, postgresJsonContent, postgreSqlRoute, prismaClientContent, schemaContent, svelteApiRouteContent, svelteMongoDbContent, sveltePackageJsonMongo, sveltePackageJsonPostgres, sveltePostgresApiContent, sveltePrismaContent, svelteUserModelContent, tsConfigContent, userModel } from "./utils/utility.js";
88

99
export async function setupMongoDb(projectName, framework, language) {
1010
console.log(
@@ -57,7 +57,6 @@ export async function setupMongoDb(projectName, framework, language) {
5757

5858
// console.log("Mongo uri : ", mongoUri)
5959
const mongoNextContent = mongodbNextContent(framework, language);
60-
const mongoNextContent = mongodbNextContent(framework, language);
6160
if (!mongoNextContent) {
6261
console.error("Missing mongodbNextContent definition.");
6362
return;
@@ -355,7 +354,10 @@ export async function setupMongoDb(projectName, framework, language) {
355354
envExampleContent()
356355
);
357356

358-
357+
fs.writeFileSync(
358+
path.join(backendPath, "tsconfig.json"),
359+
JSON.stringify(tsConfigContent, null, 2)
360+
);
359361
// Create all source files
360362
const dbConnectContent2 = dbConnectContent(language);
361363
const indexContent2 = indexContent(language);

0 commit comments

Comments
 (0)