import express, { Express } from "express"; import dotenv from "dotenv"; import bodyParser from "body-parser"; import swaggerUI from "swagger-ui-express"; import cors from "cors"; import GoogleStrategy from "passport-google-oauth20"; import cookieParser from "cookie-parser"; import session from "express-session"; import useragent from "express-useragent"; import calendarRoutes from "./src/routes/calendarRoutes"; import storeRoutes from "./src/routes/storeRoutes"; import storeServicesRoutes from "./src/routes/storeServicesRoutes"; import userRoutes from "./src/routes/userRoutes"; import usersRoutes from "./src/routes/usersRoutes"; dotenv.config(); import swaggerJsDoc from "swagger-jsdoc"; import syncModels from "./src/models/index"; import logger from "./src/logger/logger"; import passport from "passport"; import rabbitmq from "./src/rabbitmq/rabbitmq"; import { GOOGLE_CALLBACK_URL } from "./src/utils/constants"; const app: Express = express(); const host = process.env.HOST || "localhost"; const port = Number(process.env.PORT) || 3000; const options = { definition: { openapi: "3.0.0", info: { title: "PartyApp API", version: "1.0.0", //description: "PartyApp API", //termsOfService: "http://example.com/terms/", /*contact: { name: "API Support", url: "http://www.exmaple.com/support", email: "support@example.com", },*/ }, servers: [ { url: "http://localhost:3000/api/v1", //description: "PartyApp API Documentation", }, ], }, apis: ["./src/routes/*.ts"], }; app.use( session({ secret: "keyboard cat", resave: false, // don't save session if unmodified saveUninitialized: false, // don't create session until something stored }) ); // app.use(passport.authenticate('session')); passport.use( new GoogleStrategy.Strategy( { clientID: process.env.GOOGLE_CLIENT_ID as string, clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, callbackURL: GOOGLE_CALLBACK_URL, /*scope: [ "https://www.googleapis.com/auth/calendar.app.created", "https://www.googleapis.com/auth/calendar.events.freebusy", "https://www.googleapis.com/auth/userinfo.profile", ],*/ //skipUserProfile: false, // this is important, if not set to true, an error will be thrown }, (accessToken, refreshToken, profile, cb) => { console.log("accessToken", accessToken); console.log("refreshToken", refreshToken); console.log("profile", profile); return cb(null, { profile, accessToken, refreshToken }); } ) ); interface User { id: string; username: string; name: string; } passport.serializeUser(function (user, cb) { process.nextTick(function () { //console.log("user", user); cb(null, {}); }); }); passport.deserializeUser(function (user: User, cb) { process.nextTick(function () { return cb(null, user); }); }); // TODO: setup cors app.use(cors()); app.use(cookieParser()); app.use(useragent.express()); app.use(bodyParser.json()); app.use("/api/v1/calendar", calendarRoutes); app.use("/api/v1/store", storeRoutes); app.use("/api/v1/store/services", storeServicesRoutes); app.use("/api/v1/user", userRoutes); app.use("/api/v1/users", usersRoutes); const specs = swaggerJsDoc(options); app.use("/api-docs", swaggerUI.serve, swaggerUI.setup(specs)); app.use((req, res, next) => { console.log("req not found, path:", req.path); res.status(404).send("not found"); }); app.use((err: any, req: any, res: any, next: any) => { console.log("req err", err.stack); res.status(500).send({ err: "invalid request" }); }); syncModels(); // start server rabbitmq .connect( process.env.RABBITMQ_USERNAME as string, process.env.RABBITMQ_PASSWORD as string, process.env.RABBITMQ_HOST as string, process.env.RABBITMQ_PORT as string ) .then(() => { app.listen(port, host, () => logger.info(`⚡️[server]: Server is running at http://${host}:${port}`) ); }) .catch((err) => { logger.error(err); });