Skip to content
Open
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
29 changes: 29 additions & 0 deletions apps/backend/src/modules/discussion/controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { DiscussionModel } from "@repo/common";

export const getDiscussions = async (courseNumber: string, email?: string) => {
const filter: any = { courseNumber };
if (email) filter.email = email;
return await DiscussionModel.find(filter);
};

export const addDiscussion = async (
courseNumber: string,
email: string,
content: string
) => {
if (!email) throw new Error("Unauthorized");

if (!courseNumber || !content) {
throw new Error("Course number and content are required.");
}

const newDiscussion = new DiscussionModel({
courseNumber,
email,
content,
});

await newDiscussion.save();

return newDiscussion;
};
9 changes: 9 additions & 0 deletions apps/backend/src/modules/discussion/formatter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { IDiscussionItem } from "@repo/common";

export function formatDiscussion(discussion: IDiscussionItem) {
return { ...discussion };
}

export const formatDiscussions = (discussions: IDiscussionItem[]) => {
return discussions.map(formatDiscussion);
};
7 changes: 7 additions & 0 deletions apps/backend/src/modules/discussion/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import resolver from "./resolver";
import typeDef from "./typedefs/discussion";

export default {
resolver,
typeDef,
};
27 changes: 27 additions & 0 deletions apps/backend/src/modules/discussion/resolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { addDiscussion, getDiscussions } from "./controller";
import { DiscussionModule } from "./generated-types/module-types";

const resolvers: DiscussionModule.Resolvers = {
Query: {
discussions: async (
_: any,
{ courseNumber, email }: { courseNumber: string; email?: string | null }
) => {
return getDiscussions(courseNumber, email ?? undefined);
},
},
Mutation: {
addDiscussion: async (
_: any,
{
courseNumber,
email,
content,
}: { courseNumber: string; email: string; content: string }
) => {
return addDiscussion(courseNumber, email, content);
},
},
};

export default resolvers;
22 changes: 22 additions & 0 deletions apps/backend/src/modules/discussion/typedefs/discussion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { gql } from "graphql-tag";

export default gql`
type Query {
discussions(courseNumber: String!, email: String): [Discussion!]!
}

type Discussion {
email: String!
courseNumber: String!
createdAt: String!
content: String!
}

type Mutation {
addDiscussion(
email: String!
courseNumber: String!
content: String!
): Discussion!
}
`;
2 changes: 2 additions & 0 deletions apps/backend/src/modules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Catalog from "./catalog";
import Class from "./class";
import Common from "./common";
import Course from "./course";
import Discussion from "./discussion";
import Enrollment from "./enrollment";
import GradeDistribution from "./grade-distribution";
import Schedule from "./schedule";
Expand All @@ -20,6 +21,7 @@ const modules = [
Course,
Class,
Enrollment,
Discussion,
];

export const resolvers = merge(modules.map((module) => module.resolver));
Expand Down
22 changes: 22 additions & 0 deletions packages/common/src/models/discussion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Model, Schema, model } from "mongoose";

export interface IDiscussionItem {
email: string;
courseNumber: string;
createdAt: string;
content: string;
}

const discussionSchema = new Schema<IDiscussionItem>({
email: { type: String, required: true },
courseNumber: { type: String, required: true },
createdAt: { type: String, default: () => new Date().toISOString() },
content: { type: String, required: true },
});

discussionSchema.index({ courseNumber: 1 });

export const DiscussionModel: Model<IDiscussionItem> = model<IDiscussionItem>(
"discussions",
discussionSchema
);
1 change: 1 addition & 0 deletions packages/common/src/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ export * from "./course";
export * from "./section";
export * from "./grade-distribution";
export * from "./enrollment-history";
export * from "./discussion";