Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ bower_components
.lock-wscript

# Dependency directories
node_modules/
node_modules
.env

# Optional npm cache directory
Expand All @@ -59,3 +59,5 @@ node_modules/

# Yarn Integrity file
.yarn-integrity

dist
98 changes: 49 additions & 49 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
const createError = require("http-errors");
const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");
const logger = require("morgan");
const cors = require("cors");
const mongoose = require("mongoose");
const passport = require("passport");
const session = require("express-session");
const MongoStore = require("connect-mongo")(session);
const compression = require("compression");
const User = require("./models/User");
require("dotenv").config();
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const logger = require('morgan');
const cors = require('cors');
const mongoose = require('mongoose');
const passport = require('passport');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const compression = require('compression');
const User = require('./models/User');
require('dotenv').config();

// MONGODB
const forceProdDB = false;
const isProdDb =
forceProdDB ||
(process.env.NODE_ENV === "production" && process.env.REACT_APP_DB_PROD);
const isProdDb = forceProdDB
|| (process.env.NODE_ENV === 'production' && process.env.DB_URI_PROD);
const URI = isProdDb
? process.env.REACT_APP_DB_PROD
: process.env.REACT_APP_DB_DEV;
? process.env.DB_URI_PROD
: process.env.DB_URI_DEV;

mongoose.connect(URI, {
useNewUrlParser: true,
Expand All @@ -29,11 +28,11 @@ mongoose.connect(URI, {
reconnectInterval: 1000,
});
const db = mongoose.connection;
db.on("error", console.error.bind(console, "*** DB connection error ***"));
db.on("disconnected", console.error.bind(console, "*** DB disconnected ***"));
db.on("reconnected", console.error.bind(console, "*** DB reconnected ***"));
db.once("open", () => {
console.log("db connection:", isProdDb ? "prod" : "dev");
db.on('error', console.error.bind(console, '*** DB connection error ***'));
db.on('disconnected', console.error.bind(console, '*** DB disconnected ***'));
db.on('reconnected', console.error.bind(console, '*** DB reconnected ***'));
db.once('open', () => {
console.log('db connection:', isProdDb ? 'prod' : 'dev');
});

// PORT
Expand All @@ -45,28 +44,28 @@ const server = app.listen(PORT, () => {

// MIDDLEWARE
const corsCfg = {
origin: "*",
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
origin: '*',
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
preflightContinue: false,
optionsSuccessStatus: 204,
credentials: true,
};
app.use(cors(corsCfg));
app.use(logger("dev"));
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
if (process.env.NODE_ENV === "production") {
if (process.env.NODE_ENV === 'production') {
app.use(compression());
}

// PASSPORT
app.use(
session({
secret: process.env.REACT_APP_SESSION_SECRET,
secret: process.env.VITE_SESSION_SECRET,
resave: false,
saveUninitialized: true,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
})
}),
);
app.use(bodyParser.urlencoded({ extended: false }));
app.use(passport.initialize());
Expand All @@ -80,54 +79,55 @@ passport.deserializeUser((id, done) => {
// find user based on id stored in cookie
// save user data to req.user
User.findById(id)
.populate("bm.listings")
.populate("chatrooms")
.populate('bm.listings')
.populate('chatrooms')
.then((user) => {
done(null, user);
})
.catch((e) => {
done(new Error("Failed to deserialize a user"));
done(new Error('Failed to deserialize a user'));
});
});

// ROUTING
app.use("/api", require("./routes"));
app.use('/api', require('./routes'));

// SOCKET IO
require("./socket").listen(server);
require('./socket').listen(server);

// VIEW ENGINE
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "jade");
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// FORCE HTTPS ON PROD
// eslint-disable-next-line consistent-return
app.use((req, res, next) => {
if (
!req.secure &&
req.get("x-forwarded-proto") !== "https" &&
process.env.NODE_ENV === "production"
!req.secure
&& req.get('x-forwarded-proto') !== 'https'
&& process.env.NODE_ENV === 'production'
) {
return res.redirect(`https://${req.get("host")}${req.url}`);
return res.redirect(`https://${req.get('host')}${req.url}`);
}
next();
});

// PROD SERVE FRONTEND
if (process.env.NODE_ENV === "production") {
if (process.env.NODE_ENV === 'production') {
const HALF_HOUR = 1000 * 60 * 30;
app.use(express.static(path.join(__dirname)));
app.use(
express.static(path.join(__dirname, "client", "build"), {
express.static(path.join(__dirname, 'client', 'dist'), {
maxAge: HALF_HOUR,
})
}),
);

app.get("/*", (req, res) => {
res.sendFile(path.join(__dirname, "client", "build", "index.html"));
app.get('/*', (req, res) => {
res.sendFile(path.join(__dirname, 'client', 'dist', 'index.html'));
});
} else {
app.use(express.static(path.join(__dirname, "public")));
}
else {
app.use(express.static(path.join(__dirname, 'public')));
}

// catch 404 and forward to error handler
Expand All @@ -139,11 +139,11 @@ app.use((req, res, next) => {
app.use((err, req, res) => {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
res.locals.error = req.app.get('env') === 'development' ? err : {};

// render the error page
res.status(err.status || 500);
res.render("error");
res.render('error');
});

module.exports = app;
6 changes: 3 additions & 3 deletions auth/google.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ const Chatroom = require('../models/Chatroom');

const ROOT_URL = process.env.NODE_ENV === 'development'
? 'http://localhost:8081'
: process.env.REACT_APP_CLIENT_DOMAIN;
: process.env.VITE_CLIENT_DOMAIN;

passport.use(new GoogleStrategy({
clientID: process.env.REACT_APP_CLIENT_ID,
clientSecret: process.env.REACT_APP_CLIENT_SECRET,
clientID: process.env.VITE_CLIENT_ID,
clientSecret: process.env.VITE_CLIENT_SECRET,
callbackURL: `${ROOT_URL}/api/auth/google/callback`,
},
(async (accessToken, refreshToken, profile, done) => {
Expand Down
21 changes: 21 additions & 0 deletions client/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended',
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
settings: { react: { version: '18.2' } },
plugins: ['react-refresh'],
rules: {
'react/jsx-no-target-blank': 'off',
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
}
33 changes: 0 additions & 33 deletions client/.eslintrc.json

This file was deleted.

24 changes: 0 additions & 24 deletions client/.gitignore

This file was deleted.

12 changes: 0 additions & 12 deletions client/.prettierrc

This file was deleted.

68 changes: 0 additions & 68 deletions client/README.md

This file was deleted.

Loading