feat(infisical-pg): updated names and simplified dal layer using ormify

This commit is contained in:
Akhil Mohan
2024-01-27 12:38:22 +05:30
parent 15b57de0ed
commit a19e8ad016
33 changed files with 144 additions and 178 deletions
-1
View File
@@ -1,2 +1 @@
.eslintrc.js .eslintrc.js
./scripts
@@ -1,3 +1,4 @@
/* eslint-disable */
import { mkdirSync, writeFileSync } from "fs"; import { mkdirSync, writeFileSync } from "fs";
import path from "path"; import path from "path";
import promptSync from "prompt-sync"; import promptSync from "prompt-sync";
+1
View File
@@ -1,3 +1,4 @@
/* eslint-disable */
import { execSync } from "child_process"; import { execSync } from "child_process";
import path from "path"; import path from "path";
import promptSync from "prompt-sync"; import promptSync from "prompt-sync";
+5 -5
View File
@@ -1,9 +1,9 @@
/* eslint-disable */
import dotenv from "dotenv"; import dotenv from "dotenv";
import path from "path"; import path from "path";
import knex from "knex"; import knex from "knex";
import { appendFileSync, readFileSync, writeFileSync } from "fs"; import { writeFileSync } from "fs";
import promptSync from "prompt-sync"; import promptSync from "prompt-sync";
import { TableName } from "@app/db/schemas";
const prompt = promptSync(); const prompt = promptSync();
@@ -96,11 +96,11 @@ const main = async () => {
const tableNumbers = const tableNumbers =
selectedTables !== "all" ? selectedTables.split(",").map((el) => Number(el)) : []; 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 // skip if not desired table
if (selectedTables !== "all" && !tableNumbers.includes(i)) continue; if (selectedTables !== "all" && !tableNumbers.includes(i)) continue;
const tableName = tables[i].tableName; const { tableName } = tables[i];
const columns = await db(tableName).columnInfo(); const columns = await db(tableName).columnInfo();
const columnNames = Object.keys(columns); const columnNames = Object.keys(columns);
@@ -110,7 +110,7 @@ const main = async () => {
const colInfo = columns[columnName]; const colInfo = columns[columnName];
let ztype = getZodPrimitiveType(colInfo.type); let ztype = getZodPrimitiveType(colInfo.type);
if (colInfo.defaultValue) { if (colInfo.defaultValue) {
const defaultValue = colInfo.defaultValue; const { defaultValue } = colInfo;
const zSchema = getZodDefaultValue(colInfo.type, defaultValue); const zSchema = getZodDefaultValue(colInfo.type, defaultValue);
if (zSchema) { if (zSchema) {
ztype = ztype.concat(zSchema); ztype = ztype.concat(zSchema);
+2 -2
View File
@@ -7,7 +7,7 @@ import { TAuthSignupFactory } from "@app/services/auth/auth-signup-service";
import { AuthMode } from "@app/services/auth/auth-signup-type"; import { AuthMode } from "@app/services/auth/auth-signup-type";
import { TOrgRoleServiceFactory } from "@app/services/org/org-role-service"; import { TOrgRoleServiceFactory } from "@app/services/org/org-role-service";
import { TOrgServiceFactory } from "@app/services/org/org-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 { TAuthTokenServiceFactory } from "@app/services/token/token-service";
import { TUserDalFactory } from "@app/services/user/user-dal"; import { TUserDalFactory } from "@app/services/user/user-dal";
import { TUserServiceFactory } from "@app/services/user/user-service"; import { TUserServiceFactory } from "@app/services/user/user-service";
@@ -40,7 +40,7 @@ declare module "fastify" {
permission: TPermissionServiceFactory; permission: TPermissionServiceFactory;
org: TOrgServiceFactory; org: TOrgServiceFactory;
orgRole: TOrgRoleServiceFactory; orgRole: TOrgRoleServiceFactory;
serverCfg: TServerCfgServiceFactory; superAdmin: TSuperAdminServiceFactory;
user: TUserServiceFactory; user: TUserServiceFactory;
apiKey: TApiKeyServiceFactory; apiKey: TApiKeyServiceFactory;
}; };
+10 -8
View File
@@ -2,6 +2,9 @@ import { Knex } from "knex";
import { import {
TableName, TableName,
TApiKeys,
TApiKeysInsert,
TApiKeysUpdate,
TAuthTokens, TAuthTokens,
TAuthTokenSessions, TAuthTokenSessions,
TAuthTokenSessionsInsert, TAuthTokenSessionsInsert,
@@ -22,9 +25,9 @@ import {
TOrgRoles, TOrgRoles,
TOrgRolesInsert, TOrgRolesInsert,
TOrgRolesUpdate, TOrgRolesUpdate,
TServerConfig, TSuperAdmin,
TServerConfigInsert, TSuperAdminInsert,
TServerConfigUpdate, TSuperAdminUpdate,
TUserActions, TUserActions,
TUserActionsInsert, TUserActionsInsert,
TUserActionsUpdate, TUserActionsUpdate,
@@ -35,7 +38,6 @@ import {
TUsersInsert, TUsersInsert,
TUsersUpdate TUsersUpdate
} from "@app/db/schemas"; } from "@app/db/schemas";
import { TApiKeys, TApiKeysInsert, TApiKeysUpdate } from "@app/db/schemas/api-keys";
declare module "knex/types/tables" { declare module "knex/types/tables" {
interface Tables extends { [key in TableName]: Knex.CompositeTableType<any> } { interface Tables extends { [key in TableName]: Knex.CompositeTableType<any> } {
@@ -81,10 +83,10 @@ declare module "knex/types/tables" {
TUserActionsInsert, TUserActionsInsert,
TUserActionsUpdate TUserActionsUpdate
>; >;
[TableName.ServerConfig]: Knex.CompositeTableType< [TableName.SuperAdmin]: Knex.CompositeTableType<
TServerConfig, TSuperAdmin,
TServerConfigInsert, TSuperAdminInsert,
TServerConfigUpdate TSuperAdminUpdate
>; >;
[TableName.ApiKey]: Knex.CompositeTableType<TApiKeys, TApiKeysInsert, TApiKeysUpdate>; [TableName.ApiKey]: Knex.CompositeTableType<TApiKeys, TApiKeysInsert, TApiKeysUpdate>;
} }
@@ -4,9 +4,9 @@ import { TableName } from "../schemas";
import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils"; import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils";
export async function up(knex: Knex): Promise<void> { export async function up(knex: Knex): Promise<void> {
const isTablePresent = await knex.schema.hasTable(TableName.ServerConfig); const isTablePresent = await knex.schema.hasTable(TableName.SuperAdmin);
if (!isTablePresent) { 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.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
t.boolean("initialized").defaultTo(false); t.boolean("initialized").defaultTo(false);
t.boolean("allowSignUp").defaultTo(true); t.boolean("allowSignUp").defaultTo(true);
@@ -14,10 +14,10 @@ export async function up(knex: Knex): Promise<void> {
}); });
} }
// this is a one time function // this is a one time function
await createOnUpdateTrigger(knex, TableName.ServerConfig); await createOnUpdateTrigger(knex, TableName.SuperAdmin);
} }
export async function down(knex: Knex): Promise<void> { export async function down(knex: Knex): Promise<void> {
await knex.schema.dropTableIfExists(TableName.ServerConfig); await knex.schema.dropTableIfExists(TableName.SuperAdmin);
await dropOnUpdateTrigger(knex, TableName.ServerConfig); await dropOnUpdateTrigger(knex, TableName.SuperAdmin);
} }
+2 -1
View File
@@ -1,3 +1,4 @@
export * from "./api-keys";
export * from "./auth-token-sessions"; export * from "./auth-token-sessions";
export * from "./auth-tokens"; export * from "./auth-tokens";
export * from "./backup-private-key"; export * from "./backup-private-key";
@@ -6,7 +7,7 @@ export * from "./models";
export * from "./org-memberships"; export * from "./org-memberships";
export * from "./org-roles"; export * from "./org-roles";
export * from "./organizations"; export * from "./organizations";
export * from "./server-config"; export * from "./super-admin";
export * from "./user-actions"; export * from "./user-actions";
export * from "./user-encryption-keys"; export * from "./user-encryption-keys";
export * from "./users"; export * from "./users";
+1 -1
View File
@@ -11,7 +11,7 @@ export enum TableName {
OrgRoles = "org_roles", OrgRoles = "org_roles",
IncidentContact = "incident_contacts", IncidentContact = "incident_contacts",
UserAction = "user_actions", UserAction = "user_actions",
ServerConfig = "server_config", SuperAdmin = "super_admin",
ApiKey = "api_keys" ApiKey = "api_keys"
} }
@@ -7,7 +7,7 @@ import { z } from "zod";
import { TImmutableDBKeys } from "./models"; import { TImmutableDBKeys } from "./models";
export const ServerConfigSchema = z.object({ export const SuperAdminSchema = z.object({
id: z.string().uuid(), id: z.string().uuid(),
initialized: z.boolean().default(false).nullable().optional(), initialized: z.boolean().default(false).nullable().optional(),
allowSignUp: z.boolean().default(true).nullable().optional(), allowSignUp: z.boolean().default(true).nullable().optional(),
@@ -15,6 +15,6 @@ export const ServerConfigSchema = z.object({
updatedAt: z.date(), updatedAt: z.date(),
}); });
export type TServerConfig = z.infer<typeof ServerConfigSchema>; export type TSuperAdmin = z.infer<typeof SuperAdminSchema>;
export type TServerConfigInsert = Omit<TServerConfig, TImmutableDBKeys>; export type TSuperAdminInsert = Omit<TSuperAdmin, TImmutableDBKeys>;
export type TServerConfigUpdate = Partial<Omit<TServerConfig, TImmutableDBKeys>>; export type TSuperAdminUpdate = Partial<Omit<TSuperAdmin, TImmutableDBKeys>>;
@@ -11,7 +11,7 @@ export const UserEncryptionKeysSchema = z.object({
id: z.string().uuid(), id: z.string().uuid(),
clientPublicKey: z.string().nullable().optional(), clientPublicKey: z.string().nullable().optional(),
serverPrivateKey: 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(), protectedKey: z.string(),
protectedKeyIV: z.string(), protectedKeyIV: z.string(),
protectedKeyTag: z.string(), protectedKeyTag: z.string(),
+1 -1
View File
@@ -1,4 +1,4 @@
import { registerOrgRoleRouter } from "./org-role"; import { registerOrgRoleRouter } from "./org-role-router";
export const registerV1EERoutes = async (server: FastifyZodProvider) => { export const registerV1EERoutes = async (server: FastifyZodProvider) => {
// org role starts with organization // org role starts with organization
@@ -10,8 +10,9 @@ export const permissionDalFactory = (db: TDbClient) => {
): Promise<(TOrgMemberships & { permissions: string }) | undefined> => { ): Promise<(TOrgMemberships & { permissions: string }) | undefined> => {
const membership = await db(TableName.OrgMembership) const membership = await db(TableName.OrgMembership)
.leftJoin(TableName.OrgRoles, `${TableName.OrgMembership}.roleId`, `${TableName.OrgRoles}.id`) .leftJoin(TableName.OrgRoles, `${TableName.OrgMembership}.roleId`, `${TableName.OrgRoles}.id`)
.select(`${TableName.OrgMembership}.*`, `${TableName.OrgRoles}.permissions`) .where("userId", userId)
.where({ userId, [`${TableName.OrgMembership}.orgId`]: orgId }) .where(`${TableName.OrgMembership}.orgId`, orgId)
.select(`${TableName.OrgMembership}.*`, "permissions")
.first(); .first();
return membership; return membership;
+14 -14
View File
@@ -11,16 +11,16 @@ import { authDalFactory } from "@app/services/auth/auth-dal";
import { authLoginServiceFactory } from "@app/services/auth/auth-login-service"; import { authLoginServiceFactory } from "@app/services/auth/auth-login-service";
import { authPaswordServiceFactory } from "@app/services/auth/auth-password-service"; import { authPaswordServiceFactory } from "@app/services/auth/auth-password-service";
import { authSignupServiceFactory } from "@app/services/auth/auth-signup-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 { incidentContactDalFactory } from "@app/services/org/incident-contacts-dal";
import { orgDalFactory } from "@app/services/org/org-dal"; import { orgDalFactory } from "@app/services/org/org-dal";
import { orgRoleDalFactory } from "@app/services/org/org-role-dal"; import { orgRoleDalFactory } from "@app/services/org/org-role-dal";
import { orgRoleServiceFactory } from "@app/services/org/org-role-service"; import { orgRoleServiceFactory } from "@app/services/org/org-role-service";
import { orgServiceFactory } from "@app/services/org/org-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 { TSmtpService } from "@app/services/smtp/smtp-service";
import { tokenDalFactory } from "@app/services/token/token-dal"; import { superAdminDalFactory } from "@app/services/super-admin/super-admin-dal";
import { tokenServiceFactory } from "@app/services/token/token-service"; import { superAdminServiceFactory } from "@app/services/super-admin/super-admin-service";
import { userDalFactory } from "@app/services/user/user-dal"; import { userDalFactory } from "@app/services/user/user-dal";
import { userServiceFactory } from "@app/services/user/user-service"; import { userServiceFactory } from "@app/services/user/user-service";
@@ -40,7 +40,7 @@ export const registerRoutes = async (
const orgDal = orgDalFactory(db); const orgDal = orgDalFactory(db);
const incidentContactDal = incidentContactDalFactory(db); const incidentContactDal = incidentContactDalFactory(db);
const orgRoleDal = orgRoleDalFactory(db); const orgRoleDal = orgRoleDalFactory(db);
const serverCfgDal = serverCfgDalFactory(db); const superAdminDal = superAdminDalFactory(db);
const apiKeyDal = apiKeyDalFactory(db); const apiKeyDal = apiKeyDalFactory(db);
// ee db layer ops // ee db layer ops
@@ -77,16 +77,16 @@ export const registerRoutes = async (
orgService orgService
}); });
const orgRoleService = orgRoleServiceFactory({ permissionService, orgRoleDal }); const orgRoleService = orgRoleServiceFactory({ permissionService, orgRoleDal });
const serverCfgService = serverCfgServiceFactory({ const superAdminService = superAdminServiceFactory({
userDal, userDal,
authService: loginService, authService: loginService,
serverCfgDal serverCfgDal: superAdminDal
}); });
const apiKeyService = apiKeyServiceFactory({ apiKeyDal }); const apiKeyService = apiKeyServiceFactory({ apiKeyDal });
await serverCfgService.initServerCfg(); await superAdminService.initServerCfg();
// inject all services // inject all services
server.decorate("services", { server.decorate<FastifyZodProvider["services"]>("services", {
login: loginService, login: loginService,
password: passwordService, password: passwordService,
signup: signupService, signup: signupService,
@@ -94,14 +94,14 @@ export const registerRoutes = async (
permission: permissionService, permission: permissionService,
org: orgService, org: orgService,
orgRole: orgRoleService, orgRole: orgRoleService,
serverCfg: serverCfgService,
apiKey: apiKeyService, apiKey: apiKeyService,
authToken: tokenService authToken: tokenService,
} as FastifyZodProvider["services"]); superAdmin: superAdminService
});
server.decorate("store", { server.decorate<FastifyZodProvider["store"]>("store", {
user: userDal user: userDal
} as FastifyZodProvider["store"]); });
await server.register(injectIdentity); await server.register(injectIdentity);
@@ -1,6 +1,6 @@
import { z } from "zod"; 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 { getConfig } from "@app/lib/config/env";
import { UnauthorizedError } from "@app/lib/errors"; import { UnauthorizedError } from "@app/lib/errors";
import { verifySuperAdmin } from "@app/server/plugins/auth/superAdmin"; import { verifySuperAdmin } from "@app/server/plugins/auth/superAdmin";
@@ -14,12 +14,12 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => {
schema: { schema: {
response: { response: {
200: z.object({ 200: z.object({
config: ServerConfigSchema config: SuperAdminSchema
}) })
} }
}, },
handler: () => { handler: () => {
const config = server.services.serverCfg.getServerCfg(); const config = server.services.superAdmin.getServerCfg();
return { config }; return { config };
} }
}); });
@@ -33,7 +33,7 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => {
}), }),
response: { response: {
200: z.object({ 200: z.object({
config: ServerConfigSchema config: SuperAdminSchema
}) })
} }
}, },
@@ -42,7 +42,7 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => {
verifySuperAdmin(req); verifySuperAdmin(req);
}, },
handler: async (req) => { handler: async (req) => {
const config = await server.services.serverCfg.updateServerCfg(req.body); const config = await server.services.superAdmin.updateServerCfg(req.body);
return { config }; return { config };
} }
}); });
@@ -75,10 +75,10 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => {
}, },
handler: async (req, res) => { handler: async (req, res) => {
const appCfg = getConfig(); const appCfg = getConfig();
const serverCfg = server.services.serverCfg.getServerCfg(); const serverCfg = server.services.superAdmin.getServerCfg();
if (serverCfg.initialized) if (serverCfg.initialized)
throw new UnauthorizedError({ name: "Admin sign up", message: "Admin has been created" }); 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, ...req.body,
ip: req.realIp, ip: req.realIp,
userAgent: req.headers["user-agent"] || "" userAgent: req.headers["user-agent"] || ""
+3 -3
View File
@@ -1,6 +1,6 @@
import { registerAdminRouter } from "./admin"; import { registerAdminRouter } from "./admin-router";
import { registerAuthRoutes } from "./auth"; import { registerAuthRoutes } from "./auth-router";
import { registerInviteOrgRouter } from "./invite-org"; import { registerInviteOrgRouter } from "./invite-org-router";
import { registerOrgRouter } from "./organization-router"; import { registerOrgRouter } from "./organization-router";
import { registerPasswordRouter } from "./password-router"; import { registerPasswordRouter } from "./password-router";
import { registerUserActionRouter } from "./user-action-router"; import { registerUserActionRouter } from "./user-action-router";
@@ -5,7 +5,7 @@ import { TableName, TAuthTokens, TAuthTokenSessions } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors"; import { DatabaseError } from "@app/lib/errors";
import { ormify } from "@app/lib/knex"; import { ormify } from "@app/lib/knex";
import { TDeleteTokenForUserDalDTO } from "./token-types"; import { TDeleteTokenForUserDalDTO } from "./auth-token-types";
export type TTokenDalConfig = {}; export type TTokenDalConfig = {};
@@ -4,13 +4,13 @@ import bcrypt from "bcrypt";
import { TAuthTokens, TAuthTokenSessions } from "@app/db/schemas"; import { TAuthTokens, TAuthTokenSessions } from "@app/db/schemas";
import { getConfig } from "@app/lib/config/env"; import { getConfig } from "@app/lib/config/env";
import { TTokenDalFactory } from "./token-dal"; import { TTokenDalFactory } from "./auth-token-dal";
import { import {
TCreateTokenForUserDTO, TCreateTokenForUserDTO,
TIssueAuthTokenDTO, TIssueAuthTokenDTO,
TokenType, TokenType,
TValidateTokenForUserDTO TValidateTokenForUserDTO
} from "./token-types"; } from "./auth-token-types";
type TAuthTokenServiceFactoryDep = { type TAuthTokenServiceFactoryDep = {
tokenDal: TTokenDalFactory; tokenDal: TTokenDalFactory;
@@ -4,9 +4,9 @@ import { TUsers, UserDeviceSchema } from "@app/db/schemas";
import { getConfig } from "@app/lib/config/env"; import { getConfig } from "@app/lib/config/env";
import { generateSrpServerKey, srpCheckClientProof } from "@app/lib/crypto"; 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 { 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 { TUserDalFactory } from "../user/user-dal";
import { import {
TLoginClientProofDTO, TLoginClientProofDTO,
@@ -3,9 +3,9 @@ import jwt from "jsonwebtoken";
import { getConfig } from "@app/lib/config/env"; import { getConfig } from "@app/lib/config/env";
import { generateSrpServerKey, srpCheckClientProof } from "@app/lib/crypto"; 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 { 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 { TUserDalFactory } from "../user/user-dal";
import { TAuthDalFactory } from "./auth-dal"; import { TAuthDalFactory } from "./auth-dal";
import { import {
@@ -5,11 +5,11 @@ import { getConfig } from "@app/lib/config/env";
import { BadRequestError } from "@app/lib/errors"; import { BadRequestError } from "@app/lib/errors";
import { isDisposableEmail } from "@app/lib/validator"; 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 { TOrgDalFactory } from "../org/org-dal";
import { TOrgServiceFactory } from "../org/org-service"; import { TOrgServiceFactory } from "../org/org-service";
import { SmtpTemplates, TSmtpService } from "../smtp/smtp-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 { TUserDalFactory } from "../user/user-dal";
import { TAuthDalFactory } from "./auth-dal"; import { TAuthDalFactory } from "./auth-dal";
import { TCompleteAccountInviteDTO, TCompleteAccountSignupDTO } from "./auth-signup-type"; import { TCompleteAccountInviteDTO, TCompleteAccountSignupDTO } from "./auth-signup-type";
+3 -63
View File
@@ -1,67 +1,7 @@
import { Knex } from "knex";
import { TDbClient } from "@app/db"; import { TDbClient } from "@app/db";
import { TableName,TOrgRolesInsert, TOrgRolesUpdate } from "@app/db/schemas"; import { TableName } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors"; import { ormify } from "@app/lib/knex";
import { withTransaction } from "@app/lib/knex";
export type TOrgRoleDalFactory = ReturnType<typeof orgRoleDalFactory>; export type TOrgRoleDalFactory = ReturnType<typeof orgRoleDalFactory>;
export const orgRoleDalFactory = (db: TDbClient) => { export const orgRoleDalFactory = (db: TDbClient) => ormify(db, TableName.OrgRoles);
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
});
};
@@ -57,7 +57,7 @@ export const orgRoleServiceFactory = ({
if (existingRole && existingRole.id !== roleId) if (existingRole && existingRole.id !== roleId)
throw new BadRequestError({ name: "Update Role", message: "Duplicate role" }); 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" }); if (!updateRole) throw new BadRequestError({ message: "Role not found", name: "Update role" });
return updatedRole; return updatedRole;
}; };
@@ -68,7 +68,7 @@ export const orgRoleServiceFactory = ({
OrgPermissionActions.Delete, OrgPermissionActions.Delete,
OrgPermissionSubjects.Role 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" }); if (!deleteRole) throw new BadRequestError({ message: "Role not found", name: "Update role" });
return deletedRole; return deletedRole;
+2 -2
View File
@@ -11,9 +11,9 @@ import { BadRequestError, UnauthorizedError } from "@app/lib/errors";
import { isDisposableEmail } from "@app/lib/validator"; import { isDisposableEmail } from "@app/lib/validator";
import { AuthTokenType } from "../auth/auth-type"; 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 { 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 { TUserDalFactory } from "../user/user-dal";
import { TIncidentContactsDalFactory } from "./incident-contacts-dal"; import { TIncidentContactsDalFactory } from "./incident-contacts-dal";
import { TOrgDalFactory } from "./org-dal"; import { TOrgDalFactory } from "./org-dal";
@@ -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<typeof serverCfgDalFactory>;
export const serverCfgDalFactory = (db: TDbClient) => ormify(db, TableName.ServerConfig, {});
@@ -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<typeof superAdminDalFactory>;
export const superAdminDalFactory = (db: TDbClient) => ormify(db, TableName.SuperAdmin, {});
@@ -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 { BadRequestError } from "@app/lib/errors";
import { TAuthLoginFactory } from "../auth/auth-login-service"; import { TAuthLoginFactory } from "../auth/auth-login-service";
import { TUserDalFactory } from "../user/user-dal"; import { TUserDalFactory } from "../user/user-dal";
import { TServerCfgDalFactory } from "./server-cfg-dal"; import { TSuperAdminDalFactory } from "./super-admin-dal";
import { TAdminSignUpDTO } from "./server-cfg-types"; import { TAdminSignUpDTO } from "./super-admin-types";
type TServerCfgServiceFactoryDep = { type TSuperAdminServiceFactoryDep = {
serverCfgDal: TServerCfgDalFactory; serverCfgDal: TSuperAdminDalFactory;
userDal: TUserDalFactory; userDal: TUserDalFactory;
authService: Pick<TAuthLoginFactory, "generateUserTokens">; authService: Pick<TAuthLoginFactory, "generateUserTokens">;
}; };
export type TServerCfgServiceFactory = ReturnType<typeof serverCfgServiceFactory>; export type TSuperAdminServiceFactory = ReturnType<typeof superAdminServiceFactory>;
export const serverCfgServiceFactory = ({ export const superAdminServiceFactory = ({
serverCfgDal, serverCfgDal,
userDal, userDal,
authService authService
}: TServerCfgServiceFactoryDep) => { }: TSuperAdminServiceFactoryDep) => {
let serverCfg: TServerConfig; let serverCfg: TSuperAdmin;
const initServerCfg = async () => { const initServerCfg = async () => {
serverCfg = await serverCfgDal.findOne({}); serverCfg = await serverCfgDal.findOne({});
@@ -37,7 +37,7 @@ export const serverCfgServiceFactory = ({
return serverCfg; return serverCfg;
}; };
const updateServerCfg = async (data: TServerConfigUpdate) => { const updateServerCfg = async (data: TSuperAdminUpdate) => {
const cfg = await serverCfgDal.updateById(serverCfg.id, data); const cfg = await serverCfgDal.updateById(serverCfg.id, data);
return cfg; return cfg;
}; };
+51 -30
View File
@@ -20,25 +20,35 @@ export const userDalFactory = (db: TDbClient) => {
// USER ENCRYPTION FUNCTIONS // USER ENCRYPTION FUNCTIONS
// ------------------------- // -------------------------
const findUserEncKeyByEmail = async (email: string) => const findUserEncKeyByEmail = async (email: string) => {
db(TableName.Users) try {
.where({ email }) return await db(TableName.Users)
.join( .where({ email })
TableName.UserEncryptionKey, .join(
`${TableName.Users}.id`, TableName.UserEncryptionKey,
`${TableName.UserEncryptionKey}.userId` `${TableName.Users}.id`,
) `${TableName.UserEncryptionKey}.userId`
.first(); )
.first();
} catch (error) {
throw new DatabaseError({ error, name: "Find user enc by email" });
}
};
const findUserEncKeyByUserId = async (userId: string) => const findUserEncKeyByUserId = async (userId: string) => {
db(TableName.Users) try {
.where({ [`${TableName.Users}.id`]: userId }) return await db(TableName.Users)
.join( .where(`${TableName.Users}.id`, userId)
TableName.UserEncryptionKey, .join(
`${TableName.Users}.id`, TableName.UserEncryptionKey,
`${TableName.UserEncryptionKey}.userId` `${TableName.Users}.id`,
) `${TableName.UserEncryptionKey}.userId`
.first(); )
.first();
} catch (error) {
throw new DatabaseError({ error, name: "Find user enc by user id" });
}
};
const createUserEncryption = async (data: TUserEncryptionKeysInsert, tx?: Knex) => { const createUserEncryption = async (data: TUserEncryptionKeysInsert, tx?: Knex) => {
try { try {
@@ -54,11 +64,15 @@ export const userDalFactory = (db: TDbClient) => {
data: TUserEncryptionKeysUpdate, data: TUserEncryptionKeysUpdate,
tx?: Knex tx?: Knex
) => { ) => {
const [userEnc] = await (tx || db)(TableName.UserEncryptionKey) try {
.where({ userId }) const [userEnc] = await (tx || db)(TableName.UserEncryptionKey)
.update({ ...data }) .where({ userId })
.returning("*"); .update({ ...data })
return userEnc; .returning("*");
return userEnc;
} catch (error) {
throw new DatabaseError({ error, name: "Update user enc by user id" });
}
}; };
const upsertUserEncryptionKey = async ( const upsertUserEncryptionKey = async (
@@ -66,13 +80,20 @@ export const userDalFactory = (db: TDbClient) => {
data: Omit<TUserEncryptionKeysUpdate, "userId">, data: Omit<TUserEncryptionKeysUpdate, "userId">,
tx?: Knex tx?: Knex
) => { ) => {
const [userEnc] = await (tx ? tx(TableName.UserEncryptionKey) : db(TableName.UserEncryptionKey)) try {
// if user insert make sure to pass all required data const [userEnc] = await (tx
.insert({ userId, ...data } as TUserEncryptionKeys) ? tx(TableName.UserEncryptionKey)
.onConflict("userId") : db(TableName.UserEncryptionKey)
.merge() )
.returning("*"); // if user insert make sure to pass all required data
return userEnc; .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 // USER ACTION FUNCTIONS