Skip to content

Commit 749a55d

Browse files
authored
fix: routes/announcements: check duplicate name when creating (#73)
1 parent 99af0cf commit 749a55d

File tree

4 files changed

+31
-0
lines changed

4 files changed

+31
-0
lines changed

src/v2/routes/announcements/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { assertWithSchema, JSONSchemaType } from '../../utils/validation';
44
import { ERROR_CODE, GeneralError } from '../../utils/common-errors';
55
import { mustBeAdmin } from '../../utils/role-verification';
66
import { getTotalAnnouncements } from './utils';
7+
import dbw from '../../utils/database-gateway-wrapper';
78

89
// #region GET /api/v2/announcements
910

@@ -75,6 +76,13 @@ const createAnnouncementParamsSchema: JSONSchemaType<CreateAnnouncementParams> =
7576
async function createAnnouncement(req: Request, res: Response, next: NextFunction) {
7677
try {
7778
const { name, title, description } = assertWithSchema(req.body, createAnnouncementParamsSchema);
79+
if ((await dbw.announcements.getAnnouncementOrUndefined(name)) !== undefined) {
80+
throw new GeneralError({
81+
error: ERROR_CODE.ANNOUNCEMENT_EXISTED,
82+
error_msg: 'Announcement name already existed',
83+
data: { name },
84+
});
85+
}
7886
const { error, error_msg, data } = await db.announcements.createAnnouncements({
7987
name: name,
8088
title: title,

src/v2/utils/common-errors/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export const ERROR_CODE = {
44
DATABASE_GATEWAY_ERROR: 500125,
55
ROLE_MUST_BE_ADMIN: 500256,
66
ROUTE_NOT_FOUND: 500349,
7+
ANNOUNCEMENT_NOT_FOUND: 500500,
78
USER_NOT_FOUND: 500425,
89
CONTEST_NOT_FOUND: 500555,
910
CONTEST_CANNOT_ENTER: 500595,
@@ -16,6 +17,7 @@ export const ERROR_CODE = {
1617
WRONG_OLD_PASSWORD: 500835,
1718
USERNAME_EXISTED: 500850,
1819
EMAIL_EXISTED: 500900,
20+
ANNOUNCEMENT_EXISTED: 501000,
1921
UNAUTHORIZED: 501401,
2022
OTP_INCORRECT: 501509,
2123
JWT_INVALID: 502001,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import db from '../../database-gateway';
2+
import { ERROR_CODE, GeneralError } from '../../common-errors';
3+
import { GetAnnouncementsData } from '../../database-gateway/announcements';
4+
5+
export async function getAnnouncementOrUndefined(announcement_name: string) {
6+
const { error, error_msg, data } = await db.announcements.getAnnouncements({
7+
offset: 0,
8+
limit: 1,
9+
announcement_name: announcement_name,
10+
});
11+
if (error || !data) {
12+
throw new GeneralError({
13+
error: ERROR_CODE.DATABASE_GATEWAY_ERROR,
14+
error_msg: 'Received non-zero code from Database Gateway when getting contests',
15+
data: { response: { error, error_msg, data } },
16+
});
17+
}
18+
return data.items[0] || undefined;
19+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import * as contests from './components/contests';
22
import * as participations from './components/participations';
33
import * as users from './components/users';
4+
import * as announcements from './components/announcement';
45

56
const dbw = {
67
contests,
78
participations,
89
users,
10+
announcements,
911
};
1012

1113
export default dbw;

0 commit comments

Comments
 (0)