diff --git a/app/actions/discord.ts b/app/actions/discord.ts index 05d41fa..73f8977 100644 --- a/app/actions/discord.ts +++ b/app/actions/discord.ts @@ -1,7 +1,7 @@ "use server"; -import { requireAdmin } from "@/lib/auth"; -import { getGuildRolesInternal, type DiscordRole } from "@/lib/discord"; +import { requireAdmin } from "@/lib/auth/auth"; +import { getGuildRolesInternal, type DiscordRole } from "@/lib/discord/discord"; export async function getGuildRoles(): Promise { await requireAdmin(); diff --git a/app/actions/questions.ts b/app/actions/questions.ts index 504c218..d209604 100644 --- a/app/actions/questions.ts +++ b/app/actions/questions.ts @@ -7,9 +7,9 @@ import { cdn, questions } from "@/db/schema"; import type { ImageAnswerMode, QuestionType } from "@/db/schema"; import { eq } from "drizzle-orm"; import { revalidatePath } from "next/cache"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; import { sanitizeHtml } from "@/lib/sanitize-html"; -import { sse } from "@/lib/sse"; +import { sse } from "@/lib/realtime/sse"; export async function createQuestion( formId: string, diff --git a/app/actions/submissions.ts b/app/actions/submissions.ts index 17c2008..30587e8 100644 --- a/app/actions/submissions.ts +++ b/app/actions/submissions.ts @@ -5,16 +5,16 @@ import { submissions, answers } from "@/db/schema"; import { and, count, eq, lt, lte, or } from "drizzle-orm"; import { revalidatePath } from "next/cache"; import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; -import { requireAdmin, requireDiscordId, requireFormAccess } from "@/lib/auth"; -import { sse } from "@/lib/sse"; -import type { FormAnswerPayload } from "@/lib/form-answer-values"; +import { authOptions } from "@/lib/auth/auth-options"; +import { requireAdmin, requireDiscordId, requireFormAccess } from "@/lib/auth/auth"; +import { sse } from "@/lib/realtime/sse"; +import type { FormAnswerPayload } from "@/lib/form/form-answer-values"; import { normalizeSubmissionAnswers, type StoredAnswerSnapshot, -} from "@/lib/submission-intake"; -import { submissionWebhookMessage } from "@/lib/submission-webhook"; -import { isFormAcceptingSubmissions } from "@/lib/form-availability"; +} from "@/lib/form/submission-intake"; +import { submissionWebhookMessage } from "@/lib/form/submission-webhook"; +import { isFormAcceptingSubmissions } from "@/lib/form/form-availability"; function getSubmissionResultLink(formId: string, submissionId: string) { const baseUrl = process.env.BASE_URL || process.env.NEXTAUTH_URL; diff --git a/app/admin/form/[id]/client.tsx b/app/admin/form/[id]/client.tsx index a9096f4..877df7e 100644 --- a/app/admin/form/[id]/client.tsx +++ b/app/admin/form/[id]/client.tsx @@ -72,7 +72,7 @@ import { getQuestionResponseSettings, getQuestionResponseType, type QuestionResponseType, -} from "@/lib/question-response-type"; +} from "@/lib/form/question-response-type"; import { SaveStatusIndicator, SortableQuestion, diff --git a/app/admin/form/[id]/extra/client.tsx b/app/admin/form/[id]/extra/client.tsx index 94060d6..59e9a96 100644 --- a/app/admin/form/[id]/extra/client.tsx +++ b/app/admin/form/[id]/extra/client.tsx @@ -11,7 +11,7 @@ import { toast } from "sonner"; import { testDiscordWebhook, updateForm } from "@/app/admin/form/actions"; import { Loader2, ChevronDown, Check, AlertCircle, Send } from "lucide-react"; import { getGuildRoles } from "@/app/actions/discord"; -import type { DiscordRole } from "@/lib/discord"; +import type { DiscordRole } from "@/lib/discord/discord"; import { DropdownMenu, DropdownMenuCheckboxItem, @@ -23,7 +23,7 @@ import { getErrorMessage } from "@/lib/utils"; import { isValidDiscordWebhookUrl, previewWebhookTemplate, -} from "@/lib/discord-webhook-settings"; +} from "@/lib/discord/discord-webhook-settings"; import { useDebouncedAutoSave, type AutoSaveStatus, diff --git a/app/admin/form/[id]/layout.tsx b/app/admin/form/[id]/layout.tsx index 14c20c4..bfe8278 100644 --- a/app/admin/form/[id]/layout.tsx +++ b/app/admin/form/[id]/layout.tsx @@ -2,14 +2,14 @@ import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"; import { FormAdminSidebar } from "@/components/form-admin-sidebar"; import { Metadata } from "next"; import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; -import { getSessionDiscordId } from "@/lib/auth"; -import { getDiscordMemberProfile } from "@/lib/discord"; +import { authOptions } from "@/lib/auth/auth-options"; +import { getSessionDiscordId } from "@/lib/auth/auth"; +import { getDiscordMemberProfile } from "@/lib/discord/discord"; import { db } from "@/db"; import { submissions } from "@/db/schema"; import { asc, eq } from "drizzle-orm"; import { notFound } from "next/navigation"; -import { isFormAcceptingSubmissions } from "@/lib/form-availability"; +import { isFormAcceptingSubmissions } from "@/lib/form/form-availability"; export const metadata: Metadata = { title: { diff --git a/app/admin/form/[id]/result/[submissionId]/client.tsx b/app/admin/form/[id]/result/[submissionId]/client.tsx index fe9df8e..74b4f96 100644 --- a/app/admin/form/[id]/result/[submissionId]/client.tsx +++ b/app/admin/form/[id]/result/[submissionId]/client.tsx @@ -42,8 +42,8 @@ import { import Image from 'next/image'; import { stripHtml } from "@/lib/utils"; import { HtmlDisplay } from "@/components/html-display"; -import { formatStoredAnswer } from "@/lib/form-answer-values"; -import { normalizeStoredAnswerSnapshot } from "@/lib/submission-intake"; +import { formatStoredAnswer } from "@/lib/form/form-answer-values"; +import { normalizeStoredAnswerSnapshot } from "@/lib/form/submission-intake"; import { updateSubmissionAdminNote } from "@/app/admin/form/actions"; import { useDebouncedAutoSave, diff --git a/app/admin/form/[id]/result/[submissionId]/page.tsx b/app/admin/form/[id]/result/[submissionId]/page.tsx index c0b3f65..d1aeb3f 100644 --- a/app/admin/form/[id]/result/[submissionId]/page.tsx +++ b/app/admin/form/[id]/result/[submissionId]/page.tsx @@ -6,7 +6,7 @@ import { ArrowLeft, ArrowRight } from "lucide-react"; import SubmissionDetailClient from "./client"; import { DeleteSubmissionButton } from "@/components/delete-buttons"; import { RealtimeRefresh } from "@/components/realtime-refresh"; -import { getDiscordMemberProfile } from "@/lib/discord"; +import { getDiscordMemberProfile } from "@/lib/discord/discord"; interface SubmissionDetailPageProps { params: Promise<{ diff --git a/app/admin/form/[id]/result/client.tsx b/app/admin/form/[id]/result/client.tsx index 2895176..72a3b7e 100644 --- a/app/admin/form/[id]/result/client.tsx +++ b/app/admin/form/[id]/result/client.tsx @@ -8,7 +8,7 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@ import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from "@/components/ui/pagination"; import { DeleteAllSubmissionsButton, DeleteSubmissionButton } from "@/components/delete-buttons"; import { ResultsFilters } from "@/components/results-filters"; -import type { DiscordMemberProfile } from "@/lib/discord"; +import type { DiscordMemberProfile } from "@/lib/discord/discord"; const RESULTS_PAGE_SIZE = 25; type ResultFilters = { diff --git a/app/admin/form/[id]/result/export/route.ts b/app/admin/form/[id]/result/export/route.ts index 221c213..166d7fd 100644 --- a/app/admin/form/[id]/result/export/route.ts +++ b/app/admin/form/[id]/result/export/route.ts @@ -2,12 +2,12 @@ import { NextResponse } from "next/server"; import { db } from "@/db"; import { answers } from "@/db/schema"; import { inArray } from "drizzle-orm"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; import { getFilteredSubmissions, parseResultFilters, -} from "@/lib/admin-form-results"; -import { answerCellValue } from "@/lib/form-answer-values"; +} from "@/lib/form/admin-form-results"; +import { answerCellValue } from "@/lib/form/form-answer-values"; import { stripHtml } from "@/lib/utils"; function csvCell(value: unknown) { diff --git a/app/admin/form/[id]/result/page.tsx b/app/admin/form/[id]/result/page.tsx index 9fcd2f2..c677d2e 100644 --- a/app/admin/form/[id]/result/page.tsx +++ b/app/admin/form/[id]/result/page.tsx @@ -1,5 +1,5 @@ -import { parseResultFilters, getFilteredSubmissions } from "@/lib/admin-form-results"; -import { getDiscordMemberProfile } from "@/lib/discord"; +import { parseResultFilters, getFilteredSubmissions } from "@/lib/form/admin-form-results"; +import { getDiscordMemberProfile } from "@/lib/discord/discord"; import { RealtimeRefresh } from "@/components/realtime-refresh"; import ResultsClient from "./client"; diff --git a/app/admin/form/actions.ts b/app/admin/form/actions.ts index 666c5c3..2a71982 100644 --- a/app/admin/form/actions.ts +++ b/app/admin/form/actions.ts @@ -5,10 +5,10 @@ import { forms, submissions } from "@/db/schema"; import { and, eq } from "drizzle-orm"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; import { sanitizeHtml } from "@/lib/sanitize-html"; -import { sse } from "@/lib/sse"; -import { isValidDiscordWebhookUrl } from "@/lib/discord-webhook-settings"; +import { sse } from "@/lib/realtime/sse"; +import { isValidDiscordWebhookUrl } from "@/lib/discord/discord-webhook-settings"; export async function createForm(formData: FormData) { await requireAdmin(); diff --git a/app/admin/form/page.tsx b/app/admin/form/page.tsx index 9c5e61d..939df55 100644 --- a/app/admin/form/page.tsx +++ b/app/admin/form/page.tsx @@ -15,9 +15,9 @@ import { DeleteFormButton } from "@/components/delete-buttons"; import { AdminShellServer } from "@/components/admin-shell-server"; import { createDefaultForm } from "./actions"; import { RealtimeRefresh } from "@/components/realtime-refresh"; -import { getFormSubmissionStats } from "@/lib/form-submission-stats"; +import { getFormSubmissionStats } from "@/lib/form/form-submission-stats"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { isFormAcceptingSubmissions } from "@/lib/form-availability"; +import { isFormAcceptingSubmissions } from "@/lib/form/form-availability"; export const dynamic = "force-dynamic"; diff --git a/app/admin/layout.tsx b/app/admin/layout.tsx index 7b6ff19..6946c4c 100644 --- a/app/admin/layout.tsx +++ b/app/admin/layout.tsx @@ -1,7 +1,7 @@ import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; +import { authOptions } from "@/lib/auth/auth-options"; import { redirect } from "next/navigation"; -import { getAdminDiscordIds, getSessionDiscordId } from "@/lib/auth"; +import { getAdminDiscordIds, getSessionDiscordId } from "@/lib/auth/auth"; export default async function AdminLayout({ children, diff --git a/app/admin/page.tsx b/app/admin/page.tsx index e8631b0..db5cd5e 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -18,7 +18,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { getAdminDashboardData } from "@/lib/admin-dashboard"; +import { getAdminDashboardData } from "@/lib/admin/admin-dashboard"; import { ClipboardList, FilePlus2, diff --git a/app/api/admin/video-file/route.ts b/app/api/admin/video-file/route.ts index 08d290a..e0f84f9 100644 --- a/app/api/admin/video-file/route.ts +++ b/app/api/admin/video-file/route.ts @@ -4,7 +4,7 @@ import { Readable } from "node:stream"; import { pipeline } from "node:stream/promises"; import { randomUUID } from "node:crypto"; import { NextResponse } from "next/server"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; export const dynamic = "force-dynamic"; diff --git a/app/api/admin/video-upload/route.ts b/app/api/admin/video-upload/route.ts index 05474b2..4700425 100644 --- a/app/api/admin/video-upload/route.ts +++ b/app/api/admin/video-upload/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; -import { requireAdmin } from "@/lib/auth"; -import { saveVideoUpload } from "@/lib/video-upload-storage"; +import { requireAdmin } from "@/lib/auth/auth"; +import { saveVideoUpload } from "@/lib/video/video-upload-storage"; export const dynamic = "force-dynamic"; diff --git a/app/api/auth/[...nextauth]/route.ts b/app/api/auth/[...nextauth]/route.ts index b337159..c07bb03 100644 --- a/app/api/auth/[...nextauth]/route.ts +++ b/app/api/auth/[...nextauth]/route.ts @@ -1,5 +1,5 @@ import NextAuth from "next-auth"; -import { authOptions } from "@/lib/auth-options"; +import { authOptions } from "@/lib/auth/auth-options"; const handler = NextAuth(authOptions); export { handler as GET, handler as POST }; diff --git a/app/api/auth/tiktok/callback/route.ts b/app/api/auth/tiktok/callback/route.ts index a0c9b5e..980b682 100644 --- a/app/api/auth/tiktok/callback/route.ts +++ b/app/api/auth/tiktok/callback/route.ts @@ -1,6 +1,6 @@ import { NextRequest, NextResponse } from "next/server"; import { cookies } from "next/headers"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; const TIKTOK_OAUTH_STATE_COOKIE = "tiktok-oauth-state"; diff --git a/app/api/auth/tiktok/route.ts b/app/api/auth/tiktok/route.ts index 17d6002..3dc9629 100644 --- a/app/api/auth/tiktok/route.ts +++ b/app/api/auth/tiktok/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from "next/server"; import { randomBytes } from "node:crypto"; import { cookies } from "next/headers"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; const TIKTOK_OAUTH_STATE_COOKIE = "tiktok-oauth-state"; diff --git a/app/api/auth/youtube/callback/route.ts b/app/api/auth/youtube/callback/route.ts index b4d1610..f4dd43b 100644 --- a/app/api/auth/youtube/callback/route.ts +++ b/app/api/auth/youtube/callback/route.ts @@ -1,6 +1,6 @@ import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; function escapeHtml(value: unknown) { return String(value ?? "") diff --git a/app/api/auth/youtube/route.ts b/app/api/auth/youtube/route.ts index c1afba8..1ad4085 100644 --- a/app/api/auth/youtube/route.ts +++ b/app/api/auth/youtube/route.ts @@ -1,7 +1,7 @@ import { randomBytes } from "node:crypto"; import { cookies } from "next/headers"; import { NextResponse } from "next/server"; -import { requireAdmin } from "@/lib/auth"; +import { requireAdmin } from "@/lib/auth/auth"; const COOKIE = "youtube-oauth-state"; diff --git a/app/api/cron/video-uploads/route.ts b/app/api/cron/video-uploads/route.ts index 84420d8..fce1b30 100644 --- a/app/api/cron/video-uploads/route.ts +++ b/app/api/cron/video-uploads/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import { processDueVideoUploads } from "@/lib/video-platforms"; +import { processDueVideoUploads } from "@/lib/video/video-platforms"; export const dynamic = "force-dynamic"; diff --git a/app/api/upload/route.ts b/app/api/upload/route.ts index ba749b7..ba58a03 100644 --- a/app/api/upload/route.ts +++ b/app/api/upload/route.ts @@ -1,8 +1,8 @@ import { NextResponse } from "next/server"; import { db } from "@/db"; import { cdn } from "@/db/schema"; -import { requireDiscordId } from "@/lib/auth"; -import { validateImageUploadFile, cdnUrl } from "@/lib/cdn-images"; +import { requireDiscordId } from "@/lib/auth/auth"; +import { validateImageUploadFile, cdnUrl } from "@/lib/cdn/cdn-images"; export async function POST(req: Request) { let discordId: string; diff --git a/app/cdn/[id]/route.ts b/app/cdn/[id]/route.ts index 23e7782..0552a35 100644 --- a/app/cdn/[id]/route.ts +++ b/app/cdn/[id]/route.ts @@ -1,5 +1,5 @@ import { db } from "@/db"; -import { cdnImageResponse } from "@/lib/cdn-images"; +import { cdnImageResponse } from "@/lib/cdn/cdn-images"; export async function GET( _request: Request, diff --git a/app/form/[id]/page.tsx b/app/form/[id]/page.tsx index 517a11f..07c7709 100644 --- a/app/form/[id]/page.tsx +++ b/app/form/[id]/page.tsx @@ -1,17 +1,17 @@ import { db } from "@/db"; import { FormFillerClient } from "../client"; import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; +import { authOptions } from "@/lib/auth/auth-options"; import { notFound } from "next/navigation"; import LoginDialog from "@/components/login-dialog"; -import { canAccessForm, getSessionDiscordId } from "@/lib/auth"; +import { canAccessForm, getSessionDiscordId } from "@/lib/auth/auth"; import { RealtimeRefresh } from "@/components/realtime-refresh"; import { decodeCheckboxAnswer, type FormAnswerValue, -} from "@/lib/form-answer-values"; -import { getFormSubmissionStats } from "@/lib/form-submission-stats"; -import { isFormAcceptingSubmissions } from "@/lib/form-availability"; +} from "@/lib/form/form-answer-values"; +import { getFormSubmissionStats } from "@/lib/form/form-submission-stats"; +import { isFormAcceptingSubmissions } from "@/lib/form/form-availability"; export const dynamic = "force-dynamic"; diff --git a/app/form/client.tsx b/app/form/client.tsx index 01a61d2..4230edb 100644 --- a/app/form/client.tsx +++ b/app/form/client.tsx @@ -55,8 +55,8 @@ import { import { Spinner } from "@/components/ui/spinner"; import { type FormAnswerValue, -} from "@/lib/form-answer-values"; -import { isImageOnlyResponse } from "@/lib/question-response-type"; +} from "@/lib/form/form-answer-values"; +import { isImageOnlyResponse } from "@/lib/form/question-response-type"; import { buildFormSchema, parseStoredDraft, @@ -64,7 +64,7 @@ import { type FormFillerClientProps, type FormValues, type StoredDraft, -} from "@/lib/form-client"; +} from "@/lib/form/form-client"; export function FormLayoutClient({ userName, diff --git a/app/form/layout.tsx b/app/form/layout.tsx index 6ff420b..b2c2aa3 100644 --- a/app/form/layout.tsx +++ b/app/form/layout.tsx @@ -1,12 +1,12 @@ import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; +import { authOptions } from "@/lib/auth/auth-options"; import { FormLayoutClient, LoginButton } from "./client"; import { Metadata } from "next"; import { ThemeToggle } from "@/components/theme-toggle"; -import { getSessionDiscordId } from "@/lib/auth"; -import { getDiscordMemberProfile } from "@/lib/discord"; +import { getSessionDiscordId } from "@/lib/auth/auth"; +import { getDiscordMemberProfile } from "@/lib/discord/discord"; import Link from 'next/link'; -import { getAdminDiscordIds } from "@/lib/auth"; +import { getAdminDiscordIds } from "@/lib/auth/auth"; const siteUrl = process.env.BASE_URL; diff --git a/app/form/page.tsx b/app/form/page.tsx index 13e0337..3d15d90 100644 --- a/app/form/page.tsx +++ b/app/form/page.tsx @@ -7,11 +7,11 @@ import { } from "@/components/ui/card"; import { HtmlDisplay } from "@/components/html-display"; import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; -import { canAccessForm, getSessionDiscordId } from "@/lib/auth"; +import { authOptions } from "@/lib/auth/auth-options"; +import { canAccessForm, getSessionDiscordId } from "@/lib/auth/auth"; import { RealtimeRefresh } from "@/components/realtime-refresh"; import { Badge } from "@/components/ui/badge"; -import { getFormSubmissionStats } from "@/lib/form-submission-stats"; +import { getFormSubmissionStats } from "@/lib/form/form-submission-stats"; export const dynamic = "force-dynamic"; diff --git a/app/sse/[topic]/route.ts b/app/sse/[topic]/route.ts index 4799fe3..7411501 100644 --- a/app/sse/[topic]/route.ts +++ b/app/sse/[topic]/route.ts @@ -1,10 +1,10 @@ import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; +import { authOptions } from "@/lib/auth/auth-options"; import { getAdminDiscordIds, getSessionDiscordId, -} from "@/lib/auth"; -import { isSseTopic, sse } from "@/lib/sse"; +} from "@/lib/auth/auth"; +import { isSseTopic, sse } from "@/lib/realtime/sse"; export async function GET( request: Request, diff --git a/components/admin-shell-server.tsx b/components/admin-shell-server.tsx index d179190..45f5a69 100644 --- a/components/admin-shell-server.tsx +++ b/components/admin-shell-server.tsx @@ -1,7 +1,7 @@ import { getServerSession } from "next-auth"; -import { authOptions } from "@/lib/auth-options"; -import { getSessionDiscordId } from "@/lib/auth"; -import { getDiscordMemberProfile } from "@/lib/discord"; +import { authOptions } from "@/lib/auth/auth-options"; +import { getSessionDiscordId } from "@/lib/auth/auth"; +import { getDiscordMemberProfile } from "@/lib/discord/discord"; import { AdminShell } from "@/components/admin-shell"; export async function AdminShellServer({ children }: { children: React.ReactNode }) { diff --git a/components/dropdown-menu-avatar.tsx b/components/dropdown-menu-avatar.tsx index 9ec6053..c06d008 100644 --- a/components/dropdown-menu-avatar.tsx +++ b/components/dropdown-menu-avatar.tsx @@ -12,7 +12,7 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Button } from "@/components/ui/button"; -import type { DiscordRole } from "@/lib/discord"; +import type { DiscordRole } from "@/lib/discord/discord"; export interface DiscordMemberProfile { id: string; diff --git a/components/realtime-refresh.tsx b/components/realtime-refresh.tsx index c905a2a..b6cf965 100644 --- a/components/realtime-refresh.tsx +++ b/components/realtime-refresh.tsx @@ -2,11 +2,11 @@ import { useEffect } from "react"; import { useRouter } from "next/navigation"; -import { sse } from "@/lib/sse"; +import { sse } from "@/lib/realtime/sse"; import { startRealtimeRefresh, type RealtimeRefreshHandlers, -} from "@/lib/realtime-refresh"; +} from "@/lib/realtime/realtime-refresh"; type FormRealtimeRefreshProps = { topic: "forms" | "submissions"; diff --git a/components/results-filters.tsx b/components/results-filters.tsx index 12f4637..19999c2 100644 --- a/components/results-filters.tsx +++ b/components/results-filters.tsx @@ -18,7 +18,7 @@ import { PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; -import type { ResultFilters } from "@/lib/admin-form-results"; +import type { ResultFilters } from "@/lib/form/admin-form-results"; import { Download, X, CalendarDays } from "lucide-react"; import { format, parseISO } from "date-fns"; diff --git a/lib/admin-dashboard.ts b/lib/admin/admin-dashboard.ts similarity index 100% rename from lib/admin-dashboard.ts rename to lib/admin/admin-dashboard.ts diff --git a/lib/auth-options.ts b/lib/auth/auth-options.ts similarity index 93% rename from lib/auth-options.ts rename to lib/auth/auth-options.ts index 7917c59..08eb3b9 100644 --- a/lib/auth-options.ts +++ b/lib/auth/auth-options.ts @@ -4,8 +4,8 @@ import DiscordProvider from "next-auth/providers/discord"; import { DrizzleAdapter } from "@auth/drizzle-adapter"; import { db } from "@/db"; import { accounts, sessions, users, verificationTokens } from "@/db/schema"; -import type { SessionWithDiscord } from "@/lib/auth"; -import { addDiscordGuildMember } from "@/lib/discord"; +import type { SessionWithDiscord } from "@/lib/auth/auth"; +import { addDiscordGuildMember } from "@/lib/discord/discord"; const discordIdCache = new Map(); diff --git a/lib/auth.ts b/lib/auth/auth.ts similarity index 94% rename from lib/auth.ts rename to lib/auth/auth.ts index 9f83558..12934df 100644 --- a/lib/auth.ts +++ b/lib/auth/auth.ts @@ -2,8 +2,8 @@ import "server-only"; import { getServerSession } from "next-auth"; import type { Session } from "next-auth"; import { db } from "@/db"; -import { authOptions } from "@/lib/auth-options"; -import { getGuildMemberRoles } from "@/lib/discord"; +import { authOptions } from "@/lib/auth/auth-options"; +import { getGuildMemberRoles } from "@/lib/discord/discord"; export type SessionWithDiscord = Session & { user?: Session["user"] & { diff --git a/lib/cdn-images.test.ts b/lib/cdn/cdn-images.test.ts similarity index 100% rename from lib/cdn-images.test.ts rename to lib/cdn/cdn-images.test.ts diff --git a/lib/cdn-images.ts b/lib/cdn/cdn-images.ts similarity index 100% rename from lib/cdn-images.ts rename to lib/cdn/cdn-images.ts diff --git a/lib/discord-webhook-settings.ts b/lib/discord/discord-webhook-settings.ts similarity index 100% rename from lib/discord-webhook-settings.ts rename to lib/discord/discord-webhook-settings.ts diff --git a/lib/discord.ts b/lib/discord/discord.ts similarity index 100% rename from lib/discord.ts rename to lib/discord/discord.ts diff --git a/lib/admin-form-results.ts b/lib/form/admin-form-results.ts similarity index 100% rename from lib/admin-form-results.ts rename to lib/form/admin-form-results.ts diff --git a/lib/form-answer-values.ts b/lib/form/form-answer-values.ts similarity index 100% rename from lib/form-answer-values.ts rename to lib/form/form-answer-values.ts diff --git a/lib/form-availability.test.ts b/lib/form/form-availability.test.ts similarity index 92% rename from lib/form-availability.test.ts rename to lib/form/form-availability.test.ts index 20448df..aac41fb 100644 --- a/lib/form-availability.test.ts +++ b/lib/form/form-availability.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { isFormAcceptingSubmissions } from "@/lib/form-availability"; +import { isFormAcceptingSubmissions } from "@/lib/form/form-availability"; const now = new Date("2026-07-30T12:00:00.000Z"); diff --git a/lib/form-availability.ts b/lib/form/form-availability.ts similarity index 100% rename from lib/form-availability.ts rename to lib/form/form-availability.ts diff --git a/lib/form-client.test.ts b/lib/form/form-client.test.ts similarity index 100% rename from lib/form-client.test.ts rename to lib/form/form-client.test.ts diff --git a/lib/form-client.ts b/lib/form/form-client.ts similarity index 96% rename from lib/form-client.ts rename to lib/form/form-client.ts index 3cce2f5..78ac7ea 100644 --- a/lib/form-client.ts +++ b/lib/form/form-client.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -import type { FormAnswerValue } from "@/lib/form-answer-values"; -import { decodeCheckboxAnswer } from "@/lib/form-answer-values"; +import type { FormAnswerValue } from "@/lib/form/form-answer-values"; +import { decodeCheckboxAnswer } from "@/lib/form/form-answer-values"; export type Question = { id: string; diff --git a/lib/form-submission-stats.ts b/lib/form/form-submission-stats.ts similarity index 100% rename from lib/form-submission-stats.ts rename to lib/form/form-submission-stats.ts diff --git a/lib/question-response-type.test.ts b/lib/form/question-response-type.test.ts similarity index 97% rename from lib/question-response-type.test.ts rename to lib/form/question-response-type.test.ts index a665b5b..f33ed0b 100644 --- a/lib/question-response-type.test.ts +++ b/lib/form/question-response-type.test.ts @@ -3,7 +3,7 @@ import { getQuestionResponseSettings, getQuestionResponseType, isImageOnlyResponse, -} from "@/lib/question-response-type"; +} from "@/lib/form/question-response-type"; describe("question response types", () => { test("maps stored question settings to the four editor choices", () => { diff --git a/lib/question-response-type.ts b/lib/form/question-response-type.ts similarity index 100% rename from lib/question-response-type.ts rename to lib/form/question-response-type.ts diff --git a/lib/submission-intake.test.ts b/lib/form/submission-intake.test.ts similarity index 95% rename from lib/submission-intake.test.ts rename to lib/form/submission-intake.test.ts index c4dc10e..633c54f 100644 --- a/lib/submission-intake.test.ts +++ b/lib/form/submission-intake.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { normalizeSubmissionAnswers } from "@/lib/submission-intake"; +import { normalizeSubmissionAnswers } from "@/lib/form/submission-intake"; const question = { id: "question-1", diff --git a/lib/submission-intake.ts b/lib/form/submission-intake.ts similarity index 99% rename from lib/submission-intake.ts rename to lib/form/submission-intake.ts index 5a428ce..7575c99 100644 --- a/lib/submission-intake.ts +++ b/lib/form/submission-intake.ts @@ -4,7 +4,7 @@ import { encodeAnswerValue, formatStoredAnswer, type FormAnswerValue, -} from "@/lib/form-answer-values"; +} from "@/lib/form/form-answer-values"; import { stripHtml } from "@/lib/utils"; export type SubmissionQuestion = { diff --git a/lib/submission-webhook.ts b/lib/form/submission-webhook.ts similarity index 97% rename from lib/submission-webhook.ts rename to lib/form/submission-webhook.ts index 0599cd0..ae438ca 100644 --- a/lib/submission-webhook.ts +++ b/lib/form/submission-webhook.ts @@ -4,7 +4,7 @@ import { type NormalizedSubmissionAnswer, type OldAnswersByQuestionId, type SubmissionQuestion, -} from "@/lib/submission-intake"; +} from "@/lib/form/submission-intake"; const NEW_SUBMISSION_TEMPLATE = "New submission from {username} ({id})."; const UPDATED_SUBMISSION_TEMPLATE = "Submission updated by {username} ({id}).\n{update}"; diff --git a/lib/realtime-refresh.ts b/lib/realtime/realtime-refresh.ts similarity index 100% rename from lib/realtime-refresh.ts rename to lib/realtime/realtime-refresh.ts diff --git a/lib/sse.test.ts b/lib/realtime/sse.test.ts similarity index 96% rename from lib/sse.test.ts rename to lib/realtime/sse.test.ts index 8d34a00..14f8d3c 100644 --- a/lib/sse.test.ts +++ b/lib/realtime/sse.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { isSseTopic, sse } from "@/lib/sse"; +import { isSseTopic, sse } from "@/lib/realtime/sse"; describe("leaderboard SSE contract", () => { test("registers the public leaderboards topic", () => { diff --git a/lib/sse.ts b/lib/realtime/sse.ts similarity index 100% rename from lib/sse.ts rename to lib/realtime/sse.ts diff --git a/lib/video-platforms.ts b/lib/video/video-platforms.ts similarity index 100% rename from lib/video-platforms.ts rename to lib/video/video-platforms.ts diff --git a/lib/video-upload-storage.ts b/lib/video/video-upload-storage.ts similarity index 99% rename from lib/video-upload-storage.ts rename to lib/video/video-upload-storage.ts index 39d9504..40c2cfe 100644 --- a/lib/video-upload-storage.ts +++ b/lib/video/video-upload-storage.ts @@ -13,7 +13,7 @@ import { validateThumbnailFile, validateVideoFile, publishVideoJob, -} from "@/lib/video-platforms"; +} from "@/lib/video/video-platforms"; import { eq } from "drizzle-orm"; const VIDEO_DIR = process.env.VIDEO_UPLOAD_DIR || "/nfs/erika";