Skip to content

Commit 50ebcfc

Browse files
authored
Merge pull request #65 from nicolelim02/feat/users
Redirect users to email verification page
2 parents c3462f8 + 1acd663 commit 50ebcfc

File tree

11 files changed

+84
-50
lines changed

11 files changed

+84
-50
lines changed

backend/user-service/.env.sample

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,8 @@ USER=EMAIL_ADDRESS
2929
PASS=PASSWORD
3030

3131
# Redis configuration
32-
REDIS_URI=REDIS_URI
32+
REDIS_URI=REDIS_URI
33+
34+
# Test
35+
MONGO_URI_TEST=mongodb://mongo:mongo@test-mongo:27017/
36+
REDIS_URI_TEST=redis://test-redis:6379

backend/user-service/config/redis.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import dotenv from "dotenv";
33

44
dotenv.config();
55

6-
const REDIS_URI = process.env.REDIS_URI || "redis://localhost:6379";
6+
const REDIS_URI =
7+
process.env.NODE_ENV === "test"
8+
? process.env.REDIS_URI_TEST
9+
: process.env.REDIS_URI || "redis://localhost:6379";
710

811
const client = createClient({ url: REDIS_URI });
912

backend/user-service/controller/user-controller.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,10 @@ export const verifyUser = async (
155155

156156
const updatedUser = await _updateUserVerification(email);
157157
if (!updatedUser) {
158-
return res.status(404).json({ message: `User ${email} not verified.` });
158+
return res.status(404).json({ message: `User not verified.` });
159159
}
160160

161-
return res
162-
.status(200)
163-
.json({ message: `User ${email} verified successfully.` });
161+
return res.status(200).json({ message: `User verified successfully.` });
164162
} catch (error) {
165163
return res
166164
.status(500)

backend/user-service/model/repository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export async function createUser(
3131
email,
3232
password,
3333
isAdmin,
34+
isVerified,
3435
});
3536
return user.save();
3637
}

backend/user-service/scripts/seed.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export async function seedAdminAccount() {
3838
adminUsername,
3939
adminEmail,
4040
hashedPassword,
41+
true,
4142
true
4243
);
4344
console.log("Admin account created successfully.");

backend/user-service/tests/authRoutes.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import supertest from "supertest";
44
import app from "../app";
55
import UserModel from "../model/user-model";
66

7+
jest.setTimeout(10000);
8+
79
const request = supertest(app);
810

911
const AUTH_BASE_URL = "/api/auth";
@@ -25,6 +27,7 @@ const insertAdminUser = async () => {
2527
email,
2628
password: hashedPassword,
2729
isAdmin: true,
30+
isVerified: true,
2831
}).save();
2932

3033
return { email, password };
@@ -37,6 +40,7 @@ const insertNonAdminUser = async () => {
3740
lastName,
3841
email,
3942
password: hashedPassword,
43+
isVerified: true,
4044
}).save();
4145

4246
return { email, password };

backend/user-service/tests/setup.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import redisClient from "../config/redis";
33

44
beforeAll(async () => {
55
const mongoUri =
6-
process.env.MONGO_URI_TEST || "mongodb://mongo:mongo@mongo:27017/";
6+
process.env.MONGO_URI_TEST || "mongodb://mongo:mongo@test-mongo:27017/";
77

88
await mongoose.connect(mongoUri, {});
99
await redisClient.connect();

docker-compose-test.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
name: peerprep-test
2+
13
services:
24
test-user-service:
35
image: peerprep/user-service
46
build: ./backend/user-service
57
env_file: ./backend/user-service/.env
6-
environment:
7-
- MONGO_URI_TEST=mongodb://mongo:mongo@mongo:27017/
88
depends_on:
9-
- mongo
10-
- redis
9+
- test-mongo
10+
- test-redis
1111
networks:
1212
- peerprep-network
1313
volumes:
@@ -16,17 +16,17 @@ services:
1616
restart: on-failure
1717
command: ["npm", "test"]
1818

19-
mongo:
19+
test-mongo:
2020
image: mongo
2121
restart: always
2222
networks:
2323
- peerprep-network
2424
env_file:
2525
- ./backend/.env
2626

27-
redis:
27+
test-redis:
2828
image: redis:8.0-M01
29-
container_name: redis
29+
container_name: test-redis
3030
networks:
3131
- peerprep-network
3232
healthcheck:

frontend/src/App.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Routes, Route } from "react-router-dom";
1+
import { Routes, Route, Navigate } from "react-router-dom";
22

33
import NewQuestion from "./pages/NewQuestion";
44
import QuestionDetail from "./pages/QuestionDetail";
@@ -64,10 +64,15 @@ function App() {
6464
</Route>
6565
<Route path="*" element={<PageNotFound />} />
6666
</Route>
67-
<Route path="/auth">
67+
<Route path="auth">
68+
<Route index element={<Navigate to="/auth/login" />} />
6869
<Route path="signup" element={<SignUp />} />
6970
<Route path="login" element={<LogIn />} />
70-
<Route path="verifyEmail/:userId" element={<EmailVerification />} />
71+
<Route
72+
path="verifyEmail/:userId?"
73+
element={<EmailVerification />}
74+
/>
75+
<Route path="*" element={<Navigate to="/auth/login" />} />
7176
</Route>
7277
</Routes>
7378
</MatchProvider>

frontend/src/contexts/AuthContext.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ const AuthProvider: React.FC<{ children?: React.ReactNode }> = (props) => {
6767
.then(() => userClient.post("users/send-verification-email", { email }))
6868
.then((res) => {
6969
navigate(`/auth/verifyEmail/${res.data.data.id}`);
70-
// navigate("/login");
71-
// toast.success(res.data.message);
7270
})
7371
.catch((err) => {
7472
setUser(null);
@@ -89,6 +87,9 @@ const AuthProvider: React.FC<{ children?: React.ReactNode }> = (props) => {
8987
navigate("/home");
9088
})
9189
.catch((err) => {
90+
if (err.response?.data.message === "User not verified.") {
91+
navigate(`/auth/verifyEmail`);
92+
}
9293
setUser(null);
9394
toast.error(err.response?.data.message || err.message);
9495
});

0 commit comments

Comments
 (0)