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
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ jobs:

- name: perform a DEV database migration
run: npm -w cli start migrate -- --stage DEV
env:
DATABASE_URL: postgresql://postgres:not_at_all_secret@localhost:5432/postgres

- name: basic database tests
run: psql -d postgresql://postgres:not_at_all_secret@localhost:5432/postgres -v ON_ERROR_STOP=1 -f sql/ci.sql
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Created by https://www.toptal.com/developers/gitignore/api/node,macos,intellij,visualstudiocode,go
# Edit at https://www.toptal.com/developers/gitignore?templates=node,macos,intellij,visualstudiocode,go

packages/common/src/prisma-client
### Go ###
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
Expand Down
4 changes: 3 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import prettier from 'eslint-plugin-prettier';
import eslintPluginUnicorn from 'eslint-plugin-unicorn';

export default [
{
ignores: ['**/*/dist/**', 'packages/common/src/prisma-client/**'],
},
...guardian.configs.recommended,
...guardian.configs.jest,
{
Expand All @@ -14,6 +17,5 @@ export default [
'prettier/prettier': 'error',
'unicorn/prefer-array-flat-map': 'error',
},
ignores: ['**/*/dist/**'],
},
];
2,881 changes: 942 additions & 1,939 deletions package-lock.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -22399,6 +22399,7 @@ spec:
"Endpoint.Address",
],
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down Expand Up @@ -22732,6 +22733,7 @@ spec:
"Endpoint.Address",
],
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down Expand Up @@ -23144,6 +23146,7 @@ spec:
"Endpoint.Address",
],
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down Expand Up @@ -23873,6 +23876,7 @@ spec:
"Endpoint.Address",
],
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down Expand Up @@ -24192,6 +24196,7 @@ spec:
"Endpoint.Address",
],
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down Expand Up @@ -25616,6 +25621,7 @@ spec:
"Endpoint.Address",
],
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down Expand Up @@ -28535,6 +28541,7 @@ spec:
"INTERACTIVE_MONITOR_TOPIC_ARN": {
"Ref": "TopicBFC7AF6E",
},
"NODE_EXTRA_CA_CERTS": "/var/runtime/ca-cert.pem",
"QUERY_LOGGING": "false",
"STACK": "deploy",
"STAGE": "PROD",
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/cloudbuster.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export class CloudBuster {
DATABASE_HOSTNAME: db.dbInstanceEndpointAddress,
QUERY_LOGGING: 'false',
CUT_OFF_IN_DAYS: digestCutOffInDays.toString(),
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
timeout: Duration.minutes(2),
memorySize: 512,
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/cloudquery-usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export function addCloudqueryUsageLambda(
DATABASE_HOSTNAME: db.dbInstanceEndpointAddress,
QUERY_LOGGING: 'false', // Set this to 'true' to enable SQL query logging
CQ_API_KEY_PATH: cloudqueryApiKey.secretName,
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
rules: [
{
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/data-audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export function addDataAuditLambda(scope: GuStack, props: DataAuditProps) {
environment: {
DATABASE_HOSTNAME: db.dbInstanceEndpointAddress,
QUERY_LOGGING: 'false', // Set this to 'true' to enable SQL query logging,
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
monitoringConfiguration: { noMonitoring: true },
rules: [
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/github-actions-usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export function addGithubActionsUsageLambda(
environment: {
DATABASE_HOSTNAME: db.dbInstanceEndpointAddress,
QUERY_LOGGING: 'false', // Set this to 'true' to enable SQL query logging
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
runtime: Runtime.NODEJS_20_X,
timeout: Duration.minutes(10),
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/obligatron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export class Obligatron {
environment: {
DATABASE_HOSTNAME: db.dbInstanceEndpointAddress,
QUERY_LOGGING: 'false', // Set this to 'true' to enable SQL query logging
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
timeout: Duration.minutes(5),
// Unfortunately Prisma doesn't support streaming data from Postgres at the moment https://github.com/prisma/prisma/issues/5055
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/refresh-materialized-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export function addRefreshMaterializedViewLambda(
environment: {
DATABASE_HOSTNAME: db.dbInstanceEndpointAddress,
QUERY_LOGGING: 'false', // Set this to 'true' to enable SQL query logging
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
runtime: Runtime.NODEJS_20_X,
timeout: Duration.minutes(10),
Expand Down
1 change: 1 addition & 0 deletions packages/cdk/lib/repocop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ export class Repocop {
GITHUB_ORG: gitHubOrg,
CUT_OFF_IN_DAYS: digestCutOffInDays.toString(),
BRANCH_PROTECTION_ENABLED: 'true',
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
},
vpc,
securityGroups: [dbSecurityGroup],
Expand Down
3 changes: 2 additions & 1 deletion packages/cli/src/database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ export async function migrateDevDatabase(): Promise<number> {
);

console.log(`Running prisma migrate reset --force`);
const { stdout } = await $`npx -w common prisma migrate reset --force`;
const { stdout } =
await $`npx -w common prisma migrate reset --force --config prisma.config.ts --schema prisma/schema.prisma`;
console.log(stdout);

console.log('Running prisma db pull to update schema.prisma');
Expand Down
3 changes: 2 additions & 1 deletion packages/cloudbuster/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"version": "1.0.0",
"type": "module",
"scripts": {
"build": "esbuild src/index.ts --bundle --platform=node --target=node20 --outdir=dist --external:@aws-sdk --external:@prisma/client --external:prisma",
"build": "esbuild src/index.ts --bundle --platform=node --target=node20 --outdir=dist --external:@aws-sdk --external:@prisma/client --external:prisma --format=esm --banner:js=\"import { createRequire } from 'module'; const require = createRequire(import.meta.url);\"",
"postbuild": "cp package.json dist/package.json",
"start": "APP=cloudbuster CUT_OFF_IN_DAYS=60 tsx src/run-locally.ts",
"test": "node --import tsx --test \"**/*.test.ts\"",
"typecheck": "tsc --noEmit"
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudbuster/src/digests.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from 'assert';
import { describe, it } from 'node:test';
import type { cloudbuster_fsbp_vulnerabilities } from '@prisma/client';
import type { cloudbuster_fsbp_vulnerabilities } from 'common/prisma-client/client.js';
import type { SecurityHubSeverity } from 'common/types.js';
import {
createDigestForAccount,
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudbuster/src/digests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {
Anghammarad,
AnghammaradNotification,
} from '@guardian/anghammarad';
import type { cloudbuster_fsbp_vulnerabilities } from '@prisma/client';
import type { cloudbuster_fsbp_vulnerabilities } from 'common/prisma-client/client.js';
import { stringToSeverity } from 'common/src/functions.js';
import { logger } from 'common/src/logs.js';
import type { SecurityHubSeverity, Severity } from 'common/src/types.js';
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudbuster/src/findings.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from 'assert';
import { describe, it } from 'node:test';
import type { cloudbuster_fsbp_vulnerabilities } from '@prisma/client';
import type { cloudbuster_fsbp_vulnerabilities } from 'common/prisma-client/client.js';
import type { SecurityHubFinding } from 'common/types.js';
import {
findingsToGuardianFormat,
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudbuster/src/findings.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { cloudbuster_fsbp_vulnerabilities } from '@prisma/client';
import type { cloudbuster_fsbp_vulnerabilities } from 'common/prisma-client/client.js';
import { isWithinSlaTime, stringToSeverity } from 'common/src/functions.js';
import type { SecurityHubFinding } from 'common/src/types.js';
import type { GroupedFindings } from './types.js';
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudbuster/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { SNSClient } from '@aws-sdk/client-sns';
import { Anghammarad } from '@guardian/anghammarad';
import type { cloudbuster_fsbp_vulnerabilities } from '@prisma/client';
import { awsClientConfig } from 'common/aws.js';
import { logger } from 'common/logs.js';
import type { cloudbuster_fsbp_vulnerabilities } from 'common/prisma-client/client.js';
import { getFsbpFindings } from 'common/src/database-queries.js';
import { getPrismaClient } from 'common/src/database-setup.js';
import type { SecurityHubSeverity } from 'common/src/types.js';
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudbuster/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Action } from '@guardian/anghammarad';
import type { cloudbuster_fsbp_vulnerabilities } from '@prisma/client';
import type { cloudbuster_fsbp_vulnerabilities } from 'common/prisma-client/client.js';

export interface Digest {
accountId: string;
Expand Down
3 changes: 2 additions & 1 deletion packages/cloudquery-usage/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
"test": "node --import tsx --test \"**/*.test.ts\"",
"start": "APP=cloudquery-usage tsx src/run-locally.ts",
"prebuild": "rm -rf dist",
"build": "esbuild src/index.ts --bundle --platform=node --target=node20 --outdir=dist --external:@prisma/client --external:prisma",
"build": "esbuild src/index.ts --bundle --platform=node --target=node20 --outdir=dist --external:@prisma/client --external:prisma --format=esm --banner:js=\"import { createRequire } from 'module'; const require = createRequire(import.meta.url);\"",
"postbuild": "cp package.json dist/package.json",
"typecheck": "tsc --noEmit"
},
"type": "module"
Expand Down
5 changes: 4 additions & 1 deletion packages/cloudquery-usage/src/db-write.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import type { cloudquery_plugin_usage, PrismaClient } from '@prisma/client';
import type {
cloudquery_plugin_usage,
PrismaClient,
} from 'common/prisma-client/client.js';

export function saveResults(
client: PrismaClient,
Expand Down
2 changes: 1 addition & 1 deletion packages/cloudquery-usage/src/transform.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from 'node:assert';
import { describe, test } from 'node:test';
import type { cloudquery_plugin_usage } from '@prisma/client';
import type { cloudquery_plugin_usage } from 'common/prisma-client/client.js';
import { usageSummaryToDatabaseRows } from './transform.js';
import type { UsageSummaryResponseForPaidRows } from './types.js';

Expand Down
2 changes: 1 addition & 1 deletion packages/cloudquery-usage/src/transform.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { cloudquery_plugin_usage } from '@prisma/client';
import type { cloudquery_plugin_usage } from 'common/prisma-client/client.js';
import type { UsageSummaryResponseForPaidRows } from './types.js';

export function usageSummaryToDatabaseRows(
Expand Down
13 changes: 7 additions & 6 deletions packages/common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"node": ">=18"
},
"scripts": {
"postinstall": "prisma generate",
"postinstall": "npx prisma generate",
"test": "node --import tsx --test \"**/*.test.ts\"",
"typecheck": "tsc"
},
Expand All @@ -17,13 +17,14 @@
"@aws-sdk/rds-signer": "^3.1000.0",
"@octokit/auth-app": "^8.2.0",
"@octokit/graphql": "^9.0.3",
"@prisma/adapter-pg": "^7.3.0",
"@prisma/client": "^7.3.0",
"octokit": "^5.0.5",
"octokit-plugin-create-pull-request": "^6.0.1",
"@prisma/client": "^6.19.0"
"octokit-plugin-create-pull-request": "^6.0.1"
},
"devDependencies": {
"prisma": "^6.19.0",
"@octokit/types": "^16.0.0",
"@types/aws-lambda": "^8.10.161"
"@types/aws-lambda": "^8.10.161",
"prisma": "^7.3.0"
}
}
}
13 changes: 13 additions & 0 deletions packages/common/prisma.config.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
import path from 'node:path';
import { loadEnvFile } from 'node:process';
import { defineConfig } from 'prisma/config';
import { getDatabaseConnectionString } from 'common/src/database-setup.js';

if (process.env.STAGE !== 'PROD' && process.env.STAGE !== 'CODE') {
loadEnvFile(path.resolve('../../.env'));
}

export default defineConfig({
schema: path.join('prisma', 'schema.prisma'),
datasource: {
url: getDatabaseConnectionString({
hostname: process.env.DATABASE_HOSTNAME as string,
user: process.env.DATABASE_USER as string,
password: process.env.DATABASE_PASSWORD as string,
}),
},
migrations: {
path: path.join('prisma', 'migrations'),
},
Expand Down
4 changes: 2 additions & 2 deletions packages/common/prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
generator client {
provider = "prisma-client-js"
provider = "prisma-client"
output = "../src/prisma-client"
previewFeatures = ["views"]
binaryTargets = ["native", "linux-arm64-openssl-3.0.x"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model aws_cloudformation_stacks {
Expand Down
2 changes: 1 addition & 1 deletion packages/common/src/database-queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type {
aws_securityhub_findings,
PrismaClient,
view_repo_ownership,
} from '@prisma/client';
} from 'common/prisma-client/client.js';
import { toNonEmptyArray } from './functions.js';
import type {
NonEmptyArray,
Expand Down
20 changes: 12 additions & 8 deletions packages/common/src/database-setup.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { Signer } from '@aws-sdk/rds-signer';
import { PrismaClient } from '@prisma/client';
import { awsClientConfig } from 'common/aws.js';
import { getEnvOrThrow } from 'common/functions.js';
import { PrismaPg } from '@prisma/adapter-pg';
import { config } from 'dotenv';
import { awsClientConfig } from 'common/src/aws.js';
import { getEnvOrThrow } from 'common/src/functions.js';
import { PrismaClient } from 'common/src/prisma-client/client.js';

export interface DatabaseConfig {
/**
Expand Down Expand Up @@ -50,6 +52,8 @@ async function getRdsToken(stage: string, hostname: string, username: string) {
}

export function getDevDatabaseConfig(): Promise<DatabaseConfig> {
config({ path: `../../.env` });

return Promise.resolve({
hostname: getEnvOrThrow('DATABASE_HOSTNAME'),
user: getEnvOrThrow('DATABASE_USER'),
Expand Down Expand Up @@ -80,12 +84,12 @@ export function getDatabaseConnectionString(config: DatabaseConfig) {
}

export function getPrismaClient(config: PrismaConfig): PrismaClient {
const adapter = new PrismaPg({
connectionString: config.databaseConnectionString,
});

return new PrismaClient({
datasources: {
db: {
url: config.databaseConnectionString,
},
},
adapter,
...(config.withQueryLogging && {
log: [
{
Expand Down
Loading
Loading