Skip to content

Commit 72f24ce

Browse files
Cleanup & add spec to event router
1 parent 3c233ed commit 72f24ce

21 files changed

+630
-821
lines changed

src/common/schemas.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ export const SuccessResponseSchema = z.object({
44
success: z.literal(true),
55
});
66

7+
export const UserIdSchema = z.string().openapi("UserId", {
8+
description: "Id of a specific user. Can start with github or google.",
9+
example: "github1234",
10+
});
11+
12+
export const EventIdSchema = z.string().openapi("EventId", { example: "event1" });
13+
714
/**
815
* Creates a error object and schema zod given a error type and message
916
* @param params the error type and message

src/database/event-db.ts

Lines changed: 0 additions & 96 deletions
This file was deleted.

src/database/models.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { AuthInfo } from "../services/auth/auth-schemas";
55
import { AttendeeFollowing, AttendeeProfile } from "./attendee-db";
66
import { AdmissionDecision } from "./admission-db";
77
import { MentorOfficeHours } from "./mentor-db";
8-
import { Event, EventAttendance, EventFollowers } from "./event-db";
8+
import { Event, EventAttendance, EventFollowers } from "../services/event/event-schemas";
99
import { NewsletterSubscription } from "../services/newsletter/newsletter-schemas";
1010
import { RegistrationApplication } from "./registration-db";
1111
import { ShopItem } from "../services/shop/shop-schemas";

src/services/auth/auth-router.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ import Models from "../../database/models";
3636
import { RouterError } from "../../middleware/error-handler";
3737
import specification, { Tag } from "../../middleware/specification";
3838
import { z } from "zod";
39-
import { UserIdSchema, UserNotFoundError, UserNotFoundErrorSchema } from "../user/user-schemas";
39+
import { UserNotFoundError, UserNotFoundErrorSchema } from "../user/user-schemas";
40+
import { UserIdSchema } from "../../common/schemas";
4041

4142
passport.use(
4243
Provider.GITHUB,

src/services/auth/auth-schemas.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { prop } from "@typegoose/typegoose";
22
import { z } from "zod";
33
import { Device } from "../../common/config";
4-
import { UserIdSchema } from "../user/user-schemas";
4+
import { UserIdSchema } from "../../common/schemas";
55
import { CreateErrorAndSchema } from "../../common/schemas";
66

77
export class AuthInfo {

src/services/event/event-formats.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { isArrayOfType, isBoolean, isEnumOfType, isNumber, isObject, isString } from "../../common/formatTools";
22
import Config from "../../common/config";
3-
import { Event, Location } from "../../database/event-db";
3+
import { Event, Location } from "./event-schemas";
44
import { PUBLIC_EVENT_TYPE, STAFF_EVENT_TYPE } from "./event-models";
55

66
export function isValidEvent(event: Event): boolean {

src/services/event/event-lib.ts

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,43 @@
1-
import { PUBLIC_EVENT_TYPE, FilteredEventView } from "./event-models";
2-
import { Event } from "../../database/event-db";
1+
import { FilterQuery } from "mongoose";
2+
import { Role } from "../auth/auth-schemas";
3+
import { Event, PublicEvent } from "./event-schemas";
34

45
/**
5-
* Truncates a InternalEvent object to create an ExternalEvent by omitting
6-
* the 'isPrivate', 'displayOnStaffCheckIn', and 'isStaff' properties.
7-
*
8-
* @param baseEvent The object to convert into a public event.
9-
* @returns The truncated ExternalEvent object.
6+
* Truncates a event into a public event by removing metadata (namely exp)
7+
* @param event The event to filter
8+
* @returns The filtered event
109
*/
11-
export function createFilteredEventView(baseEvent: Event): FilteredEventView {
12-
const publicEvent: FilteredEventView = {
13-
eventId: baseEvent.eventId,
14-
name: baseEvent.name,
15-
description: baseEvent.description,
16-
startTime: baseEvent.startTime,
17-
endTime: baseEvent.endTime,
18-
locations: baseEvent.locations,
19-
sponsor: baseEvent.sponsor,
20-
eventType: baseEvent.eventType as PUBLIC_EVENT_TYPE,
21-
points: baseEvent.points ?? 0,
22-
isAsync: baseEvent.isAsync,
23-
mapImageUrl: baseEvent.mapImageUrl,
24-
isPro: baseEvent.isPro ?? false,
10+
export function filterEvent(event: Event): PublicEvent {
11+
return {
12+
eventId: event.eventId,
13+
isStaff: event.isStaff,
14+
name: event.name,
15+
description: event.description,
16+
startTime: event.startTime,
17+
endTime: event.endTime,
18+
eventType: event.eventType,
19+
locations: event.locations,
20+
isAsync: event.isAsync,
21+
mapImageUrl: event.mapImageUrl,
22+
sponsor: event.sponsor,
23+
points: event.points,
24+
isPrivate: event.isPrivate,
25+
displayOnStaffCheckIn: event.displayOnStaffCheckIn,
26+
isPro: event.isPro,
2527
};
26-
return publicEvent;
28+
}
29+
30+
/**
31+
* Returns a filter query to filter out events that the roles specified cannot access
32+
* @param roles The roles to restrict by
33+
* @returns A filter query to restrict events based on roles
34+
*/
35+
export function restrictEventsByRoles(roles: Role[]): FilterQuery<Event> {
36+
if (roles.includes(Role.STAFF)) {
37+
return {};
38+
} else if (roles.includes(Role.PRO)) {
39+
return { isPrivate: false, isStaff: false };
40+
} else {
41+
return { isPrivate: false, isStaff: false, isPro: false };
42+
}
2743
}

src/services/event/event-models.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Enum representing the type of the event
22

3-
import { Location } from "../../database/event-db";
3+
import { Location } from "./event-schemas";
44

55
// MEAL, SPEAKER, WORKSHOP, MINIEVENT, QNA, or OTHER
66
export enum PUBLIC_EVENT_TYPE {

src/services/event/event-router.test.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, it, beforeEach } from "@jest/globals";
2-
import { EventFollowers } from "../../database/event-db";
2+
import { EventFollowers } from "./event-schemas";
33
import { AttendeeFollowing } from "../../database/attendee-db";
44
import Models from "../../database/models";
55
import { StatusCode } from "status-code-enum";
@@ -23,9 +23,9 @@ beforeEach(async () => {
2323

2424
describe("GET /event/followers/", () => {
2525
it("gives an forbidden error for a non-staff user", async () => {
26-
const response = await getAsAttendee(`/event/followers/`)
27-
.send({ eventId: TESTER_EVENT_FOLLOWERS.eventId })
28-
.expect(StatusCode.ClientErrorForbidden);
26+
const response = await getAsAttendee(`/event/followers/${TESTER_EVENT_FOLLOWERS.eventId}/`).expect(
27+
StatusCode.ClientErrorForbidden,
28+
);
2929

3030
expect(JSON.parse(response.text)).toHaveProperty("error", "Forbidden");
3131
});
@@ -35,17 +35,15 @@ describe("GET /event/followers/", () => {
3535
eventId: TESTER_EVENT_FOLLOWERS.eventId,
3636
});
3737

38-
const response = await getAsStaff(`/event/followers/`)
39-
.send({ eventId: TESTER_EVENT_FOLLOWERS.eventId })
40-
.expect(StatusCode.ClientErrorNotFound);
38+
const response = await getAsStaff(`/event/followers/${TESTER_EVENT_FOLLOWERS.eventId}/`).expect(
39+
StatusCode.ClientErrorNotFound,
40+
);
4141

42-
expect(JSON.parse(response.text)).toHaveProperty("error", "EventNotFound");
42+
expect(JSON.parse(response.text)).toHaveProperty("error", "NotFound");
4343
});
4444

4545
it("works for a staff user", async () => {
46-
const response = await getAsStaff(`/event/followers/`)
47-
.send({ eventId: TESTER_EVENT_FOLLOWERS.eventId })
48-
.expect(StatusCode.SuccessOK);
46+
const response = await getAsStaff(`/event/followers/${TESTER_EVENT_FOLLOWERS.eventId}/`).expect(StatusCode.SuccessOK);
4947

5048
expect(JSON.parse(response.text)).toMatchObject({
5149
eventId: TESTER_EVENT_FOLLOWERS.eventId,

0 commit comments

Comments
 (0)