├── services ├── bulletin │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── application.properties │ │ │ └── java │ │ │ │ └── edu │ │ │ │ └── uga │ │ │ │ └── devdogs │ │ │ │ └── bulletin │ │ │ │ ├── database │ │ │ │ ├── Section.java │ │ │ │ └── Course.java │ │ │ │ ├── exceptions │ │ │ │ ├── SectionNotFoundException.java │ │ │ │ ├── CourseNotFoundException.java │ │ │ │ └── IncorrectArguementsException.java │ │ │ │ ├── BulletinApplication.java │ │ │ │ ├── controller │ │ │ │ └── BulletinController.java │ │ │ │ ├── services │ │ │ │ └── BulletinCourseService.java │ │ │ │ └── webscraping │ │ │ │ └── DescriptionScraper.java │ │ └── test │ │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── bulletin │ │ │ ├── TestcontainersConfiguration.java │ │ │ ├── TestBulletinApplication.java │ │ │ └── BulletinApplicationTests.java │ ├── .gitignore │ ├── .mvn │ │ └── wrapper │ │ │ └── maven-wrapper.properties │ └── pom.xml ├── coursicle │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── application.properties │ │ │ └── java │ │ │ │ └── edu │ │ │ │ └── uga │ │ │ │ └── devdogs │ │ │ │ └── coursicle │ │ │ │ └── CoursicleApplication.java │ │ └── test │ │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── coursicle │ │ │ └── CoursicleApplicationTests.java │ ├── target │ │ ├── classes │ │ │ ├── application.properties │ │ │ └── edu │ │ │ │ └── uga │ │ │ │ └── devdogs │ │ │ │ └── coursicle │ │ │ │ └── CoursicleApplication.class │ │ └── test-classes │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── coursicle │ │ │ └── CoursicleApplicationTests.class │ ├── .gitignore │ ├── .mvn │ │ └── wrapper │ │ │ └── maven-wrapper.properties │ ├── HELP.md │ └── pom.xml ├── optimize │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── application.properties │ │ │ └── java │ │ │ │ └── edu │ │ │ │ └── uga │ │ │ │ └── devdogs │ │ │ │ └── optimize │ │ │ │ └── OptimizeApplication.java │ │ └── test │ │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── optimize │ │ │ └── OptimizeApplicationTests.java │ ├── .gitignore │ ├── .mvn │ │ └── wrapper │ │ │ └── maven-wrapper.properties │ ├── HELP.md │ └── pom.xml ├── professor-rating │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── application.properties │ │ │ └── java │ │ │ │ └── edu │ │ │ │ └── uga │ │ │ │ └── devdogs │ │ │ │ ├── professor_rating │ │ │ │ ├── ProfessorRatingApplication.java │ │ │ │ ├── services │ │ │ │ │ └── RateMyProfessorService.java │ │ │ │ └── controllers │ │ │ │ │ └── RESTController.java │ │ │ │ └── syllabus_scraper │ │ │ │ ├── SemesterInfo.java │ │ │ │ ├── DepartmentInfo.java │ │ │ │ ├── AspNetData.java │ │ │ │ └── ClassInfo.java │ │ └── test │ │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── professor_rating │ │ │ └── ProfessorRatingApplicationTests.java │ ├── .gitignore │ ├── .mvn │ │ └── wrapper │ │ │ └── maven-wrapper.properties │ └── pom.xml └── course-information │ ├── src │ ├── test │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── course_information │ │ │ └── CourseInformationApplicationTests.java │ └── main │ │ ├── java │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── course_information │ │ │ ├── exception │ │ │ └── CourseNotFoundException.java │ │ │ ├── CourseNotFoundException.java │ │ │ ├── Algorithm │ │ │ ├── records │ │ │ │ ├── Professor.java │ │ │ │ ├── Course.java │ │ │ │ ├── SampleData.java │ │ │ │ ├── Section.java │ │ │ │ ├── SConstraints.java │ │ │ │ ├── HConstraints.java │ │ │ │ └── Class.java │ │ │ └── schedule │ │ │ │ ├── ClassComparator.java │ │ │ │ └── Schedule.java │ │ │ ├── Building │ │ │ └── BuildingRepository.java │ │ │ ├── Professor │ │ │ └── ProfessorRepository.java │ │ │ ├── controller │ │ │ └── TestController.java │ │ │ ├── exceptions │ │ │ ├── CourseNotFoundException.java │ │ │ ├── ProfessorNotFoundException.java │ │ │ ├── BuildingNotFoundException.java │ │ │ └── SectionDetailsNotFoundException.java │ │ │ ├── Schedule │ │ │ └── ScheduleRepository.java │ │ │ ├── webscraping │ │ │ ├── ProfessorRating.java │ │ │ └── DescriptionScraper.java │ │ │ ├── Class │ │ │ └── ClassRepository.java │ │ │ ├── CourseSection │ │ │ └── CourseSectionRepository.java │ │ │ ├── Course │ │ │ └── CourseRepository.java │ │ │ └── service │ │ │ └── ProfessorService.java │ │ └── resources │ │ └── application.properties │ ├── .gitignore │ └── .mvn │ └── wrapper │ └── maven-wrapper.properties ├── frontend ├── next.config.mjs ├── public │ ├── images │ │ ├── devdog.png │ │ ├── Basemap.png │ │ ├── DevDogsLogo.png │ │ ├── background.png │ │ ├── GoogleDevLogo.png │ │ ├── WordmarkMascot.png │ │ ├── devdogCobranded.png │ │ ├── timeIcon.svg │ │ ├── downArrow.svg │ │ └── removeButton.svg │ ├── vercel.svg │ └── next.svg ├── src │ ├── app │ │ ├── _private │ │ │ ├── _NewPageTemplate.tsx │ │ │ └── info.txt │ │ ├── settings │ │ │ └── page.tsx │ │ ├── plans │ │ │ ├── [id] │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ └── page.tsx │ │ ├── not-found.tsx │ │ ├── manual-entry │ │ │ └── page.tsx │ │ ├── login │ │ │ └── page.tsx │ │ ├── signup │ │ │ └── page.tsx │ │ ├── route-map │ │ │ └── page.tsx │ │ ├── past-credits │ │ │ └── page.tsx │ │ ├── generate-schedule │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── credit-data │ │ │ └── page.tsx │ │ ├── survey │ │ │ └── page.tsx │ │ ├── questionnaire │ │ │ └── page.tsx │ │ ├── create │ │ │ └── page.tsx │ │ └── distance-page │ │ │ └── page.tsx │ ├── components │ │ ├── home │ │ │ ├── Minimap.tsx │ │ │ ├── HomepageAlert.tsx │ │ │ ├── ScheduleSave.tsx │ │ │ ├── LabPairingSystem.tsx │ │ │ └── CallToAction.tsx │ │ ├── ui │ │ │ ├── ButtonRounded.tsx │ │ │ ├── Button.tsx │ │ │ ├── RemoveElementButton.tsx │ │ │ ├── DeletePlan.tsx │ │ │ └── Card.tsx │ │ ├── RecommendedCourse.tsx │ │ ├── courses │ │ │ ├── RegisteredClass.tsx │ │ │ ├── TimeDistanceFilter.tsx │ │ │ └── CourseDisplay.tsx │ │ ├── survey │ │ │ ├── ToggleButton.tsx │ │ │ └── TimeSelector.tsx │ │ ├── RecommendedCourses.tsx │ │ ├── Toasts.tsx │ │ ├── saved-plans │ │ │ └── SavedPlan.tsx │ │ └── Footer.tsx │ ├── env.ts │ ├── types │ │ └── scheduleTypes.ts │ ├── styles │ │ └── globals.css │ ├── schemas │ │ └── localStorage.ts │ └── hooks │ │ ├── useQuery.tsx │ │ └── useLocalStorage.ts ├── postcss.config.mjs ├── prettier.config.js ├── .env.example ├── .gitignore ├── tsconfig.json ├── .eslintrc.cjs ├── package.json └── tailwind.config.ts ├── package.json ├── algorithm-prototyping ├── sample-data-parser │ ├── src │ │ ├── test │ │ │ ├── resources │ │ │ │ ├── professors.json │ │ │ │ ├── courses.json │ │ │ │ └── distances.json │ │ │ └── java │ │ │ │ └── SampleDataParserTest.java │ │ └── main │ │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── sampledataparser │ │ │ ├── records │ │ │ ├── Professor.java │ │ │ ├── Course.java │ │ │ ├── SampleData.java │ │ │ ├── Section.java │ │ │ ├── Distances.java │ │ │ ├── SConstraints.java │ │ │ ├── HConstraints.java │ │ │ └── Class.java │ │ │ └── deserializers │ │ │ ├── LocalTimeDeserializer.java │ │ │ ├── CourseMapDeserializer.java │ │ │ ├── DayOfWeekListDeserializer.java │ │ │ └── ProfessorDeserializer.java │ ├── target │ │ └── test-classes │ │ │ └── professors.json │ └── pom.xml ├── src │ └── main │ │ ├── java │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ ├── Main.class │ │ │ └── Main.java │ │ └── resources │ │ ├── scripts │ │ ├── generate_professors_outline.py │ │ ├── generate_buildings_outline.py │ │ └── generate_distances.py │ │ ├── buildings.json │ │ ├── professors.json │ │ └── buildingData │ │ ├── TiftonBuildingData.json │ │ └── GriffinBuildingData.json ├── brute-force-prototype │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── edu │ │ │ └── uga │ │ │ └── devdogs │ │ │ └── bruteforceprototype │ │ │ └── schedule │ │ │ ├── ClassComparator.java │ │ │ └── Schedule.java │ │ └── test │ │ └── java │ │ ├── BruteForcePrototypeTest.java │ │ └── ScheduleTest.java └── pom.xml ├── .gitignore ├── docker-compose.yml ├── .github └── workflows │ └── frontend.yml ├── README.md └── pnpm-lock.yaml /services/bulletin/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=bulletin 2 | -------------------------------------------------------------------------------- /services/coursicle/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=coursicle 2 | -------------------------------------------------------------------------------- /services/coursicle/target/classes/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=coursicle 2 | -------------------------------------------------------------------------------- /services/optimize/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=optimize 2 | -------------------------------------------------------------------------------- /services/professor-rating/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=professor-rating 2 | -------------------------------------------------------------------------------- /frontend/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /frontend/public/images/devdog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/devdog.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "prettier": "^3.5.3", 4 | "prettier-plugin-tailwindcss": "^0.6.11" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /frontend/public/images/Basemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/Basemap.png -------------------------------------------------------------------------------- /frontend/public/images/DevDogsLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/DevDogsLogo.png -------------------------------------------------------------------------------- /frontend/public/images/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/background.png -------------------------------------------------------------------------------- /frontend/public/images/GoogleDevLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/GoogleDevLogo.png -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/test/resources/professors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Daniel Barnum", 4 | "quality": 5 5 | } 6 | ] 7 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/target/test-classes/professors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Daniel Barnum", 4 | "quality": 5 5 | } 6 | ] 7 | -------------------------------------------------------------------------------- /frontend/public/images/WordmarkMascot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/WordmarkMascot.png -------------------------------------------------------------------------------- /frontend/public/images/devdogCobranded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/frontend/public/images/devdogCobranded.png -------------------------------------------------------------------------------- /frontend/src/app/_private/_NewPageTemplate.tsx: -------------------------------------------------------------------------------- 1 | export default function page() { 2 | return
; 3 | } 4 | -------------------------------------------------------------------------------- /services/bulletin/src/main/java/edu/uga/devdogs/bulletin/database/Section.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin.database; 2 | 3 | public class Section { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/app/_private/info.txt: -------------------------------------------------------------------------------- 1 | This is a private folder which makes it not part of the routing system, you can put whatever in here and it wont interfere with nextjs page routing system. -------------------------------------------------------------------------------- /algorithm-prototyping/src/main/java/edu/uga/devdogs/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/algorithm-prototyping/src/main/java/edu/uga/devdogs/Main.class -------------------------------------------------------------------------------- /frontend/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /services/bulletin/src/main/java/edu/uga/devdogs/bulletin/database/Course.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin.database; 2 | 3 | public class Course { 4 | //TODO: jpa implementation 5 | 6 | } 7 | -------------------------------------------------------------------------------- /algorithm-prototyping/src/main/java/edu/uga/devdogs/Main.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Hello world!"); 6 | } 7 | } -------------------------------------------------------------------------------- /frontend/prettier.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */ 2 | const config = { 3 | plugins: ["prettier-plugin-tailwindcss"], 4 | }; 5 | 6 | export default config; 7 | -------------------------------------------------------------------------------- /services/coursicle/target/classes/edu/uga/devdogs/coursicle/CoursicleApplication.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/services/coursicle/target/classes/edu/uga/devdogs/coursicle/CoursicleApplication.class -------------------------------------------------------------------------------- /services/coursicle/target/test-classes/edu/uga/devdogs/coursicle/CoursicleApplicationTests.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevDogs-UGA/Optimal-Schedule-Builder/HEAD/services/coursicle/target/test-classes/edu/uga/devdogs/coursicle/CoursicleApplicationTests.class -------------------------------------------------------------------------------- /services/bulletin/src/test/java/edu/uga/devdogs/bulletin/TestcontainersConfiguration.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin; 2 | 3 | import org.springframework.boot.test.context.TestConfiguration; 4 | 5 | @TestConfiguration(proxyBeanMethods = false) 6 | class TestcontainersConfiguration { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /services/bulletin/src/main/java/edu/uga/devdogs/bulletin/exceptions/SectionNotFoundException.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin.exceptions; 2 | 3 | public class SectionNotFoundException extends RuntimeException { 4 | public SectionNotFoundException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /services/optimize/src/test/java/edu/uga/devdogs/optimize/OptimizeApplicationTests.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.optimize; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class OptimizeApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /services/coursicle/src/test/java/edu/uga/devdogs/coursicle/CoursicleApplicationTests.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.coursicle; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class CoursicleApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /frontend/public/images/timeIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IntelliJ IDEA specific 2 | .idea/ 3 | *.iml 4 | *.iws 5 | out/ 6 | target/ 7 | 8 | # VSCode specific 9 | .vscode/ 10 | 11 | # macOS specific 12 | .DS_Store 13 | 14 | # Windows specific 15 | Thumbs.db 16 | 17 | # Node modules (for JS/TS projects) 18 | node_modules/ 19 | 20 | # Log files 21 | *.log 22 | 23 | # Environment variables 24 | .env 25 | .env.* 26 | 27 | -------------------------------------------------------------------------------- /services/professor-rating/src/test/java/edu/uga/devdogs/professor_rating/ProfessorRatingApplicationTests.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.professor_rating; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ProfessorRatingApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /services/course-information/src/test/java/edu/uga/devdogs/course_information/CourseInformationApplicationTests.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class CourseInformationApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/components/home/Minimap.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export function Minimap() { 4 | return ( 5 |
6 |

Minimap

7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /services/bulletin/src/test/java/edu/uga/devdogs/bulletin/TestBulletinApplication.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | 5 | public class TestBulletinApplication { 6 | 7 | public static void main(String[] args) { 8 | SpringApplication.from(BulletinApplication::main).with(TestcontainersConfiguration.class).run(args); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/exception/CourseNotFoundException.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information.exception; 2 | 3 | 4 | public class CourseNotFoundException extends RuntimeException { 5 | 6 | // Constructor for course not found 7 | public CourseNotFoundException(String message){ 8 | 9 | super(message); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/components/home/HomepageAlert.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export function HomepageAlert() { 4 | return ( 5 |
6 |

Alert

7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/home/ScheduleSave.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export function ScheduleSave() { 4 | return ( 5 |
6 |

Schedule Save

7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/CourseNotFoundException.java: -------------------------------------------------------------------------------- 1 | // package edu.uga.devdogs.course_information.exception; 2 | 3 | 4 | // public class CourseNotFoundException extends RuntimeException { 5 | 6 | // // Constructor for course not found 7 | // public CourseNotFoundException(String message){ 8 | 9 | // super(message); 10 | // } 11 | 12 | // } 13 | -------------------------------------------------------------------------------- /frontend/src/components/ui/ButtonRounded.tsx: -------------------------------------------------------------------------------- 1 | interface props { 2 | onClick?: () => void; 3 | className?: string; 4 | text?: string; 5 | } 6 | 7 | export const Button = ({ onClick, className, text }: props) => { 8 | return ( 9 | 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /frontend/.env.example: -------------------------------------------------------------------------------- 1 | # WARNING! 2 | # This file will be committed to version control, so make sure not to have any 3 | # secrets in it. If you are cloning this repo, create a copy of this file named 4 | # ".env" and populate it with your secrets. 5 | 6 | # When adding additional environment variables, the schema in "/src/env.ts" 7 | # should be updated accordingly. 8 | NEXT_PUBLIC_COURSE_INFORMATION_SERVICE="https://course-information-service-url.com/api/" -------------------------------------------------------------------------------- /services/bulletin/src/main/java/edu/uga/devdogs/bulletin/BulletinApplication.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class BulletinApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(BulletinApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /services/optimize/src/main/java/edu/uga/devdogs/optimize/OptimizeApplication.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.optimize; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class OptimizeApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(OptimizeApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/components/home/LabPairingSystem.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export function LabPairingSystem() { 4 | return ( 5 |
6 |

7 | Lab Pairing System 8 |

9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /services/bulletin/src/test/java/edu/uga/devdogs/bulletin/BulletinApplicationTests.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | import org.springframework.context.annotation.Import; 6 | 7 | @Import(TestcontainersConfiguration.class) 8 | @SpringBootTest 9 | class BulletinApplicationTests { 10 | 11 | @Test 12 | void contextLoads() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /services/coursicle/src/main/java/edu/uga/devdogs/coursicle/CoursicleApplication.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.coursicle; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CoursicleApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CoursicleApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/Professor.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.sampledataparser.records; 2 | 3 | /** 4 | * Represents a professor with a name and a quality rating. 5 | * 6 | * @param name The name of the professor. 7 | * @param quality The quality rating of the professor (e.g., on a scale from 1 to 5). 8 | */ 9 | public record Professor(String name, 10 | double quality) { 11 | } 12 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/Professor.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information.Algorithm.records; 2 | 3 | /** 4 | * Represents a professor with a name and a quality rating. 5 | * 6 | * @param name The name of the professor. 7 | * @param quality The quality rating of the professor (e.g., on a scale from 1 to 5). 8 | */ 9 | public record Professor(String name, 10 | double quality) { 11 | } 12 | -------------------------------------------------------------------------------- /services/professor-rating/src/main/java/edu/uga/devdogs/professor_rating/ProfessorRatingApplication.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.professor_rating; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class ProfessorRatingApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(ProfessorRatingApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Created by JP Park 2 | # Last maintained by JP Park 3 | 4 | version: "1.0" 5 | 6 | services: 7 | config-server: 8 | image: # TODO 9 | container_name: # TODO 10 | ports: 11 | - # TODO 12 | environment: 13 | 14 | eureka-server: 15 | image: # TODO 16 | container_name: # TODO 17 | ports: 18 | - # TODO 19 | environment: 20 | 21 | api-gateway: 22 | image: # TODO 23 | container_name: # TODO 24 | ports: 25 | - # TODO 26 | -------------------------------------------------------------------------------- /frontend/src/app/settings/page.tsx: -------------------------------------------------------------------------------- 1 | import { Navbar } from "@/components/Navbar"; 2 | 3 | export default function PastCredits() { 4 | return ( 5 |
6 | 7 |
8 |
9 |

Settings Page

10 |
11 |
12 |
13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/Course.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.sampledataparser.records; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Represents a course with a course code and its associated sections. 7 | * 8 | * @param courseCode The unique code identifying the course. 9 | * @param sections The sections available for this course. 10 | */ 11 | public record Course(String courseCode, 12 | List
sections) { 13 | } 14 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/Course.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information.Algorithm.records; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Represents a course with a course code and its associated sections. 7 | * 8 | * @param courseCode The unique code identifying the course. 9 | * @param sections The sections available for this course. 10 | */ 11 | public record Course(String courseCode, 12 | List
sections) { 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/env.ts: -------------------------------------------------------------------------------- 1 | import { createEnv } from "@t3-oss/env-nextjs"; 2 | // import * as z from 'zod'; 3 | 4 | /** 5 | * TODO: when we can actually connect to the course 6 | * information service, we'll store the URL in an 7 | * environment variable, and it will be defined here. 8 | */ 9 | export const env = createEnv({ 10 | client: { 11 | // NEXT_PUBLIC_COURSE_INFORMATION_SERVICE: z.string().url(), 12 | }, 13 | runtimeEnv: { 14 | // NEXT_PUBLIC_COURSE_INFORMATION_SERVICE: process.env.NEXT_PUBLIC_COURSE_INFORMATION_SERVICE 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /services/bulletin/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /services/coursicle/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /services/optimize/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /services/professor-rating/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /services/course-information/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/test/resources/courses.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "course_code": "ENGL 1101", 4 | "sections": [ 5 | { 6 | "course_code": "ENGL 1101", 7 | "crn": "25013", 8 | "professor_name": "Daniel Barnum", 9 | "classes": [ 10 | { 11 | "crn": "25013", 12 | "days": ["Monday", "Wednesday", "Friday"], 13 | "start_time": "12:40", 14 | "end_time": "13:30", 15 | "building_name": "Park Hall" 16 | } 17 | ] 18 | } 19 | ] 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /frontend/public/images/downArrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/SampleData.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.sampledataparser.records; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * Represents the sample data used in the scheduling system, containing the available courses and distances between buildings. 7 | * 8 | * @param courses The array of courses in the sample data. 9 | * @param distances The distances between buildings on campus. 10 | */ 11 | public record SampleData(Map courses, 12 | Map> distances) { 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/app/plans/[id]/layout.tsx: -------------------------------------------------------------------------------- 1 | import { type Metadata } from "next"; 2 | 3 | import { Navbar } from "@/components/Navbar"; 4 | 5 | export const metadata: Metadata = { 6 | title: "Generated Schedule", 7 | description: 8 | "Optimal Schedule Builder web application for UGA students to generate and design optimal academic schedules", 9 | icons: [{ rel: "icon", url: "/favicon.ico" }], 10 | }; 11 | 12 | export default function RootLayout({ 13 | children, 14 | }: Readonly<{ children: React.ReactNode }>) { 15 | return ( 16 | <> 17 | 18 | {children} 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/SampleData.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information.Algorithm.records; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * Represents the sample data used in the scheduling system, containing the available courses and distances between buildings. 7 | * 8 | * @param courses The array of courses in the sample data. 9 | * @param distances The distances between buildings on campus. 10 | */ 11 | public record SampleData(Map courses, 12 | Map> distances) { 13 | } 14 | -------------------------------------------------------------------------------- /frontend/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /services/bulletin/src/main/java/edu/uga/devdogs/bulletin/exceptions/CourseNotFoundException.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin.exceptions; 2 | 3 | public class CourseNotFoundException extends RuntimeException { 4 | public CourseNotFoundException() { 5 | super("Course not found."); 6 | } 7 | 8 | public CourseNotFoundException(String message) { 9 | super(message); 10 | } 11 | 12 | public CourseNotFoundException(String message, Throwable cause) { 13 | super(message, cause); 14 | } 15 | 16 | public CourseNotFoundException(Throwable cause) { 17 | super(cause); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/app/not-found.tsx: -------------------------------------------------------------------------------- 1 | // Custom 404 Page 2 | "use client"; 3 | 4 | import { Button } from "@/components/ui/Button"; 5 | import Link from "next/link"; 6 | 7 | export default function NotFound() { 8 | return ( 9 |
10 |

404 Page Not Found

11 | 12 | 13 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/components/ui/Button.tsx: -------------------------------------------------------------------------------- 1 | interface props { 2 | onClick?: () => void; 3 | className?: string; 4 | text?: string; 5 | type?: "submit" | "reset" | "button"; 6 | } 7 | 8 | export const Button = ({ onClick, className, text, type }: props) => { 9 | return ( 10 | 24 | ); 25 | }; 26 | -------------------------------------------------------------------------------- /services/bulletin/src/main/java/edu/uga/devdogs/bulletin/exceptions/IncorrectArguementsException.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.bulletin.exceptions; 2 | 3 | public class IncorrectArguementsException extends RuntimeException { 4 | public IncorrectArguementsException() { 5 | super("Section details not found."); 6 | } 7 | 8 | public IncorrectArguementsException(String message) { 9 | super(message); 10 | } 11 | 12 | public IncorrectArguementsException(String message, Throwable cause) { 13 | super(message, cause); 14 | } 15 | 16 | public IncorrectArguementsException(Throwable cause) { 17 | super(cause); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/Building/BuildingRepository.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information.Building; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.data.jpa.repository.Query; 5 | 6 | public interface BuildingRepository extends JpaRepository{ 7 | 8 | //This will get a building by its unique ID 9 | //@Query("SELECT b from Building b WHERE b.buildingCode = ?1") 10 | Building findByBuildingCode(String buildingCode); 11 | 12 | //@Query("select u from Building where u.name = ?1") 13 | Building findByName(String name); 14 | } 15 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/test/resources/distances.json: -------------------------------------------------------------------------------- 1 | { 2 | "Park Hall": { 3 | "Park Hall": 0.0, 4 | "Boyd": 0.5, 5 | "Miller Plant Sciences": 1.2, 6 | "Miller Learning Center": 0.8 7 | }, 8 | "Boyd": { 9 | "Park Hall": 0.5, 10 | "Boyd": 0.0, 11 | "Miller Plant Sciences": 1.5, 12 | "Miller Learning Center": 1.0 13 | }, 14 | "Miller Plant Sciences": { 15 | "Park Hall": 1.2, 16 | "Boyd": 1.5, 17 | "Miller Plant Sciences": 0.0, 18 | "Miller Learning Center": 0.6 19 | }, 20 | "Miller Learning Center": { 21 | "Park Hall": 0.8, 22 | "Boyd": 1.0, 23 | "Miller Plant Sciences": 0.6, 24 | "Miller Learning Center": 0.0 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /algorithm-prototyping/src/main/resources/scripts/generate_professors_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 | professors = [] 9 | 10 | for course in courses: 11 | for section in course["sections"]: 12 | professor_name = section["professor_name"] 13 | if not any(professor["name"] == professor_name for professor in professors): 14 | professor_dict = { 15 | "name": professor_name, 16 | "quality": 0 17 | } 18 | professors.append(professor_dict) 19 | 20 | with open("professors.json", "w") as professors_json: 21 | json.dump(professors, professors_json, indent=2) -------------------------------------------------------------------------------- /frontend/src/components/ui/RemoveElementButton.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import Image from "next/image"; 3 | interface buttonProps { 4 | width: number; 5 | height: number; 6 | onClick: () => void; 7 | } 8 | 9 | const RemoveElementButton = ({ width, height, onClick }: buttonProps) => { 10 | return ( 11 | 25 | ); 26 | }; 27 | 28 | export default RemoveElementButton; 29 | -------------------------------------------------------------------------------- /frontend/src/app/manual-entry/page.tsx: -------------------------------------------------------------------------------- 1 | import { Navbar } from "@/components/Navbar"; 2 | import Link from "next/link"; 3 | 4 | export default function ManualEntry() { 5 | return ( 6 |
7 | 8 |
9 |
10 |

Manual Entry Page

11 |
12 | 15 |
16 |
17 |
18 |
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 | 2 | 3 | 4 | 5 | 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 |
21 |
{course}
22 |
{courseNumber}
23 |
{professor}
24 |
25 |
27 |
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 |
7 | 8 |
9 |
10 |

11 | Generate Schedules Page 12 |

13 |
14 |
15 | 18 |
19 |
20 | 23 |
24 |
25 |
26 |
27 |
28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /algorithm-prototyping/sample-data-parser/src/main/java/edu/uga/devdogs/sampledataparser/records/Class.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.sampledataparser.records; 2 | 3 | import java.time.DayOfWeek; 4 | import java.time.LocalTime; 5 | import java.util.List; 6 | 7 | /** 8 | * Represents a class in a course section, including its CRN, meeting days, start time, end time, and building. 9 | * 10 | * @param crn The course reference number (CRN) for the section associated with this class. 11 | * @param days The days of the week when the class meets. 12 | * @param startTime The start time of the class. 13 | * @param endTime The end time of the class. 14 | * @param buildingName The name of the building where the class is held. 15 | * @param campus The campus the course takes place at. 16 | */ 17 | public record Class(int crn, 18 | List days, 19 | LocalTime startTime, 20 | LocalTime endTime, 21 | String buildingName, 22 | String campus, 23 | String buildingNumber) { 24 | } 25 | -------------------------------------------------------------------------------- /services/course-information/src/main/java/edu/uga/devdogs/course_information/Algorithm/records/Class.java: -------------------------------------------------------------------------------- 1 | package edu.uga.devdogs.course_information.Algorithm.records; 2 | 3 | import java.time.DayOfWeek; 4 | import java.time.LocalTime; 5 | import java.util.List; 6 | 7 | /** 8 | * Represents a class in a course section, including its CRN, meeting days, start time, end time, and building. 9 | * 10 | * @param crn The course reference number (CRN) for the section associated with this class. 11 | * @param days The days of the week when the class meets. 12 | * @param startTime The start time of the class. 13 | * @param endTime The end time of the class. 14 | * @param buildingName The name of the building where the class is held. 15 | * @param campus The campus the course takes place at. 16 | */ 17 | public record Class(int crn, 18 | List days, 19 | LocalTime startTime, 20 | LocalTime endTime, 21 | String buildingName, 22 | String campus, 23 | String buildingNumber) { 24 | } 25 | -------------------------------------------------------------------------------- /frontend/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import("eslint").Linter.Config} */ 2 | const config = { 3 | parser: "@typescript-eslint/parser", 4 | parserOptions: { 5 | project: true, 6 | }, 7 | plugins: ["@typescript-eslint"], 8 | extends: [ 9 | "next/core-web-vitals", 10 | "plugin:@typescript-eslint/recommended-type-checked", 11 | "plugin:@typescript-eslint/stylistic-type-checked", 12 | ], 13 | rules: { 14 | "@typescript-eslint/array-type": "off", 15 | "@typescript-eslint/consistent-type-definitions": "off", 16 | "@typescript-eslint/consistent-type-imports": [ 17 | "warn", 18 | { 19 | prefer: "type-imports", 20 | fixStyle: "inline-type-imports", 21 | }, 22 | ], 23 | "@typescript-eslint/no-unused-vars": [ 24 | "warn", 25 | { 26 | argsIgnorePattern: "^_", 27 | }, 28 | ], 29 | "@typescript-eslint/require-await": "off", 30 | "@typescript-eslint/no-misused-promises": [ 31 | "error", 32 | { 33 | checksVoidReturn: { 34 | attributes: false, 35 | }, 36 | }, 37 | ], 38 | }, 39 | }; 40 | module.exports = config; 41 | -------------------------------------------------------------------------------- /algorithm-prototyping/src/main/resources/buildings.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Park Hall", 4 | "x": 11, 5 | "y": 25 6 | }, 7 | { 8 | "name": "Miller Plant Sciences", 9 | "x": 12, 10 | "y": 3 11 | }, 12 | { 13 | "name": "Boyd", 14 | "x": 11, 15 | "y": 12 16 | }, 17 | { 18 | "name": "Dawson Hall", 19 | "x": 10, 20 | "y": 15 21 | }, 22 | { 23 | "name": "Physics", 24 | "x": 9, 25 | "y": 17 26 | }, 27 | { 28 | "name": "Science Learning Center", 29 | "x": 9, 30 | "y": 3 31 | }, 32 | { 33 | "name": "Conner Hall", 34 | "x": 14, 35 | "y": 16 36 | }, 37 | { 38 | "name": "Cedar Street Building C", 39 | "x": 14, 40 | "y": 17 41 | }, 42 | { 43 | "name": "Aderhold Hall", 44 | "x": 16, 45 | "y": 2 46 | }, 47 | { 48 | "name": "Life Sciences", 49 | "x": 17, 50 | "y": 4 51 | }, 52 | { 53 | "name": "Forest Resources", 54 | "x": 12, 55 | "y": 8 56 | }, 57 | { 58 | "name": "Food Sciences", 59 | "x": 16, 60 | "y": 14 61 | }, 62 | { 63 | "name": "Geography Geology", 64 | "x": 10, 65 | "y": 18 66 | } 67 | ] 68 | -------------------------------------------------------------------------------- /frontend/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import { Footer } from "@/components/Footer"; 2 | import { QueryClientProvider } from "@/hooks/useQuery"; 3 | import { ToastProvider } from "@/hooks/useToast"; 4 | import "@/styles/globals.css"; 5 | import { type Metadata } from "next"; 6 | import { Heebo } from "next/font/google"; 7 | 8 | const heebo = Heebo({ subsets: ["latin"], variable: "--font-sans" }); 9 | 10 | export const metadata: Metadata = { 11 | title: "UGA Optimal Schedule Builder", 12 | description: 13 | "Optimal Schedule Builder web application for UGA students to generate and design optimal academic schedules", 14 | icons: [{ rel: "icon", url: "/favicon.ico" }], 15 | }; 16 | 17 | export default function RootLayout({ 18 | children, 19 | }: Readonly<{ children: React.ReactNode }>) { 20 | return ( 21 | 22 | 23 | 24 | 25 |
{children}
26 |