Skip to content

Commit 1e2f883

Browse files
feat(server): add meeting api & poll api
1 parent dd40fb3 commit 1e2f883

18 files changed

Lines changed: 416 additions & 44 deletions

File tree

frontend/src/App.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { updateAccessToken } from "./utils/updateAccessToken";
44
import Backdrop from "@material-ui/core/Backdrop";
55
import CircularProgress from "@material-ui/core/CircularProgress";
66
import { makeStyles, createStyles, Theme } from "@material-ui/core/styles";
7+
import { getToken } from "./store/tokenStore";
78

89
const useStyles = makeStyles((theme: Theme) =>
910
createStyles({
@@ -18,7 +19,12 @@ const App: React.FC = () => {
1819
const classes = useStyles();
1920
const [loading, setLoading] = React.useState(true);
2021
React.useEffect(() => {
21-
updateAccessToken(setLoading);
22+
const accessToken = getToken();
23+
if (!!accessToken) {
24+
updateAccessToken(setLoading);
25+
} else {
26+
setLoading(false);
27+
}
2228
});
2329
return (
2430
<>

frontend/src/Routes.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ import Registration from "./pages/Registration";
88
import GoogleRedirect from "./pages/GoogleRedirect";
99
import Meeting from "./pages/Meeting";
1010
import { updateAccessToken } from "./utils/updateAccessToken";
11+
import { getToken } from "./store/tokenStore";
1112

1213
const Routes: React.FC = () => {
1314
const REFRESH_TIME_MS = 60 * 60 * 1000;
1415
React.useEffect(() => {
1516
const interval = setInterval(() => {
16-
console.log("Refreshing token...");
17-
updateAccessToken();
17+
const accessToken = getToken();
18+
if (!!accessToken) {
19+
console.log("Refreshing token...");
20+
updateAccessToken();
21+
}
1822
}, REFRESH_TIME_MS);
1923

2024
// This represents the unmount function, in which you need to clear your interval to prevent memory leaks.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from "react";
2+
import { createStyles, makeStyles } from "@material-ui/core/styles";
3+
4+
const useStyles = makeStyles(() =>
5+
createStyles({
6+
root: {
7+
flexGrow: 1,
8+
},
9+
})
10+
);
11+
const MeetingTabs: React.FC = () => {
12+
const classes = useStyles();
13+
return <div className={classes.root}>yolo</div>;
14+
};
15+
16+
export default MeetingTabs;

frontend/src/pages/GoogleRedirect/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const GoogleRedirect: React.FC = () => {
2121
const history = useHistory();
2222
const { search } = useLocation();
2323
const queries = queryString.parse(search);
24-
const id = queries.user_id;
24+
const id = queries.token;
2525
React.useEffect(() => {
2626
const googleToken = async () => {
2727
const res = await fetch(server + "/api/user/google-login/" + id);

frontend/src/pages/Meeting/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { createStyles, makeStyles } from "@material-ui/core/styles";
33
import { getToken } from "src/store/tokenStore";
44
import { Redirect } from "react-router";
55
import Navbar from "../../components/Navs/Navbar";
6+
import MeetingTabs from "src/components/Meeting/MeetingTabs";
67

78
const useStyles = makeStyles(() =>
89
createStyles({
@@ -21,7 +22,7 @@ const Meeting: React.FC = () => {
2122
return (
2223
<div className={classes.root}>
2324
<Navbar />
24-
SeCurE mEetIng
25+
<MeetingTabs />
2526
</div>
2627
);
2728
};

server/package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
"mongoose": "^5.12.9",
2222
"passport": "^0.4.1",
2323
"passport-google-oauth": "^2.0.0",
24-
"passport-google-oauth20": "^2.0.0"
24+
"passport-google-oauth20": "^2.0.0",
25+
"uuid": "^8.3.2"
2526
},
2627
"devDependencies": {
2728
"@types/bcryptjs": "^2.4.2",
@@ -34,6 +35,7 @@
3435
"@types/passport": "^1.0.6",
3536
"@types/passport-google-oauth": "^1.0.41",
3637
"@types/passport-google-oauth20": "^2.0.7",
38+
"@types/uuid": "^8.3.0",
3739
"@typescript-eslint/eslint-plugin": "^4.23.0",
3840
"@typescript-eslint/parser": "^4.23.0",
3941
"eslint": "^7.26.0",

server/src/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import express from "express";
22
import mongoose from "mongoose";
33
import cors from "cors";
4+
import cookieParser from "cookie-parser";
5+
import passport from "passport";
6+
47
import refreshTokenRoute from "./routes/refreshtoken";
58
import userRoute from "./routes/userRoutes";
69
import googleAuthRoutes from "./routes/googleAuthRoutes";
710
import meetingRoute from "./routes/meetingRoutes";
8-
import cookieParser from "cookie-parser";
9-
import passport from "passport";
11+
import pollRoutes from "./routes/pollRoutes";
1012
require("./config/google-oauth");
1113

1214
// eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -41,6 +43,7 @@ app.use("/api", refreshTokenRoute);
4143
app.use("/api/user", userRoute);
4244
app.use("/api/auth/google", googleAuthRoutes);
4345
app.use("/api/meeting", meetingRoute);
46+
app.use("/api/poll", pollRoutes);
4447
app.get("/", (_, res) => {
4548
res.send("hello world");
4649
});
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Request, Response, NextFunction } from "express";
2+
import { verify } from "jsonwebtoken";
3+
import { User } from "../model/User";
4+
5+
const adminAuthValidation = async (
6+
req: Request,
7+
res: Response,
8+
next: NextFunction
9+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10+
): Promise<Response<any, Record<string, any>> | void> => {
11+
try {
12+
const accessToken = req.headers.authorization?.split(" ")[1];
13+
if (!accessToken) {
14+
return res.json({ done: false, err: "No token" });
15+
}
16+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
17+
const payload: any = verify(accessToken, process.env.JWT_SECRET!);
18+
19+
if (!payload) {
20+
return res.json({ done: false, err: "Bad token" });
21+
}
22+
23+
// Check if clubs present in request
24+
const club = req.body.club;
25+
if (!club) {
26+
return res.json({ done: false, err: "Invalid request" });
27+
}
28+
29+
const user = await User.findOne({ _id: payload.userId });
30+
if (!user) {
31+
return res.json({ done: false, err: "Invalid token" });
32+
}
33+
const clubAuth = user?.clubs?.find((e) => e.name === club)?.authority;
34+
if (!clubAuth && clubAuth !== "admin") {
35+
console.log(JSON.stringify(user.clubs));
36+
return res.json({ done: false, err: "Permission denied" });
37+
}
38+
39+
next();
40+
} catch (err) {
41+
console.log("my error: " + err);
42+
return res.json({ done: false, err: "Something went wrong" });
43+
}
44+
};
45+
46+
export default adminAuthValidation;

server/src/middleware/authValidation.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,30 @@ const authValidation = async (
66
req: Request,
77
res: Response,
88
next: NextFunction
9-
): Promise<void> => {
9+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10+
): Promise<Response<any, Record<string, any>> | void> => {
1011
try {
11-
const accessToken = req.headers.authorization;
12+
const accessToken = req.headers.authorization?.split(" ")[1];
1213
if (!accessToken) {
13-
throw new Error("No Token");
14+
return res.json({ done: false, err: "No token" });
1415
}
1516
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1617
const payload: any = verify(accessToken, process.env.JWT_SECRET!);
1718

1819
if (!payload) {
19-
throw new Error("No Payload");
20+
return res.json({ done: false, err: "Bad token" });
2021
}
2122

2223
const user = await User.findOne({ _id: payload.userId });
2324

2425
if (user) {
2526
next();
2627
} else {
27-
res.json({ err: "NO TOKEn" });
28+
return res.json({ done: false, err: "No token" });
2829
}
2930
} catch (err) {
3031
console.log("my error: " + err);
32+
return res.json({ done: false, err: "Something went wrong" });
3133
}
3234
};
3335

0 commit comments

Comments
 (0)