Skip to content

Commit 472dafd

Browse files
committed
Add loggers, refactor, add JWT_SECRET to github actions
1 parent 56851ed commit 472dafd

File tree

8 files changed

+34
-31
lines changed

8 files changed

+34
-31
lines changed

.github/workflows/pipeline.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ jobs:
2828
echo CLOUDINARY_NAME=${{ secrets.CLOUDINARY_NAME }} >> .env
2929
echo CLOUDINARY_API_KEY=${{ secrets.CLOUDINARY_API_KEY }} >> .env
3030
echo CLOUDINARY_API_SECRET=${{ secrets.CLOUDINARY_API_SECRET }} >> .env
31+
echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env
3132
- name: npm install
3233
run: npm install
3334
- name: lint
3435
run: npm run lint
3536
- name: test
36-
run: npm test -- auth
37+
run: npm test
3738
test_lint_frontend:
3839
runs-on: ubuntu-20.04
3940
defaults:
@@ -57,7 +58,8 @@ jobs:
5758
echo DEV_MONGODB_URI=${{ secrets.DEV_MONGODB_URI }} >> .env
5859
echo CLOUDINARY_NAME=${{ secrets.CLOUDINARY_NAME }} >> .env
5960
echo CLOUDINARY_API_KEY=${{ secrets.CLOUDINARY_API_KEY }} >> .env
60-
echo CLOUDINARY_API_SECRET=${{ secrets.CLOUDINARY_API_SECRET }} >> .env
61+
echo CLOUDINARY_API_SECRET=${{ secrets.CLOUDINARY_API_SECRET }} >> .env'
62+
echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env
6163
npm install
6264
- name: cypress tests
6365
uses: cypress-io/github-action@v2

backend/src/app.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import userRouter from './routes/users';
99
import authRouter from './routes/auth';
1010
import testRouter from './routes/tests';
1111
import likeRouter from './routes/likes';
12-
import { errorHandler } from './utils/middleware';
12+
import { errorHandler, logErrorCodes } from './utils/middleware';
1313

1414
const { NODE_ENV } = process.env;
1515
const app = express();
@@ -22,6 +22,8 @@ if (NODE_ENV === 'development') {
2222
})();
2323
}
2424

25+
app.use(logErrorCodes);
26+
2527
app.get('/health', (_req, res) => {
2628
res.send('ok');
2729
});

backend/src/routes/comments.ts

-4
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ router.get('/', async (req, res, next) => {
3131
return res.send(comments);
3232
} catch (error) {
3333
const errorMessage = logger.getErrorMessage(error);
34-
logger.error(errorMessage);
3534

3635
if (/not found/i.test(errorMessage)) {
3736
return res.status(404).send({ error: errorMessage });
@@ -51,7 +50,6 @@ router.get('/:parentCommentId', async (req, res, next) => {
5150
return res.send(replies);
5251
} catch (error) {
5352
const errorMessage = logger.getErrorMessage(error);
54-
logger.error(errorMessage);
5553

5654
if (/not found/i.test(errorMessage)) {
5755
return res.status(404).send({ error: errorMessage });
@@ -77,7 +75,6 @@ router.post('/', authenticator(), async (req, res, next) => {
7775
return res.status(201).end();
7876
} catch (error) {
7977
const errorMessage = logger.getErrorMessage(error);
80-
logger.error(errorMessage);
8178

8279
if (/not found/i.test(errorMessage)) {
8380
return res.status(404).send({ error: errorMessage });
@@ -100,7 +97,6 @@ router.delete('/:commentId', authenticator(), async (req, res, next) => {
10097
return res.status(204).end();
10198
} catch (error) {
10299
const errorMessage = logger.getErrorMessage(error);
103-
logger.error(errorMessage);
104100

105101
if (/not found/i.test(errorMessage)) {
106102
return res.status(404).send({ error: errorMessage });

backend/src/routes/likes.ts

-13
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ router.post('/', authenticator(), async (req, res, next) => {
1818
return res.status(201).end();
1919
} catch (error) {
2020
const errorMessage = logger.getErrorMessage(error);
21-
logger.error(errorMessage);
2221

2322
if (/not found/i.test(errorMessage)) {
2423
return res.status(404).send({ error: errorMessage });
@@ -44,9 +43,6 @@ router.delete('/:entityId', authenticator(), async (req, res, next) => {
4443

4544
return res.status(204).end();
4645
} catch (error) {
47-
const errorMessage = logger.getErrorMessage(error);
48-
logger.error(errorMessage);
49-
5046
return next(error);
5147
}
5248
});
@@ -59,9 +55,6 @@ router.get('/:entityId/likeCount', async (req, res, next) => {
5955

6056
return res.status(200).send({ likeCount });
6157
} catch (error) {
62-
const errorMessage = logger.getErrorMessage(error);
63-
logger.error(errorMessage);
64-
6558
return next(error);
6659
}
6760
});
@@ -74,9 +67,6 @@ router.get('/:entityId/likes', async (req, res, next) => {
7467

7568
return res.status(200).send({ likes });
7669
} catch (error) {
77-
const errorMessage = logger.getErrorMessage(error);
78-
logger.error(errorMessage);
79-
8070
return next(error);
8171
}
8272
});
@@ -90,9 +80,6 @@ router.get('/:entityId/hasLiked', authenticator(), async (req, res, next) => {
9080

9181
return res.status(200).send({ hasLiked });
9282
} catch (error) {
93-
const errorMessage = logger.getErrorMessage(error);
94-
logger.error(errorMessage);
95-
9683
return next(error);
9784
}
9885
});

backend/src/routes/posts.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@ router.post('/', authenticator(), async (req, res, next) => {
2626
try {
2727
newPostFields = fieldParsers.proofPostFields(req.body);
2828
} catch (error) {
29-
logger.error(logger.getErrorMessage(error));
3029
return res.status(400).send({ error: logger.getErrorMessage(error) });
3130
}
3231

3332
try {
3433
image = await cloudinary.upload(newPostFields.imageDataUrl);
3534
} catch (error) {
36-
logger.error(logger.getErrorMessage(error));
3735
return res.status(500).send({ error: 'Something went wrong uploading the photo!' });
3836
}
3937

@@ -46,7 +44,6 @@ router.post('/', authenticator(), async (req, res, next) => {
4644
await user.save();
4745
return res.status(201).send(savedPost);
4846
} catch (error) {
49-
logger.error(logger.getErrorMessage(error));
5047
return next(error);
5148
}
5249
});
@@ -57,7 +54,6 @@ router.put('/:id', authenticator(), async (req, res, next) => {
5754
try {
5855
if (updatedPostFields.caption) updatedPostFields.caption = parseStringField(updatedPostFields.caption, 'caption');
5956
} catch (error) {
60-
logger.error(logger.getErrorMessage(error));
6157
return res.status(400).send({ error: logger.getErrorMessage(error) });
6258
}
6359

@@ -70,7 +66,7 @@ router.put('/:id', authenticator(), async (req, res, next) => {
7066
return res.status(200).send(updatedPost);
7167
} catch (error) {
7268
const errorMessage = logger.getErrorMessage(error);
73-
logger.error(errorMessage);
69+
7470
if (errorMessage === 'Unauthorized') return res.status(401).send({ error: errorMessage });
7571

7672
return next(error);
@@ -83,7 +79,6 @@ router.delete('/:id', authenticator(), async (req, res, next) => {
8379
return res.status(204).end();
8480
} catch (error) {
8581
const errorMessage = logger.getErrorMessage(error);
86-
logger.error(errorMessage);
8782

8883
if (/unauthorized/i.test(errorMessage)) {
8984
return res.status(401).send({ error: errorMessage });

backend/src/routes/users.ts

-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ router.put('/:id/follow', authenticator(), async (req, res, next) => {
9696
return res.status(200).end();
9797
} catch (error) {
9898
const errorMessage = logger.getErrorMessage(error);
99-
logger.error(errorMessage);
10099
const errorResponseObj = { error: errorMessage };
101100

102101
if (/user not found/i.test(errorMessage)) return res.status(404).send(errorResponseObj);

backend/src/utils/middleware.ts

+25-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ export const authenticator = () => (
4343
export const errorHandler = (error: Error, _req: Request, res: Response, next: NextFunction) => {
4444
const errorMessage = logger.getErrorMessage(error);
4545

46-
if (process.env.NODE_ENV !== 'test') {
47-
logger.error(errorMessage);
48-
}
46+
logger.error({
47+
errorMessage,
48+
name: error.name,
49+
message: error.message,
50+
stack: error.stack,
51+
});
4952

5053
if (error.name === 'CastError') {
5154
return res.status(400).send({ error: 'malformatted id' });
@@ -65,3 +68,22 @@ export const errorHandler = (error: Error, _req: Request, res: Response, next: N
6568

6669
return next(error);
6770
};
71+
72+
export function logErrorCodes(req: Request, res:Response, next: NextFunction) {
73+
const originalSend = res.send.bind(res);
74+
75+
res.send = function logIfError(data) {
76+
if (res.statusCode >= 400) {
77+
logger.error({
78+
method: req.method,
79+
url: req.originalUrl,
80+
statusCode: res.statusCode,
81+
errorMessage: data,
82+
});
83+
}
84+
85+
return originalSend(data);
86+
};
87+
88+
next();
89+
}

backend/test/auth-api.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('successful login', () => {
2727
});
2828
});
2929

30-
test.only('responds with 200 code and returns JSON', async () => {
30+
test('responds with 200 code and returns JSON', async () => {
3131
await api
3232
.post(LOGIN_URL)
3333
.send({ username: testUser.username, password: 'secret' })

0 commit comments

Comments
 (0)