This commit is contained in:
smfahim25 2025-03-20 14:33:41 +06:00
parent f3416f86f6
commit 27339ba1bd
2 changed files with 144 additions and 99 deletions

View file

@ -1,5 +1,5 @@
import { createClerkClient } from "@clerk/backend"; import { createClerkClient } from "@clerk/backend";
import { ENV } from "../../config/env" import { ENV } from "../../config/env";
import { users } from "../../db/schema"; import { users } from "../../db/schema";
import { db } from "../../db"; import { db } from "../../db";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
@ -7,119 +7,160 @@ import { eq } from "drizzle-orm";
// @ts-ignore // @ts-ignore
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import { checkUserInDB, createUser, storeRefreshToken } from "../../helper/auth/auth.helper"; import {
checkUserInDB,
createUser,
storeRefreshToken,
} from "../../helper/auth/auth.helper";
import { verifyAuth } from "../../middlewares/auth.middlewares"; import { verifyAuth } from "../../middlewares/auth.middlewares";
// Initialize Clerk with your API key // Initialize Clerk with your API key
const clerk = createClerkClient({ secretKey: ENV.CLERK_SECRET_KEY }); const clerk = createClerkClient({ secretKey: ENV.CLERK_SECRET_KEY });
export const getUserData = async (userId: string) => { export const getUserData = async (userId: string) => {
try { try {
const [user, checkInDB] = await Promise.all([ const [user, checkInDB] = await Promise.all([
clerk.users.getUser(userId), clerk.users.getUser(userId),
checkUserInDB(userId) checkUserInDB(userId),
]); ]);
if (user && !checkInDB.found) { if (user && !checkInDB.found) {
// Validate and transform user data
const userDBData = {
id: user.id,
email: user.emailAddresses[0].emailAddress, // Assuming the first email address
firstName: user.firstName || "N/A", // Provide a default value if needed
lastName: user.lastName || "N/A",
image: user.imageUrl,
};
// Validate and transform user data const userData = await createUser(userDBData);
const userDBData = {
id: user.id,
email: user.emailAddresses[0].emailAddress, // Assuming the first email address
firstName: user.firstName || "N/A", // Provide a default value if needed
lastName: user.lastName || "N/A",
image: user.imageUrl,
};
const userData = await createUser(userDBData); return {
status: 200,
return { status: 200, message: "User retrieved successfully", data: userData }; message: "User retrieved successfully",
} data: userData,
if (user && checkInDB.found) { };
return { status: 200, message: "User retrieved successfully", data: checkInDB };
}
if (!user) {
return { status: 404, message: "User not found" };
}
} catch (error: any) {
console.error("Error in getUserData:", error.message || error.toString());
return { status: 500, message: `An error occurred while getting the user` };
} }
if (user && checkInDB.found) {
return {
status: 200,
message: "User retrieved successfully",
data: checkInDB,
};
}
if (!user) {
return { status: 404, message: "User not found" };
}
} catch (error: any) {
console.error("Error in getUserData:", error.message || error.toString());
return { status: 500, message: `An error occurred while getting the user` };
}
}; };
export const updateUser = async (id: string, body: { export const updateUser = async (
paid_status: string, id: string,
package_expire_date: string, body: {
}) => { paid_status: string;
try { package_expire_date: string;
const updateUserData = await db.update(users).set({ paid_status: body?.paid_status, expires_in: body?.package_expire_date }).where(eq(users.id, id)).returning({ updatedId: users.id }); }
) => {
try {
const updateUserData = await db
.update(users)
.set({
paid_status: body?.paid_status,
expires_in: body?.package_expire_date,
})
.where(eq(users.id, id))
.returning({ updatedId: users.id });
return { status: 200, message: "User updated successfully", updateUserData }; return {
status: 200,
} catch (error: any) { message: "User updated successfully",
console.error("Error in updateUser:", error.message || error.toString()); updateUserData,
return { status: 500, message: `An error occurred while updating the user` }; };
} } catch (error: any) {
} console.error("Error in updateUser:", error.message || error.toString());
return {
status: 500,
message: `An error occurred while updating the user`,
};
}
};
export const generateToken = async (context: any) => { export const generateToken = async (context: any) => {
try { try {
const userId = context?.params?.userId; const userId = context?.params?.userId;
const access_cookie = context?.cookie?.access_token?.value; const access_cookie = context?.cookie?.access_token?.value;
const refresh_cookie = context?.cookie?.refresh_token?.value; const refresh_cookie = context?.cookie?.refresh_token?.value;
if (access_cookie !== undefined || refresh_cookie !== undefined) { if (access_cookie !== undefined || refresh_cookie !== undefined) {
const verify = await verifyAuth(context?.cookie); const verify = await verifyAuth(context?.cookie);
return verify; return verify;
} else if (
access_cookie === undefined &&
refresh_cookie === undefined &&
userId !== undefined
) {
const user = await checkUserInDB(userId);
if (user?.found === true) {
// generate access token
const accessToken = jwt.sign({ userId }, ENV.JWT_ACCESS_TOKEN_SECRET, {
expiresIn: "3h",
});
// generate refresh token
const refreshToken = jwt.sign(
{ userId },
ENV.JWT_REFRESH_TOKEN_SECRET,
{ expiresIn: "7d" }
);
// store refresh token in db
const storeRToken = await storeRefreshToken(userId, refreshToken);
if (storeRToken.status === 200) {
context.cookie.access_token.set({
value: accessToken,
httpOnly: true,
secure: true, // Set to true in production
sameSite: "none", // Adjust based on your needs
path: "/",
maxAge: 3 * 60 * 60, // 3 hours in seconds
});
context.cookie.refresh_token.set({
value: refreshToken,
httpOnly: true,
secure: true, // Set to true in production
sameSite: "none", // Adjust based on your needs
path: "/",
maxAge: 7 * 24 * 60 * 60, // 7 days in seconds
});
return {
status: 201,
message: "Token generated successfully",
token: accessToken,
user: user.user,
};
} }
else if (access_cookie === undefined && refresh_cookie === undefined && userId !== undefined) { return {
const user = await checkUserInDB(userId); status: 500,
if (user?.found === true) { message: "An error occurred while storing the refresh token",
};
// generate access token } else {
const accessToken = jwt.sign({ userId }, ENV.JWT_ACCESS_TOKEN_SECRET, { expiresIn: '3h' }); return { status: 404, message: "User not found" };
}
// generate refresh token } else {
const refreshToken = jwt.sign({ userId }, ENV.JWT_REFRESH_TOKEN_SECRET, { expiresIn: '7d' }); return { status: 404, message: "Unauthorized!!!" };
// store refresh token in db
const storeRToken = await storeRefreshToken(userId, refreshToken);
if (storeRToken.status === 200) {
context.cookie.access_token.set({
value: accessToken,
httpOnly: true,
secure: true, // Set to true in production
sameSite: 'none', // Adjust based on your needs
path: "/",
maxAge: 3 * 60 * 60, // 3 hours in seconds
});
context.cookie.refresh_token.set({
value: refreshToken,
httpOnly: true,
secure: true, // Set to true in production
sameSite: 'none', // Adjust based on your needs
path: "/",
maxAge: 7 * 24 * 60 * 60, // 7 days in seconds
});
return { status: 201, message: "Token generated successfully", token: accessToken, user: user.user };
}
return { status: 500, message: "An error occurred while storing the refresh token" };
}
else {
return { status: 404, message: "User not found" };
}
}
else {
return { status: 404, message: "Unauthorized!!!" };
}
} catch (error: any) {
console.error("Error in generateToken:", error.message || error.toString());
return { status: 500, message: `An error occurred while generating the token` };
} }
} } catch (error: any) {
console.error("Error in generateToken:", error.message || error.toString());
return {
status: 500,
message: `An error occurred while generating the token`,
};
}
};

View file

@ -44,5 +44,9 @@ const app = new Elysia()
) )
.listen(ENV.SERVER_PORT); .listen(ENV.SERVER_PORT);
app.routes.forEach((route) => {
console.log(`Route: ${route.method} ${route.path}`);
});
console.log(`🦊 Elysia is running at ${ENV.SERVER_URL}`); console.log(`🦊 Elysia is running at ${ENV.SERVER_URL}`);
console.log(`Swagger docs available at ${ENV.SERVER_URL}/swagger`); console.log(`Swagger docs available at ${ENV.SERVER_URL}/swagger`);