extend schema @queryLimits(maxCost: 500, maxDepth: 12, defaultPageSize: 50, maxPageSize: 200) @rateLimit(max: 300, window: 60) """ The weight that this schema member adds to the cost of a query, as defined by the IBM GraphQL Cost Directives specification. """ directive @cost( """ The cost that each appearance adds, as a serialized Float. """ weight: String! ) on ARGUMENT_DEFINITION | ENUM | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | OBJECT | SCALAR """ The size of the list that a field returns, as defined by the IBM GraphQL Cost Directives specification. """ directive @listSize( """ The maximum length of the list. """ assumedSize: Int """ Whether a query must give exactly one of the slicing arguments. """ requireOneSlicingArgument: Boolean = true """ The subfields whose list length the size sets, instead of this field. """ sizedFields: [String!] """ The arguments whose value sets the length of the list. """ slicingArguments: [String!] ) on FIELD_DEFINITION """ Limits that the server checks before it runs a query. The server rejects a query that costs more than maxCost or nests deeper than maxDepth. The cost follows the @cost and @listSize directives. """ directive @queryLimits( """ The page size of a connection when a query gives no first or last. """ defaultPageSize: Int! """ The highest cost that the server runs. """ maxCost: Int! """ The deepest nesting that the server runs. """ maxDepth: Int! """ The largest page that a connection returns. """ maxPageSize: Int! ) on SCHEMA """ The server accepts at most max requests from one IP address in each window of seconds. The GraphQL and REST catalog APIs share this limit. Every response sends the RateLimit and RateLimit-Policy headers, and a 429 response sends Retry-After. """ directive @rateLimit( """ The number of requests allowed in one window. """ max: Int! """ The length of the window, in seconds. """ window: Int! ) on SCHEMA """ A campus building """ type Building { abbreviation: String! @cost(weight: "1") formalName: String @cost(weight: "1") name: String! @cost(weight: "1") } """ One course, such as COMP 2350, across terms, with Banner's description and prerequisites """ type Course { """ e.g. "COMP 2350" """ code: String! @cost(weight: "1") corequisites: JSON! @cost(weight: "1") courseNumber: Int! @cost(weight: "1") creditHours: Int @cost(weight: "1") description: String @cost(weight: "1") """ An and/or tree of courses and placement tests. Each course has its code, title, and linked. """ prerequisites: JSON @cost(weight: "1") restrictions: JSON! @cost(weight: "1") subjectCode: String! @cost(weight: "1") title: String @cost(weight: "1") """ fall, spring, or summer """ typicallyOffered: [String!]! @cost(weight: "1") """ Courses that list this one as a prerequisite """ unlocks: [Course!]! @cost(weight: "5") } """ The connection type for Course. """ type CourseConnection { """ A list of edges. """ edges: [CourseEdge] @cost(weight: "1") """ A list of nodes. """ nodes: [Course] @cost(weight: "1") """ Information to aid in pagination. """ pageInfo: PageInfo! @cost(weight: "1") """ Total matching records, ignoring pagination """ totalCount: Int! @cost(weight: "1") } """ An edge in a connection. """ type CourseEdge { """ A cursor for use in pagination. """ cursor: String! @cost(weight: "1") """ The item at the end of the edge. """ node: Course @cost(weight: "1") } """ A day a section meets """ enum DayOfWeekEnum { """ Friday """ FRIDAY """ Monday """ MONDAY """ Saturday """ SATURDAY """ Sunday """ SUNDAY """ Thursday """ THURSDAY """ Tuesday """ TUESDAY """ Wednesday """ WEDNESDAY } """ The scheduled final exam for a section """ type FinalExam { date: ISO8601Date! @cost(weight: "1") endTime: String! @cost(weight: "1") location: String @cost(weight: "1") startTime: String! @cost(weight: "1") } """ An ISO 8601-encoded date """ scalar ISO8601Date @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") """ A faculty member who teaches sections """ type Instructor { department: String @cost(weight: "1") firstName: String! @cost(weight: "1") lastName: String! @cost(weight: "1") name: String! @cost(weight: "1") pubId: String! @cost(weight: "1") rmp: RmpRating @cost(weight: "1") school: String @cost(weight: "1") """ Instructors who teach something close to what this one teaches """ similar(limit: Int = 10): [Instructor!]! @cost(weight: "10") @listSize(assumedSize: 50, slicingArguments: ["limit"], requireOneSlicingArgument: false) title: String @cost(weight: "1") } """ The connection type for Instructor. """ type InstructorConnection { """ A list of edges. """ edges: [InstructorEdge] @cost(weight: "1") """ A list of nodes. """ nodes: [Instructor] @cost(weight: "1") """ Information to aid in pagination. """ pageInfo: PageInfo! @cost(weight: "1") """ Total matching records, ignoring pagination """ totalCount: Int! @cost(weight: "1") } """ An edge in a connection. """ type InstructorEdge { """ A cursor for use in pagination. """ cursor: String! @cost(weight: "1") """ The item at the end of the edge. """ node: Instructor @cost(weight: "1") } """ Represents untyped JSON """ scalar JSON """ Sections that Banner requires a student to register together, most often a lecture and its lab. """ type LinkedSections { """ CRNs of the partner sections in the same term. Empty when the section stands alone. """ crns: [Int!]! @cost(weight: "1") """ Banner's link identifier, e.g. "A1" for a lecture and "B1" for its labs. """ identifier: String @cost(weight: "1") """ Each list is one set of partner CRNs to take together. Pick any one set. """ options: [[Int!]!]! @cost(weight: "1") """ Public ids of the same partner sections, in the same order as crns. """ pubIds: [String!]! @cost(weight: "1") """ True when Banner marks this section as part of a pairing. """ required: Boolean! @cost(weight: "1") """ "banner": Banner's own pairs. "link_identifier": a guess from the link identifiers, used until Banner's pairs are fetched. The guess can be wrong. """ source: String! @cost(weight: "1") } """ The building and rooms a meeting is held in """ type Location { building: Building! @cost(weight: "1") """ Human-readable building and room, e.g. "WAT 307" """ display: String @cost(weight: "1") rooms: [Room!]! @cost(weight: "1") } """ One weekly meeting of a section """ type MeetingTime { allDay: Boolean! @cost(weight: "1") """ 24-hour HH:MM """ beginTime: String! @cost(weight: "1") beginTime12h: String! @cost(weight: "1") day: DayOfWeekEnum! @cost(weight: "1") """ 0 (Sunday) through 6 (Saturday) """ dayOfWeek: Int! @cost(weight: "1") durationMinutes: Int! @cost(weight: "1") """ 24-hour HH:MM """ endTime: String! @cost(weight: "1") endTime12h: String! @cost(weight: "1") """ Null when the section has no room assigned, as with online sections """ location: Location @cost(weight: "1") meetingType: String! @cost(weight: "1") } """ Information about pagination in a connection. """ type PageInfo { """ When paginating forwards, the cursor to continue. """ endCursor: String @cost(weight: "1") """ When paginating forwards, are there more items? """ hasNextPage: Boolean! @cost(weight: "1") """ When paginating backwards, are there more items? """ hasPreviousPage: Boolean! @cost(weight: "1") """ When paginating backwards, the cursor to continue. """ startCursor: String @cost(weight: "1") } """ Public, read-only WIT course catalog """ type Query { """ One course by code, such as "COMP 2350", across terms """ course(code: String!): Course @cost(weight: "1") """ Courses (not sections) by code or title words """ courses( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int q: String """ Subject codes, e.g. ["COMP"] """ subject: [String!] """ Only courses with a section in this term """ termUid: Int ): CourseConnection! @cost(weight: "1") @listSize(assumedSize: 200, slicingArguments: ["first", "last"], sizedFields: ["edges", "nodes"], requireOneSlicingArgument: false) """ Faculty who teach at least one section """ instructors( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Each word must match the first, last, or display name """ q: String """ Rank q by meaning instead of by the literal name. A query can run one semantic search. """ semantic: Boolean = false termUid: Int ): InstructorConnection! @cost(weight: "1") @listSize(assumedSize: 200, slicingArguments: ["first", "last"], sizedFields: ["edges", "nodes"], requireOneSlicingArgument: false) """ Rate My Professors reviews of WIT instructors """ reviews( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ An instructor public id """ instructor: String """ Returns the last _n_ elements from the list. """ last: Int """ Free text over the comment and the course """ q: String """ Rank q by meaning instead of by the literal words. A query can run one semantic search. """ semantic: Boolean = false """ "positive" or "negative" """ sentiment: String ): ReviewConnection! @cost(weight: "1") @listSize(assumedSize: 200, slicingArguments: ["first", "last"], sizedFields: ["edges", "nodes"], requireOneSlicingArgument: false) """ Checks a set of sections taken together: time conflicts, linked lecture and lab pairs, the same course twice, and totals """ scheduleCheck( """ At most 30 """ crns: [Int!]! termUid: Int! ): ScheduleCheck! @cost(weight: "1") """ One section by CRN. Pass term_uid when a CRN repeats across terms. """ section(crn: Int!, termUid: Int): Section @cost(weight: "1") """ Course sections matching the given filters """ sections( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: SectionFilterInput """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int ): SectionConnection! @cost(weight: "1") @listSize(assumedSize: 200, slicingArguments: ["first", "last"], sizedFields: ["edges", "nodes"], requireOneSlicingArgument: false) """ Subjects offered, with section counts """ subjects(termUid: Int): [Subject!]! @cost(weight: "1") """ One term by its Banner code """ term(uid: Int!): Term @cost(weight: "1") """ All known terms, newest first """ terms: [Term!]! @cost(weight: "1") } """ One Rate My Professors review of a WIT instructor """ type Review { clarityRating: Int @cost(weight: "1") comment: String! @cost(weight: "1") courseName: String @cost(weight: "1") difficultyRating: Int @cost(weight: "1") instructor: Instructor @cost(weight: "1") pubId: String! @cost(weight: "1") ratedOn: ISO8601Date @cost(weight: "1") sentiment: String! @cost(weight: "1") """ Where the text comes from, for credit and for a link back """ source: String! @cost(weight: "1") tags: [String!]! @cost(weight: "1") thumbsDown: Int @cost(weight: "1") thumbsUp: Int @cost(weight: "1") wouldTakeAgain: Boolean @cost(weight: "1") } """ The connection type for Review. """ type ReviewConnection { """ A list of edges. """ edges: [ReviewEdge] @cost(weight: "1") """ A list of nodes. """ nodes: [Review] @cost(weight: "1") """ Information to aid in pagination. """ pageInfo: PageInfo! @cost(weight: "1") """ Total matching records, ignoring pagination """ totalCount: Int! @cost(weight: "1") } """ An edge in a connection. """ type ReviewEdge { """ A cursor for use in pagination. """ cursor: String! @cost(weight: "1") """ The item at the end of the edge. """ node: Review @cost(weight: "1") } """ Aggregate Rate My Professors statistics for an instructor """ type RmpRating { avgDifficulty: Float @cost(weight: "1") avgRating: Float @cost(weight: "1") id: String @cost(weight: "1") numRatings: Int @cost(weight: "1") wouldTakeAgainPercent: Float @cost(weight: "1") } """ A room inside a campus building """ type Room { building: Building @cost(weight: "1") floor: Int @cost(weight: "1") number: String! @cost(weight: "1") } """ The result of checking a set of sections together (Catalog::ScheduleCheck) """ type ScheduleCheck { cancelled: [Int!]! @cost(weight: "1") conflicts: [ScheduleConflict!]! @cost(weight: "1") duplicates: [ScheduleDuplicate!]! @cost(weight: "1") linkProblems: [ScheduleLinkProblem!]! @cost(weight: "1") """ CRNs that are not in the term """ notFound: [Int!]! @cost(weight: "1") sections: [ScheduleSection!]! @cost(weight: "1") term: Term! @cost(weight: "1") totals: ScheduleTotals! @cost(weight: "1") } """ Two sections that meet at the same time on the same day, during overlapping dates """ type ScheduleConflict { crns: [Int!]! @cost(weight: "1") day: String! @cost(weight: "1") """ The two meetings, as HH:MM-HH:MM """ times: [String!]! @cost(weight: "1") } """ The same course chosen twice with the same schedule type """ type ScheduleDuplicate { """ e.g. "COMP 2350" """ courseCode: String! @cost(weight: "1") crns: [Int!]! @cost(weight: "1") } """ A linked section (a lecture or its lab) that the schedule cannot register as it is """ type ScheduleLinkProblem { crn: Int! @cost(weight: "1") message: String! @cost(weight: "1") partnerCrns: [Int!]! @cost(weight: "1") partnerOptions: [[Int!]!]! @cost(weight: "1") """ "missing_partner": add every CRN of one partnerOptions set. "unverified_link": Banner's pairs are not stored yet and no partner is known; check it in LeopardWeb. """ problem: String! @cost(weight: "1") """ "banner" or "link_identifier", as in LinkedSections """ source: String! @cost(weight: "1") } """ One weekly meeting of a section in a schedule check """ type ScheduleMeeting { """ HH:MM, 24-hour """ beginTime: String! @cost(weight: "1") """ e.g. "monday" """ day: String! @cost(weight: "1") """ HH:MM, 24-hour """ endTime: String! @cost(weight: "1") } """ A section in a schedule check """ type ScheduleSection { """ e.g. "COMP 2350-3B" """ courseCode: String! @cost(weight: "1") creditHours: Int @cost(weight: "1") crn: Int! @cost(weight: "1") meetingTimes: [ScheduleMeeting!]! @cost(weight: "1") scheduleType: String! @cost(weight: "1") title: String! @cost(weight: "1") } """ Totals for the week """ type ScheduleTotals { """ Banner's credits for linked sections (a lab is 0); a course without them counts once """ creditHours: Int! @cost(weight: "1") days: [String!]! @cost(weight: "1") earliestStart: String @cost(weight: "1") latestEnd: String @cost(weight: "1") """ Weekly meetings that start before 9:00 """ meetingsBeforeNine: Int! @cost(weight: "1") } """ How a section is delivered """ enum ScheduleTypeEnum { """ extension """ EXTENSION """ hybrid in-person and online """ HYBRID """ independent study """ INDEPENDENT_STUDY """ laboratory hands-on """ LABORATORY """ lecture """ LECTURE """ online asynchronous """ ONLINE """ online blended """ ONLINE_BLENDED """ online synchronous lab """ ONLINE_SYNC_LAB """ online synchronous lecture """ ONLINE_SYNC_LECTURE """ rotating laboratory """ ROTATING_LAB """ rotating lecture """ ROTATING_LECTURE """ study abroad """ STUDY_ABROAD """ study away domestic """ STUDY_AWAY_DOMESTIC } """ Academic season """ enum SeasonEnum { """ Fall """ FALL """ Spring """ SPRING """ Summer """ SUMMER } """ Seat counts for a section, from Banner. A nightly job refreshes them, so they can be up to a day old. They are not a real-time count. """ type Seats { """ Seats still open. Null when Banner returned no enrollment data. """ available: Int @cost(weight: "1") """ Total seats in the section. Null when Banner returned no enrollment data. """ capacity: Int @cost(weight: "1") } """ One course section, identified by its CRN within a term """ type Section { """ The course across terms, with the description and prerequisites. Null until Banner's details are loaded. """ course: Course @cost(weight: "1") """ e.g. "COMP 2000-01" """ courseCode: String! @cost(weight: "1") courseNumber: Int! @cost(weight: "1") creditHours: Int @cost(weight: "1") crn: Int! @cost(weight: "1") """ The course description """ description: String @cost(weight: "1") endDate: ISO8601Date! @cost(weight: "1") finalExam: FinalExam @cost(weight: "1") gradeMode: String @cost(weight: "1") instructors: [Instructor!]! @cost(weight: "1") linked: LinkedSections! @cost(weight: "1") meetingTimes: [MeetingTime!]! @cost(weight: "1") """ The course prerequisites, as on course """ prerequisites: JSON @cost(weight: "1") pubId: String! @cost(weight: "1") scheduleType: ScheduleTypeEnum! @cost(weight: "1") """ Banner code, e.g. "LEC" """ scheduleTypeCode: String! @cost(weight: "1") seats: Seats! @cost(weight: "1") sectionNumber: String! @cost(weight: "1") """ Sections in the same term that teach something close to this one """ similar(limit: Int = 10): [Section!]! @cost(weight: "10") @listSize(assumedSize: 50, slicingArguments: ["limit"], requireOneSlicingArgument: false) startDate: ISO8601Date! @cost(weight: "1") status: String! @cost(weight: "1") """ e.g. "Computer Science (COMP)" """ subject: String! @cost(weight: "1") """ e.g. "COMP" """ subjectCode: String! @cost(weight: "1") term: Term! @cost(weight: "1") title: String! @cost(weight: "1") } """ The connection type for Section. """ type SectionConnection { """ A list of edges. """ edges: [SectionEdge] @cost(weight: "1") """ A list of nodes. """ nodes: [Section] @cost(weight: "1") """ Information to aid in pagination. """ pageInfo: PageInfo! @cost(weight: "1") """ Total matching records, ignoring pagination """ totalCount: Int! @cost(weight: "1") } """ An edge in a connection. """ type SectionEdge { """ A cursor for use in pagination. """ cursor: String! @cost(weight: "1") """ The item at the end of the edge. """ node: Section @cost(weight: "1") } """ Filters for the sections query. Every field is optional. """ input SectionFilterInput { """ Drop sections with any meeting before this time (HH:MM) """ beginsAfter: String courseNumber: [Int!] creditHours: [Int!] crns: [Int!] """ Drop sections with any meeting ending after this time (HH:MM) """ endsBefore: String """ Drop sections meeting on any of these days """ freeDays: [DayOfWeekEnum!] includeCancelled: Boolean = false instructor: String """ Keep sections meeting on at least one of these days """ meetsOn: [DayOfWeekEnum!] """ Public ids, which stay unique across terms """ pubIds: [String!] """ Free text over title, subject, and number """ q: String scheduleTypes: [ScheduleTypeEnum!] """ Rank q by meaning instead of by the literal words. Falls back to the literal match when semantic search is off. A query can run one semantic search. """ semantic: Boolean = false """ Subject label or short code, e.g. "COMP" """ subject: [String!] termUid: Int } """ A subject with the number of sections offered """ type Subject { code: String! @cost(weight: "1") sectionCount: Int! @cost(weight: "1") subject: String! @cost(weight: "1") } """ An academic term """ type Term { endDate: ISO8601Date @cost(weight: "1") """ e.g. "Fall 2026" """ name: String! @cost(weight: "1") season: SeasonEnum! @cost(weight: "1") sectionCount: Int! @cost(weight: "1") startDate: ISO8601Date @cost(weight: "1") """ Banner term code, e.g. 202710 """ uid: Int! @cost(weight: "1") year: Int! @cost(weight: "1") }