Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@ COPY --from=datapuller-builder /datapuller/out/package-lock.json ./package-lock.
RUN ["npm", "install"]

COPY --from=datapuller-builder /datapuller/out/full/ .
ENTRYPOINT ["turbo", "run", "main", "--filter=datapuller", "--"]
CMD ["--puller=main"]

FROM datapuller-dev AS datapuller-prod
WORKDIR /datapuller
ENTRYPOINT ["turbo", "run", "main", "--filter=datapuller", "--env-mode=loose", "--"]
ENTRYPOINT ["turbo", "run", "main", "--filter=datapuller"]
CMD ["--", "--puller=decals"]

# backend
FROM base AS backend-builder
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/src/bootstrap/loaders/express.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export default async (
origin: [
config.url,
"http://localhost:8080",
"http://localhost:5173",
"http://localhost:3000",
// TODO: Remove
"https://gn980r4n-8080.usw3.devtunnels.ms",
],
Expand Down
148 changes: 89 additions & 59 deletions apps/backend/src/modules/class/controller.ts
Original file line number Diff line number Diff line change
@@ -1,71 +1,84 @@
import {
ClassModel,
DecalModel,
IClassItem,
ISectionItem,
SectionModel,
} from "@repo/common";

import { formatClass, formatSection } from "./formatter";
import { formatClass, formatDecal, formatSection } from "./formatter";

export const getClass = async (
year: number,
semester: string,
sessionId: string,
subject: string,
courseNumber: string,
number: string
) => {
/**
* Get a class
* @default sessionId "1"
*/
export const getClass = async ({
sessionId = "1",
...options
}: {
year: number;
semester: string;
sessionId: string;
subject: string;
courseNumber: string;
number: string;
}) => {
const _class = await ClassModel.findOne({
year,
semester,
sessionId: sessionId ? sessionId : "1",
subject,
courseNumber,
number,
sessionId,
...options,
}).lean();

console.log(await ClassModel.countDocuments({}));

if (!_class) return null;

return formatClass(_class as IClassItem);
};

export const getSecondarySections = async (
year: number,
semester: string,
sessionId: string,
subject: string,
courseNumber: string,
number: string
) => {
/**
* Get the secondary sections for a class
* - Includes any 999 sections
* - Includes any sections prefixed by the primary section
* - Does not include the primary section
* @default sessionId "1"
*/
export const getSecondarySections = async ({
sessionId = "1",
number,
...options
}: {
year: number;
semester: string;
sessionId: string;
subject: string;
courseNumber: string;
number: string;
}) => {
const sections = await SectionModel.find({
year,
semester,
sessionId: sessionId ? sessionId : "1",
subject,
courseNumber,
number: { $regex: `^(${number[number.length - 1]}|999)` },
...options,
sessionId,
number: { $regex: `^(?:${number[number.length - 1]}\d\d|999)$` },
}).lean();

return sections.map((section) => formatSection(section as ISectionItem));
};

export const getPrimarySection = async (
year: number,
semester: string,
sessionId: string,
subject: string,
courseNumber: string,
number: string
) => {
/**
* Get the primary section for a class
* @default sessionId "1"
*/
export const getPrimarySection = async ({
sessionId = "1",
...options
}: {
year: number;
semester: string;
sessionId: string;
subject: string;
courseNumber: string;
number: string;
}) => {
const section = await SectionModel.findOne({
year,
semester,
sessionId: sessionId ? sessionId : "1",
subject,
courseNumber,
number,
...options,
sessionId,
primary: true,
}).lean();

Expand All @@ -74,24 +87,41 @@ export const getPrimarySection = async (
return formatSection(section as ISectionItem);
};

export const getSection = async (
year: number,
semester: string,
sessionId: string,
subject: string,
courseNumber: string,
number: string
) => {
/**
* Get a section
* @default sessionId "1"
*/
export const getSection = async ({
sessionId = "1",
...options
}: {
year: number;
semester: string;
sessionId?: string;
subject: string;
courseNumber: string;
number: string;
}) => {
const section = await SectionModel.findOne({
year,
semester,
sessionId: sessionId ? sessionId : "1",
subject,
courseNumber,
number,
...options,
sessionId,
}).lean();

if (!section) return null;

return formatSection(section as ISectionItem);
};

export const getDecal = async (options: {
year: number;
semester: string;
subject: string;
courseNumber: string;
number: string;
}) => {
const decal = await DecalModel.findOne(options).lean();

if (!decal) return null;

return formatDecal(decal);
};
9 changes: 8 additions & 1 deletion apps/backend/src/modules/class/formatter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IClassItem, ISectionItem } from "@repo/common";
import { DecalType, IClassItem, IDecal, ISectionItem } from "@repo/common";

import { ClassModule } from "./generated-types/module-types";

Expand Down Expand Up @@ -36,6 +36,7 @@ export const formatClass = (_class: IClassItem) => {
primarySection: null,
sections: null,
gradeDistribution: null,
decal: null,
} as IntermediateClass;

return output;
Expand Down Expand Up @@ -69,3 +70,9 @@ export const formatSection = (section: ISectionItem) => {

return output;
};

export const formatDecal = (decal: DecalType) => {
if (!decal) return null;

return decal as IDecal;
};
86 changes: 56 additions & 30 deletions apps/backend/src/modules/class/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { getTerm } from "../term/controller";
import { TermModule } from "../term/generated-types/module-types";
import {
getClass,
getDecal,
getPrimarySection,
getSecondarySections,
getSection,
Expand Down Expand Up @@ -65,14 +66,14 @@ const resolvers: ClassModule.Resolvers = {
_,
{ year, semester, sessionId, subject, courseNumber, number }
) => {
const _class = await getClass(
const _class = await getClass({
year,
semester,
sessionId,
subject,
courseNumber,
number
);
number,
});

return _class as unknown as ClassModule.Class;
},
Expand All @@ -81,14 +82,14 @@ const resolvers: ClassModule.Resolvers = {
_,
{ year, semester, sessionId, subject, courseNumber, number }
) => {
const section = await getSection(
const section = await getSection({
year,
semester,
sessionId,
subject,
courseNumber,
number
);
number,
});

return section as unknown as ClassModule.Section;
},
Expand All @@ -114,29 +115,35 @@ const resolvers: ClassModule.Resolvers = {
primarySection: async (parent: IntermediateClass | ClassModule.Class) => {
if (parent.primarySection) return parent.primarySection;

const primarySection = await getPrimarySection(
parent.year,
parent.semester,
parent.sessionId,
parent.subject,
parent.courseNumber,
parent.number
);
const { year, semester, sessionId, subject, courseNumber, number } =
parent;

const primarySection = await getPrimarySection({
year,
semester,
sessionId,
subject,
courseNumber,
number,
});

return primarySection as unknown as ClassModule.Section;
},

sections: async (parent: IntermediateClass | ClassModule.Class) => {
if (parent.sections) return parent.sections;

const secondarySections = await getSecondarySections(
parent.year,
parent.semester,
parent.sessionId,
parent.subject,
parent.courseNumber,
parent.number
);
const { year, semester, sessionId, subject, courseNumber, number } =
parent;

const secondarySections = await getSecondarySections({
year,
semester,
sessionId,
subject,
courseNumber,
number,
});

return secondarySections as unknown as ClassModule.Section[];
},
Expand All @@ -157,6 +164,22 @@ const resolvers: ClassModule.Resolvers = {

return gradeDistribution;
},

decal: async (parent: IntermediateClass | ClassModule.Class) => {
if (parent.decal) return parent.decal;

const { year, semester, subject, courseNumber, number } = parent;

const decal = await getDecal({
year,
semester,
subject,
courseNumber,
number,
});

return decal;
},
},

Section: {
Expand All @@ -179,14 +202,17 @@ const resolvers: ClassModule.Resolvers = {
class: async (parent: IntermediateSection | ClassModule.Section) => {
if (parent.class) return parent.class;

const _class = await getClass(
parent.year,
parent.semester,
parent.sessionId,
parent.subject,
parent.courseNumber,
parent.number
);
const { year, semester, sessionId, subject, courseNumber, number } =
parent;

const _class = await getClass({
year,
semester,
sessionId,
subject,
courseNumber,
number,
});

return _class as unknown as ClassModule.Class;
},
Expand Down
Loading