Skip to content

Commit 1397350

Browse files
committed
Fix error handling if there is no connection to server
1 parent 434de98 commit 1397350

File tree

6 files changed

+196
-49
lines changed

6 files changed

+196
-49
lines changed

back/src/app.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,18 @@ const limiter = rateLimit({
2828
const maxAccounts = config.TEST ? 1000 : 3;
2929
const accountLimiter = rateLimit({
3030
windowMs: 120 * 60 * 1000,
31-
// max: maxAccounts,
32-
max: 1000,
31+
max: maxAccounts,
3332
standardHeaders: true,
3433
legacyHeaders: false,
3534
message: 'Too many accounts created, please try again later.'
3635
});
36+
const loginLimiter = rateLimit({
37+
windowMs: 15 * 60 * 1000,
38+
max: 100,
39+
standardHeaders: true,
40+
legacyHeaders: false,
41+
message: 'Too many account requests, please try again later.'
42+
});
3743

3844
const updateTasks = async () => {
3945
console.log('hi');
@@ -116,7 +122,7 @@ app.use(cookieParser());
116122
app.use(express.json());
117123
app.use(express.static('build'));
118124

119-
app.use('/api/login', limiter, loginRouter);
125+
app.use('/api/login', loginLimiter, loginRouter);
120126
app.use('/api/newUser', accountLimiter, newUserRouter);
121127

122128
app.use(middleware.parseToken);

back/src/models/user.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ interface PassResetDetails {
77
passResetCooldown: number | null,
88
}
99

10-
interface UserTask {
10+
export interface FriendsData {
11+
friendRequests: string[],
12+
friends: string[]
13+
}
14+
15+
export interface UserTask {
1116
id: string,
1217
active: boolean,
1318
startTime: number,
@@ -22,6 +27,7 @@ export interface UserInterface extends mongoose.Document {
2227
emailCode: string | null,
2328
passReset: PassResetDetails,
2429
refreshToken: string | null,
30+
friendsData: FriendsData,
2531
tasks: UserTask[];
2632
}
2733
const userSchema = new mongoose.Schema({
@@ -65,6 +71,16 @@ const userSchema = new mongoose.Schema({
6571
type: String,
6672
default: null
6773
},
74+
friendsData: {
75+
type: {
76+
friendRequests: [String],
77+
friends: [String]
78+
},
79+
default: {
80+
friendRequests: [],
81+
friends: []
82+
}
83+
},
6884
tasks: [{
6985
id: {
7086
type: mongoose.Schema.Types.ObjectId,

back/src/routers/taskRouter.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { countDays, getCurrentEpochInSeconds } from '../utils/dayOfWeekHelper.js
33
import 'express-async-errors';
44
import { AuthenticatedRequest } from 'utils/middleware.js';
55
import Task, { DeadlineOptions, RecurringOptions, TaskInterface } from '../models/task.js';
6-
import { UserInterface } from '../models/user.js';
6+
import User, { UserInterface } from '../models/user.js';
77

88
const taskRouter: Router = express.Router();
99

@@ -43,6 +43,31 @@ taskRouter.get('/current', async (request: AuthenticatedRequest, response: Respo
4343
}
4444
response.status(200).json({ tasks });
4545
});
46+
47+
taskRouter.get('/friend/:username', async (request: AuthenticatedRequest, response: Response) => {
48+
if (!request.user) {
49+
return response.status(401).json({ error: 'User/token not found' });
50+
}
51+
const username = request.params.username;
52+
const user = await User.findOne({ username: { $regex: new RegExp(username, 'i') } });
53+
if (!user) {
54+
return response.status(400).json({ error: 'User does not exist.' });
55+
}
56+
if (!request.user.friendsData.friends.map(friend => friend.toUpperCase() === username.toUpperCase())) {
57+
return response.status(401).json({ error: 'You do not have this user added.' });
58+
}
59+
const tasks: TaskInterface[] = [];
60+
for (const userTask of user.tasks) {
61+
const task = await Task.findById(userTask.id);
62+
if (!task) {
63+
return response.status(404).json({ error: 'Invalid task id' });
64+
}
65+
await checkIfTimeSurpassed(userTask.startTime, task);
66+
tasks.push(task);
67+
}
68+
response.status(200).json({ tasks });
69+
});
70+
4671
taskRouter.post('/newTask', async (request: AuthenticatedRequest, response: Response) => {
4772
const { type, name, discrete, daysOfWeek, deadlineDate, time }: NewUserInfo = request.body;
4873
if (type === null || type === undefined) {

back/src/routers/userRouter.ts

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import express, { Response, Router } from 'express';
22
import 'express-async-errors';
33
import { AuthenticatedRequest } from 'utils/middleware.js';
4+
import User from '../models/user.js';
45

56
const userRouter: Router = express.Router();
67

@@ -16,4 +17,103 @@ userRouter.get('/current', async (request: AuthenticatedRequest, response: Respo
1617
response.status(200).json(user);
1718
});
1819

20+
userRouter.get('/friend/:username', async (request: AuthenticatedRequest, response: Response) => {
21+
if (!request.user) {
22+
return response.status(401).json({ error: 'User/token not found' });
23+
}
24+
const username = request.params.username;
25+
const user = await User.findOne({ username: { $regex: new RegExp(username, 'i') } });
26+
if (!user) {
27+
return response.status(400).json({ error: 'User does not exist.' });
28+
}
29+
if (!request.user.friendsData.friends.map(friend => friend.toUpperCase() === username.toUpperCase())) {
30+
return response.status(401).json({ error: 'You do not have this user added.' });
31+
}
32+
await user.populate({
33+
path: 'tasks.id',
34+
select: '_id name type deadlineOptions recurringOptions discrete daysOfWeek totalTimeToday timeLeftToday daysOld user'
35+
});
36+
response.status(200).json(user);
37+
});
38+
39+
userRouter.post('/sendFriendRequest/:username', async (request: AuthenticatedRequest, response: Response) => {
40+
const username = request.params.username;
41+
console.log(username);
42+
if (!request.user) {
43+
return response.status(401).json({ error: 'User/token not found' });
44+
}
45+
const user = await User.findOne({ username: { $regex: new RegExp(username, 'i') } });
46+
if (!user) {
47+
return response.status(400).json({ error: 'User does not exist.' });
48+
}
49+
if (user.friendsData.friendRequests.includes(request.user.username)) {
50+
return response.status(400).json({ error: 'Friend request already sent.' });
51+
}
52+
if (user.friendsData.friends.includes(request.user.username)) {
53+
return response.status(400).json({ error: 'Friend already added.' });
54+
}
55+
user.friendsData.friendRequests.push(request.user.username);
56+
await user.save();
57+
response.status(200);
58+
});
59+
60+
userRouter.post('/acceptFriendRequest/:username', async (request: AuthenticatedRequest, response: Response) => {
61+
const username = request.params.username;
62+
const user = request.user;
63+
if (!user) {
64+
return response.status(401).json({ error: 'User/token not found' });
65+
}
66+
const requestUser = await User.findOne({ username: { $regex: new RegExp(username, 'i') } });
67+
if (!requestUser) {
68+
return response.status(400).json({ error: 'User does not exist.' });
69+
}
70+
if (!user.friendsData.friendRequests.map(request => request.toUpperCase() === username.toUpperCase())) {
71+
return response.status(400).json({ error: 'User never recieved friend request form this user.' });
72+
}
73+
user.friendsData.friendRequests = user.friendsData.friendRequests.filter(request => request.toUpperCase() !== username.toUpperCase());
74+
requestUser.friendsData.friendRequests = requestUser.friendsData.friendRequests.filter(request => request.toUpperCase() !== user.username.toUpperCase());
75+
user.friendsData.friends.push(username);
76+
requestUser.friendsData.friends.push(user.username);
77+
await user.save();
78+
await requestUser.save();
79+
80+
response.status(200);
81+
});
82+
83+
userRouter.post('/rejectFriendRequest/:username', async (request: AuthenticatedRequest, response: Response) => {
84+
const username = request.params.username.toUpperCase();
85+
const user = request.user;
86+
if (!user) {
87+
return response.status(401).json({ error: 'User/token not found' });
88+
}
89+
if (!user.friendsData.friendRequests.map(friend => friend.toUpperCase() === username)) {
90+
return response.status(400).json({ error: 'User never recieved friend request from this user.' });
91+
}
92+
user.friendsData.friendRequests = user.friendsData.friendRequests.filter(request => request.toUpperCase() !== username);
93+
await user.save();
94+
95+
response.status(200);
96+
});
97+
98+
userRouter.post('/removeFriend/:username', async (request: AuthenticatedRequest, response: Response) => {
99+
const username = request.params.username;
100+
const user = request.user;
101+
if (!user) {
102+
return response.status(401).json({ error: 'User/token not found' });
103+
}
104+
const requestUser = await User.findOne({ username: { $regex: new RegExp(username, 'i') } });
105+
if (!requestUser) {
106+
return response.status(400).json({ error: 'User does not exist.' });
107+
}
108+
if (!user.friendsData.friends.map(friend => friend.toUpperCase() === username.toUpperCase())) {
109+
return response.status(400).json({ error: 'This user was never added.' });
110+
}
111+
user.friendsData.friends = user.friendsData.friends.filter(request => request.toUpperCase() !== username.toUpperCase());
112+
requestUser.friendsData.friends = requestUser.friendsData.friends.filter(request => request.toUpperCase() !== user.username.toUpperCase());
113+
await user.save();
114+
await requestUser.save();
115+
116+
response.status(200);
117+
});
118+
19119
export default userRouter;

back/src/utils/genToken.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface code{
1414
code: string;
1515
}
1616

17-
let expireLong = '7d';
17+
let expireLong = '1d';
1818
let expireShort = '1h';
1919
const expireVeryShort = '10m';
2020

0 commit comments

Comments
 (0)