2024-06-26 20:38:34 -05:00
|
|
|
import { prisma } from "./db";
|
|
|
|
import { User } from "@prisma/client";
|
2024-10-21 12:59:05 -05:00
|
|
|
import verifySubscription from "./stripe/verifySubscription";
|
2024-06-26 20:38:34 -05:00
|
|
|
import bcrypt from "bcrypt";
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
username: string;
|
|
|
|
password: string;
|
|
|
|
};
|
|
|
|
|
|
|
|
const STRIPE_SECRET_KEY = process.env.STRIPE_SECRET_KEY;
|
|
|
|
const emailEnabled =
|
|
|
|
process.env.EMAIL_FROM && process.env.EMAIL_SERVER ? true : false;
|
|
|
|
|
|
|
|
export default async function verifyByCredentials({
|
|
|
|
username,
|
|
|
|
password,
|
|
|
|
}: Props): Promise<User | null> {
|
|
|
|
const user = await prisma.user.findFirst({
|
|
|
|
where: emailEnabled
|
|
|
|
? {
|
|
|
|
OR: [
|
|
|
|
{
|
|
|
|
username: username.toLowerCase(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
email: username?.toLowerCase(),
|
|
|
|
},
|
|
|
|
],
|
|
|
|
}
|
|
|
|
: {
|
|
|
|
username: username.toLowerCase(),
|
|
|
|
},
|
|
|
|
include: {
|
|
|
|
subscriptions: true,
|
2024-10-26 08:42:21 -05:00
|
|
|
parentSubscription: true,
|
2024-06-26 20:38:34 -05:00
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!user) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
let passwordMatches: boolean = false;
|
|
|
|
|
|
|
|
if (user?.password) {
|
|
|
|
passwordMatches = bcrypt.compareSync(password, user.password);
|
|
|
|
|
|
|
|
if (!passwordMatches) {
|
|
|
|
return null;
|
|
|
|
} else {
|
|
|
|
if (STRIPE_SECRET_KEY) {
|
|
|
|
const subscribedUser = await verifySubscription(user);
|
|
|
|
|
|
|
|
if (!subscribedUser) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return user;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|