import { Application } from "@oak/oak"; import { oakCors } from "@tajpouria/cors"; import dumpsRouter from "./routes/dumps.ts"; import filesRouter from "./routes/files.ts"; import usersRouter from "./routes/users.ts"; import avatarsRouter from "./routes/avatars.ts"; import wsRouter from "./routes/ws.ts"; import previewRouter from "./routes/preview.ts"; import playlistsRouter from "./routes/playlists.ts"; import commentsRouter from "./routes/comments.ts"; import followsRouter from "./routes/follows.ts"; import notificationsRouter from "./routes/notifications.ts"; import invitesRouter from "./routes/invites.ts"; import { BASE_URL, HOSTNAME, PORT } from "./config.ts"; import { errorMiddleware } from "./middleware/error.ts"; import routeStaticFilesFrom from "./lib/static.ts"; import { DUMPS_DIR, UPLOADS_DIR } from "./utils/upload.ts"; import { UUID_RE } from "./lib/slugify.ts"; const app = new Application(); app.use(errorMiddleware); app.use(oakCors()); app.use( dumpsRouter.routes(), dumpsRouter.allowedMethods(), ); app.use( filesRouter.routes(), filesRouter.allowedMethods(), ); app.use( usersRouter.routes(), usersRouter.allowedMethods(), ); app.use( avatarsRouter.routes(), avatarsRouter.allowedMethods(), ); app.use( wsRouter.routes(), wsRouter.allowedMethods(), ); app.use( previewRouter.routes(), previewRouter.allowedMethods(), ); app.use( playlistsRouter.routes(), playlistsRouter.allowedMethods(), ); app.use( commentsRouter.routes(), commentsRouter.allowedMethods(), ); app.use( followsRouter.routes(), followsRouter.allowedMethods(), ); app.use( notificationsRouter.routes(), notificationsRouter.allowedMethods(), ); app.use( invitesRouter.routes(), invitesRouter.allowedMethods(), ); app.use(routeStaticFilesFrom([ `${Deno.cwd()}/dist`, `${Deno.cwd()}/public`, ])); app.addEventListener( "listen", () => console.log(`Server listening on ${BASE_URL}`), ); app.addEventListener( "error", (e) => console.log(`Uncaught error: ${e.message}`), ); // Migrate dump files from uploads root to uploads/dumps subfolder async function migrateDumpFiles() { await Deno.mkdir(DUMPS_DIR, { recursive: true }); for await (const entry of Deno.readDir(UPLOADS_DIR)) { if (entry.isFile && UUID_RE.test(entry.name)) { await Deno.rename( `${UPLOADS_DIR}/${entry.name}`, `${DUMPS_DIR}/${entry.name}`, ).catch(() => {}); } } } if (import.meta.main) { await migrateDumpFiles(); await app.listen({ hostname: HOSTNAME, port: PORT }); } export { app };