diff --git a/backend-pg/.eslintignore b/backend-pg/.eslintignore index 9899d04e4..a9ba028ce 100644 --- a/backend-pg/.eslintignore +++ b/backend-pg/.eslintignore @@ -1,2 +1 @@ .eslintrc.js -./scripts diff --git a/backend-pg/scripts/create-backend-file.ts b/backend-pg/scripts/create-backend-file.ts index 27a52fae8..ae3ad2441 100644 --- a/backend-pg/scripts/create-backend-file.ts +++ b/backend-pg/scripts/create-backend-file.ts @@ -1,3 +1,4 @@ +/* eslint-disable */ import { mkdirSync, writeFileSync } from "fs"; import path from "path"; import promptSync from "prompt-sync"; diff --git a/backend-pg/scripts/create-migration.ts b/backend-pg/scripts/create-migration.ts index 9a80f290e..c3f4a0746 100644 --- a/backend-pg/scripts/create-migration.ts +++ b/backend-pg/scripts/create-migration.ts @@ -1,3 +1,4 @@ +/* eslint-disable */ import { execSync } from "child_process"; import path from "path"; import promptSync from "prompt-sync"; diff --git a/backend-pg/scripts/generate-schema-types.ts b/backend-pg/scripts/generate-schema-types.ts index 64bcbec6e..03ac4e2e4 100644 --- a/backend-pg/scripts/generate-schema-types.ts +++ b/backend-pg/scripts/generate-schema-types.ts @@ -1,9 +1,9 @@ +/* eslint-disable */ import dotenv from "dotenv"; import path from "path"; import knex from "knex"; -import { appendFileSync, readFileSync, writeFileSync } from "fs"; +import { writeFileSync } from "fs"; import promptSync from "prompt-sync"; -import { TableName } from "@app/db/schemas"; const prompt = promptSync(); @@ -96,11 +96,11 @@ const main = async () => { const tableNumbers = selectedTables !== "all" ? selectedTables.split(",").map((el) => Number(el)) : []; - for (let i = 0; i < tables.length; i++) { + for (let i = 0; i < tables.length; i += 1) { // skip if not desired table if (selectedTables !== "all" && !tableNumbers.includes(i)) continue; - const tableName = tables[i].tableName; + const { tableName } = tables[i]; const columns = await db(tableName).columnInfo(); const columnNames = Object.keys(columns); @@ -110,7 +110,7 @@ const main = async () => { const colInfo = columns[columnName]; let ztype = getZodPrimitiveType(colInfo.type); if (colInfo.defaultValue) { - const defaultValue = colInfo.defaultValue; + const { defaultValue } = colInfo; const zSchema = getZodDefaultValue(colInfo.type, defaultValue); if (zSchema) { ztype = ztype.concat(zSchema); diff --git a/backend-pg/src/@types/fastify.d.ts b/backend-pg/src/@types/fastify.d.ts index 5788c8023..d8d2b802f 100644 --- a/backend-pg/src/@types/fastify.d.ts +++ b/backend-pg/src/@types/fastify.d.ts @@ -7,7 +7,7 @@ import { TAuthSignupFactory } from "@app/services/auth/auth-signup-service"; import { AuthMode } from "@app/services/auth/auth-signup-type"; import { TOrgRoleServiceFactory } from "@app/services/org/org-role-service"; import { TOrgServiceFactory } from "@app/services/org/org-service"; -import { TServerCfgServiceFactory } from "@app/services/server-cfg/server-cfg-service"; +import { TSuperAdminServiceFactory } from "@app/services/super-admin/super-admin-service"; import { TAuthTokenServiceFactory } from "@app/services/token/token-service"; import { TUserDalFactory } from "@app/services/user/user-dal"; import { TUserServiceFactory } from "@app/services/user/user-service"; @@ -40,7 +40,7 @@ declare module "fastify" { permission: TPermissionServiceFactory; org: TOrgServiceFactory; orgRole: TOrgRoleServiceFactory; - serverCfg: TServerCfgServiceFactory; + superAdmin: TSuperAdminServiceFactory; user: TUserServiceFactory; apiKey: TApiKeyServiceFactory; }; diff --git a/backend-pg/src/@types/knex.d.ts b/backend-pg/src/@types/knex.d.ts index 7f9ef07f8..ad1263632 100644 --- a/backend-pg/src/@types/knex.d.ts +++ b/backend-pg/src/@types/knex.d.ts @@ -2,6 +2,9 @@ import { Knex } from "knex"; import { TableName, + TApiKeys, + TApiKeysInsert, + TApiKeysUpdate, TAuthTokens, TAuthTokenSessions, TAuthTokenSessionsInsert, @@ -22,9 +25,9 @@ import { TOrgRoles, TOrgRolesInsert, TOrgRolesUpdate, - TServerConfig, - TServerConfigInsert, - TServerConfigUpdate, + TSuperAdmin, + TSuperAdminInsert, + TSuperAdminUpdate, TUserActions, TUserActionsInsert, TUserActionsUpdate, @@ -35,7 +38,6 @@ import { TUsersInsert, TUsersUpdate } from "@app/db/schemas"; -import { TApiKeys, TApiKeysInsert, TApiKeysUpdate } from "@app/db/schemas/api-keys"; declare module "knex/types/tables" { interface Tables extends { [key in TableName]: Knex.CompositeTableType } { @@ -81,10 +83,10 @@ declare module "knex/types/tables" { TUserActionsInsert, TUserActionsUpdate >; - [TableName.ServerConfig]: Knex.CompositeTableType< - TServerConfig, - TServerConfigInsert, - TServerConfigUpdate + [TableName.SuperAdmin]: Knex.CompositeTableType< + TSuperAdmin, + TSuperAdminInsert, + TSuperAdminUpdate >; [TableName.ApiKey]: Knex.CompositeTableType; } diff --git a/backend-pg/src/db/migrations/20231207055701_server-config.ts b/backend-pg/src/db/migrations/20231207055701_super-admin.ts similarity index 61% rename from backend-pg/src/db/migrations/20231207055701_server-config.ts rename to backend-pg/src/db/migrations/20231207055701_super-admin.ts index 853981e1c..6d5f7f32d 100644 --- a/backend-pg/src/db/migrations/20231207055701_server-config.ts +++ b/backend-pg/src/db/migrations/20231207055701_super-admin.ts @@ -4,9 +4,9 @@ import { TableName } from "../schemas"; import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils"; export async function up(knex: Knex): Promise { - const isTablePresent = await knex.schema.hasTable(TableName.ServerConfig); + const isTablePresent = await knex.schema.hasTable(TableName.SuperAdmin); if (!isTablePresent) { - await knex.schema.createTable(TableName.ServerConfig, (t) => { + await knex.schema.createTable(TableName.SuperAdmin, (t) => { t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid()); t.boolean("initialized").defaultTo(false); t.boolean("allowSignUp").defaultTo(true); @@ -14,10 +14,10 @@ export async function up(knex: Knex): Promise { }); } // this is a one time function - await createOnUpdateTrigger(knex, TableName.ServerConfig); + await createOnUpdateTrigger(knex, TableName.SuperAdmin); } export async function down(knex: Knex): Promise { - await knex.schema.dropTableIfExists(TableName.ServerConfig); - await dropOnUpdateTrigger(knex, TableName.ServerConfig); + await knex.schema.dropTableIfExists(TableName.SuperAdmin); + await dropOnUpdateTrigger(knex, TableName.SuperAdmin); } diff --git a/backend-pg/src/db/schemas/index.ts b/backend-pg/src/db/schemas/index.ts index 27d04c172..8bb6a169b 100644 --- a/backend-pg/src/db/schemas/index.ts +++ b/backend-pg/src/db/schemas/index.ts @@ -1,3 +1,4 @@ +export * from "./api-keys"; export * from "./auth-token-sessions"; export * from "./auth-tokens"; export * from "./backup-private-key"; @@ -6,7 +7,7 @@ export * from "./models"; export * from "./org-memberships"; export * from "./org-roles"; export * from "./organizations"; -export * from "./server-config"; +export * from "./super-admin"; export * from "./user-actions"; export * from "./user-encryption-keys"; export * from "./users"; diff --git a/backend-pg/src/db/schemas/models.ts b/backend-pg/src/db/schemas/models.ts index e12eabdc1..85bb06c59 100644 --- a/backend-pg/src/db/schemas/models.ts +++ b/backend-pg/src/db/schemas/models.ts @@ -11,7 +11,7 @@ export enum TableName { OrgRoles = "org_roles", IncidentContact = "incident_contacts", UserAction = "user_actions", - ServerConfig = "server_config", + SuperAdmin = "super_admin", ApiKey = "api_keys" } diff --git a/backend-pg/src/db/schemas/server-config.ts b/backend-pg/src/db/schemas/super-admin.ts similarity index 63% rename from backend-pg/src/db/schemas/server-config.ts rename to backend-pg/src/db/schemas/super-admin.ts index 0b777e1bc..f998cf325 100644 --- a/backend-pg/src/db/schemas/server-config.ts +++ b/backend-pg/src/db/schemas/super-admin.ts @@ -7,7 +7,7 @@ import { z } from "zod"; import { TImmutableDBKeys } from "./models"; -export const ServerConfigSchema = z.object({ +export const SuperAdminSchema = z.object({ id: z.string().uuid(), initialized: z.boolean().default(false).nullable().optional(), allowSignUp: z.boolean().default(true).nullable().optional(), @@ -15,6 +15,6 @@ export const ServerConfigSchema = z.object({ updatedAt: z.date(), }); -export type TServerConfig = z.infer; -export type TServerConfigInsert = Omit; -export type TServerConfigUpdate = Partial>; +export type TSuperAdmin = z.infer; +export type TSuperAdminInsert = Omit; +export type TSuperAdminUpdate = Partial>; diff --git a/backend-pg/src/db/schemas/user-encryption-keys.ts b/backend-pg/src/db/schemas/user-encryption-keys.ts index 5d71c7f57..0fde37ae7 100644 --- a/backend-pg/src/db/schemas/user-encryption-keys.ts +++ b/backend-pg/src/db/schemas/user-encryption-keys.ts @@ -11,7 +11,7 @@ export const UserEncryptionKeysSchema = z.object({ id: z.string().uuid(), clientPublicKey: z.string().nullable().optional(), serverPrivateKey: z.string().nullable().optional(), - encryptionVersion: z.number().default(1).nullable().optional(), + encryptionVersion: z.number().default(2).nullable().optional(), protectedKey: z.string(), protectedKeyIV: z.string(), protectedKeyTag: z.string(), diff --git a/backend-pg/src/ee/routes/v1/index.ts b/backend-pg/src/ee/routes/v1/index.ts index a3b4c1554..83510891d 100644 --- a/backend-pg/src/ee/routes/v1/index.ts +++ b/backend-pg/src/ee/routes/v1/index.ts @@ -1,4 +1,4 @@ -import { registerOrgRoleRouter } from "./org-role"; +import { registerOrgRoleRouter } from "./org-role-router"; export const registerV1EERoutes = async (server: FastifyZodProvider) => { // org role starts with organization diff --git a/backend-pg/src/ee/routes/v1/org-role.ts b/backend-pg/src/ee/routes/v1/org-role-router.ts similarity index 100% rename from backend-pg/src/ee/routes/v1/org-role.ts rename to backend-pg/src/ee/routes/v1/org-role-router.ts diff --git a/backend-pg/src/ee/services/permission/permission-dal.ts b/backend-pg/src/ee/services/permission/permission-dal.ts index 4b4731bc3..1ffe54211 100644 --- a/backend-pg/src/ee/services/permission/permission-dal.ts +++ b/backend-pg/src/ee/services/permission/permission-dal.ts @@ -10,8 +10,9 @@ export const permissionDalFactory = (db: TDbClient) => { ): Promise<(TOrgMemberships & { permissions: string }) | undefined> => { const membership = await db(TableName.OrgMembership) .leftJoin(TableName.OrgRoles, `${TableName.OrgMembership}.roleId`, `${TableName.OrgRoles}.id`) - .select(`${TableName.OrgMembership}.*`, `${TableName.OrgRoles}.permissions`) - .where({ userId, [`${TableName.OrgMembership}.orgId`]: orgId }) + .where("userId", userId) + .where(`${TableName.OrgMembership}.orgId`, orgId) + .select(`${TableName.OrgMembership}.*`, "permissions") .first(); return membership; diff --git a/backend-pg/src/server/routes/index.ts b/backend-pg/src/server/routes/index.ts index ad662872b..96ff66062 100644 --- a/backend-pg/src/server/routes/index.ts +++ b/backend-pg/src/server/routes/index.ts @@ -11,16 +11,16 @@ import { authDalFactory } from "@app/services/auth/auth-dal"; import { authLoginServiceFactory } from "@app/services/auth/auth-login-service"; import { authPaswordServiceFactory } from "@app/services/auth/auth-password-service"; import { authSignupServiceFactory } from "@app/services/auth/auth-signup-service"; +import { tokenDalFactory } from "@app/services/auth-token/auth-token-dal"; +import { tokenServiceFactory } from "@app/services/auth-token/auth-token-service"; import { incidentContactDalFactory } from "@app/services/org/incident-contacts-dal"; import { orgDalFactory } from "@app/services/org/org-dal"; import { orgRoleDalFactory } from "@app/services/org/org-role-dal"; import { orgRoleServiceFactory } from "@app/services/org/org-role-service"; import { orgServiceFactory } from "@app/services/org/org-service"; -import { serverCfgDalFactory } from "@app/services/server-cfg/server-cfg-dal"; -import { serverCfgServiceFactory } from "@app/services/server-cfg/server-cfg-service"; import { TSmtpService } from "@app/services/smtp/smtp-service"; -import { tokenDalFactory } from "@app/services/token/token-dal"; -import { tokenServiceFactory } from "@app/services/token/token-service"; +import { superAdminDalFactory } from "@app/services/super-admin/super-admin-dal"; +import { superAdminServiceFactory } from "@app/services/super-admin/super-admin-service"; import { userDalFactory } from "@app/services/user/user-dal"; import { userServiceFactory } from "@app/services/user/user-service"; @@ -40,7 +40,7 @@ export const registerRoutes = async ( const orgDal = orgDalFactory(db); const incidentContactDal = incidentContactDalFactory(db); const orgRoleDal = orgRoleDalFactory(db); - const serverCfgDal = serverCfgDalFactory(db); + const superAdminDal = superAdminDalFactory(db); const apiKeyDal = apiKeyDalFactory(db); // ee db layer ops @@ -77,16 +77,16 @@ export const registerRoutes = async ( orgService }); const orgRoleService = orgRoleServiceFactory({ permissionService, orgRoleDal }); - const serverCfgService = serverCfgServiceFactory({ + const superAdminService = superAdminServiceFactory({ userDal, authService: loginService, - serverCfgDal + serverCfgDal: superAdminDal }); const apiKeyService = apiKeyServiceFactory({ apiKeyDal }); - await serverCfgService.initServerCfg(); + await superAdminService.initServerCfg(); // inject all services - server.decorate("services", { + server.decorate("services", { login: loginService, password: passwordService, signup: signupService, @@ -94,14 +94,14 @@ export const registerRoutes = async ( permission: permissionService, org: orgService, orgRole: orgRoleService, - serverCfg: serverCfgService, apiKey: apiKeyService, - authToken: tokenService - } as FastifyZodProvider["services"]); + authToken: tokenService, + superAdmin: superAdminService + }); - server.decorate("store", { + server.decorate("store", { user: userDal - } as FastifyZodProvider["store"]); + }); await server.register(injectIdentity); diff --git a/backend-pg/src/server/routes/v1/admin.ts b/backend-pg/src/server/routes/v1/admin-router.ts similarity index 84% rename from backend-pg/src/server/routes/v1/admin.ts rename to backend-pg/src/server/routes/v1/admin-router.ts index 3bd05cc09..945441dca 100644 --- a/backend-pg/src/server/routes/v1/admin.ts +++ b/backend-pg/src/server/routes/v1/admin-router.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -import { ServerConfigSchema, UsersSchema } from "@app/db/schemas"; +import { SuperAdminSchema, UsersSchema } from "@app/db/schemas"; import { getConfig } from "@app/lib/config/env"; import { UnauthorizedError } from "@app/lib/errors"; import { verifySuperAdmin } from "@app/server/plugins/auth/superAdmin"; @@ -14,12 +14,12 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { schema: { response: { 200: z.object({ - config: ServerConfigSchema + config: SuperAdminSchema }) } }, handler: () => { - const config = server.services.serverCfg.getServerCfg(); + const config = server.services.superAdmin.getServerCfg(); return { config }; } }); @@ -33,7 +33,7 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { }), response: { 200: z.object({ - config: ServerConfigSchema + config: SuperAdminSchema }) } }, @@ -42,7 +42,7 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { verifySuperAdmin(req); }, handler: async (req) => { - const config = await server.services.serverCfg.updateServerCfg(req.body); + const config = await server.services.superAdmin.updateServerCfg(req.body); return { config }; } }); @@ -75,10 +75,10 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { }, handler: async (req, res) => { const appCfg = getConfig(); - const serverCfg = server.services.serverCfg.getServerCfg(); + const serverCfg = server.services.superAdmin.getServerCfg(); if (serverCfg.initialized) throw new UnauthorizedError({ name: "Admin sign up", message: "Admin has been created" }); - const { user, token } = await server.services.serverCfg.adminSignUp({ + const { user, token } = await server.services.superAdmin.adminSignUp({ ...req.body, ip: req.realIp, userAgent: req.headers["user-agent"] || "" diff --git a/backend-pg/src/server/routes/v1/auth.ts b/backend-pg/src/server/routes/v1/auth-router.ts similarity index 100% rename from backend-pg/src/server/routes/v1/auth.ts rename to backend-pg/src/server/routes/v1/auth-router.ts diff --git a/backend-pg/src/server/routes/v1/index.ts b/backend-pg/src/server/routes/v1/index.ts index 7461f26ac..2be02f37b 100644 --- a/backend-pg/src/server/routes/v1/index.ts +++ b/backend-pg/src/server/routes/v1/index.ts @@ -1,6 +1,6 @@ -import { registerAdminRouter } from "./admin"; -import { registerAuthRoutes } from "./auth"; -import { registerInviteOrgRouter } from "./invite-org"; +import { registerAdminRouter } from "./admin-router"; +import { registerAuthRoutes } from "./auth-router"; +import { registerInviteOrgRouter } from "./invite-org-router"; import { registerOrgRouter } from "./organization-router"; import { registerPasswordRouter } from "./password-router"; import { registerUserActionRouter } from "./user-action-router"; diff --git a/backend-pg/src/server/routes/v1/invite-org.ts b/backend-pg/src/server/routes/v1/invite-org-router.ts similarity index 100% rename from backend-pg/src/server/routes/v1/invite-org.ts rename to backend-pg/src/server/routes/v1/invite-org-router.ts diff --git a/backend-pg/src/services/token/token-dal.ts b/backend-pg/src/services/auth-token/auth-token-dal.ts similarity index 97% rename from backend-pg/src/services/token/token-dal.ts rename to backend-pg/src/services/auth-token/auth-token-dal.ts index 1b4bc37e3..cda3fa953 100644 --- a/backend-pg/src/services/token/token-dal.ts +++ b/backend-pg/src/services/auth-token/auth-token-dal.ts @@ -5,7 +5,7 @@ import { TableName, TAuthTokens, TAuthTokenSessions } from "@app/db/schemas"; import { DatabaseError } from "@app/lib/errors"; import { ormify } from "@app/lib/knex"; -import { TDeleteTokenForUserDalDTO } from "./token-types"; +import { TDeleteTokenForUserDalDTO } from "./auth-token-types"; export type TTokenDalConfig = {}; diff --git a/backend-pg/src/services/token/token-service.ts b/backend-pg/src/services/auth-token/auth-token-service.ts similarity index 98% rename from backend-pg/src/services/token/token-service.ts rename to backend-pg/src/services/auth-token/auth-token-service.ts index 283ff8bff..74a339179 100644 --- a/backend-pg/src/services/token/token-service.ts +++ b/backend-pg/src/services/auth-token/auth-token-service.ts @@ -4,13 +4,13 @@ import bcrypt from "bcrypt"; import { TAuthTokens, TAuthTokenSessions } from "@app/db/schemas"; import { getConfig } from "@app/lib/config/env"; -import { TTokenDalFactory } from "./token-dal"; +import { TTokenDalFactory } from "./auth-token-dal"; import { TCreateTokenForUserDTO, TIssueAuthTokenDTO, TokenType, TValidateTokenForUserDTO -} from "./token-types"; +} from "./auth-token-types"; type TAuthTokenServiceFactoryDep = { tokenDal: TTokenDalFactory; diff --git a/backend-pg/src/services/token/token-types.ts b/backend-pg/src/services/auth-token/auth-token-types.ts similarity index 100% rename from backend-pg/src/services/token/token-types.ts rename to backend-pg/src/services/auth-token/auth-token-types.ts diff --git a/backend-pg/src/services/auth/auth-login-service.ts b/backend-pg/src/services/auth/auth-login-service.ts index e5bf89224..989980691 100644 --- a/backend-pg/src/services/auth/auth-login-service.ts +++ b/backend-pg/src/services/auth/auth-login-service.ts @@ -4,9 +4,9 @@ import { TUsers, UserDeviceSchema } from "@app/db/schemas"; import { getConfig } from "@app/lib/config/env"; import { generateSrpServerKey, srpCheckClientProof } from "@app/lib/crypto"; +import { TAuthTokenServiceFactory } from "../auth-token/auth-token-service"; +import { TokenType } from "../auth-token/auth-token-types"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; -import { TAuthTokenServiceFactory } from "../token/token-service"; -import { TokenType } from "../token/token-types"; import { TUserDalFactory } from "../user/user-dal"; import { TLoginClientProofDTO, diff --git a/backend-pg/src/services/auth/auth-password-service.ts b/backend-pg/src/services/auth/auth-password-service.ts index d15ae4424..3e0837e08 100644 --- a/backend-pg/src/services/auth/auth-password-service.ts +++ b/backend-pg/src/services/auth/auth-password-service.ts @@ -3,9 +3,9 @@ import jwt from "jsonwebtoken"; import { getConfig } from "@app/lib/config/env"; import { generateSrpServerKey, srpCheckClientProof } from "@app/lib/crypto"; +import { TAuthTokenServiceFactory } from "../auth-token/auth-token-service"; +import { TokenType } from "../auth-token/auth-token-types"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; -import { TAuthTokenServiceFactory } from "../token/token-service"; -import { TokenType } from "../token/token-types"; import { TUserDalFactory } from "../user/user-dal"; import { TAuthDalFactory } from "./auth-dal"; import { diff --git a/backend-pg/src/services/auth/auth-signup-service.ts b/backend-pg/src/services/auth/auth-signup-service.ts index 8049a642b..3806fd091 100644 --- a/backend-pg/src/services/auth/auth-signup-service.ts +++ b/backend-pg/src/services/auth/auth-signup-service.ts @@ -5,11 +5,11 @@ import { getConfig } from "@app/lib/config/env"; import { BadRequestError } from "@app/lib/errors"; import { isDisposableEmail } from "@app/lib/validator"; +import { TAuthTokenServiceFactory } from "../auth-token/auth-token-service"; +import { TokenType } from "../auth-token/auth-token-types"; import { TOrgDalFactory } from "../org/org-dal"; import { TOrgServiceFactory } from "../org/org-service"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; -import { TAuthTokenServiceFactory } from "../token/token-service"; -import { TokenType } from "../token/token-types"; import { TUserDalFactory } from "../user/user-dal"; import { TAuthDalFactory } from "./auth-dal"; import { TCompleteAccountInviteDTO, TCompleteAccountSignupDTO } from "./auth-signup-type"; diff --git a/backend-pg/src/services/org/org-role-dal.ts b/backend-pg/src/services/org/org-role-dal.ts index 3a77cafcc..24bf2482a 100644 --- a/backend-pg/src/services/org/org-role-dal.ts +++ b/backend-pg/src/services/org/org-role-dal.ts @@ -1,67 +1,7 @@ -import { Knex } from "knex"; - import { TDbClient } from "@app/db"; -import { TableName,TOrgRolesInsert, TOrgRolesUpdate } from "@app/db/schemas"; -import { DatabaseError } from "@app/lib/errors"; -import { withTransaction } from "@app/lib/knex"; +import { TableName } from "@app/db/schemas"; +import { ormify } from "@app/lib/knex"; export type TOrgRoleDalFactory = ReturnType; -export const orgRoleDalFactory = (db: TDbClient) => { - const find = async (data: TOrgRolesUpdate, tx?: Knex) => { - try { - const role = await (tx || db)(TableName.OrgRoles).where(data); - return role; - } catch (error) { - throw new DatabaseError({ error, name: "Org role find one" }); - } - }; - - const findOne = async (data: TOrgRolesUpdate, tx?: Knex) => { - try { - const role = await (tx || db)(TableName.OrgRoles).where(data).first(); - return role; - } catch (error) { - throw new DatabaseError({ error, name: "Org role find one" }); - } - }; - - const create = async (data: TOrgRolesInsert, tx?: Knex) => { - try { - const [role] = await (tx || db)(TableName.OrgRoles).insert(data).returning("*"); - return role; - } catch (error) { - throw new DatabaseError({ error, name: "Org role create" }); - } - }; - - const updateOne = async ( - filter: { id: string; orgId: string }, - data: TOrgRolesUpdate, - tx?: Knex - ) => { - try { - const [role] = await (tx || db)(TableName.OrgRoles).where(filter).update(data).returning("*"); - return role; - } catch (error) { - throw new DatabaseError({ error, name: "Org role create" }); - } - }; - - const deleteOne = async (filter: { id: string; orgId: string }, tx?: Knex) => { - try { - const [role] = await (tx || db)(TableName.OrgRoles).where(filter).delete().returning("*"); - return role; - } catch (error) { - throw new DatabaseError({ error, name: "Org role create" }); - } - }; - - return withTransaction(db, { - find, - findOne, - create, - updateOne, - deleteOne - }); -}; +export const orgRoleDalFactory = (db: TDbClient) => ormify(db, TableName.OrgRoles); diff --git a/backend-pg/src/services/org/org-role-service.ts b/backend-pg/src/services/org/org-role-service.ts index bcec8b231..f47f90ff0 100644 --- a/backend-pg/src/services/org/org-role-service.ts +++ b/backend-pg/src/services/org/org-role-service.ts @@ -57,7 +57,7 @@ export const orgRoleServiceFactory = ({ if (existingRole && existingRole.id !== roleId) throw new BadRequestError({ name: "Update Role", message: "Duplicate role" }); } - const updatedRole = await orgRoleDal.updateOne({ id: roleId, orgId }, { ...data }); + const [updatedRole] = await orgRoleDal.update({ id: roleId, orgId }, { ...data }); if (!updateRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); return updatedRole; }; @@ -68,7 +68,7 @@ export const orgRoleServiceFactory = ({ OrgPermissionActions.Delete, OrgPermissionSubjects.Role ); - const deletedRole = await orgRoleDal.deleteOne({ id: roleId, orgId }); + const [deletedRole] = await orgRoleDal.delete({ id: roleId, orgId }); if (!deleteRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); return deletedRole; diff --git a/backend-pg/src/services/org/org-service.ts b/backend-pg/src/services/org/org-service.ts index f986ad229..7554d21ea 100644 --- a/backend-pg/src/services/org/org-service.ts +++ b/backend-pg/src/services/org/org-service.ts @@ -11,9 +11,9 @@ import { BadRequestError, UnauthorizedError } from "@app/lib/errors"; import { isDisposableEmail } from "@app/lib/validator"; import { AuthTokenType } from "../auth/auth-type"; +import { TAuthTokenServiceFactory } from "../auth-token/auth-token-service"; +import { TokenType } from "../auth-token/auth-token-types"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; -import { TAuthTokenServiceFactory } from "../token/token-service"; -import { TokenType } from "../token/token-types"; import { TUserDalFactory } from "../user/user-dal"; import { TIncidentContactsDalFactory } from "./incident-contacts-dal"; import { TOrgDalFactory } from "./org-dal"; diff --git a/backend-pg/src/services/server-cfg/server-cfg-dal.ts b/backend-pg/src/services/server-cfg/server-cfg-dal.ts deleted file mode 100644 index a0bac5ce9..000000000 --- a/backend-pg/src/services/server-cfg/server-cfg-dal.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TDbClient } from "@app/db"; -import { TableName } from "@app/db/schemas"; -import { ormify } from "@app/lib/knex"; - -export type TServerCfgDalFactory = ReturnType; - -export const serverCfgDalFactory = (db: TDbClient) => ormify(db, TableName.ServerConfig, {}); diff --git a/backend-pg/src/services/super-admin/super-admin-dal.ts b/backend-pg/src/services/super-admin/super-admin-dal.ts new file mode 100644 index 000000000..8242e9e60 --- /dev/null +++ b/backend-pg/src/services/super-admin/super-admin-dal.ts @@ -0,0 +1,7 @@ +import { TDbClient } from "@app/db"; +import { TableName } from "@app/db/schemas"; +import { ormify } from "@app/lib/knex"; + +export type TSuperAdminDalFactory = ReturnType; + +export const superAdminDalFactory = (db: TDbClient) => ormify(db, TableName.SuperAdmin, {}); diff --git a/backend-pg/src/services/server-cfg/server-cfg-service.ts b/backend-pg/src/services/super-admin/super-admin-service.ts similarity index 81% rename from backend-pg/src/services/server-cfg/server-cfg-service.ts rename to backend-pg/src/services/super-admin/super-admin-service.ts index 958cf3328..b2a0d570d 100644 --- a/backend-pg/src/services/server-cfg/server-cfg-service.ts +++ b/backend-pg/src/services/super-admin/super-admin-service.ts @@ -1,25 +1,25 @@ -import { TServerConfig, TServerConfigUpdate } from "@app/db/schemas"; +import { TSuperAdmin, TSuperAdminUpdate } from "@app/db/schemas"; import { BadRequestError } from "@app/lib/errors"; import { TAuthLoginFactory } from "../auth/auth-login-service"; import { TUserDalFactory } from "../user/user-dal"; -import { TServerCfgDalFactory } from "./server-cfg-dal"; -import { TAdminSignUpDTO } from "./server-cfg-types"; +import { TSuperAdminDalFactory } from "./super-admin-dal"; +import { TAdminSignUpDTO } from "./super-admin-types"; -type TServerCfgServiceFactoryDep = { - serverCfgDal: TServerCfgDalFactory; +type TSuperAdminServiceFactoryDep = { + serverCfgDal: TSuperAdminDalFactory; userDal: TUserDalFactory; authService: Pick; }; -export type TServerCfgServiceFactory = ReturnType; +export type TSuperAdminServiceFactory = ReturnType; -export const serverCfgServiceFactory = ({ +export const superAdminServiceFactory = ({ serverCfgDal, userDal, authService -}: TServerCfgServiceFactoryDep) => { - let serverCfg: TServerConfig; +}: TSuperAdminServiceFactoryDep) => { + let serverCfg: TSuperAdmin; const initServerCfg = async () => { serverCfg = await serverCfgDal.findOne({}); @@ -37,7 +37,7 @@ export const serverCfgServiceFactory = ({ return serverCfg; }; - const updateServerCfg = async (data: TServerConfigUpdate) => { + const updateServerCfg = async (data: TSuperAdminUpdate) => { const cfg = await serverCfgDal.updateById(serverCfg.id, data); return cfg; }; diff --git a/backend-pg/src/services/server-cfg/server-cfg-types.ts b/backend-pg/src/services/super-admin/super-admin-types.ts similarity index 100% rename from backend-pg/src/services/server-cfg/server-cfg-types.ts rename to backend-pg/src/services/super-admin/super-admin-types.ts diff --git a/backend-pg/src/services/user/user-dal.ts b/backend-pg/src/services/user/user-dal.ts index de8b2ac0d..834f9f2c5 100644 --- a/backend-pg/src/services/user/user-dal.ts +++ b/backend-pg/src/services/user/user-dal.ts @@ -20,25 +20,35 @@ export const userDalFactory = (db: TDbClient) => { // USER ENCRYPTION FUNCTIONS // ------------------------- - const findUserEncKeyByEmail = async (email: string) => - db(TableName.Users) - .where({ email }) - .join( - TableName.UserEncryptionKey, - `${TableName.Users}.id`, - `${TableName.UserEncryptionKey}.userId` - ) - .first(); + const findUserEncKeyByEmail = async (email: string) => { + try { + return await db(TableName.Users) + .where({ email }) + .join( + TableName.UserEncryptionKey, + `${TableName.Users}.id`, + `${TableName.UserEncryptionKey}.userId` + ) + .first(); + } catch (error) { + throw new DatabaseError({ error, name: "Find user enc by email" }); + } + }; - const findUserEncKeyByUserId = async (userId: string) => - db(TableName.Users) - .where({ [`${TableName.Users}.id`]: userId }) - .join( - TableName.UserEncryptionKey, - `${TableName.Users}.id`, - `${TableName.UserEncryptionKey}.userId` - ) - .first(); + const findUserEncKeyByUserId = async (userId: string) => { + try { + return await db(TableName.Users) + .where(`${TableName.Users}.id`, userId) + .join( + TableName.UserEncryptionKey, + `${TableName.Users}.id`, + `${TableName.UserEncryptionKey}.userId` + ) + .first(); + } catch (error) { + throw new DatabaseError({ error, name: "Find user enc by user id" }); + } + }; const createUserEncryption = async (data: TUserEncryptionKeysInsert, tx?: Knex) => { try { @@ -54,11 +64,15 @@ export const userDalFactory = (db: TDbClient) => { data: TUserEncryptionKeysUpdate, tx?: Knex ) => { - const [userEnc] = await (tx || db)(TableName.UserEncryptionKey) - .where({ userId }) - .update({ ...data }) - .returning("*"); - return userEnc; + try { + const [userEnc] = await (tx || db)(TableName.UserEncryptionKey) + .where({ userId }) + .update({ ...data }) + .returning("*"); + return userEnc; + } catch (error) { + throw new DatabaseError({ error, name: "Update user enc by user id" }); + } }; const upsertUserEncryptionKey = async ( @@ -66,13 +80,20 @@ export const userDalFactory = (db: TDbClient) => { data: Omit, tx?: Knex ) => { - const [userEnc] = await (tx ? tx(TableName.UserEncryptionKey) : db(TableName.UserEncryptionKey)) - // if user insert make sure to pass all required data - .insert({ userId, ...data } as TUserEncryptionKeys) - .onConflict("userId") - .merge() - .returning("*"); - return userEnc; + try { + const [userEnc] = await (tx + ? tx(TableName.UserEncryptionKey) + : db(TableName.UserEncryptionKey) + ) + // if user insert make sure to pass all required data + .insert({ userId, ...data } as TUserEncryptionKeys) + .onConflict("userId") + .merge() + .returning("*"); + return userEnc; + } catch (error) { + throw new DatabaseError({ error, name: "Upsert user enc key" }); + } }; // USER ACTION FUNCTIONS