Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
5c206fe
Create new search API route
amavankal Oct 2, 2025
6412bbb
Merge branch 'UTDNebula:develop' into feature/search-api
amavankal Nov 23, 2025
471c72b
Installed Graphology
amavankal Nov 29, 2025
179fd7a
Copied files to generate autocomplete graph for autocomplete api from…
amavankal Nov 29, 2025
8279dcf
Fixed undefined type errors
amavankal Nov 29, 2025
5fad4dc
Fixed API key name
amavankal Nov 29, 2025
55bbe59
Fixed dotenv path with automatic dotenv/config import
amavankal Nov 29, 2025
14562b8
Updated build scripts to fetch data from Nebula's API and build the a…
amavankal Nov 29, 2025
4ca3d29
Built autocomplete graph
amavankal Nov 29, 2025
b2c55ff
Add autocomplete route from Trends
amavankal Nov 29, 2025
cfc922f
Add script to generate course name table
amavankal Nov 29, 2025
0119b75
Copied over necessary files for autocomplete API
amavankal Nov 29, 2025
785ef0b
Fixed undefined type errors in SearchQuery
amavankal Nov 29, 2025
4f3e2c5
Fixed small undefined type issues
amavankal Nov 29, 2025
d1c6f8a
Add build script to generate course name table
amavankal Nov 29, 2025
6e78af3
Built course name tables
amavankal Nov 29, 2025
0c387c0
added autocomplete
Matrixk1ng Mar 4, 2026
4be3d3c
Merge branch 'develop' into feature/search-api
Matrixk1ng Mar 4, 2026
133168a
added the conncction to search for courses notes
Matrixk1ng Mar 5, 2026
775ca6b
Added search filter to individual notes sections
Matrixk1ng Mar 11, 2026
8297a59
eslint fix
Matrixk1ng Mar 11, 2026
f607049
Update .gitignore
Matrixk1ng Mar 11, 2026
354c078
packae lock
Matrixk1ng Mar 17, 2026
5084ea9
ran eslint and changed gitignore
Matrixk1ng Mar 17, 2026
6a32b73
ran eslint
Matrixk1ng Mar 17, 2026
41d63b7
fixed build error
Matrixk1ng Mar 17, 2026
de3983f
removed unused code
Matrixk1ng Mar 17, 2026
10448c1
removed code that caused build errors
Matrixk1ng Mar 17, 2026
fab5dfa
made header reusable
Matrixk1ng Mar 18, 2026
fd5aebe
Update package-lock.json
Matrixk1ng Mar 18, 2026
7836837
ran format
Matrixk1ng Mar 18, 2026
3d99972
resolved convos
Matrixk1ng Mar 18, 2026
e21a3a4
removed searchhome
Matrixk1ng Mar 18, 2026
43d7b2c
fixed unresolved stuff and stuff i forgot
Matrixk1ng Mar 19, 2026
3df71c5
npm format
Matrixk1ng Mar 19, 2026
9c9dd21
api url change/fix
Matrixk1ng Mar 19, 2026
f8bf6e0
Merge conflicts fix
TyHil Mar 19, 2026
2dde232
Merge branch 'develop' into feature/search-api
TyHil Mar 19, 2026
cb42049
npm install
TyHil Mar 19, 2026
9d81738
Regenerate package-lock.json
TyHil Mar 19, 2026
2b51009
moved searchbar - readded some comments - though not much, removed th…
Matrixk1ng Mar 19, 2026
edb7533
format fix
Matrixk1ng Mar 19, 2026
4bf4563
removed autofocus from header
Matrixk1ng Mar 25, 2026
4db6f1b
Merge branch 'develop' into feature/search-api
TyHil Mar 25, 2026
5e85022
Move default classnames to search bar
TyHil Mar 25, 2026
b4ed8a3
fixed fetchaggregatedData not working
Matrixk1ng Mar 25, 2026
c44e0bf
Revert package lock changes
TyHil Mar 26, 2026
0f8de19
Add data to prettier ignore
TyHil Mar 26, 2026
d92e755
Revert to old search bar design
TyHil Mar 26, 2026
2b70f81
Rebuild autocomplete graphs/tables
TyHil Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions .github/workflows/update-autocomplete.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Update course data from API

on: workflow_dispatch

jobs:
main:
name: Fetch and rebuild autocomplete graph and combos table
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write

steps:
- name: Check out Git repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}

- name: Create or reset the update branch
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git checkout develop
git branch -D update-course-data || true # Delete branch if it exists locally
git checkout -b update-course-data

- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '22'

- name: Install for ts-node
run: npm install

- name: Add API Key
run: echo "NEBULA_API_KEY=${{ secrets.NEBULA_API_KEY }}" >> .env.local

- name: Fetch new data from api
run: npm run fetchdata

- name: Build autocomplete graph
run: npm run buildautocomplete

- name: Build course name table
run: npm run buildcoursenames

- name: Commit changes
run: |
git add .
git commit -m "Update course data from API"
git push -f origin update-course-data

- name: Create PR
uses: actions/github-script@v6
with:
script: |
const { repo, owner } = context.repo;
const pulls = await github.rest.pulls.list({
owner: owner,
repo: repo,
head: '${owner}:update-course-data',
base: 'develop',
state: 'open',
});

if (pulls.data.length < 1) {
await github.rest.pulls.create({
title: 'Update course data from API',
owner: owner,
repo: repo,
head: 'update-course-data',
base: 'develop',
body: [
'Fetch and rebuild autocomplete graph and combos table',
'',
'This PR is auto-generated by',
'[actions/github-script](https://github.com/actions/github-script)',
].join('\n'),
});
}
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
src/server/db/migrations/*
next-env.d.ts
data
45 changes: 44 additions & 1 deletion package-lock.json

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

10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
"test": "NODE_OPTIONS=--experimental-vm-modules dotenv jest --detectOpenHandles --forceExit",
"auth-schema:generate": "dotenv -- npx @better-auth/cli@latest generate --output src/server/db/schema/auth.ts --config src/server/auth.ts",
"drizzle:generate": "dotenv drizzle-kit generate",
"drizzle:push": "dotenv drizzle-kit push"
"drizzle:push": "dotenv drizzle-kit push",
"fetchdata": "ts-node -O \"{\\\"module\\\":\\\"commonjs\\\"}\" src/scripts/fetchAggregatedData.ts",
"buildautocomplete": "ts-node -O \"{\\\"module\\\":\\\"commonjs\\\"}\" src/scripts/generateAutocompleteGraph.ts",
"buildcoursenames": "ts-node -O \"{\\\"module\\\":\\\"commonjs\\\"}\" src/scripts/generateCourseNameTable.ts"
},
"dependencies": {
"@auth/drizzle-adapter": "^0.3.2",
Expand All @@ -39,11 +42,13 @@
"@trpc/client": "^11.8.1",
"@trpc/server": "^11.8.1",
"@trpc/tanstack-react-query": "^11.8.1",
"autosuggest-highlight": "^3.3.4",
"better-auth": "^1.4.17",
"date-fns": "^4.1.0",
"dotenv": "^17.2.3",
"drizzle-orm": "^0.45.1",
"drizzle-zod": "^0.8.3",
"graphology": "^0.26.0",
"next": "^16.1.4",
"next-auth": "^4.24.11",
"pdfjs-dist": "^5.4.296",
Expand Down Expand Up @@ -82,7 +87,8 @@
"tailwindcss-animate": "^1.0.7",
"ts-jest": "^29.4.6",
"ts-node": "^10.9.1",
"typescript": "^5.9.3"
"typescript": "^5.9.3",
"@types/autosuggest-highlight": "^3.2.3"
},
"overrides": {
"drizzle-zod": {
Expand Down
43 changes: 43 additions & 0 deletions src/app/api/autocomplete/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { NextResponse } from 'next/server';
import autocompleteGraph from 'src/data/autocomplete_graph.json';
import type { GenericFetchedData } from 'src/modules/GenericFetchedData/GenericFetchedData';
import { type SearchQuery } from 'src/modules/SearchQuery/SearchQuery';
import {
getGraph,
searchAutocomplete,
} from '@src/modules/autocomplete/autocomplete';

const graph = getGraph(autocompleteGraph as object);

export function GET(request: Request) {
const { searchParams } = new URL(request.url);
const input = searchParams.get('input');
if (typeof input !== 'string') {
return NextResponse.json(
{ message: 'error', data: 'Incorrect query parameters' },
{ status: 400 },
);
}

let searchBy: 'any' | 'professor' | 'course' = 'any';
const searchByParam = searchParams.get('searchBy');
if (searchByParam === 'professor' || searchByParam === 'course') {
searchBy = searchByParam;
}

let limit = 20;
const limitParam = searchParams.get('limit');
if (typeof limitParam === 'string' && !isNaN(Number(limitParam))) {
limit = Number(limitParam);
}

const results = searchAutocomplete(graph, input, limit, searchBy);

return NextResponse.json(
{
state: 'done',
data: results,
} satisfies GenericFetchedData<SearchQuery[]>,
{ status: 200 },
);
}
1 change: 0 additions & 1 deletion src/app/notes/[...slug]/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ export default function NotesLayout({ children }: NotesLayoutProps) {
return (
<main className="relative min-h-screen">
<Header />

<section className="mx-auto flex w-full max-w-6xl flex-col gap-6 px-5 pb-16 pt-24 lg:pt-28">
{children}
</section>
Expand Down
22 changes: 2 additions & 20 deletions src/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import SearchIcon from '@mui/icons-material/Search';
import InputAdornment from '@mui/material/InputAdornment';
import TextField from '@mui/material/TextField';
import Header from '@src/components/header/Header';
import SearchBar from '@src/components/header/SearchBar';
import NebulaLogo from '@src/icons/NebulaLogo';

const Home = () => {
Expand All @@ -23,7 +21,6 @@ const Home = () => {
itemVisibility={{ search: false }}
color="light"
/>

<section className="h-screen">
<div className="flex h-full w-full flex-col items-center justify-center overflow-visible">
<h2 className="mb-3 flex items-center gap-1 text-sm font-semibold tracking-wider text-white text-shadow-[0_0_4px_rgb(0_0_0_/_0.4)]">
Expand All @@ -48,22 +45,7 @@ const Home = () => {
<p className="mb-10 text-center text-white text-base md:text-lg text-shadow-[0_0_4px_rgb(0_0_0_/_0.4)]">
Share and access course notes. By students, for students.
</p>

<TextField
placeholder="Search for courses or professors"
variant="outlined"
slotProps={{
input: {
endAdornment: (
<InputAdornment position="end" key="search-icon">
<SearchIcon className="text-royal dark:text-cornflower-300" />
</InputAdornment>
),
className: 'rounded-full bg-white dark:bg-neutral-700',
},
}}
className="w-full max-w-xs md:max-w-sm lg:max-w-md"
/>
<SearchBar autoFocus />
</div>
</section>
</div>
Expand Down
2 changes: 2 additions & 0 deletions src/components/header/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use server';

import SearchBar from '@src/components/header/SearchBar';
import Sidebar from '@src/components/nav/Sidebar';
import { BaseHeader, BaseHeaderProps } from './BaseHeader';

Expand All @@ -9,6 +10,7 @@ const Header = async (props: BaseHeaderProps) => {
return (
<BaseHeader
menu={<Sidebar homepage={props.shadow} hamburgerColor={props.color} />}
searchBar={<SearchBar />}
{...props}
>
{props.children}
Expand Down
Loading
Loading