Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 10 additions & 1 deletion .prettierrc.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,16 @@ const config = {
useTabs: false,
bracketSameLine: false,
endOfLine: 'auto',
plugins: ['prettier-plugin-tailwindcss'],
plugins: [
'prettier-plugin-tailwindcss',
'@ianvs/prettier-plugin-sort-imports',
],
importOrder: [
'<BUILTIN_MODULES>', // Node.js built-in modules
'<THIRD_PARTY_MODULES>', // Imports not matched by other special words or groups.
'^(@src)(/.*)$',
'^[.]', // relative imports
],
};

export default config;
1 change: 1 addition & 0 deletions next.config.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { withSentryConfig } from '@sentry/nextjs';

/**
* Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially useful
* for Docker builds.
Expand Down
80 changes: 35 additions & 45 deletions package-lock.json

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

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@hookform/resolvers": "^3.3.2",
"@ianvs/prettier-plugin-sort-imports": "^4.7.0",
"@mui/icons-material": "^7.3.1",
"@mui/material": "^7.3.1",
"@mui/material-nextjs": "^7.3.0",
Expand Down Expand Up @@ -74,7 +75,6 @@
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-react": "^7.29.4",
"eslint-plugin-react-hooks": "^4.4.0",
"eslint-plugin-simple-import-sort": "^7.0.0",
"jest": "^29.7.0",
"postcss": "^8.4.27",
"prettier": "^3.2.5",
Expand Down
1 change: 0 additions & 1 deletion src/app/api/auth/[...nextauth]/route.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import NextAuth from 'next-auth';

import { authOptions } from '@src/server/auth';

// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
Expand Down
45 changes: 16 additions & 29 deletions src/app/api/files/upload/route.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { NextResponse } from 'next/server';
import { db } from '@src/server/db';
import { file } from '@src/server/db/schema/file';
import { and, eq } from 'drizzle-orm';
import { getServerAuthSession } from '@src/server/auth';
import fs from 'fs';
import path from 'path';

import { and, eq } from 'drizzle-orm';
import { NextResponse } from 'next/server';
import { z } from 'zod';
import { getServerAuthSession } from '@src/server/auth';
import { db } from '@src/server/db';
import { file } from '@src/server/db/schema/file';

const allowedTypes = ['image/png', 'image/jpeg', 'application/pdf'];

Expand All @@ -15,10 +14,10 @@ const uploadFormSchema = z.object({
prefix: z.string().min(1, { message: 'Prefix is missing' }),
courseNumber: z.string().min(1, { message: 'Course number is missing' }),
sectionCode: z.string().min(1, { message: 'Section code is missing' }),
professor: z.string().min(1 , { message: 'Professor is missing' }),
professor: z.string().min(1, { message: 'Professor is missing' }),
term: z.enum(['Spring', 'Summer', 'Fall']),
year: z.coerce.number({ message: 'Year is missing'}),
})
year: z.coerce.number({ message: 'Year is missing' }),
});

// Upload file to database w/ file metadata (Local)
export async function POST(req: Request) {
Expand All @@ -42,17 +41,11 @@ export async function POST(req: Request) {
const newFile = data.file as File;

if (!(newFile instanceof File)) {
return NextResponse.json(
{ error: 'Invalid file upload' },
{ status: 400 },
);
return NextResponse.json({ error: 'Invalid file upload' }, { status: 400 });
}

if (newFile.size === 0) {
return NextResponse.json(
{ error: 'File is empty' },
{ status: 400 },
);
return NextResponse.json({ error: 'File is empty' }, { status: 400 });
}

if (!allowedTypes.includes(newFile.type)) {
Expand All @@ -76,10 +69,7 @@ export async function POST(req: Request) {
});

if (!sectionData) {
return NextResponse.json(
{ error: 'Section not found' },
{ status: 404 },
);
return NextResponse.json({ error: 'Section not found' }, { status: 404 });
}

try {
Expand All @@ -96,10 +86,10 @@ export async function POST(req: Request) {
const fileMetadata = {
authorId: session.user.id,
sectionId: sectionData.id,
fileTitle: newFile.name, // required by schema
fileName: newFile.name, // required by schema
fileTitle: newFile.name, // required by schema
fileName: newFile.name, // required by schema
};

const result = await db.insert(file).values(fileMetadata).returning();

return NextResponse.json(
Expand All @@ -108,9 +98,6 @@ export async function POST(req: Request) {
);
} catch (err) {
console.error('File upload error:', err);
return NextResponse.json(
{ error: 'File upload failed' },
{ status: 500 },
);
return NextResponse.json({ error: 'File upload failed' }, { status: 500 });
}
}
5 changes: 2 additions & 3 deletions src/app/api/reports/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@
import { NextResponse } from 'next/server'; // Used to send HTTP responses (JSON, status codes)
import { z } from 'zod'; // Zod validates and parses input data

// Import session helper to check if a user is logged in
import { getServerAuthSession } from '@src/server/auth';
// Import database connection and the "report" table schema
import { db } from '@src/server/db';
import { report } from '@src/server/db/schema/reports';

// Import session helper to check if a user is logged in
import { getServerAuthSession } from '@src/server/auth';

// This ensures the API only accepts the correct fields
const CreateReportSchema = z.object({
fileId: z.string().min(1),
Expand Down
10 changes: 4 additions & 6 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import '@src/styles/globals.css';

import { ThemeProvider } from '@mui/material/styles';
import { AppRouterCacheProvider } from '@mui/material-nextjs/v15-appRouter';
import { Bai_Jamjuree, Inter } from 'next/font/google';
import { type Metadata } from 'next';
import { ThemeProvider } from '@mui/material/styles';
import { GoogleAnalytics } from '@next/third-parties/google';
import { type Metadata } from 'next';
import { Bai_Jamjuree, Inter } from 'next/font/google';
import Link from 'next/link';

import theme from '@src/utils/theme';
import { ToastProvider } from '@src/components/toast/ToastProvider';
import theme from '@src/utils/theme';

const inter = Inter({
subsets: ['latin'],
Expand Down
2 changes: 1 addition & 1 deletion src/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Metadata } from 'next';
import NavBar from '@components/NavBar';
import type { Metadata } from 'next';

export const metadata: Metadata = {
alternates: {
Expand Down
6 changes: 3 additions & 3 deletions src/components/NavBar.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import Link from 'next/link';
import Image from 'next/image';
import { IconButton, Tooltip } from '@mui/material';
import Image from 'next/image';
import Link from 'next/link';
import React from 'react';

export default function NavBar() {
return (
Expand Down
1 change: 1 addition & 0 deletions src/components/toast/ToastProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
'use client';

import React, {
createContext,
useCallback,
Expand Down
2 changes: 1 addition & 1 deletion src/server/api/root.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createCallerFactory, createTRPCRouter } from '@src/server/api/trpc';
import { userMetadataRouter } from './routers/userMetadata';
import { storageRouter } from './routers/storage';
import { userMetadataRouter } from './routers/userMetadata';

/**
* This is the primary router for your server.
Expand Down
6 changes: 3 additions & 3 deletions src/server/api/routers/storage.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { callStorageAPI, getUploadURL } from '@src/utils/storage';
import { createTRPCRouter, publicProcedure, protectedProcedure } from '../trpc';
import { z } from 'zod';
import { TRPCError } from '@trpc/server';
import { z } from 'zod';
import { callStorageAPI, getUploadURL } from '@src/utils/storage';
import { createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc';

const getDeleteSchema = z.object({
objectID: z.string(),
Expand Down
5 changes: 2 additions & 3 deletions src/server/api/routers/userMetadata.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { z } from 'zod';
import { createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc';
import { eq, sql } from 'drizzle-orm';

import { z } from 'zod';
import { insertUserMetadata } from '@src/server/db/models';
import { userMetadata, user as users } from '@src/server/db/schema/user';
import { createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc';

const byIdSchema = z.object({ id: z.string().uuid() });

Expand Down
3 changes: 1 addition & 2 deletions src/server/api/trpc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@
*/

import { initTRPC, TRPCError } from '@trpc/server';
import { cache } from 'react';
import superjson from 'superjson';
import { ZodError } from 'zod';

import { getServerAuthSession } from '@src/server/auth';
import { db } from '@src/server/db';
import { cache } from 'react';

/**
* 1. CONTEXT
Expand Down
12 changes: 6 additions & 6 deletions src/server/auth.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { DrizzleAdapter } from '@auth/drizzle-adapter';
import { eq } from 'drizzle-orm';
import { pgTable } from 'drizzle-orm/pg-core';
import {
getServerSession,
type NextAuthOptions,
type DefaultSession,
type NextAuthOptions,
} from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';
import DiscordProvider from 'next-auth/providers/discord';
import GoogleProvider from 'next-auth/providers/google';
import { env } from '@src/env.mjs';
import { DrizzleAdapter } from '@auth/drizzle-adapter';
import { db } from './db';
import { eq } from 'drizzle-orm';
import { type SelectUserMetadata, type InsertUserMetadata } from './db/models';
import { pgTable } from 'drizzle-orm/pg-core';
import { type InsertUserMetadata, type SelectUserMetadata } from './db/models';
import { userMetadata } from './db/schema/user';

/**
Expand Down
6 changes: 3 additions & 3 deletions src/server/db/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { drizzle } from 'drizzle-orm/neon-http';
import { env } from '@src/env.mjs';

import * as user from './schema/user';
import * as file from './schema/file';
import * as section from './schema/section';
import * as report from './schema/reports';
import * as section from './schema/section';
import * as user from './schema/user';

const schema = {
...file,
...section,
Expand Down
Loading