init
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
import express, {
|
||||
type Request,
|
||||
type Response,
|
||||
type NextFunction,
|
||||
} from "express";
|
||||
import cors from "cors";
|
||||
import session from "express-session";
|
||||
import passport from "passport";
|
||||
import bcrypt from "bcrypt";
|
||||
import env from "./utils/env.js";
|
||||
import { Strategy as LocalStrategy } from "passport-local";
|
||||
import { prisma } from "database";
|
||||
import { ZodError } from "zod";
|
||||
|
||||
// routes
|
||||
import usersRoute from "./routers/users.js";
|
||||
import postsRoute from "./routers/posts.js";
|
||||
|
||||
const app = express();
|
||||
|
||||
// passport strategy
|
||||
passport.use(
|
||||
new LocalStrategy(
|
||||
{ usernameField: "email" },
|
||||
async (email, password, done) => {
|
||||
try {
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
email,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) return done(null, false, { message: "Bad credentials" });
|
||||
|
||||
const ok = await bcrypt.compare(password, user.password);
|
||||
return ok
|
||||
? done(null, user)
|
||||
: done(null, false, { message: "Bad credentials" });
|
||||
} catch (err) {
|
||||
return done(err);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
passport.serializeUser((user, done) => done(null, user.id));
|
||||
passport.deserializeUser(async (id: number, done) => {
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
});
|
||||
|
||||
done(null, user ?? false);
|
||||
});
|
||||
|
||||
app.use(express.urlencoded({ extended: false }));
|
||||
app.use(
|
||||
session({
|
||||
secret: env.SESSION_SECRET,
|
||||
resave: false,
|
||||
saveUninitialized: false,
|
||||
}),
|
||||
);
|
||||
app.use(passport.session());
|
||||
app.use(express.json());
|
||||
if (env.NODE_ENV === "production") {
|
||||
app.use(
|
||||
cors({
|
||||
origin: "blog.alexav.gg",
|
||||
credentials: true,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
app.get("/", (req: Request, res: Response) => {
|
||||
res.status(200).json({
|
||||
status: 200,
|
||||
});
|
||||
});
|
||||
app.use("/users", usersRoute);
|
||||
app.use("/posts", postsRoute);
|
||||
|
||||
app.use(
|
||||
(err: Error | ZodError, req: Request, res: Response, next: NextFunction) => {
|
||||
if (err instanceof ZodError) {
|
||||
res.status(400).json({
|
||||
status: 400,
|
||||
message: "Malformed request body",
|
||||
issues: err.issues,
|
||||
});
|
||||
} else {
|
||||
console.log(err);
|
||||
res.status(500).json({
|
||||
status: 500,
|
||||
message:
|
||||
"Sorry, an unexpected error occurred while performing that action",
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
app.listen(3000, () => {
|
||||
console.log("Server started");
|
||||
});
|
||||
Reference in New Issue
Block a user