Skip to content

Commit 7d178d7

Browse files
authored
Docs: code formatting (#92)
* Adding rate limiting docs * update rate limiting docs * Resolve conflict * Code formatting --------- Co-authored-by: Wayne <5291640+ringoinca@users.noreply.github.com>
1 parent 4b11cd9 commit 7d178d7

12 files changed

Lines changed: 2671 additions & 2796 deletions

File tree

packages/backend/src/api/controllers/api-key.controller.ts

Lines changed: 56 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,63 @@ import { z } from 'zod';
44
import { config } from '../../config';
55

66
const generateApiKeySchema = z.object({
7-
name: z.string().min(1, 'API kay name must be more than 1 characters').max(255, 'API kay name must not be more than 255 characters'),
8-
expiresInDays: z.number().int().positive('Only positive number is allowed').max(730, "The API key must expire within 2 years / 730 days."),
7+
name: z
8+
.string()
9+
.min(1, 'API kay name must be more than 1 characters')
10+
.max(255, 'API kay name must not be more than 255 characters'),
11+
expiresInDays: z
12+
.number()
13+
.int()
14+
.positive('Only positive number is allowed')
15+
.max(730, 'The API key must expire within 2 years / 730 days.'),
916
});
1017

1118
export class ApiKeyController {
12-
public async generateApiKey(req: Request, res: Response) {
13-
if (config.app.isDemo) {
14-
return res.status(403).json({ message: req.t('errors.demoMode') });
15-
}
16-
try {
17-
const { name, expiresInDays } = generateApiKeySchema.parse(req.body);
18-
if (!req.user || !req.user.sub) {
19-
return res.status(401).json({ message: 'Unauthorized' });
20-
}
21-
const userId = req.user.sub;
22-
23-
const key = await ApiKeyService.generate(userId, name, expiresInDays);
24-
25-
res.status(201).json({ key });
26-
} catch (error) {
27-
if (error instanceof z.ZodError) {
28-
return res.status(400).json({ message: req.t('api.requestBodyInvalid'), errors: error.message });
29-
}
30-
res.status(500).json({ message: req.t('errors.internalServerError') });
31-
}
32-
}
33-
34-
public async getApiKeys(req: Request, res: Response) {
35-
if (!req.user || !req.user.sub) {
36-
return res.status(401).json({ message: 'Unauthorized' });
37-
}
38-
const userId = req.user.sub;
39-
const keys = await ApiKeyService.getKeys(userId);
40-
41-
res.status(200).json(keys);
42-
}
43-
44-
public async deleteApiKey(req: Request, res: Response) {
45-
if (config.app.isDemo) {
46-
return res.status(403).json({ message: req.t('errors.demoMode') });
47-
}
48-
const { id } = req.params;
49-
if (!req.user || !req.user.sub) {
50-
return res.status(401).json({ message: 'Unauthorized' });
51-
}
52-
const userId = req.user.sub;
53-
await ApiKeyService.deleteKey(id, userId);
54-
55-
res.status(204).send({ message: req.t('apiKeys.deleteSuccess') });
56-
}
19+
public async generateApiKey(req: Request, res: Response) {
20+
if (config.app.isDemo) {
21+
return res.status(403).json({ message: req.t('errors.demoMode') });
22+
}
23+
try {
24+
const { name, expiresInDays } = generateApiKeySchema.parse(req.body);
25+
if (!req.user || !req.user.sub) {
26+
return res.status(401).json({ message: 'Unauthorized' });
27+
}
28+
const userId = req.user.sub;
29+
30+
const key = await ApiKeyService.generate(userId, name, expiresInDays);
31+
32+
res.status(201).json({ key });
33+
} catch (error) {
34+
if (error instanceof z.ZodError) {
35+
return res
36+
.status(400)
37+
.json({ message: req.t('api.requestBodyInvalid'), errors: error.message });
38+
}
39+
res.status(500).json({ message: req.t('errors.internalServerError') });
40+
}
41+
}
42+
43+
public async getApiKeys(req: Request, res: Response) {
44+
if (!req.user || !req.user.sub) {
45+
return res.status(401).json({ message: 'Unauthorized' });
46+
}
47+
const userId = req.user.sub;
48+
const keys = await ApiKeyService.getKeys(userId);
49+
50+
res.status(200).json(keys);
51+
}
52+
53+
public async deleteApiKey(req: Request, res: Response) {
54+
if (config.app.isDemo) {
55+
return res.status(403).json({ message: req.t('errors.demoMode') });
56+
}
57+
const { id } = req.params;
58+
if (!req.user || !req.user.sub) {
59+
return res.status(401).json({ message: 'Unauthorized' });
60+
}
61+
const userId = req.user.sub;
62+
await ApiKeyService.deleteKey(id, userId);
63+
64+
res.status(204).send({ message: req.t('apiKeys.deleteSuccess') });
65+
}
5766
}

packages/backend/src/api/middleware/rateLimiter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ export const rateLimiter = rateLimit({
88
max: config.api.rateLimit.max,
99
message: {
1010
status: 429,
11-
message: `Too many requests from this IP, please try again after ${windowInMinutes} minutes`
11+
message: `Too many requests from this IP, please try again after ${windowInMinutes} minutes`,
1212
},
1313
statusCode: 429,
1414
standardHeaders: true,
15-
legacyHeaders: false
15+
legacyHeaders: false,
1616
});

packages/backend/src/api/middleware/requireAuth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export const requireAuth = (authService: AuthService) => {
3232
req.user = {
3333
sub: user.id,
3434
email: user.email,
35-
roles: user.role ? [user.role.name] : []
35+
roles: user.role ? [user.role.name] : [],
3636
};
3737
return next();
3838
}

packages/backend/src/api/routes/api-key.routes.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { requireAuth } from '../middleware/requireAuth';
44
import { AuthService } from '../../services/AuthService';
55

66
export const apiKeyRoutes = (authService: AuthService) => {
7-
const router = Router();
8-
const controller = new ApiKeyController();
7+
const router = Router();
8+
const controller = new ApiKeyController();
99

10-
router.post('/', requireAuth(authService), controller.generateApiKey);
11-
router.get('/', requireAuth(authService), controller.getApiKeys);
12-
router.delete('/:id', requireAuth(authService), controller.deleteApiKey);
10+
router.post('/', requireAuth(authService), controller.generateApiKey);
11+
router.get('/', requireAuth(authService), controller.getApiKeys);
12+
router.delete('/:id', requireAuth(authService), controller.deleteApiKey);
1313

14-
return router;
14+
return router;
1515
};

packages/backend/src/config/api.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import 'dotenv/config';
22

33
export const apiConfig = {
4-
rateLimit: {
5-
windowMs: process.env.RATE_LIMIT_WINDOW_MS ? parseInt(process.env.RATE_LIMIT_WINDOW_MS, 10) : 1 * 60 * 1000, // 1 minutes
6-
max: process.env.RATE_LIMIT_MAX_REQUESTS ? parseInt(process.env.RATE_LIMIT_MAX_REQUESTS, 10) : 100, // limit each IP to 100 requests per windowMs
7-
}
4+
rateLimit: {
5+
windowMs: process.env.RATE_LIMIT_WINDOW_MS
6+
? parseInt(process.env.RATE_LIMIT_WINDOW_MS, 10)
7+
: 1 * 60 * 1000, // 1 minutes
8+
max: process.env.RATE_LIMIT_MAX_REQUESTS
9+
? parseInt(process.env.RATE_LIMIT_MAX_REQUESTS, 10)
10+
: 100, // limit each IP to 100 requests per windowMs
11+
},
812
};

0 commit comments

Comments
 (0)