From e21a51f1d0bbc5f1307c39dff5e5d9eecf4375e5 Mon Sep 17 00:00:00 2001 From: Dunemask Date: Sun, 22 Dec 2024 17:56:13 -0700 Subject: [PATCH] [CHORE] Misc Code Updates & Fixes --- lib/app.ts | 4 ++-- lib/config.ts | 19 +++++++++++-------- prisma/schema.prisma | 4 ++-- src/util/api/GeneratedRequests.ts | 29 +++++++++++++++++++---------- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/lib/app.ts b/lib/app.ts index dc22d31..64b4a24 100644 --- a/lib/app.ts +++ b/lib/app.ts @@ -1,7 +1,7 @@ import "dotenv/config"; import "dotenv-expand/config"; import Cairo from "./Cairo"; -import { assertRequired } from "./config"; -assertRequired(); +import { assertRequiredEnvars } from "./config"; +assertRequiredEnvars(); const cairo = new Cairo(); await cairo.start(); diff --git a/lib/config.ts b/lib/config.ts index 56540bc..0441590 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -1,12 +1,15 @@ import DefaultRolePolicies from "./vix/AppPolicies"; -const requiredEnvars: string[] = ["CAIRO_KEYPAIR_KEY"]; +const REQUIRED_ENV: string[] = [ + "CAIRO_POSTGRES_URI", // Used for postgres connections + "CAIRO_KEYPAIR_KEY", // Used for encrypting and decrypting keypair keys +]; -const encodedEnvar = (envar: string | undefined) => (!!envar ? Buffer.from(envar, "base64").toString("utf8") : envar); - -export function assertRequired() { - for (const e of requiredEnvars) if (!process.env[e]) throw Error(`Envar '${e}' is required!`); +const decodeEnvar = (e: T) => (!!e ? Buffer.from(e, "base64").toString("utf8") : e) as T; +export function assertRequiredEnvars() { + for (const envar of Object.values(REQUIRED_ENV)) if (!process.env[envar]) throw Error(`Envar ${envar} is required!`); } +const ENV = process.env as { [key in (typeof REQUIRED_ENV)[number]]: string } & Record; export default { Server: { @@ -33,11 +36,11 @@ export default { }, }, SigningOptions: { - HashRounds: 12, + HashRounds: 14, Version: "0.0.1-alpha", - Issuer: encodedEnvar(process.env.CAIRO_HOSTNAME) ?? "https://cairo.dunemask.net", + Issuer: process.env.CAIRO_HOSTNAME ?? "https://cairo.dunemask.net", Keys: { - KeyPair: encodedEnvar(process.env.CAIRO_KEYPAIR_KEY) ?? "keypair-key", + KeyPair: decodeEnvar(ENV.CAIRO_KEYPAIR_KEY), }, Subjects: { User: "user", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9fbaf4a..a48c8f8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -56,9 +56,9 @@ model KeyPair { name String? encryptedPrivateKey String encryptedPublicKey String - project Project @relation(fields: [projectId], references: [id]) - // Application Level Uniqueness for non-custom usages. For example, there can only be 1 UserToken Keypair + // Relations + project Project @relation(fields: [projectId], references: [id]) } enum AuthorityType { diff --git a/src/util/api/GeneratedRequests.ts b/src/util/api/GeneratedRequests.ts index 9f6d109..401b81a 100644 --- a/src/util/api/GeneratedRequests.ts +++ b/src/util/api/GeneratedRequests.ts @@ -3,17 +3,26 @@ import { CAuthContract, CProjectContract } from "@vix/ContractTypes"; import { apiRequest } from "@dunemask/vix/bridge"; import { authenticatedApiRequest } from "./requests"; - export const getProjectAuthVerify = (project: string) => - authenticatedApiRequest({subpath: `/${project}/auth/verify`, method:"GET", jsonify: true}); +export const getProjectAuthVerify = (project: string) => + authenticatedApiRequest({ subpath: `/${project}/auth/verify`, method: "GET", jsonify: true }); - export const postProjectAuthLogin = (project: string,login: CAuthContract["Login"]) => - apiRequest({subpath: `/${project}/auth/login`, method:"POST", json: login, jsonify: true}); +export const postProjectAuthLogin = (project: string, login: CAuthContract["Login"]) => + apiRequest({ + subpath: `/${project}/auth/login`, + method: "POST", + json: login, + jsonify: true, + }); - export const getProjectAuthCredentials = (project: string) => - authenticatedApiRequest({subpath: `/${project}/auth/credentials`, method:"GET", jsonify: true}); +export const getProjectAuthCredentials = (project: string) => + authenticatedApiRequest({ + subpath: `/${project}/auth/credentials`, + method: "GET", + jsonify: true, + }); - export const postProjectCreate = (project: string,create: CProjectContract["Create"]) => - authenticatedApiRequest({subpath: `/${project}/create`, method:"POST", json: create, jsonify: true}); +export const postProjectCreate = (project: string, create: CProjectContract["Create"]) => + authenticatedApiRequest({ subpath: `/${project}/create`, method: "POST", json: create, jsonify: true }); - export const getProjectList = (project: string) => - authenticatedApiRequest({subpath: `/${project}/list`, method:"GET", jsonify: true}); \ No newline at end of file +export const getProjectList = (project: string) => + authenticatedApiRequest({ subpath: `/${project}/list`, method: "GET", jsonify: true });