143 lines
5.2 KiB
TypeScript
143 lines
5.2 KiB
TypeScript
import { createClerkClient } from "@clerk/backend";
|
|
import { ENV } from "../../config/env"
|
|
import { users } from "../../db/schema";
|
|
import { db } from "../../db";
|
|
import { eq } from "drizzle-orm";
|
|
|
|
// @ts-ignore
|
|
import jwt from "jsonwebtoken";
|
|
|
|
import { checkUserInDB, createUser, storeRefreshToken } from "../../helper/auth/auth.helper";
|
|
|
|
// Initialize Clerk with your API key
|
|
const clerk = createClerkClient({ secretKey: ENV.CLERK_SECRET_KEY });
|
|
|
|
export const getUserData = async (userId: string) => {
|
|
try {
|
|
const [user, checkInDB] = await Promise.all([
|
|
clerk.users.getUser(userId),
|
|
checkUserInDB(userId)
|
|
]);
|
|
|
|
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,
|
|
};
|
|
|
|
const userData = await createUser(userDBData);
|
|
|
|
return { status: 200, 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` };
|
|
}
|
|
};
|
|
|
|
export const updateUser = async (id: string, body) => {
|
|
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 };
|
|
|
|
} 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) => {
|
|
try {
|
|
const userId = context?.params?.userId;
|
|
// generating accessToken and refreshToken
|
|
const user = await checkUserInDB(userId);
|
|
if (user?.found === true) {
|
|
const accessSecret = ENV.JWT_ACCESS_TOKEN_SECRET;
|
|
const refreshSecret = ENV.JWT_REFRESH_TOKEN_SECRET;
|
|
|
|
// generate access token
|
|
const accessToken = jwt.sign({ userId }, accessSecret, { expiresIn: '3h' });
|
|
|
|
// generate refresh token
|
|
const refreshToken = jwt.sign({ userId }, refreshSecret, { expiresIn: '7d' });
|
|
|
|
// store refresh token in db
|
|
const storeRToken = await storeRefreshToken(userId, refreshToken);
|
|
|
|
if (storeRToken.status === 200) {
|
|
context.cookie.access_token = {
|
|
value: accessToken,
|
|
httpOnly: true,
|
|
secure: true,
|
|
sameSite: 'none',
|
|
path: "/",
|
|
maxAge: 3 * 60 * 60 * 1000, // 3 hours
|
|
}
|
|
|
|
return { status: 200, message: "Token generated successfully", token: accessToken };
|
|
}
|
|
|
|
return { status: 500, message: "An error occurred while storing the refresh token" };
|
|
}
|
|
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` };
|
|
}
|
|
}
|
|
|
|
export const verifyToken = async (context: any) => {
|
|
try {
|
|
// if token is in cookie, verify it
|
|
const token_cookie = context.cookie.access_token.value;
|
|
if (token_cookie) {
|
|
const verify_cookie = jwt.verify(token_cookie, ENV.JWT_REFRESH_TOKEN_SECRET);
|
|
if (verify_cookie) {
|
|
return { status: 200, message: "Token verified successfully" };
|
|
}
|
|
else {
|
|
return { status: 401, message: "Unauthorized!!!" };
|
|
}
|
|
}
|
|
// if token is not in cookie, then check in header and verify it
|
|
else {
|
|
const token_header = context.headers.authorization.split("Bearer ")[1];
|
|
|
|
if (token_header) {
|
|
const verify_header = jwt.decode(token_header);
|
|
|
|
if (verify_header?.userId) {
|
|
context.params.userId = verify_header.userId;
|
|
await generateToken(context);
|
|
}
|
|
else {
|
|
return { status: 401, message: "Unauthorized!!!" };
|
|
}
|
|
}
|
|
else {
|
|
return { status: 401, message: "Unauthorized!!!" };
|
|
}
|
|
}
|
|
|
|
} catch (error: any) {
|
|
console.log("Error in verifyToken:", error.message || error.toString());
|
|
return { status: 500, message: `An error occurred while verifying the token` };
|
|
}
|
|
}
|
|
|
|
|
|
|