19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/frontend/src/app/login/page.tsx:
--------------------------------------------------------------------------------
1 | // If returning user -> Home
2 | // If new user -> Signup
3 |
4 | import { Navbar } from "@/components/Navbar";
5 | import Link from "next/link";
6 |
7 | export default function Login() {
8 | return (
9 |
10 |
11 |
12 |
13 |
Login Page
14 |
15 |
16 |
19 |
20 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/frontend/src/app/signup/page.tsx:
--------------------------------------------------------------------------------
1 | // Fill out signup data
2 | // get started -> Home
3 |
4 | import { Navbar } from "@/components/Navbar";
5 | import Link from "next/link";
6 |
7 | export default function Signup() {
8 | return (
9 |
10 |
11 |
12 |
13 |
Signup Page
14 |
15 |
16 |
19 |
20 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/services/professor-rating/src/main/java/edu/uga/devdogs/syllabus_scraper/SemesterInfo.java:
--------------------------------------------------------------------------------
1 | public class SemesterInfo {
2 | private String semesterCode;
3 | private String semesterName;
4 |
5 | public SemesterInfo(String semesterCode, String semesterName) {
6 | this.semesterCode = semesterCode;
7 | this.semesterName = semesterName;
8 | }
9 |
10 | public String getSemesterCode() {
11 | return semesterCode;
12 | }
13 |
14 | public void setSemesterCode(String semesterCode) {
15 | this.semesterCode = semesterCode;
16 | }
17 |
18 | public String getSemesterName() {
19 | return semesterName;
20 | }
21 |
22 | public void setSemesterName(String semesterName) {
23 | this.semesterName = semesterName;
24 | }
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/frontend/public/images/removeButton.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/Section.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.Algorithm.records;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Represents a section of a course, including the course code, CRN, professor, and associated classes.
7 | *
8 | * @param courseCode The course code for the course associated with this section.
9 | * @param crn The course reference number (CRN) for this section.
10 | * @param professor The professor teaching this section.
11 | * @param classes The array of classes associated with this section.
12 | */
13 | public record Section(String courseCode,
14 | int crn,
15 | Professor professor,
16 | List classes) {
17 | }
18 |
--------------------------------------------------------------------------------
/algorithm-prototyping/src/main/resources/scripts/generate_buildings_outline.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | courses = []
4 |
5 | with open("courses.json", "r") as courses_json:
6 | courses = json.load(courses_json)
7 |
8 | buildings = []
9 |
10 | for course in courses:
11 | for section in course["sections"]:
12 | for _class in section["classes"]:
13 | building_name = _class["building_name"]
14 | if not any(building["name"] == building_name for building in buildings):
15 | building_dict = {
16 | "name": building_name,
17 | "x": 0,
18 | "y": 0
19 | }
20 | buildings.append(building_dict)
21 |
22 | with open("buildings.json", "w") as buildings_json:
23 | json.dump(buildings, buildings_json, indent=2)
--------------------------------------------------------------------------------
/services/course-information/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.application.name=course-information
2 |
3 |
4 | spring.datasource.url=jdbc:mysql://optimalscheduledatabase.cj6soes8wsjl.us-east-2.rds.amazonaws.com:3306/CourseInformation
5 | spring.datasource.username= ${DB_USERNAME}
6 | spring.datasource.password= ${DB_PASSWORD}
7 |
8 |
9 | spring.jpa.hibernate.ddl-auto= create
10 | spring.jpa.show-sql=false
11 | spring.jpa.properties.hibernate.format_sql=true
12 | logging.level.org.hibernate.type.descriptor.sql=trace
13 |
14 |
15 | spring.jackson.serialization.INDENT_OUTPUT=true
16 | spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=false
17 | spring.jackson.default-property-inclusion=non-null
18 |
19 | pdf.input.dir=/home/ec2-user/input
20 |
21 |
22 | # will control when we update the building
23 | update.buildings= true
24 |
--------------------------------------------------------------------------------
/frontend/src/app/route-map/page.tsx:
--------------------------------------------------------------------------------
1 | // Returning User: option to return Home or return Schedule View
2 | // New User: option to return Home or returen Schdeule View
3 | import { Navbar } from "@/components/Navbar";
4 | import Link from "next/link";
5 |
6 | export default function RouteMap() {
7 | return (
8 |
9 |
10 |
11 |
12 |
Route Map Page
13 |
14 |
15 |
18 |
19 |
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/Professor/ProfessorRepository.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.Professor;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 | import org.springframework.data.jpa.repository.Query;
5 | import org.springframework.stereotype.Repository;
6 |
7 | @Repository
8 | public interface ProfessorRepository extends JpaRepository {
9 | @Query("SELECT p FROM Professor p WHERE p.professorId = ?1")
10 | Professor findById(int id);
11 |
12 | @Query("SELECT p FROM Professor p WHERE p.lastName = ?1")
13 | Professor findByLastName(String lastName);
14 |
15 | Professor findByLastNameAndFirstNameIgnoreCase(String lastName, String firstName);
16 |
17 | Professor findByLastNameAndDepartment(String lastName, String department);
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/controller/TestController.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.controller;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.jdbc.core.JdbcTemplate;
5 | import org.springframework.web.bind.annotation.GetMapping;
6 | import org.springframework.web.bind.annotation.RestController;
7 |
8 | @RestController
9 | public class TestController {
10 |
11 | @Autowired
12 | private JdbcTemplate jdbcTemplate;
13 |
14 | @GetMapping("/test-db")
15 | public String testDatabase() {
16 | try {
17 | jdbcTemplate.execute("SELECT 1");
18 | return "Database connection is working!";
19 | } catch (Exception e) {
20 | return "Database connection failed: " + e.getMessage();
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/exceptions/CourseNotFoundException.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.exceptions;
2 |
3 | public class CourseNotFoundException extends RuntimeException {
4 |
5 | //constructor for course not found
6 | public CourseNotFoundException() {
7 | super("Course not found.");
8 | }
9 |
10 | //constructor for course not found with message
11 | public CourseNotFoundException(String message) {
12 | super(message);
13 | }
14 |
15 | //constructor for course not found with message and cause
16 | public CourseNotFoundException(String message, Throwable cause) {
17 | super(message, cause);
18 | }
19 |
20 | //constructor for course not found with cause
21 | public CourseNotFoundException(Throwable cause) {
22 | super(cause);
23 | }
24 | }
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/exceptions/ProfessorNotFoundException.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.exceptions;
2 |
3 | public class ProfessorNotFoundException extends RuntimeException {
4 |
5 | //constructor for professor not found
6 | public ProfessorNotFoundException() {
7 | super("Professor details not found.");
8 | }
9 |
10 | //constructor for professor not found with message
11 | public ProfessorNotFoundException(String message) {
12 | super(message);
13 | }
14 |
15 | // constructor for professor not found with message and cause
16 | public ProfessorNotFoundException(String message, Throwable cause) {
17 | super(message, cause);
18 | }
19 |
20 | // constructor for professor not found with cause
21 | public ProfessorNotFoundException(Throwable cause) {
22 | super(cause);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/Section.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.sampledataparser.records;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * Represents a section of a course, including the course code, CRN, professor, and associated classes.
9 | *
10 | * @param courseCode The course code for the course associated with this section.
11 | * @param crn The course reference number (CRN) for this section.
12 | * @param professor The professor teaching this section.
13 | * @param classes The array of classes associated with this section.
14 | */
15 | public record Section(String courseCode,
16 | int crn,
17 | @SerializedName("professor_name") Professor professor,
18 | List classes) {
19 | }
20 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/Schedule/ScheduleRepository.java:
--------------------------------------------------------------------------------
1 | // package edu.uga.devdogs.course_information.Schedule;
2 |
3 | // import org.example.collegeSchedule.entity.Schedule;
4 | // import org.springframework.data.jpa.repository.JpaRepository;
5 | // import org.springframework.stereotype.Repository;
6 |
7 | // import java.util.List;
8 |
9 | // @Repository
10 | // public interface ScheduleRepository extends JpaRepository {
11 |
12 | // // Custom Query Methods
13 | // List findByUserId(Long userId);
14 |
15 | // List findByNameContaining(String name);
16 |
17 | // List findByRatingGreaterThanEqual(double rating);
18 |
19 | // List findByHoursBetween(int minHours, int maxHours);
20 |
21 | // List findByAvgWalkTimeLessThanEqual(int maxAvgWalkTime);
22 | // }
23 |
--------------------------------------------------------------------------------
/algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/Distances.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.sampledataparser.records;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * Represents the distances between buildings on campus.
9 | * It contains an array of building names and a distance matrix where each element represents
10 | * the distance between two buildings. The index of a building in the buildings array matches
11 | * its index in the matrix.
12 | *
13 | * @param buildings The array of building names.
14 | * @param matrix The distance matrix where matrix[i][j] is the distance between buildings[i] and buildings[j].
15 | */
16 | public record Distances(List buildings,
17 | @SerializedName("distance_matrix")
18 | List> matrix) {
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/src/types/scheduleTypes.ts:
--------------------------------------------------------------------------------
1 | interface ClassData {
2 | classTitle: string;
3 | className: string;
4 | description: string;
5 | locationLong: string;
6 | locationShort: string;
7 | prereq: string;
8 | coreq: string;
9 | professor: string;
10 | semester: string;
11 |
12 | credits: number;
13 | crn: number;
14 | openSeats: number;
15 | maxSeats: number;
16 | waitlist: number;
17 |
18 | bgColor: string;
19 | borderColor: string;
20 |
21 | timeStart: string;
22 | timeEnd: string;
23 | timeDifference: number | null; // Optional, can be number or null
24 |
25 | currentDay: string;
26 | otherTimes: [string, string, string]; // Used to support classes with two or more locations/times
27 | }
28 |
29 | type DaySchedule = Record;
30 |
31 | type WeekSchedule = Record;
32 |
33 | export type { ClassData, DaySchedule, WeekSchedule };
34 |
--------------------------------------------------------------------------------
/services/professor-rating/src/main/java/edu/uga/devdogs/professor_rating/services/RateMyProfessorService.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.professor_rating.services;
2 | import org.springframework.stereotype.Service;
3 |
4 |
5 | /**
6 | * Service class that handles business logic for the RateMyProfessor (RMP) service
7 | *
8 | *
9 | * This Service layer acts as an intermediary between the Controller layer
10 | * and the database. It is responsible for fetching, processing, and transforming data.
11 | *
12 | */
13 | @Service
14 | public class RateMyProfessorService {
15 | /**
16 | * Placeholder business logic method for future implementation.
17 | * This method will handle tasks related to data fetching, transformation,
18 | * and interaction between the database and the API.
19 | */
20 | public void someBusinessLogic() {
21 | // Service logic goes here
22 | }
23 | }
--------------------------------------------------------------------------------
/algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/SConstraints.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.sampledataparser.records;
2 |
3 | import java.time.DayOfWeek;
4 | import java.time.LocalTime;
5 |
6 | /**
7 | * Representation of the soft constraints considered by the user
8 | *
9 | * @param gapDay The preferred day for a gap.
10 | * @param prefStartTime The preferred time to start their first course of the day.
11 | * @param prefEndTime The preferred time to start their last course of the day.
12 | * @param showFilledClasses Whether a user wants to exclude full sections from their schedule
13 | *
14 | */
15 | public record SConstraints(
16 | DayOfWeek gapDay,
17 | LocalTime prefStartTime,
18 | LocalTime prefEndTime,
19 | boolean showFilledClasses) {
20 | }
21 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/exceptions/BuildingNotFoundException.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.exceptions;
2 |
3 | public class BuildingNotFoundException extends RuntimeException {
4 |
5 | //constructor for building not found.
6 | public BuildingNotFoundException() {
7 | super("Building Not Found");
8 | }
9 |
10 | //constructor for building not found with a message.
11 | public BuildingNotFoundException(String message) {
12 | super(message);
13 | }
14 |
15 | //constructor for building not found with a message and cause.
16 | public BuildingNotFoundException(String message, Throwable cause) {
17 | super(message, cause);
18 | }
19 |
20 | //constructor for building not found with a cause.
21 | public BuildingNotFoundException(Throwable cause) {
22 | super(cause);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/frontend/src/app/past-credits/page.tsx:
--------------------------------------------------------------------------------
1 | // Returning User: -> Schedule View (\schedules)
2 | // New User: -> Schedule View (\schedules)
3 |
4 | // make class blocks clickable to access more
5 | import { Navbar } from "@/components/Navbar";
6 | import Link from "next/link";
7 |
8 | export default function PastCredits() {
9 | return (
10 |
11 |
12 |
13 |
14 |
Past Credits Page
15 |
16 |
19 |
20 |
21 |
22 |
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/SConstraints.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.Algorithm.records;
2 |
3 | import java.time.DayOfWeek;
4 | import java.time.LocalTime;
5 |
6 | /**
7 | * Representation of the soft constraints considered by the user
8 | *
9 | * @param gapDay The preferred day for a gap.
10 | * @param prefStartTime The preferred time to start their first course of the day.
11 | * @param prefEndTime The preferred time to start their last course of the day.
12 | * @param showFilledClasses Whether a user wants to exclude full sections from their schedule
13 | *
14 | */
15 | public record SConstraints(
16 | DayOfWeek gapDay,
17 | LocalTime prefStartTime,
18 | LocalTime prefEndTime,
19 | boolean showFilledClasses) {
20 | }
21 |
--------------------------------------------------------------------------------
/frontend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "esModuleInterop": true,
4 | "skipLibCheck": true,
5 | "target": "es2022",
6 | "allowJs": true,
7 | "resolveJsonModule": true,
8 | "moduleDetection": "force",
9 | "isolatedModules": true,
10 | "strict": true,
11 | "noUncheckedIndexedAccess": true,
12 | "checkJs": true,
13 | "lib": ["dom", "dom.iterable", "ES2024"],
14 | "noEmit": true,
15 | "module": "ESNext",
16 | "moduleResolution": "Bundler",
17 | "jsx": "preserve",
18 | "plugins": [
19 | {
20 | "name": "next"
21 | }
22 | ],
23 | "incremental": true,
24 | "baseUrl": ".",
25 | "paths": {
26 | "@/*": ["./src/*"]
27 | }
28 | },
29 | "include": [
30 | ".eslintrc.cjs",
31 | "next-env.d.ts",
32 | "**/*.ts",
33 | "**/*.tsx",
34 | "**/*.cjs",
35 | "**/*.js",
36 | ".next/types/**/*.ts"
37 | ],
38 | "exclude": ["node_modules"]
39 | }
40 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/exceptions/SectionDetailsNotFoundException.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.exceptions;
2 |
3 | public class SectionDetailsNotFoundException extends RuntimeException {
4 |
5 | // Constructor for section details not found
6 | public SectionDetailsNotFoundException() {
7 | super("Section details not found.");
8 | }
9 |
10 |
11 | // Constructor for section details not found with message
12 | public SectionDetailsNotFoundException(String message) {
13 | super(message);
14 | }
15 |
16 | // Constructor for section details not found with message and cause
17 | public SectionDetailsNotFoundException(String message, Throwable cause) {
18 | super(message, cause);
19 | }
20 |
21 | // Constructor for section details not found with cause
22 | public SectionDetailsNotFoundException(Throwable cause) {
23 | super(cause);
24 | }
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/frontend/src/app/plans/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Suspense } from "react";
4 | import ScheduleDisplay from "@/components/schedules/ScheduleDisplay";
5 | import background from "../../../../public/images/background.png";
6 |
7 | interface Props {
8 | params: {
9 | id: string;
10 | };
11 | }
12 |
13 | // Page for viewing a generated schedule / saved plan
14 | export default function SchedulePage({ params }: Props) {
15 | // Render the schedule
16 | return (
17 |
23 | {/* Schedule display container */}
24 |
25 | Loading...
}>
26 |
27 |
28 |
29 |
30 | );
31 | }
32 |
--------------------------------------------------------------------------------
/algorithm-prototyping/src/main/resources/scripts/generate_distances.py:
--------------------------------------------------------------------------------
1 | import json
2 | # Read buildings.json and store data as a dictionary
3 | with open('buildings.json', 'r') as file:
4 | data = json.load(file)
5 | # Initialize output dictionary with buildings array and distance matrix
6 | distanceData = {}
7 | #Calculate distance matrix and update output dictionary
8 | for building1 in data:
9 | distanceData[building1['name']] = {}
10 | for building2 in data:
11 | # Calculate distance between two buildings using formula: distance = sqrt(a^2 + b^2)
12 | # Where 'a' is the difference in x-coordinates and 'b' is the difference in y-coordinates
13 | dist = ((building1['x']-building2['x']) ** 2 + (building1['y']-building2['y']) ** 2) ** 0.5
14 |
15 | distanceData[building1['name']][building2['name']] = dist
16 | # Serializing json
17 | output = json.dumps(distanceData, indent=4)
18 |
19 | # Writing to distance_matrix.json
20 | with open('distances.json', 'w') as file:
21 | file.write(output)
--------------------------------------------------------------------------------
/frontend/src/components/RecommendedCourse.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Button } from "./ui/Button";
4 |
5 | interface props {
6 | course?: string;
7 | courseNumber?: string;
8 | professor?: string;
9 | handleClick?: () => void;
10 | }
11 |
12 | export function RecommendedCourse({
13 | course,
14 | courseNumber,
15 | professor,
16 | handleClick,
17 | }: props) {
18 | return (
19 |
20 |
28 |
29 | );
30 | }
31 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/webscraping/ProfessorRating.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.webscraping;
2 |
3 | public class ProfessorRating {
4 | private final String name;
5 | private final String department;
6 | private final double avgRating;
7 | private final int numRatings;
8 |
9 | public ProfessorRating(String name, String department, double avgRating, int numRatings) {
10 | this.name = name;
11 | this.department = department;
12 | this.avgRating = avgRating;
13 | this.numRatings = numRatings;
14 | }
15 |
16 | public String getName() { return name; }
17 | public String getDepartment() { return department; }
18 | public double getAvgRating() { return avgRating; }
19 | public int getNumRatings() { return numRatings; }
20 |
21 | @Override
22 | public String toString() {
23 | return name + " (" + department + ") — Rating: " + avgRating + " [" + numRatings + " ratings]";
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/services/bulletin/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | # Licensed to the Apache Software Foundation (ASF) under one
2 | # or more contributor license agreements. See the NOTICE file
3 | # distributed with this work for additional information
4 | # regarding copyright ownership. The ASF licenses this file
5 | # to you under the Apache License, Version 2.0 (the
6 | # "License"); you may not use this file except in compliance
7 | # with the License. You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied. See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | wrapperVersion=3.3.2
18 | distributionType=only-script
19 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
20 |
--------------------------------------------------------------------------------
/services/coursicle/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | # Licensed to the Apache Software Foundation (ASF) under one
2 | # or more contributor license agreements. See the NOTICE file
3 | # distributed with this work for additional information
4 | # regarding copyright ownership. The ASF licenses this file
5 | # to you under the Apache License, Version 2.0 (the
6 | # "License"); you may not use this file except in compliance
7 | # with the License. You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied. See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | wrapperVersion=3.3.2
18 | distributionType=only-script
19 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
20 |
--------------------------------------------------------------------------------
/services/optimize/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | # Licensed to the Apache Software Foundation (ASF) under one
2 | # or more contributor license agreements. See the NOTICE file
3 | # distributed with this work for additional information
4 | # regarding copyright ownership. The ASF licenses this file
5 | # to you under the Apache License, Version 2.0 (the
6 | # "License"); you may not use this file except in compliance
7 | # with the License. You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied. See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | wrapperVersion=3.3.2
18 | distributionType=only-script
19 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
20 |
--------------------------------------------------------------------------------
/services/course-information/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | # Licensed to the Apache Software Foundation (ASF) under one
2 | # or more contributor license agreements. See the NOTICE file
3 | # distributed with this work for additional information
4 | # regarding copyright ownership. The ASF licenses this file
5 | # to you under the Apache License, Version 2.0 (the
6 | # "License"); you may not use this file except in compliance
7 | # with the License. You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied. See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | wrapperVersion=3.3.2
18 | distributionType=only-script
19 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
20 |
--------------------------------------------------------------------------------
/services/professor-rating/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | # Licensed to the Apache Software Foundation (ASF) under one
2 | # or more contributor license agreements. See the NOTICE file
3 | # distributed with this work for additional information
4 | # regarding copyright ownership. The ASF licenses this file
5 | # to you under the Apache License, Version 2.0 (the
6 | # "License"); you may not use this file except in compliance
7 | # with the License. You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied. See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | wrapperVersion=3.3.2
18 | distributionType=only-script
19 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
20 |
--------------------------------------------------------------------------------
/algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/HConstraints.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.sampledataparser.records;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Representation of the hard constraints considered by the user
7 | *
8 | * @param excludedCourses The courses the user does not want to take.
9 | * @param excludedSections The sections the user does not want to take.
10 | * @param campus The campus the user attends.
11 | * @param minCreditHours The minimum number of credit hours the user wants to take.
12 | * @param maxCreditHours The maximum number of credit hours the user wants to take.
13 | * @param walking The user uses walking as a means of transportation.
14 | *
15 | */
16 | public record HConstraints(List excludedCourses,
17 | List excludedSections,
18 | String campus,
19 | int minCreditHours,
20 | int maxCreditHours,
21 | boolean walking) {
22 | }
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/HConstraints.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.Algorithm.records;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Representation of the hard constraints considered by the user
7 | *
8 | * @param excludedCourses The courses the user does not want to take.
9 | * @param excludedSections The sections the user does not want to take.
10 | * @param campus The campus the user attends.
11 | * @param minCreditHours The minimum number of credit hours the user wants to take.
12 | * @param maxCreditHours The maximum number of credit hours the user wants to take.
13 | * @param walking The user uses walking as a means of transportation.
14 | *
15 | */
16 | public record HConstraints(List excludedCourses,
17 | List excludedSections,
18 | String campus,
19 | int minCreditHours,
20 | int maxCreditHours,
21 | boolean walking) {
22 | }
--------------------------------------------------------------------------------
/frontend/src/app/generate-schedule/page.tsx:
--------------------------------------------------------------------------------
1 | import { Navbar } from "@/components/Navbar";
2 | import Link from "next/link";
3 |
4 | export default function GenerateSchedules() {
5 | return (
6 |
13 |
14 | {/* Right side button */}
15 |
19 |
20 | Get Started
21 |
22 |
23 |
37 |
38 |
39 |
40 | );
41 | }
42 |
--------------------------------------------------------------------------------
/services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/schedule/ClassComparator.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.course_information.Algorithm.schedule;
2 |
3 | import edu.uga.devdogs.course_information.Algorithm.records.Class;
4 |
5 | import java.util.Comparator;
6 |
7 | /**
8 | * A comparator for comparing two Class objects.
9 | * The comparison is primarily based on the start time of the class.
10 | * If the start times are the same, the comparison falls back to using the CRN.
11 | */
12 | public class ClassComparator implements Comparator {
13 |
14 | /**
15 | * Compares two Class objects based on their start time.
16 | * If the start times are the same, it compares them based on their CRN.
17 | *
18 | * @param class1 the first Class to compare
19 | * @param class2 the second Class to compare
20 | * @return a negative integer, zero, or a positive integer as the first Class
21 | * is less than, equal to, or greater than the second Class.
22 | */
23 | @Override
24 | public int compare(Class class1, Class class2) {
25 | // Compare based on start time
26 | int timeComparison = class1.startTime().compareTo(class2.startTime());
27 | if (timeComparison != 0) {
28 | return timeComparison;
29 | }
30 |
31 | // If start times are the same, compare by CRN as a fallback
32 | return Integer.compare(class1.crn(), class2.crn());
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/frontend/src/app/questionnaire/page.tsx:
--------------------------------------------------------------------------------
1 | // Returning User: -> Past Credit Data
2 | // New User: -> Past Credit Data page -> option(Home or Schedule Generaton(\schedules))
3 | import { Navbar } from "@/components/Navbar";
4 | import Link from "next/link";
5 |
6 | export default function Questionnaire() {
7 | return (
8 |
49 | );
50 | }
51 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Optimal-Schedule-Builder
2 |
3 | DevDogs' inaugural, 2024-2025 project: an optimal schedule-building website for UGA students.
4 |
5 | ## Welcome to the DevDogs Optimal Schedule Builder project!
6 |
7 | We’re excited to have you here! If you’re interested in contributing to our project, please request to join the 2024-2025 Project Contributers team [here](https://github.com/orgs/DevDogs-UGA/teams/24-25-project-contributors) and join our [Discord server](https://discord.com/invite/MuyJ4f5xKE). If you're a new member or want a refresher check out our [catch up article!](/gitWiki/catchUp.md).
8 |
9 | ## Getting Started
10 |
11 | 1. **Join the Team**: Request to join the 2024-2025 Project Contributor team on our GitHub Organization.
12 | 2. **Review Issues**: Check the Issues tab to see what work needs to be done. Feel free to add issues with features or modifications you would like to include in the project!
13 | 3. **Fork the Repository**: Create a fork of this repository to work on your own copy of the code. Assign yourself an issue to work on.
14 | 4. **Clone the Repository**: Use Git or GitHub Desktop to clone your forked repository to your local machine.
15 | 5. **Work on the Issue**: Complete the tasks associated with your assigned issue.
16 | 6. **Push Changes**: Push your local changes to your forked GitHub repository.
17 | 7. **Create a Pull Request**: Once your work is complete, submit a pull request (PR) to the original repository. Be sure to document your changes thoroughly and include any relevant screenshots.
18 |
19 | **Important**: Always sync your forked repository with the original before starting any new coding session, and pull the latest changes to your local machine.
20 |
--------------------------------------------------------------------------------
/services/coursicle/HELP.md:
--------------------------------------------------------------------------------
1 | # Getting Started
2 |
3 | ### Reference Documentation
4 |
5 | For further reference, please consider the following sections:
6 |
7 | - [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
8 | - [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.4/maven-plugin)
9 | - [Create an OCI image](https://docs.spring.io/spring-boot/3.3.4/maven-plugin/build-image.html)
10 | - [Spring Web](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#web)
11 | - [Spring Data JPA](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#data.sql.jpa-and-spring-data)
12 | - [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#using.devtools)
13 |
14 | ### Guides
15 |
16 | The following guides illustrate how to use some features concretely:
17 |
18 | - [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
19 | - [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
20 | - [Building REST services with Spring](https://spring.io/guides/tutorials/rest/)
21 | - [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/)
22 | - [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/)
23 |
24 | ### Maven Parent overrides
25 |
26 | Due to Maven's design, elements are inherited from the parent POM to the project POM.
27 | While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the parent.
28 | To prevent this, the project POM contains empty overrides for these elements.
29 | If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides.
30 |
--------------------------------------------------------------------------------
/services/professor-rating/src/main/java/edu/uga/devdogs/syllabus_scraper/DepartmentInfo.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Class holds information about each of the school's department and its following code.
3 | * The code is to identify which option to select, and the name is the name of the department.
4 | * Right now, everything requires a department name, but maybe we can add a static map that holds
5 | * the corresponding class course code (ex. CSCI) with its prefix (CS)
6 | */
7 | public class DepartmentInfo {
8 | private String departmentCode;
9 | private String departmentName;
10 |
11 | /**
12 | * The data needed to hold the department information
13 | * @param departmentCode code to identify which option to select on the UGA syllabus site
14 | * @param departmentName name of the department
15 | */
16 | public DepartmentInfo(String departmentCode, String departmentName) {
17 | this.departmentCode = departmentCode;
18 | this.departmentName = departmentName;
19 | }
20 |
21 | /**
22 | * @return the department code
23 | */
24 | public String getDepartmentCode() {
25 | return departmentCode;
26 | }
27 |
28 | /**
29 | * Sets the department code
30 | * @param departmentCode the department code
31 | */
32 | public void setDepartmentCode(String departmentCode) {
33 | this.departmentCode = departmentCode;
34 | }
35 |
36 | /**
37 | * @return the department name
38 | */
39 | public String getDepartmentName() {
40 | return departmentName;
41 | }
42 |
43 | /**
44 | * Sets the department name
45 | * @param departmentName the department name
46 | */
47 | public void setDepartmentName(String departmentName) {
48 | this.departmentName = departmentName;
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/deserializers/LocalTimeDeserializer.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.sampledataparser.deserializers;
2 |
3 | import com.google.gson.JsonDeserializationContext;
4 | import com.google.gson.JsonDeserializer;
5 | import com.google.gson.JsonElement;
6 | import com.google.gson.JsonParseException;
7 |
8 | import java.lang.reflect.Type;
9 | import java.time.LocalTime;
10 | import java.time.format.DateTimeFormatter;
11 |
12 | /**
13 | * A custom deserializer for converting a JSON string into a {@link LocalTime} object.
14 | * The deserializer expects the time string to be in the "HH:mm" format (e.g., "14:30").
15 | */
16 | public class LocalTimeDeserializer implements JsonDeserializer {
17 |
18 | // Formatter to parse the time in "HH:mm" format
19 | private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
20 |
21 | /**
22 | * Deserializes a JSON element into a {@link LocalTime} object.
23 | * The JSON element is expected to be a string in the "HH:mm" format, representing a time.
24 | *
25 | * @param jsonElement the JSON element to deserialize, expected to be a time string.
26 | * @param type the type of the object to deserialize.
27 | * @param jsonDeserializationContext the context for deserialization.
28 | * @return a {@link LocalTime} object representing the time from the JSON string.
29 | * @throws JsonParseException if the JSON element cannot be parsed into a valid {@link LocalTime}.
30 | */
31 | @Override
32 | public LocalTime deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
33 | throws JsonParseException {
34 | String timeString = jsonElement.getAsString();
35 |
36 | return LocalTime.parse(timeString, formatter);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "type": "module",
6 | "engines": {
7 | "node": ">=20.0.0"
8 | },
9 | "scripts": {
10 | "dev": "next dev",
11 | "build": "next build",
12 | "start": "next start",
13 | "lint": "next lint",
14 | "lint:check": "eslint --ext \".ts,.vue\" --ignore-path .gitignore .",
15 | "lint:fix": "eslint --ext \".ts,.vue\" --ignore-path .gitignore --fix .",
16 | "format:check": "prettier --check .",
17 | "format:fix": "prettier --write --list-different .",
18 | "fl": "prettier --write --list-different . && eslint --ext \".ts,.vue\" --ignore-path .gitignore --fix ."
19 | },
20 | "dependencies": {
21 | "@radix-ui/react-accordion": "^1.2.3",
22 | "@radix-ui/react-dialog": "^1.1.6",
23 | "@radix-ui/react-popover": "^1.1.6",
24 | "@radix-ui/react-toast": "^1.2.6",
25 | "@t3-oss/env-nextjs": "^0.11.1",
26 | "@tailwindcss/forms": "^0.5.10",
27 | "@tanstack/react-query": "^5.66.5",
28 | "date-fns": "^4.1.0",
29 | "match-sorter": "^8.0.0",
30 | "motion": "^12.4.3",
31 | "next": "14.2.23",
32 | "pnpm": "^10.6.3",
33 | "react": "^18.3.1",
34 | "react-dom": "^18.3.1",
35 | "react-icons": "^5.4.0",
36 | "sharp": "^0.33.5",
37 | "zod": "^3.24.2"
38 | },
39 | "devDependencies": {
40 | "@types/eslint": "^8.56.12",
41 | "@types/node": "^22.13.4",
42 | "@types/react": "^18.3.18",
43 | "@types/react-dom": "^18.3.5",
44 | "@typescript-eslint/eslint-plugin": "^8.24.1",
45 | "@typescript-eslint/parser": "^8.24.1",
46 | "eslint": "^8.57.1",
47 | "eslint-config-next": "14.2.13",
48 | "postcss": "^8.5.2",
49 | "prettier": "3.5.3",
50 | "prettier-plugin-tailwindcss": "^0.6.11",
51 | "tailwindcss": "^3.4.17",
52 | "typescript": "^5.7.3"
53 | },
54 | "packageManager": "pnpm@9.11.0"
55 | }
56 |
--------------------------------------------------------------------------------
/services/optimize/HELP.md:
--------------------------------------------------------------------------------
1 | # Getting Started
2 |
3 | ### Reference Documentation
4 |
5 | For further reference, please consider the following sections:
6 |
7 | - [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
8 | - [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.4/maven-plugin)
9 | - [Create an OCI image](https://docs.spring.io/spring-boot/3.3.4/maven-plugin/build-image.html)
10 | - [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#actuator)
11 | - [Spring Web](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#web)
12 | - [Spring Data JPA](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#data.sql.jpa-and-spring-data)
13 | - [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/3.3.4/reference/htmlsingle/index.html#using.devtools)
14 |
15 | ### Guides
16 |
17 | The following guides illustrate how to use some features concretely:
18 |
19 | - [Building a RESTful Web Service with Spring Boot Actuator](https://spring.io/guides/gs/actuator-service/)
20 | - [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
21 | - [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
22 | - [Building REST services with Spring](https://spring.io/guides/tutorials/rest/)
23 | - [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/)
24 |
25 | ### Maven Parent overrides
26 |
27 | Due to Maven's design, elements are inherited from the parent POM to the project POM.
28 | While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the parent.
29 | To prevent this, the project POM contains empty overrides for these elements.
30 | If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides.
31 |
--------------------------------------------------------------------------------
/frontend/src/styles/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | --background: 0 100% 99%;
7 |
8 | --dusty-pink: 342 100% 95%;
9 | --bulldog-red: 348 88% 39%;
10 | --barely-pink: 345 100% 98%;
11 | --dev-dog-blue: 240 20% 25%;
12 | --nearly-black: 45 6% 13%;
13 | --midnight-blue: 240 20% 17%;
14 | --grout-gray: 0 5% 52%;
15 | --glory-glory-red: 349 100% 45%;
16 | --mud-gray: 346 7% 37%;
17 | --pebble-gray: 346 9% 63%;
18 | --limestone: 20 12% 81%;
19 | --baby-blue: 180 33% 89%;
20 | --lake-herrick: 183 100% 34%;
21 | --gold: 22 89% 79%;
22 | --peach: 0 65% 69%;
23 | --wave: 184 52% 63%;
24 | }
25 |
26 | /* For Safari and Chrome */
27 | .no-scrollbar::-webkit-scrollbar {
28 | display: none;
29 | }
30 | /* For older Safari versions */
31 | .no-scrollbar::-webkit-scrollbar {
32 | -webkit-appearance: none;
33 | }
34 |
35 | /* For Internet Explorer and Edge */
36 | .no-scrollbar {
37 | -ms-overflow-style: none;
38 | }
39 |
40 | .OuterRingAnimation {
41 | /* background: black; */
42 | text-align: center;
43 |
44 | position: relative;
45 | }
46 |
47 | @property --angle {
48 | syntax: "";
49 | initial-value: 0deg;
50 | inherits: false;
51 | }
52 |
53 | .OuterRingAnimation::after,
54 | .OuterRingAnimation::before {
55 | content: "";
56 | position: absolute;
57 | height: 100%;
58 | background-image: conic-gradient(
59 | from var(--angle),
60 | red,
61 | blue,
62 | yellow,
63 | green,
64 | red
65 | );
66 | width: 100%;
67 | top: 50%;
68 | left: 50%;
69 | translate: -50% -50%;
70 | z-index: -1;
71 | border-radius: inherit;
72 | animation: 3s spin linear infinite;
73 | }
74 |
75 | .OuterRingAnimation::before {
76 | filter: blur(1.5rem);
77 | opacity: 0.5;
78 | }
79 |
80 | @keyframes spin {
81 | from {
82 | --angle: 0deg;
83 | }
84 | to {
85 | --angle: 360deg;
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/algorithm-prototyping/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | edu.uga.devdogs
8 | algorithm-prototyping
9 | 1.0-SNAPSHOT
10 |
11 | pom
12 |
13 |
14 | sample-data-parser
15 | brute-force-prototype
16 |
17 |
18 |
19 | 21
20 | 21
21 | UTF-8
22 |
23 |
24 |
25 |
26 | org.junit.jupiter
27 | junit-jupiter
28 | 5.11.0-M2
29 | test
30 |
31 |
32 |
33 |
34 |
35 |
36 | org.apache.maven.plugins
37 | maven-javadoc-plugin
38 | 3.3.0
39 |
40 |
41 |
42 | aggregate
43 |
44 | site
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/services/bulletin/src/main/java/edu/uga/devdogs/bulletin/services/BulletinCourseService.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.bulletin.services;
2 |
3 | import edu.uga.devdogs.bulletin.database.Course;
4 | import edu.uga.devdogs.bulletin.database.Section;
5 | import edu.uga.devdogs.bulletin.exceptions.CourseNotFoundException;
6 | import edu.uga.devdogs.bulletin.exceptions.IncorrectArguementsException;
7 | import edu.uga.devdogs.bulletin.exceptions.SectionNotFoundException;
8 | import org.springframework.stereotype.Service;
9 |
10 | import java.sql.Time;
11 | import java.text.ParseException;
12 | import java.text.SimpleDateFormat;
13 | import java.util.*;
14 |
15 | /**
16 | * Service class that handles business logic for the Bulletin microservice.
17 | *
18 | *
19 | * This Service layer acts as an intermediary between the Controller layer
20 | * and the database. It is responsible for fetching, processing, and transforming data.
21 | *
22 | *
23 | *
24 | * Future methods will include data management operations, transforming raw
25 | * data from the database into meaningful responses for the API.
26 | *
27 | *
28 | * @author Raghav Vikramprabhu
29 | */
30 | @Service
31 | public class BulletinCourseService {
32 | /**
33 | * Placeholder business logic method for future implementation.
34 | *
35 | * This method will handle tasks related to data fetching, transformation,
36 | * and interaction between the database and the API.
37 | *
38 | */
39 | public void someBusinessLogic() {
40 | // Service logic goes here
41 | }
42 |
43 | /*
44 | * This method is a helper method to parse our timeslots (10:00 AM - 11:15 AM)
45 | */
46 | private static Time parseTime(String timeString) throws ParseException {
47 | SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
48 | Date parsedDate = sdf.parse(timeString);
49 | return new Time(parsedDate.getTime());
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/services/professor-rating/src/main/java/edu/uga/devdogs/syllabus_scraper/AspNetData.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Class stores data for hidden aspx values that are required in the body of the post request
3 | */
4 | public class AspNetData {
5 | private String viewState;
6 | private String viewStateGenerator;
7 | private String eventValidation;
8 |
9 | /**
10 | * Constructor that
11 | * @param viewState hidden view state input
12 | * @param viewStateGenerator hidden state generator input
13 | * @param eventValidation hidden validation input
14 | */
15 | public AspNetData(String viewState, String viewStateGenerator, String eventValidation) {
16 | this.viewState = viewState;
17 | this.viewStateGenerator = viewStateGenerator;
18 | this.eventValidation = eventValidation;
19 | }
20 |
21 | /**
22 | * @return viewstate
23 | */
24 | public String getViewState() {
25 | return viewState;
26 | }
27 |
28 | /**
29 | * Set view state
30 | * @param viewState the view state
31 | */
32 | public void setViewState(String viewState) {
33 | this.viewState = viewState;
34 | }
35 |
36 | /**
37 | * @return view state generator
38 | */
39 | public String getViewStateGenerator() {
40 | return viewStateGenerator;
41 | }
42 |
43 | /**
44 | * Set view state generator
45 | * @param viewStateGenerator the view state generator
46 | */
47 | public void setViewStateGenerator(String viewStateGenerator) {
48 | this.viewStateGenerator = viewStateGenerator;
49 | }
50 |
51 | /**
52 | * @return event validation
53 | */
54 | public String getEventValidation() {
55 | return eventValidation;
56 | }
57 |
58 | /**
59 | * Set event validation
60 | * @param eventValidation the event validation
61 | */
62 | public void setEventValidation(String eventValidation) {
63 | this.eventValidation = eventValidation;
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/services/professor-rating/src/main/java/edu/uga/devdogs/syllabus_scraper/ClassInfo.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Class stores information about the course class, which includes professor name, the title, and semester.
3 | */
4 | public class ClassInfo {
5 | private String instructorName;
6 | private String courseTitle;
7 | private String semesterAndYear;
8 |
9 | /**
10 | * The data needed to hold class information
11 | * @param instructorName the professor name
12 | * @param courseTitle the title of the course
13 | * @param semesterAndYear the year and semester of when the course was held
14 | */
15 | public ClassInfo(String instructorName, String courseTitle, String semesterAndYear) {
16 | this.instructorName = instructorName;
17 | this.courseTitle = courseTitle;
18 | this.semesterAndYear = semesterAndYear;
19 | }
20 |
21 | /**
22 | * @return professor name
23 | */
24 | public String getInstructorName() {
25 | return instructorName;
26 | }
27 |
28 | /**
29 | * Sets the professor name
30 | * @param instructorName professor name
31 | */
32 | public void setInstructorName(String instructorName) {
33 | this.instructorName = instructorName;
34 | }
35 |
36 | /**
37 | * @return course title
38 | */
39 | public String getCourseTitle() {
40 | return courseTitle;
41 | }
42 |
43 | /**
44 | * Sets the course title
45 | * @param courseTitle the course title
46 | */
47 | public void setCourseTitle(String courseTitle) {
48 | this.courseTitle = courseTitle;
49 | }
50 |
51 | /**
52 | * @return the semester and year
53 | */
54 | public String getSemesterAndYear() {
55 | return semesterAndYear;
56 | }
57 |
58 | /**
59 | * Sets the semester and year of the class held
60 | * @param semesterAndYear the semester and year
61 | */
62 | public void setSemesterAndYear(String semesterAndYear) {
63 | this.semesterAndYear = semesterAndYear;
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/algorithm-prototyping/brute-force-prototype/src/test/java/BruteForcePrototypeTest.java:
--------------------------------------------------------------------------------
1 | import edu.uga.devdogs.sampledataparser.SampleDataParser;
2 | import edu.uga.devdogs.sampledataparser.records.Course;
3 | import edu.uga.devdogs.sampledataparser.records.SampleData;
4 | import org.junit.jupiter.api.BeforeAll;
5 | import org.junit.jupiter.api.Test;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 | import java.util.Map;
10 | import java.util.Set;
11 |
12 | public class BruteForcePrototypeTest {
13 |
14 | static Map> distances;
15 |
16 | static List> testCourseSets;
17 |
18 | @BeforeAll
19 | static void setUp() {
20 | // File paths for the sample data
21 | String professorsFilePath = "../src/main/resources/professors.json";
22 | String coursesFilePath = "../src/main/resources/courses.json";
23 | String distancesFilePath = "../src/main/resources/distances.json";
24 |
25 | // Parse sample data
26 | SampleData sampleData = SampleDataParser.parse(professorsFilePath, coursesFilePath, distancesFilePath);
27 | Map courses = sampleData.courses();
28 | distances = sampleData.distances();
29 |
30 | // Initialize the list of course sets
31 | testCourseSets = new ArrayList<>();
32 |
33 | // Add first course set for testing
34 | testCourseSets.add(Set.of(
35 | courses.get("ENGL 1101"),
36 | courses.get("CSCI 1302"),
37 | courses.get("PHYS 1211"),
38 | courses.get("PHYS 1211L")
39 | ));
40 |
41 | // Add second course set for testing
42 | testCourseSets.add(Set.of(
43 | courses.get("ENGL 1102"),
44 | courses.get("PHYS 1212"),
45 | courses.get("PHYS 1212L"),
46 | courses.get("MATH 2250")
47 | ));
48 | }
49 |
50 | @Test
51 | void testOptimize() {
52 |
53 | }
54 |
55 | @Test
56 | void testGenerateValidSchedules() {
57 |
58 | }
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/algorithm-prototyping/brute-force-prototype/src/test/java/ScheduleTest.java:
--------------------------------------------------------------------------------
1 | import edu.uga.devdogs.sampledataparser.SampleDataParser;
2 | import edu.uga.devdogs.sampledataparser.records.Course;
3 | import edu.uga.devdogs.sampledataparser.records.SampleData;
4 | import edu.uga.devdogs.sampledataparser.records.Section;
5 | import org.junit.jupiter.api.BeforeAll;
6 | import org.junit.jupiter.api.Test;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 | import java.util.Map;
11 | import java.util.Set;
12 |
13 | public class ScheduleTest {
14 |
15 | static List> testSectionSets;
16 |
17 | @BeforeAll
18 | static void setUp() {
19 | // File paths for the sample data
20 | String professorsFilePath = "../src/main/resources/professors.json";
21 | String coursesFilePath = "../src/main/resources/courses.json";
22 | String distancesFilePath = "../src/main/resources/distances.json";
23 |
24 | // Parse sample data
25 | SampleData sampleData = SampleDataParser.parse(professorsFilePath, coursesFilePath, distancesFilePath);
26 | Map courses = sampleData.courses();
27 |
28 | // Initialize the list of test section sets
29 | testSectionSets = new ArrayList<>();
30 |
31 | // Add first section set for testing
32 | testSectionSets.add(Set.of(
33 | courses.get("ENGL 1101").sections().get(0),
34 | courses.get("CSCI 1302").sections().get(0),
35 | courses.get("PHYS 1211").sections().get(0),
36 | courses.get("PHYS 1211L").sections().get(0)
37 | ));
38 |
39 | // Add second section set for testing
40 | testSectionSets.add(Set.of(
41 | courses.get("ENGL 1102").sections().get(0),
42 | courses.get("PHYS 1212").sections().get(0),
43 | courses.get("PHYS 1212L").sections().get(0),
44 | courses.get("MATH 2250").sections().get(0)
45 | ));
46 | }
47 |
48 | @Test
49 | void testSchedule() {
50 |
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/frontend/src/components/Toasts.tsx:
--------------------------------------------------------------------------------
1 | import * as Toast from "@radix-ui/react-toast";
2 | import { type IconType } from "react-icons";
3 | import { PiCheckCircle, PiInfo, PiWarning, PiXCircle } from "react-icons/pi";
4 |
5 | interface Props {
6 | icon?: IconType;
7 | message: string;
8 | }
9 |
10 | export function Error({ icon: Icon = PiXCircle, message }: Props) {
11 | return (
12 |
51 | );
52 | }
53 |
--------------------------------------------------------------------------------
/algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/deserializers/CourseMapDeserializer.java:
--------------------------------------------------------------------------------
1 | package edu.uga.devdogs.sampledataparser.deserializers;
2 |
3 | import com.google.gson.*;
4 | import edu.uga.devdogs.sampledataparser.records.Course;
5 |
6 | import java.lang.reflect.Type;
7 | import java.util.HashMap;
8 | import java.util.Map;
9 |
10 | /**
11 | * A custom deserializer for deserializing a JSON array of courses into a
12 | * {@link Map} where the keys are course codes and the values are {@link Course} objects.
13 | *
14 | * This deserializer reads a JSON array, deserializes each element into a {@link Course},
15 | * and stores it in a {@link HashMap} with the course code as the key for easy access.
16 | */
17 | public class CourseMapDeserializer implements JsonDeserializer