From 2e058e6101438de20910cba0f8a9610ba1387777 Mon Sep 17 00:00:00 2001 From: bh0fer Date: Sun, 13 Sep 2026 21:01:14 +0000 Subject: [PATCH 1/2] cleanup imports: remove unused and sort trick: configure auto organisation in vs code and replace "import " with "import " to trigger format --- .devcontainer/devcontainer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index fa758d1..dc6efbc 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -63,7 +63,10 @@ "copilotAccessMode": "ro", "expiresOn": 0 } - ] + ], + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + } } } }, From 5947a5c8a10ef0117c71b9fbeb642cf4d38b7470 Mon Sep 17 00:00:00 2001 From: bh0fer Date: Sun, 13 Sep 2026 21:07:08 +0000 Subject: [PATCH 2/2] organize imports --- .vscode/settings.json | 3 + prisma/reset.ts | 2 +- .../seed-files/document-root-permissions.ts | 2 +- prisma/seed-files/documents.ts | 1 - prisma/seed.ts | 6 +- .../view-migrations/create-view-migration.ts | 2 +- src/app.ts | 14 ++-- src/auth.ts | 14 ++-- src/auth/guard.ts | 4 +- src/controllers/admins.ts | 10 +-- src/controllers/cmsSettings.ts | 2 +- src/controllers/documentRoots.ts | 6 +- src/controllers/documents.ts | 8 +- src/controllers/rootGroupPermissions.ts | 4 +- src/controllers/rootUserPermissions.ts | 4 +- src/controllers/studentGroups.ts | 4 +- src/controllers/users.ts | 2 +- src/instrumentation.ts | 2 +- src/models/CmsSetting.ts | 4 +- src/models/Document.ts | 6 +- src/models/DocumentRoot.ts | 10 +-- src/models/RootGroupPermission.ts | 6 +- src/models/RootUserPermission.ts | 6 +- src/models/StudentGroup.ts | 10 +-- src/models/User.ts | 7 +- src/prisma.ts | 2 +- src/routes/event-handlers/action.handler.ts | 6 +- src/routes/event-handlers/joinRoom.handler.ts | 12 +-- .../event-handlers/leaveRoom.handler.ts | 6 +- .../event-handlers/streamUpdate.handler.ts | 8 +- src/routes/router.ts | 76 +++++++++---------- src/routes/socketEventTypes.ts | 6 +- src/routes/socketEvents.ts | 8 +- src/server.ts | 8 +- src/socketIoServer.ts | 6 +- src/tests/integration/helpers.ts | 4 +- 36 files changed, 141 insertions(+), 140 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7d8dd9b..274e4a8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,5 +14,8 @@ "editor.formatOnSave": true, "files.exclude": { "**/*:Zone.Identifier": true + }, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" } } \ No newline at end of file diff --git a/prisma/reset.ts b/prisma/reset.ts index 4d1d5c2..8825434 100644 --- a/prisma/reset.ts +++ b/prisma/reset.ts @@ -1,6 +1,6 @@ import 'dotenv/config'; -import { Prisma } from './generated/client.js'; import prisma from '../src/prisma.js'; +import { Prisma } from './generated/client.js'; async function main() { const { DATABASE_URL } = process.env; diff --git a/prisma/seed-files/document-root-permissions.ts b/prisma/seed-files/document-root-permissions.ts index 02cc622..e817d69 100644 --- a/prisma/seed-files/document-root-permissions.ts +++ b/prisma/seed-files/document-root-permissions.ts @@ -4,4 +4,4 @@ const rootUserPermissions: Prisma.RootUserPermissionCreateManyInput[] = []; const rootGroupPermissions: Prisma.RootGroupPermissionCreateManyInput[] = []; -export { rootUserPermissions, rootGroupPermissions }; +export { rootGroupPermissions, rootUserPermissions }; diff --git a/prisma/seed-files/documents.ts b/prisma/seed-files/documents.ts index a348fd0..d1da4f9 100644 --- a/prisma/seed-files/documents.ts +++ b/prisma/seed-files/documents.ts @@ -1,5 +1,4 @@ import { Prisma } from '../generated/client.js'; -import { FOO_BAR_ID, TEST_USER_ID } from './users.js'; const { USER_EMAIL, USER_ID } = process.env; diff --git a/prisma/seed.ts b/prisma/seed.ts index 7b7e94b..3892b28 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,4 +1,5 @@ -import { FOO_BAR_ID, TEST_USER_ID, users as seedUsers } from './seed-files/users.js'; +import prisma from '../src/prisma.js'; +import { documentRoots as seedDocumentRoots } from './seed-files/document-roots.js'; import { documents as seedDocuments } from './seed-files/documents.js'; import { ALL_USERS_GROUP_ID, @@ -6,8 +7,7 @@ import { PROJECT_GROUP_ID, studentGroups as seedStudentGroups } from './seed-files/student-groups.js'; -import { documentRoots as seedDocumentRoots } from './seed-files/document-roots.js'; -import prisma from '../src/prisma.js'; +import { FOO_BAR_ID, TEST_USER_ID, users as seedUsers } from './seed-files/users.js'; const { USER_ID, USER_EMAIL } = process.env; diff --git a/prisma/view-migrations/create-view-migration.ts b/prisma/view-migrations/create-view-migration.ts index 6834efa..92c0006 100644 --- a/prisma/view-migrations/create-view-migration.ts +++ b/prisma/view-migrations/create-view-migration.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; -import * as path from 'path'; import { load as yamlLoad } from 'js-yaml'; import { default as parseArgs } from 'minimist'; +import * as path from 'path'; import { exit } from 'process'; import { fileURLToPath } from 'url'; diff --git a/src/app.ts b/src/app.ts index 947b995..20e4bfd 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,18 +1,18 @@ +import { fromNodeHeaders, toNodeHandler } from 'better-auth/node'; +import cors from 'cors'; import express, { NextFunction, Request, Response } from 'express'; import path from 'path'; -import cors from 'cors'; -import morganMiddleware from './middleware/morgan.middleware.js'; -import router from './routes/router.js'; +import { type User } from '../prisma/generated/client.js'; +import { auth } from './auth.js'; import routeGuard, { createAccessRules } from './auth/guard.js'; +import morganMiddleware from './middleware/morgan.middleware.js'; import authConfig from './routes/authConfig.js'; -import { type User } from '../prisma/generated/client.js'; +import router from './routes/router.js'; import BaseError from './utils/errors/BaseError.js'; -import { fromNodeHeaders, toNodeHandler } from 'better-auth/node'; -import { auth } from './auth.js'; +import { notify } from './socketIoServer.js'; import Logger from './utils/logger.js'; import { CORS_ORIGIN } from './utils/originConfig.js'; -import { notify } from './socketIoServer.js'; const AccessRules = createAccessRules(authConfig.accessMatrix); diff --git a/src/auth.ts b/src/auth.ts index 9745735..e05aadd 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -1,19 +1,19 @@ import { betterAuth } from 'better-auth'; import { prismaAdapter } from 'better-auth/adapters/prisma'; -import prisma from './prisma.js'; import { createAuthMiddleware } from 'better-auth/api'; import { admin } from 'better-auth/plugins/admin'; +import { adminAc, userAc } from 'better-auth/plugins/admin/access'; import { oneTimeToken } from 'better-auth/plugins/one-time-token'; -import { CORS_ORIGIN_STRINGIFIED } from './utils/originConfig.js'; -import { getNameFromEmail } from './helpers/email.js'; import type { GithubProfile, MicrosoftEntraIDProfile } from 'better-auth/social-providers'; -import Logger from './utils/logger.js'; -import { getIo, notify } from './socketIoServer.js'; +import { teacher } from './auth/permissions.js'; +import { getNameFromEmail } from './helpers/email.js'; import User from './models/User.js'; +import prisma from './prisma.js'; import { IoRoom } from './routes/socketEvents.js'; import { IoEvent, RecordType } from './routes/socketEventTypes.js'; -import { adminAc, userAc } from 'better-auth/plugins/admin/access'; -import { teacher } from './auth/permissions.js'; +import { getIo, notify } from './socketIoServer.js'; +import Logger from './utils/logger.js'; +import { CORS_ORIGIN_STRINGIFIED } from './utils/originConfig.js'; // If your Prisma file is located elsewhere, you can change the path diff --git a/src/auth/guard.ts b/src/auth/guard.ts index d5d966f..e7645a1 100644 --- a/src/auth/guard.ts +++ b/src/auth/guard.ts @@ -1,8 +1,8 @@ import { NextFunction, Request, Response } from 'express'; +import { getAccessLevel, Role } from '../models/User.js'; import { AccessMatrix } from '../routes/authConfig.js'; -import Logger from '../utils/logger.js'; import { HttpStatusCode } from '../utils/errors/BaseError.js'; -import { getAccessLevel, Role } from '../models/User.js'; +import Logger from '../utils/logger.js'; interface AccessRegexRule { path: string; diff --git a/src/controllers/admins.ts b/src/controllers/admins.ts index 4c14883..bd74b9e 100644 --- a/src/controllers/admins.ts +++ b/src/controllers/admins.ts @@ -1,12 +1,12 @@ +import { fromNodeHeaders } from 'better-auth/node'; import { RequestHandler } from 'express'; -import { IoEvent, RecordType } from '../routes/socketEventTypes.js'; -import { IoRoom } from '../routes/socketEvents.js'; import { Prisma } from '../../prisma/generated/client.js'; -import { HTTP403Error } from '../utils/errors/Errors.js'; -import prisma from '../prisma.js'; import { auth } from '../auth.js'; -import { fromNodeHeaders } from 'better-auth/node'; import User, { hasElevatedAccess, Role } from '../models/User.js'; +import prisma from '../prisma.js'; +import { IoEvent, RecordType } from '../routes/socketEventTypes.js'; +import { IoRoom } from '../routes/socketEvents.js'; +import { HTTP403Error } from '../utils/errors/Errors.js'; export const createAllowedAction: RequestHandler = async ( req, diff --git a/src/controllers/cmsSettings.ts b/src/controllers/cmsSettings.ts index 807362b..f538fc6 100644 --- a/src/controllers/cmsSettings.ts +++ b/src/controllers/cmsSettings.ts @@ -1,7 +1,7 @@ import { RequestHandler } from 'express'; +import { CmsSettings as DbCmsSettings } from '../../prisma/generated/client.js'; import CmsSettings from '../models/CmsSetting.js'; import { ChangedRecord, IoEvent, RecordType } from '../routes/socketEventTypes.js'; -import { CmsSettings as DbCmsSettings } from '../../prisma/generated/client.js'; export const find: RequestHandler = async (req, res, next) => { const settings = await CmsSettings.findModel((req as any).user!); diff --git a/src/controllers/documentRoots.ts b/src/controllers/documentRoots.ts index 457fa5e..ae536c2 100644 --- a/src/controllers/documentRoots.ts +++ b/src/controllers/documentRoots.ts @@ -1,11 +1,11 @@ import { RequestHandler } from 'express'; +import { NoneAccess, RO_RW_DocumentRootAccess } from '../helpers/accessPolicy.js'; +import Document from '../models/Document.js'; import DocumentRoot, { Config as CreateConfig, UpdateConfig } from '../models/DocumentRoot.js'; +import { hasElevatedAccess } from '../models/User.js'; import { ChangedRecord, IoEvent, RecordType } from '../routes/socketEventTypes.js'; import { IoRoom } from '../routes/socketEvents.js'; import { HTTP400Error, HTTP403Error } from '../utils/errors/Errors.js'; -import Document from '../models/Document.js'; -import { NoneAccess, RO_RW_DocumentRootAccess } from '../helpers/accessPolicy.js'; -import { hasElevatedAccess } from '../models/User.js'; export const findMultipleFor: RequestHandler< { id: string /** userId */ }, diff --git a/src/controllers/documents.ts b/src/controllers/documents.ts index 5abf044..f517450 100644 --- a/src/controllers/documents.ts +++ b/src/controllers/documents.ts @@ -1,12 +1,12 @@ -import { Document as DbDocument, Prisma } from '../../prisma/generated/client.js'; +import type { JsonObject } from '@prisma/client/runtime/client'; import { RequestHandler } from 'express'; +import { Document as DbDocument, Prisma } from '../../prisma/generated/client.js'; +import { NoneAccess, RO_RW_DocumentRootAccess, RWAccess } from '../helpers/accessPolicy.js'; import Document from '../models/Document.js'; +import prisma from '../prisma.js'; import { ChangedDocument, IoEvent, RecordType } from '../routes/socketEventTypes.js'; import { IoRoom } from '../routes/socketEvents.js'; -import { NoneAccess, RO_RW_DocumentRootAccess, RWAccess } from '../helpers/accessPolicy.js'; -import prisma from '../prisma.js'; import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; -import type { JsonObject } from '@prisma/client/runtime/client'; export const find: RequestHandler<{ id: string }> = async (req, res, next) => { const document = await Document.findModel((req as any).user!, req.params.id); diff --git a/src/controllers/rootGroupPermissions.ts b/src/controllers/rootGroupPermissions.ts index 21cfd1a..9ca8696 100644 --- a/src/controllers/rootGroupPermissions.ts +++ b/src/controllers/rootGroupPermissions.ts @@ -1,8 +1,8 @@ -import { Access } from '../../prisma/generated/client.js'; import { RequestHandler } from 'express'; +import { Access } from '../../prisma/generated/client.js'; import RootGroupPermission from '../models/RootGroupPermission.js'; -import { HTTP400Error } from '../utils/errors/Errors.js'; import { IoEvent, RecordType } from '../routes/socketEventTypes.js'; +import { HTTP400Error } from '../utils/errors/Errors.js'; export const create: RequestHandler< any, diff --git a/src/controllers/rootUserPermissions.ts b/src/controllers/rootUserPermissions.ts index 4297791..c192289 100644 --- a/src/controllers/rootUserPermissions.ts +++ b/src/controllers/rootUserPermissions.ts @@ -1,9 +1,9 @@ -import { Access } from '../../prisma/generated/client.js'; import { RequestHandler } from 'express'; +import { Access } from '../../prisma/generated/client.js'; import RootUserPermission from '../models/RootUserPermission.js'; -import { HTTP400Error } from '../utils/errors/Errors.js'; import { IoEvent, RecordType } from '../routes/socketEventTypes.js'; import { IoRoom } from '../routes/socketEvents.js'; +import { HTTP400Error } from '../utils/errors/Errors.js'; export const create: RequestHandler< any, diff --git a/src/controllers/studentGroups.ts b/src/controllers/studentGroups.ts index 537527e..2abb058 100644 --- a/src/controllers/studentGroups.ts +++ b/src/controllers/studentGroups.ts @@ -1,8 +1,8 @@ -import { StudentGroup as DbStudentGroup } from '../../prisma/generated/client.js'; +import { JsonObject } from '@prisma/client/runtime/client'; import { RequestHandler } from 'express'; +import { StudentGroup as DbStudentGroup } from '../../prisma/generated/client.js'; import StudentGroup from '../models/StudentGroup.js'; import { IoEvent, RecordType } from '../routes/socketEventTypes.js'; -import { JsonObject } from '@prisma/client/runtime/client'; export const create: RequestHandler = async (req, res, next) => { const { name, description, parentId } = req.body; diff --git a/src/controllers/users.ts b/src/controllers/users.ts index d8601b5..3ea709e 100644 --- a/src/controllers/users.ts +++ b/src/controllers/users.ts @@ -1,5 +1,5 @@ -import { User as DbUser } from '../../prisma/generated/client.js'; import { RequestHandler } from 'express'; +import { User as DbUser } from '../../prisma/generated/client.js'; import User from '../models/User.js'; export const user: RequestHandler = async (req, res) => { diff --git a/src/instrumentation.ts b/src/instrumentation.ts index 1971930..8ec82c3 100644 --- a/src/instrumentation.ts +++ b/src/instrumentation.ts @@ -1,6 +1,6 @@ import * as Sentry from '@sentry/node'; -import Logger from './utils/logger.js'; import dotenv from 'dotenv'; +import Logger from './utils/logger.js'; dotenv.config(); if (process.env.NODE_ENV === 'production' && process.env.SENTRY_DSN) { Logger.info('Initializing Sentry'); diff --git a/src/models/CmsSetting.ts b/src/models/CmsSetting.ts index 503b413..b7104b3 100644 --- a/src/models/CmsSetting.ts +++ b/src/models/CmsSetting.ts @@ -1,6 +1,6 @@ -import { Prisma, PrismaClient, CmsSettings as DbCmsSettings, User } from '../../prisma/generated/client.js'; -import prisma from '../prisma.js'; +import { CmsSettings as DbCmsSettings, Prisma, PrismaClient, User } from '../../prisma/generated/client.js'; import { createDataExtractor } from '../helpers/dataExtractor.js'; +import prisma from '../prisma.js'; import Logger from '../utils/logger.js'; const getData = createDataExtractor(['activeBranch', 'activePath']); diff --git a/src/models/Document.ts b/src/models/Document.ts index 8d8b030..e248f0f 100644 --- a/src/models/Document.ts +++ b/src/models/Document.ts @@ -1,12 +1,12 @@ -import { Access, Document as DbDocument, PrismaClient, User } from '../../prisma/generated/client.js'; import type { JsonObject } from '@prisma/client/runtime/client'; +import { Access, Document as DbDocument, PrismaClient, User } from '../../prisma/generated/client.js'; +import { highestAccess, NoneAccess, RWAccess } from '../helpers/accessPolicy.js'; import prisma from '../prisma.js'; import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; +import Logger from '../utils/logger.js'; import DocumentRoot, { AccessCheckableDocumentRoot } from './DocumentRoot.js'; -import { highestAccess, NoneAccess, RWAccess } from '../helpers/accessPolicy.js'; import { ApiGroupPermission } from './RootGroupPermission.js'; import { ApiUserPermission } from './RootUserPermission.js'; -import Logger from '../utils/logger.js'; import { hasElevatedAccess, Role, whereStudentGroupAccess } from './User.js'; type AccessCheckableDocument = DbDocument & { documentRoot: AccessCheckableDocumentRoot }; diff --git a/src/models/DocumentRoot.ts b/src/models/DocumentRoot.ts index eccd7f1..b55c5f7 100644 --- a/src/models/DocumentRoot.ts +++ b/src/models/DocumentRoot.ts @@ -1,18 +1,18 @@ -import prisma from '../prisma.js'; import { Access, - Document, DocumentRoot as DbDocumentRoot, + Document, PrismaClient, RootGroupPermission, RootUserPermission, User } from '../../prisma/generated/client.js'; +import { asDocumentRootAccess, asGroupAccess, asUserAccess } from '../helpers/accessPolicy.js'; +import prisma from '../prisma.js'; +import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; import { ApiDocument } from './Document.js'; -import { ApiUserPermission } from './RootUserPermission.js'; import { ApiGroupPermission } from './RootGroupPermission.js'; -import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; -import { asDocumentRootAccess, asGroupAccess, asUserAccess } from '../helpers/accessPolicy.js'; +import { ApiUserPermission } from './RootUserPermission.js'; import { hasElevatedAccess, Role, whereStudentGroupAccess } from './User.js'; export type ApiDocumentRoot = DbDocumentRoot & { diff --git a/src/models/RootGroupPermission.ts b/src/models/RootGroupPermission.ts index fdd6d8b..06e4f9a 100644 --- a/src/models/RootGroupPermission.ts +++ b/src/models/RootGroupPermission.ts @@ -1,13 +1,13 @@ import { Access, - PrismaClient, RootGroupPermission as DbGroupPermission, + PrismaClient, User } from '../../prisma/generated/client.js'; -import prisma from '../prisma.js'; import { asGroupAccess } from '../helpers/accessPolicy.js'; -import { hasElevatedAccess, Role } from './User.js'; +import prisma from '../prisma.js'; import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; +import { hasElevatedAccess, Role } from './User.js'; // TODO: Consider checking existence of documentRoot / studentGroup to provide better error messages / exceptions. diff --git a/src/models/RootUserPermission.ts b/src/models/RootUserPermission.ts index 7817df2..d243b09 100644 --- a/src/models/RootUserPermission.ts +++ b/src/models/RootUserPermission.ts @@ -1,13 +1,13 @@ import { Access, - PrismaClient, RootUserPermission as DbRootUserPermission, + PrismaClient, User } from '../../prisma/generated/client.js'; -import prisma from '../prisma.js'; import { asUserAccess } from '../helpers/accessPolicy.js'; -import { hasElevatedAccess, Role, whereStudentGroupAccess } from './User.js'; +import prisma from '../prisma.js'; import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; +import { hasElevatedAccess, Role, whereStudentGroupAccess } from './User.js'; // TODO: Consider checking existence of documentRoot / user to provide better error messages / exceptions. diff --git a/src/models/StudentGroup.ts b/src/models/StudentGroup.ts index 9c5b167..7668ea6 100644 --- a/src/models/StudentGroup.ts +++ b/src/models/StudentGroup.ts @@ -1,11 +1,11 @@ -import { Prisma, PrismaClient, StudentGroup as DbStudentGroup, User } from '../../prisma/generated/client.js'; -import prisma from '../prisma.js'; -import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; -import { createDataExtractor } from '../helpers/dataExtractor.js'; -import { hasElevatedAccess, Role } from './User.js'; import { JsonObject } from '@prisma/client/runtime/client'; +import { StudentGroup as DbStudentGroup, Prisma, PrismaClient, User } from '../../prisma/generated/client.js'; +import { createDataExtractor } from '../helpers/dataExtractor.js'; import asApiRecord, { type ApiStudentGroup } from '../helpers/StudentGroup.asApiRecord.js'; +import prisma from '../prisma.js'; +import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; import StudentGroupCache from '../utils/StudentGroup.cache.js'; +import { hasElevatedAccess, Role } from './User.js'; export const StreamableGroupUserCacheStore = new StudentGroupCache(); diff --git a/src/models/User.ts b/src/models/User.ts index a6c8401..b439f1d 100644 --- a/src/models/User.ts +++ b/src/models/User.ts @@ -1,9 +1,8 @@ -import { Prisma, PrismaClient, User as DbUser } from '../../prisma/generated/client.js'; +import { Session } from 'better-auth'; +import { User as DbUser, Prisma, PrismaClient } from '../../prisma/generated/client.js'; +import { createDataExtractor } from '../helpers/dataExtractor.js'; import prisma from '../prisma.js'; import { HTTP403Error, HTTP404Error } from '../utils/errors/Errors.js'; -import { createDataExtractor } from '../helpers/dataExtractor.js'; -import _ from 'es-toolkit/compat'; -import { Session } from 'better-auth'; const getData = createDataExtractor(['firstName', 'lastName']); export enum Role { diff --git a/src/prisma.ts b/src/prisma.ts index 132098c..a6ee33e 100644 --- a/src/prisma.ts +++ b/src/prisma.ts @@ -1,5 +1,5 @@ -import { Prisma, PrismaClient } from '../prisma/generated/client.js'; import { PrismaPg } from '@prisma/adapter-pg'; +import { Prisma, PrismaClient } from '../prisma/generated/client.js'; const connectionString = `${process.env.DATABASE_URL}`; diff --git a/src/routes/event-handlers/action.handler.ts b/src/routes/event-handlers/action.handler.ts index 787d55e..eae9bf4 100644 --- a/src/routes/event-handlers/action.handler.ts +++ b/src/routes/event-handlers/action.handler.ts @@ -1,8 +1,8 @@ -import { User } from '../../../prisma/generated/client.js'; -import { ClientToServerEvents, IoClientEvent, IoEvent, ServerToClientEvents } from '../socketEventTypes.js'; import type { DefaultEventsMap, Socket } from 'socket.io'; -import prisma from '../../prisma.js'; +import { User } from '../../../prisma/generated/client.js'; import { Role } from '../../models/User.js'; +import prisma from '../../prisma.js'; +import { ClientToServerEvents, IoClientEvent, IoEvent, ServerToClientEvents } from '../socketEventTypes.js'; const onAction: ( user: User, diff --git a/src/routes/event-handlers/joinRoom.handler.ts b/src/routes/event-handlers/joinRoom.handler.ts index c11508f..c3d407c 100644 --- a/src/routes/event-handlers/joinRoom.handler.ts +++ b/src/routes/event-handlers/joinRoom.handler.ts @@ -1,12 +1,12 @@ -import { User } from '../../../prisma/generated/client.js'; -import { ClientToServerEvents, IoClientEvent, ServerToClientEvents } from '../socketEventTypes.js'; import type { DefaultEventsMap, Socket } from 'socket.io'; -import prisma from '../../prisma.js'; -import StudentGroup from '../../models/StudentGroup.js'; -import { onStreamDynamicRoomUpdate } from './streamUpdate.handler.js'; -import DocumentRoot from '../../models/DocumentRoot.js'; +import { User } from '../../../prisma/generated/client.js'; import { highestAccess, RWAccess } from '../../helpers/accessPolicy.js'; +import DocumentRoot from '../../models/DocumentRoot.js'; +import StudentGroup from '../../models/StudentGroup.js'; import { Role } from '../../models/User.js'; +import prisma from '../../prisma.js'; +import { ClientToServerEvents, IoClientEvent, ServerToClientEvents } from '../socketEventTypes.js'; +import { onStreamDynamicRoomUpdate } from './streamUpdate.handler.js'; type SocketType = Socket; const isDocumentRoot = (roomId: string) => { diff --git a/src/routes/event-handlers/leaveRoom.handler.ts b/src/routes/event-handlers/leaveRoom.handler.ts index 56193ca..134d5f9 100644 --- a/src/routes/event-handlers/leaveRoom.handler.ts +++ b/src/routes/event-handlers/leaveRoom.handler.ts @@ -1,8 +1,8 @@ -import { User } from '../../../prisma/generated/client.js'; -import { ClientToServerEvents, IoClientEvent, ServerToClientEvents } from '../socketEventTypes.js'; import type { DefaultEventsMap, Socket } from 'socket.io'; -import prisma from '../../prisma.js'; +import { User } from '../../../prisma/generated/client.js'; import { hasElevatedAccess } from '../../models/User.js'; +import prisma from '../../prisma.js'; +import { ClientToServerEvents, IoClientEvent, ServerToClientEvents } from '../socketEventTypes.js'; const onLeaveRoom: ( user: User, diff --git a/src/routes/event-handlers/streamUpdate.handler.ts b/src/routes/event-handlers/streamUpdate.handler.ts index faf1e9e..ca51157 100644 --- a/src/routes/event-handlers/streamUpdate.handler.ts +++ b/src/routes/event-handlers/streamUpdate.handler.ts @@ -1,3 +1,7 @@ +import type { DefaultEventsMap, Socket } from 'socket.io'; +import { User } from '../../../prisma/generated/client.js'; +import { StreamableGroupUserCacheStore } from '../../models/StudentGroup.js'; +import Logger from '../../utils/logger.js'; import { ChangedDocument, ClientToServerEvents, @@ -5,10 +9,6 @@ import { IoEvent, ServerToClientEvents } from '../socketEventTypes.js'; -import { User } from '../../../prisma/generated/client.js'; -import type { DefaultEventsMap, Socket } from 'socket.io'; -import { StreamableGroupUserCacheStore } from '../../models/StudentGroup.js'; -import Logger from '../../utils/logger.js'; const onStreamUpdate: ( user: User, diff --git a/src/routes/router.ts b/src/routes/router.ts index e45b439..6c64d22 100644 --- a/src/routes/router.ts +++ b/src/routes/router.ts @@ -1,39 +1,4 @@ import express from 'express'; -import { all as allUsers, find as findUser, update as updateUser, user } from '../controllers/users.js'; -import { - all as allStudentGroups, - create as createStudentGroup, - destroy as deleteStudentGroup, - update as updateStudentGroup, - addUser as addStudentGroupUser, - removeUser as removeStudentGroupUser, - setAdminRole as setStudentGroupAdminRole -} from '../controllers/studentGroups.js'; -import { - create as createUserPermission, - destroy as deleteUserPermission, - update as updateUserPermission -} from '../controllers/rootUserPermissions.js'; -import { - create as createStudentGroupPermission, - destroy as deleteStudentGroupPermission, - update as updateStudentGroupPermission -} from '../controllers/rootGroupPermissions.js'; -import { - create as createDocument, - destroy as deleteDocument, - update as updateDocument, - linkTo as linkDocument, - find as findDocument -} from '../controllers/documents.js'; -import { - create as createDocumentRoot, - update as updateDocumentRoot, - permissions as allPermissions, - findMultipleFor as findMultipleDocumentRootsFor, - destroy as deleteDocumentRoot, - multipleDocuments -} from '../controllers/documentRoots.js'; import { allowedActions, createAllowedAction, @@ -43,11 +8,46 @@ import { revokeUserPassword } from '../controllers/admins.js'; import { - githubToken, find as findCmsSettings, - update as updateCmsSettings, - logout as githubLogout + logout as githubLogout, + githubToken, + update as updateCmsSettings } from '../controllers/cmsSettings.js'; +import { + permissions as allPermissions, + create as createDocumentRoot, + destroy as deleteDocumentRoot, + findMultipleFor as findMultipleDocumentRootsFor, + multipleDocuments, + update as updateDocumentRoot +} from '../controllers/documentRoots.js'; +import { + create as createDocument, + destroy as deleteDocument, + find as findDocument, + linkTo as linkDocument, + update as updateDocument +} from '../controllers/documents.js'; +import { + create as createStudentGroupPermission, + destroy as deleteStudentGroupPermission, + update as updateStudentGroupPermission +} from '../controllers/rootGroupPermissions.js'; +import { + create as createUserPermission, + destroy as deleteUserPermission, + update as updateUserPermission +} from '../controllers/rootUserPermissions.js'; +import { + addUser as addStudentGroupUser, + all as allStudentGroups, + create as createStudentGroup, + destroy as deleteStudentGroup, + removeUser as removeStudentGroupUser, + setAdminRole as setStudentGroupAdminRole, + update as updateStudentGroup +} from '../controllers/studentGroups.js'; +import { all as allUsers, find as findUser, update as updateUser, user } from '../controllers/users.js'; // initialize router const router = express.Router(); diff --git a/src/routes/socketEventTypes.ts b/src/routes/socketEventTypes.ts index 54d4d86..d9aa411 100644 --- a/src/routes/socketEventTypes.ts +++ b/src/routes/socketEventTypes.ts @@ -1,10 +1,10 @@ import { AllowedAction, CmsSettings, Prisma } from '../../prisma/generated/client.js'; +import { ApiStudentGroup } from '../helpers/StudentGroup.asApiRecord.js'; import { ApiDocument } from '../models/Document.js'; -import { ApiUserPermission } from '../models/RootUserPermission.js'; -import { ApiGroupPermission } from '../models/RootGroupPermission.js'; import { ApiDocumentRootWithoutDocuments } from '../models/DocumentRoot.js'; +import { ApiGroupPermission } from '../models/RootGroupPermission.js'; +import { ApiUserPermission } from '../models/RootUserPermission.js'; import { ApiUser } from '../models/User.js'; -import { ApiStudentGroup } from '../helpers/StudentGroup.asApiRecord.js'; export enum IoEvent { NEW_RECORD = 'NEW_RECORD', diff --git a/src/routes/socketEvents.ts b/src/routes/socketEvents.ts index ce1c2d1..4c3a599 100644 --- a/src/routes/socketEvents.ts +++ b/src/routes/socketEvents.ts @@ -1,16 +1,16 @@ /* istanbul ignore file */ -import { type User } from '../../prisma/generated/client.js'; import { Server } from 'socket.io'; -import Logger from '../utils/logger.js'; -import { ClientToServerEvents, IoEvent, IoClientEvent, ServerToClientEvents } from './socketEventTypes.js'; +import { type User } from '../../prisma/generated/client.js'; +import { auth } from '../auth.js'; import StudentGroup from '../models/StudentGroup.js'; import { hasElevatedAccess, Role } from '../models/User.js'; +import Logger from '../utils/logger.js'; import onAction from './event-handlers/action.handler.js'; import onJoinRoom from './event-handlers/joinRoom.handler.js'; import onLeaveRoom from './event-handlers/leaveRoom.handler.js'; -import { auth } from '../auth.js'; import onStreamUpdate from './event-handlers/streamUpdate.handler.js'; +import { ClientToServerEvents, IoClientEvent, IoEvent, ServerToClientEvents } from './socketEventTypes.js'; export enum IoRoom { ADMIN = 'admin', diff --git a/src/server.ts b/src/server.ts index 2491c48..e1c6772 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,10 +1,10 @@ -import app, { configure } from './app.js'; -import { initialize as initializeSocketIo } from './socketIoServer.js'; -import http from 'http'; import * as Sentry from '@sentry/node'; -import Logger from './utils/logger.js'; import dotenv from 'dotenv'; +import http from 'http'; +import app, { configure } from './app.js'; import { StreamableGroupUserCacheStore } from './models/StudentGroup.js'; +import { initialize as initializeSocketIo } from './socketIoServer.js'; +import Logger from './utils/logger.js'; dotenv.config(); const PORT = process.env.PORT || 3002; diff --git a/src/socketIoServer.ts b/src/socketIoServer.ts index 8bdd8c0..7272f2d 100644 --- a/src/socketIoServer.ts +++ b/src/socketIoServer.ts @@ -1,8 +1,8 @@ -import { Server } from 'socket.io'; import type http from 'http'; -import type { ClientToServerEvents, ServerToClientEvents, Notification } from './routes/socketEventTypes.js'; -import { CORS_ORIGIN } from './utils/originConfig.js'; +import { Server } from 'socket.io'; import EventRouter from './routes/socketEvents.js'; +import type { ClientToServerEvents, Notification, ServerToClientEvents } from './routes/socketEventTypes.js'; +import { CORS_ORIGIN } from './utils/originConfig.js'; let _io: Server; diff --git a/src/tests/integration/helpers.ts b/src/tests/integration/helpers.ts index 5258b03..eec6406 100644 --- a/src/tests/integration/helpers.ts +++ b/src/tests/integration/helpers.ts @@ -1,8 +1,8 @@ -import request from 'supertest'; import { randomUUID } from 'crypto'; +import request from 'supertest'; import app from '../../app.js'; -import prisma from '../../prisma.js'; import { Role } from '../../models/User.js'; +import prisma from '../../prisma.js'; export const API_URL = '/api/v1';