Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
16538f4
ci: :hammer: Add a demo github action script
kyrkjedelen Mar 5, 2025
a4563ef
style: :rotating_light: Add lib to biome script paths and fix linting…
kyrkjedelen Mar 5, 2025
2aed983
ci: :hammer: Add biome checking CI/CD workflow
kyrkjedelen Mar 5, 2025
86f84c6
ci: :hammer: Fix small typo in biome script
kyrkjedelen Mar 5, 2025
96e2023
ci: :green_heart: Add pnpm install to ci script
kyrkjedelen Mar 5, 2025
5f4eb1c
style: :rotating_light: Update linting script to be in all files, and…
kyrkjedelen Mar 5, 2025
6313f0b
ci: :hammer: Update script to also run the app after building
kyrkjedelen Mar 5, 2025
8c0ab0f
ci: :hammer: Add database configs to ci/cd script
kyrkjedelen Mar 5, 2025
5c1c043
ci: :green_heart: Fix syntax error in ci/cd script
kyrkjedelen Mar 5, 2025
d82c8b3
feat: :card_file_box: Add feature to create database on migration, an…
kyrkjedelen Mar 5, 2025
73b4323
ci: :green_heart: Make database have hard coded ports in ci/cd script
kyrkjedelen Mar 5, 2025
74f4183
ci: :hammer: Make the ci/cd script log the database parameters
kyrkjedelen Mar 5, 2025
52f8971
refactor: :card_file_box: Make the createDatabase script not use the …
kyrkjedelen Mar 5, 2025
3fba8ab
ci: :green_heart: Try double quotes in database queries
kyrkjedelen Mar 5, 2025
e27f23b
ci: :green_heart: Fix database name in create database script to be p…
kyrkjedelen Mar 5, 2025
ce874cd
ci: :loud_sound: Add error log in createDatabase script
kyrkjedelen Mar 5, 2025
6259f03
ci: :card_file_box: Edited query to get database name
kyrkjedelen Mar 5, 2025
87c8b86
ci: :card_file_box: Add single quotes to database name in query in cr…
kyrkjedelen Mar 5, 2025
17a7058
ci: :hammer: Make pnpm start stop after five seconds
kyrkjedelen Mar 5, 2025
1e44594
ci: :bug: Fix waiting in ci/cd script
kyrkjedelen Mar 5, 2025
b3dc940
ci: :hammer: Remove waiting from ci/cd script
kyrkjedelen Mar 5, 2025
01b9cdd
ci: :hammer: Add echo to ci/cd script
kyrkjedelen Mar 5, 2025
38df8fb
ci: :hammer: Remove echo and kill of process, since its unneccesary
kyrkjedelen Mar 5, 2025
f7bb4f8
style: :rotating_light: Fix linting errors
kyrkjedelen Mar 5, 2025
de3a57f
ci: :hammer: Split up CI/CD scripts
kyrkjedelen Mar 5, 2025
45754a8
ci: :green_heart: Remove biome check from build check workflow
kyrkjedelen Mar 5, 2025
fad28b2
ci: :hammer: Add node testrunner to ci/cd
kyrkjedelen Mar 5, 2025
31d4a9e
ci: :green_heart: Fix ci script to be in one file, and rename
kyrkjedelen Mar 5, 2025
4f862cd
style: :rotating_light: Fix linting error
kyrkjedelen Mar 5, 2025
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
112 changes: 112 additions & 0 deletions .github/workflows/pull-request-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
name: Pull request to main
env:
NODE_VERSION: 21.7.3
PNPM_VERSION: 10.2.0
BIOME_VERSION: 1.9.3
DATABASE_PASSWORD: pass123
DATABASE_USER: postgres
DATABASE_HOST: localhost
DATABASE_PORT: 5432
DATABASE_SSL_OPTION: false
DATABASE_NAME: vektor-database
PORT: 8080
HOSTING_URL: localhost

on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
biome-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Biome
uses: biomejs/setup-biome@v2
with:
version: ${{ env.BIOME_VERSION }}
- name: Run Biome
run: biome ci .
build:
runs-on: ubuntu-latest
services:
database:
image: postgres:latest
env:
POSTGRES_PASSWORD: ${{ env.DATABASE_PASSWORD }}
# Wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: "pnpm"
- name: Install pnpm
run: pnpm install
- name: Generate migration files
run: pnpm db:generate
- name: Migrate database
run: pnpm db:migrate
- name: Build
run: pnpm build
- name: Store build artifact
uses: actions/upload-artifact@v4
with:
name: build
path: build
- name: Start
run: pnpm start &
test:
runs-on: ubuntu-latest
services:
database:
image: postgres:latest
env:
POSTGRES_PASSWORD: ${{ env.DATABASE_PASSWORD }}
# Wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: "pnpm"
- name: Install pnpm
run: pnpm install
- name: Generate migration files
run: pnpm db:generate
- name: Migrate database
run: pnpm db:migrate
- name: Build
run: pnpm build
- name: Test
run: pnpm test


43 changes: 43 additions & 0 deletions db/setup/createDatabase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import "dotenv/config";
import { databaseConnectionParameters } from "@db/config/parameters";
import {
getDatabaseErrorPrivateMessage,
postgresErrorParser,
} from "@db/errors/postgresError";
import pg from "pg"; // It does not work to import { Client } from "pg"

const postgresClient = new pg.Client({
...databaseConnectionParameters,
database: "postgres",
});

try {
await postgresClient.connect();
const databaseListResponse = await postgresClient.query(
`SELECT pg_catalog.pg_database.datname FROM pg_catalog.pg_database WHERE pg_catalog.pg_database.datname = '${databaseConnectionParameters.database}';`,
);

if (databaseListResponse.rowCount === 0) {
console.log(
`${databaseConnectionParameters.database} database not found, creating it`,
);
await postgresClient.query(
`CREATE DATABASE "${databaseConnectionParameters.database}";`,
);
console.log(`Created database ${databaseConnectionParameters.database}`);
} else {
console.log(`Database ${databaseConnectionParameters.database} exists`);
}
await postgresClient.end();
} catch (error) {
const errorResult = postgresErrorParser.safeParse(error);
if (errorResult.success) {
console.debug(error);
console.error(getDatabaseErrorPrivateMessage(errorResult.data));
} else {
console.error(error);
}
await postgresClient.end();
console.error("Error when checking if database already exists.");
process.exit(1);
}
6 changes: 0 additions & 6 deletions db/setup/migrationPostgres.ts

This file was deleted.

8 changes: 6 additions & 2 deletions lib/financeParsers.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { z } from "zod";
import validator from "validator";
import { z } from "zod";

export const currencyParser = z.string().refine((input) => {
return validator.isCurrency(input, {
Expand All @@ -23,4 +23,8 @@ export const norwegianIBANParser = z.string().refine((input) => {
});
}, "is not a valid norwegian account number");

export const norwegianBankAccountNumberParser = z.string().length(11).transform(string => "NO93" + string).pipe(norwegianIBANParser);
export const norwegianBankAccountNumberParser = z
.string()
.length(11)
.transform((string) => `NO93${string}`)
.pipe(norwegianIBANParser);
2 changes: 1 addition & 1 deletion lib/globalVariables.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const maxTextLength = 2500 as const;
export const MAX_TEXT_LENGTH = 2500 as const;
12 changes: 7 additions & 5 deletions lib/lib.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { z } from "zod"
import { z } from "zod";

// modified from https://github.com/colinhacks/zod/discussions/839#discussioncomment-4335236
export function zodEnumFromObjKeys<K extends string> ( obj: Record<K, any> ): z.ZodEnum<[ K, ...K[] ]> {
const [ firstKey, ...otherKeys ] = Object.keys( obj ) as K[]
return z.enum( [ firstKey, ...otherKeys ] )
}
export function zodEnumFromObjKeys<K extends string>(
obj: Record<K, unknown>,
): z.ZodEnum<[K, ...K[]]> {
const [firstKey, ...otherKeys] = Object.keys(obj) as K[];
return z.enum([firstKey, ...otherKeys]);
}
102 changes: 51 additions & 51 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,52 +1,52 @@
{
"name": "vektor-api",
"version": "0.0.1",
"description": "",
"main": "./src/main.ts",
"type": "module",
"scripts": {
"dev:once": "tsx ./src/main.ts",
"dev": "tsx watch ./src/main.ts",
"build": "tsc --project ./tsconfig.json && tsc-alias --project ./tsconfig.json --resolve-full-paths",
"start": "node ./build/src/main.js",
"prod": "pnpm build && pnpm start",
"test": "echo \"Error: no test specified\" && exit 1",
"format": "biome format --write ./src ./db",
"lint": "biome lint --write ./src ./db",
"check": "biome check --write ./src ./db",
"db:generate": "drizzle-kit generate --config=db/config/drizzle.config.ts",
"db:migrate": "drizzle-kit migrate --config=db/config/drizzle.config.ts",
"db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts",
"docs:generate": "tsx ./src/openapi/generateDocument.ts"
},
"license": "ISC",
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"drizzle-orm": "^0.33.0",
"drizzle-zod": "^0.5.1",
"express": "^4.21.1",
"pg": "^8.13.0",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1",
"validator": "^13.12.0",
"zod": "^3.23.8",
"zod-openapi": "^3.3.0",
"zod-validation-error": "^3.4.0"
},
"devDependencies": {
"@biomejs/biome": "1.9.3",
"@types/cors": "^2.8.17",
"@types/express": "^4.17.21",
"@types/node": "^22.7.8",
"@types/pg": "^8.11.10",
"@types/swagger-jsdoc": "^6.0.4",
"@types/swagger-ui-express": "^4.1.7",
"@types/validator": "^13.12.2",
"drizzle-kit": "^0.24.2",
"tsc-alias": "^1.8.10",
"tsx": "^4.19.1",
"typescript": "^5.6.3",
"yaml": "^2.6.0"
}
}
"name": "vektor-api",
"version": "0.0.1",
"description": "",
"main": "./src/main.ts",
"type": "module",
"scripts": {
"dev:once": "tsx ./src/main.ts",
"dev": "tsx watch ./src/main.ts",
"build": "tsc --project ./tsconfig.json && tsc-alias --project ./tsconfig.json --resolve-full-paths",
"start": "node ./build/src/main.js",
"prod": "pnpm build && pnpm start",
"test": "tsc --noEmit && node --import tsx --test ./src/test/*.ts",
"format": "biome format --write",
"lint": "biome lint --write",
"check": "biome check --write",
"db:generate": "drizzle-kit generate --config=db/config/drizzle.config.ts",
"db:migrate": "tsx ./db/setup/createDatabase.ts && drizzle-kit migrate --config=db/config/drizzle.config.ts",
"db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts",
"docs:generate": "tsx ./src/openapi/generateDocument.ts"
},
"license": "ISC",
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"drizzle-orm": "^0.33.0",
"drizzle-zod": "^0.5.1",
"express": "^4.21.1",
"pg": "^8.13.0",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1",
"validator": "^13.12.0",
"zod": "^3.23.8",
"zod-openapi": "^3.3.0",
"zod-validation-error": "^3.4.0"
},
"devDependencies": {
"@biomejs/biome": "1.9.3",
"@types/cors": "^2.8.17",
"@types/express": "^4.17.21",
"@types/node": "^22.7.8",
"@types/pg": "^8.11.10",
"@types/swagger-jsdoc": "^6.0.4",
"@types/swagger-ui-express": "^4.1.7",
"@types/validator": "^13.12.2",
"drizzle-kit": "^0.24.2",
"tsc-alias": "^1.8.10",
"tsx": "^4.19.1",
"typescript": "^5.6.3",
"yaml": "^2.6.0"
}
}
Loading