Skip to content

Commit

Permalink
start rating module
Browse files Browse the repository at this point in the history
  • Loading branch information
PineND committed Oct 28, 2024
1 parent b57206b commit 8f16396
Show file tree
Hide file tree
Showing 10 changed files with 140 additions and 29 deletions.
2 changes: 2 additions & 0 deletions apps/backend/src/modules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Common from "./common";
import Course from "./course";
import Enrollment from "./enrollment";
import GradeDistribution from "./grade-distribution";
import Rating from "./rating";
import Schedule from "./schedule";
import Term from "./term";
import User from "./user";
Expand All @@ -20,6 +21,7 @@ const modules = [
Course,
Class,
Enrollment,
Rating,
];

export const resolvers = merge(modules.map((module) => module.resolver));
Expand Down
9 changes: 9 additions & 0 deletions apps/backend/src/modules/rating/controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { RatingType } from '@repo/common';

export async function getRatingsByClass(): Promise<null> {
return null;
}

export async function createRating(rating: RatingType): Promise<null> {
rating;
}
Empty file.
7 changes: 7 additions & 0 deletions apps/backend/src/modules/rating/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import resolver from "./resolver";
import typeDef from "./typedefs/rating";

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

const typedef = gql`
type HistogramEntry {
value: Int!
count: Int!
class: String!
}
type ClassHistogram {
class: Class
histogram: [HistogramEntry!]
}
type RatingSummary {
name: String!
class_histogram: [ClassHistogram!]
overall_histogram: [HistogramEntry!]
totalCount: Int!
average: Float!
}
type Rating {
class: Class!
name: String!
value: Int!
}
type Query {
rating(name: String!, subject: String!, number: String!): RatingSummary!
user_ratings(subject: String!, number: String!): [Rating] @auth
}
type CreateRatingInput {
class: String!
name: String!
value: Int!
}
type Mutation {
createRating(rating: CreateRatingInput): @auth
deleteRating(): @auth
}
`;

export default typedef;
56 changes: 28 additions & 28 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"eslint": "^8.56.0",
"patch-package": "^8.0.0",
"prettier": "^3.3.3",
"turbo": "^2.0.9"
"turbo": "^2.2.3"
},
"name": "berkeleytime"
}
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,4 +6,5 @@ export * from "./term";
export * from "./course";
export * from "./course";
export * from "./section";
export * from "./rating";
export * from "./grade-distribution";
52 changes: 52 additions & 0 deletions packages/common/src/models/rating.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import mongoose, { InferSchemaType, Schema } from "mongoose";

const ratingSchema = new Schema({
_id: Schema.Types.ObjectId,
google_id: {
type: String,
trim: true,
required: true,
immutable: true,
select: false,
},
email: {
type: String,
trim: true,
required: true,
immutable: true,
},
class: {
type: Schema.Types.ObjectId,
ref: 'Class',
required: true,
immutable: true
},
// likert int 1 -> 5 values
// boolean 0/1 values
// string properties assign hash code
value: {
type: Number,
required: true,
validate: {
validator: Number.isInteger,
}
},
// indicate value type (granularity: specific questions)
value_type: {
type: String,
required: true,
}
}, {
timestamps: {
createdAt: "createdAt",
updatedAt: "updatedAt",
},
});

export const RatingModel = mongoose.model(
"crowdsource_rating",
ratingSchema,
"crowdsource_rating"
);

export type RatingType = InferSchemaType<typeof ratingSchema>;

0 comments on commit 8f16396

Please sign in to comment.