Skip to content
Open
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
5 changes: 4 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@
"copilotAccessMode": "ro",
"expiresOn": 0
}
]
],
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
}
}
},
Expand Down
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"editor.formatOnSave": true,
"files.exclude": {
"**/*:Zone.Identifier": true
},
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
}
2 changes: 1 addition & 1 deletion prisma/reset.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
2 changes: 1 addition & 1 deletion prisma/seed-files/document-root-permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ const rootUserPermissions: Prisma.RootUserPermissionCreateManyInput[] = [];

const rootGroupPermissions: Prisma.RootGroupPermissionCreateManyInput[] = [];

export { rootUserPermissions, rootGroupPermissions };
export { rootGroupPermissions, rootUserPermissions };
1 change: 0 additions & 1 deletion prisma/seed-files/documents.ts
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
6 changes: 3 additions & 3 deletions prisma/seed.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
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,
CLASS_GROUP_ID,
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;

Expand Down
2 changes: 1 addition & 1 deletion prisma/view-migrations/create-view-migration.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
14 changes: 7 additions & 7 deletions src/app.ts
Original file line number Diff line number Diff line change
@@ -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);

Expand Down
14 changes: 7 additions & 7 deletions src/auth.ts
Original file line number Diff line number Diff line change
@@ -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

Expand Down
4 changes: 2 additions & 2 deletions src/auth/guard.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
10 changes: 5 additions & 5 deletions src/controllers/admins.ts
Original file line number Diff line number Diff line change
@@ -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<any, any, Prisma.AllowedActionCreateInput> = async (
req,
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/cmsSettings.ts
Original file line number Diff line number Diff line change
@@ -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!);
Expand Down
6 changes: 3 additions & 3 deletions src/controllers/documentRoots.ts
Original file line number Diff line number Diff line change
@@ -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 */ },
Expand Down
8 changes: 4 additions & 4 deletions src/controllers/documents.ts
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/rootGroupPermissions.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/rootUserPermissions.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/studentGroups.ts
Original file line number Diff line number Diff line change
@@ -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<any, any, DbStudentGroup> = async (req, res, next) => {
const { name, description, parentId } = req.body;
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/users.ts
Original file line number Diff line number Diff line change
@@ -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) => {
Expand Down
2 changes: 1 addition & 1 deletion src/instrumentation.ts
Original file line number Diff line number Diff line change
@@ -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');
Expand Down
4 changes: 2 additions & 2 deletions src/models/CmsSetting.ts
Original file line number Diff line number Diff line change
@@ -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<Prisma.CmsSettingsUncheckedUpdateInput>(['activeBranch', 'activePath']);

Expand Down
6 changes: 3 additions & 3 deletions src/models/Document.ts
Original file line number Diff line number Diff line change
@@ -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 };
Expand Down
10 changes: 5 additions & 5 deletions src/models/DocumentRoot.ts
Original file line number Diff line number Diff line change
@@ -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 & {
Expand Down
6 changes: 3 additions & 3 deletions src/models/RootGroupPermission.ts
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
6 changes: 3 additions & 3 deletions src/models/RootUserPermission.ts
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
10 changes: 5 additions & 5 deletions src/models/StudentGroup.ts
Original file line number Diff line number Diff line change
@@ -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();

Expand Down
7 changes: 3 additions & 4 deletions src/models/User.ts
Original file line number Diff line number Diff line change
@@ -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<Prisma.UserUncheckedUpdateInput>(['firstName', 'lastName']);

export enum Role {
Expand Down
2 changes: 1 addition & 1 deletion src/prisma.ts
Original file line number Diff line number Diff line change
@@ -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}`;

Expand Down
6 changes: 3 additions & 3 deletions src/routes/event-handlers/action.handler.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
12 changes: 6 additions & 6 deletions src/routes/event-handlers/joinRoom.handler.ts
Original file line number Diff line number Diff line change
@@ -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<ClientToServerEvents, ServerToClientEvents, DefaultEventsMap, any>;

const isDocumentRoot = (roomId: string) => {
Expand Down
Loading