Skip to content

Commit

Permalink
protected routes have method to refresh token, all CRUD Methods work …
Browse files Browse the repository at this point in the history
…with the database and firebase console.
  • Loading branch information
SubinQKim committed Jan 22, 2024
1 parent 39cccb0 commit 2679ca2
Show file tree
Hide file tree
Showing 10 changed files with 1,089 additions and 6 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ dist
# DynamoDB Local files
.dynamodb/

# firebase sdk
firebase-adminsdk.json

# TernJS port file
.tern-port

Expand Down
6 changes: 6 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ require('dotenv').config();
// routes
const users = require('./routes/users');

const testRouter = require('./routes/verTest');

const { authRouter, verifyToken } = require('./routes/auth');

const email = require('./routes/nodeMailer');

const app = express();
Expand All @@ -30,6 +34,8 @@ app.use('/published-schedule', publishedScheduleRouter);
app.use('/users', users);
app.use('/catalog', catalogRouter);
app.use('/nodeMailer', email);
app.use('/auth', authRouter);
app.use('/verTest', [verifyToken, testRouter]);

app.listen(PORT, () => {
console.log(`Server listening on ${PORT}`);
Expand Down
11 changes: 11 additions & 0 deletions firebase.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const admin = require('firebase-admin');

require('dotenv').config();

console.log('Current working directory:', process.cwd());

const credentials = require('./firebase-adminsdk.json');

admin.initializeApp({ credential: admin.credential.cert(credentials) });

module.exports = admin;
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"eslint-plugin-prettier": "^4.0.0",
"express": "^4.17.1",
"express-promise-router": "^4.1.1",
"firebase-admin": "^12.0.0",
"nodemailer": "^6.9.7",
"nodemon": "^2.0.14",
"pg": "^8.8.0",
Expand Down
42 changes: 42 additions & 0 deletions routes/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const express = require('express');

const authRouter = express();
const admin = require('../firebase');

authRouter.use(express.json());

// This method makes a call to Firebase that will verify the access token attached to the request's cookies
// This method is used to make sure that only users who have appropriate access tokens can access backend routes.
const verifyToken = async (req, res, next) => {
try {
const {
cookies: { accessToken },
} = req;
if (!accessToken) {
return res.status(400).send('@verifyToken no access token');
}
const decodedToken = await admin.auth().verifyIdToken(accessToken);
if (!decodedToken) {
return res.status(400).send('Empty token from firebase');
}
return next();
} catch (err) {
return res.status(400).send('@verifyToken no access token');
}
};

// This method makes a call to firebase that will verify the access token attached to the request's cookies
// This method is used to make sure that only users who have appropriate access tokens can access frontend routes.
authRouter.get('/verifyToken/:accessToken', async (req, res) => {
try {
const { accessToken } = req.params;
console.log('accessToken3urju3jrwj!', accessToken);
const decodedToken = await admin.auth().verifyIdToken(accessToken);
return res.status(200).send(decodedToken.uid);
} catch (err) {
console.log('err', err);
return res.status(400).send('@verifyToken no access token');
}
});

module.exports = { verifyToken, authRouter };
2 changes: 0 additions & 2 deletions routes/nodeMailer.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ emailRouter.use(express.json());

emailRouter.post('/send', (req, res) => {
const { email, messageHtml, subject } = req.body;
console.log('req.body', req.body);
console.log('email', email);
const mail = {
from: `${process.env.REACT_APP_EMAIL_FIRST_NAME} ${process.env.REACT_APP_EMAIL_LAST_NAME} ${process.env.REACT_APP_EMAIL_USERNAME}`,
to: email,
Expand Down
22 changes: 21 additions & 1 deletion routes/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ const { db } = require('../server/db');

const userRouter = express.Router();

const admin = require('../firebase');

userRouter.get('/', async (req, res) => {
try {
const allUsers = await db.query(`SELECT * FROM users;`);
Expand All @@ -13,6 +15,18 @@ userRouter.get('/', async (req, res) => {
}
});

// logInWithEmailAndPassword() needs to get specific user id
userRouter.get('/:uid', async (req, res) => {
try {
const { uid } = req.params;
console.log('uid', req.params);
const user = await db.query(`SELECT * FROM users WHERE id = $1;`, [uid]);
res.status(200).json(keysToCamel(user));
} catch (err) {
res.status(500).send(err.message);
}
});

userRouter.get('/pending-accounts', async (req, res) => {
try {
const pendingAccounts = await db.query(`SELECT * FROM users WHERE approved = FALSE;`);
Expand All @@ -22,9 +36,10 @@ userRouter.get('/pending-accounts', async (req, res) => {
}
});

userRouter.post('/', async (req, res) => {
userRouter.post('/create', async (req, res) => {
try {
const { id, email, type, approved } = req.body;
// console.log('req.body', req.body);
await db.query(`INSERT INTO users (id, email, "type", approved) VALUES ($1, $2, $3, $4);`, [
id,
email,
Expand All @@ -35,6 +50,7 @@ userRouter.post('/', async (req, res) => {
id,
});
} catch (err) {
console.log('err', err);
res.status(500).json({
status: 'Failed',
msg: err.message,
Expand All @@ -58,6 +74,10 @@ userRouter.put('/:uid', async (req, res) => {
userRouter.delete('/:uid', async (req, res) => {
try {
const { uid } = req.params;

// Firebase delete
await admin.auth().deleteUser(uid);

const deletedUser = await db.query(`DELETE FROM users WHERE id = $1 RETURNING *;`, [uid]);
res.status(200).send(keysToCamel(deletedUser));
} catch (err) {
Expand Down
16 changes: 16 additions & 0 deletions routes/verTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const express = require('express');
const { keysToCamel } = require('../common/utils');
const { db } = require('../server/db');

const testRouter = express();

testRouter.get('/', async (req, res) => {
try {
const allUsers = await db.query(`SELECT * FROM users;`);
res.status(200).json(keysToCamel(allUsers));
} catch (err) {
res.status(500).send(err.message);
}
});

module.exports = testRouter;
1 change: 1 addition & 0 deletions transporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const nodemailer = require('nodemailer');
require('dotenv').config();

// sender information

const transport = {
host: 'smtp.gmail.com', // e.g. smtp.gmail.com
auth: {
Expand Down
Loading

0 comments on commit 2679ca2

Please sign in to comment.