Skip to content
Merged
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
39 changes: 5 additions & 34 deletions .github/workflows/pull-request-check.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
name: Pull request to main
permissions: {}
env:
NODE_VERSION: 21.7.3
PNPM_VERSION: 10.6.0
BIOME_VERSION: 1.9.3
DATABASE_PASSWORD: pass123
DATABASE_USER: postgres
DATABASE_HOST: localhost
Expand All @@ -25,39 +23,23 @@ jobs:
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: Docker compose
run: docker compose up -d
- name: Generate migration files
run: pnpm db:generate
- name: Migrate database
Expand All @@ -73,19 +55,6 @@ jobs:
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
Expand All @@ -100,6 +69,8 @@ jobs:
cache: "pnpm"
- name: Install pnpm
run: pnpm install
- name: Docker compose
run: docker compose up -d
- name: Generate migration files
run: pnpm db:generate
- name: Migrate database
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ node_modules
db/migrations
.vscode
build
openapi-document.yaml
openapi-document.yaml
#From docker compose database
db-data
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Vektorprogrammets API

Kildekoden er på engelsk
For at testene skal fungere, bruk node version >=22

## Folder structure

Expand Down
8 changes: 4 additions & 4 deletions db/tables/expenses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import { usersTable } from "@/db/tables/users";
import { relations } from "drizzle-orm";
import {
boolean,
date,
integer,
numeric,
serial,
text,
timestamp,
} from "drizzle-orm/pg-core";

export const expensesTable = mainSchema.table("expenses", {
Expand All @@ -19,10 +19,10 @@ export const expensesTable = mainSchema.table("expenses", {
description: text("description").notNull(),
moneyAmount: numeric("moneyAmount", { scale: 2 }).notNull(),
accountNumber: text("accountNumber").notNull(),
purchaseDate: date("purchaseDate", { mode: "date" }).notNull(),
submitDate: date("submitDate", { mode: "date" }).defaultNow().notNull(),
purchaseTime: timestamp("purchaseTime").notNull(),
submitTime: timestamp("submitTime").defaultNow().notNull(),
isAccepted: boolean("isAccepted").default(true).notNull(),
handlingDate: date("handlingDate", { mode: "date" }),
handlingTime: timestamp("handlingTime"),
});

export const expensesRelations = relations(expensesTable, ({ one }) => ({
Expand Down
6 changes: 3 additions & 3 deletions db/tables/sponsors.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { departmentsTable } from "@/db/tables/departments";
import { mainSchema } from "@/db/tables/schema";
import { relations } from "drizzle-orm";
import { date, integer, serial, text } from "drizzle-orm/pg-core";
import { integer, serial, text, timestamp } from "drizzle-orm/pg-core";

export const sponsorSizeEnum = mainSchema.enum("size", [
"small",
Expand All @@ -13,8 +13,8 @@ export const sponsorsTable = mainSchema.table("sponsors", {
id: serial("id").primaryKey(),
name: text("name").notNull(),
homePageUrl: text("homePageURL").notNull(),
startDate: date("startDate", { mode: "date" }).notNull(),
endDate: date("endDate", { mode: "date" }),
startTime: timestamp("startTime").notNull(),
endTime: timestamp("endTime"),
size: sponsorSizeEnum("size").notNull(),
spesificDepartmentId: integer("spesificDepartmentId").references(
() => departmentsTable.id,
Expand Down
4 changes: 2 additions & 2 deletions db/tables/team-applications.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { mainSchema } from "@/db/tables/schema";
import { relations } from "drizzle-orm";
import { date, integer, serial, text } from "drizzle-orm/pg-core";
import { integer, serial, text, timestamp } from "drizzle-orm/pg-core";

import { fieldsOfStudyTable } from "@/db/tables/fields-of-study";
import { teamsTable } from "@/db/tables/teams";
Expand All @@ -19,7 +19,7 @@ export const teamApplicationsTable = mainSchema.table("teamApplications", {
yearOfStudy: integer("yearOfStudy").notNull(),
biography: text("biography").notNull(),
phonenumber: text("phonenumber").notNull(),
submitDate: date("submitDate", { mode: "date" }).defaultNow().notNull(),
submitTime: timestamp("submitTime").defaultNow().notNull(),
});

export const teamApplicationsRelations = relations(
Expand Down
4 changes: 2 additions & 2 deletions db/tables/teams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { mainSchema } from "@/db/tables/schema";
import { teamApplicationsTable } from "@/db/tables/team-applications";
import { teamUsersTable } from "@/db/tables/users";
import { relations } from "drizzle-orm";
import { boolean, date, serial, text } from "drizzle-orm/pg-core";
import { boolean, serial, text, timestamp } from "drizzle-orm/pg-core";
import { integer } from "drizzle-orm/pg-core";

export const teamsTable = mainSchema.table("teams", {
Expand All @@ -17,7 +17,7 @@ export const teamsTable = mainSchema.table("teams", {
shortDescription: text("shortDescription").notNull(),
acceptApplication: boolean("acceptApplication").notNull(),
active: boolean("active").notNull(),
deadline: date("deadline", { mode: "date" }),
deadline: timestamp("deadline"),
});

export const teamRelations = relations(teamsTable, ({ one, many }) => ({
Expand Down
11 changes: 11 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
services:
db:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_DB=${DATABASE_NAME}
ports:
- ${DATABASE_PORT}:5432
volumes:
- ./db-data:/var/lib/postgresql/data
3 changes: 3 additions & 0 deletions lib/global-variables.ts
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
export const MAX_TEXT_LENGTH = 2500 as const;
export const DEFAULT_QUERY_LIMIT = 10 as const;

export const DEFAULT_QUERY_SORT_OPTION = "desc" as const;
30 changes: 30 additions & 0 deletions lib/time-parsers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { z } from "zod";

export const timeStringParser = z.union([z.string().date(), z.string().time()]);

export const dateParser = z.date();
export const toDateParser = z
.union([timeStringParser, z.date()])
.pipe(z.coerce.date())
.pipe(dateParser);

export const datePeriodParser = z
.object({
startDate: dateParser,
endDate: dateParser,
})
.refine((datePeriod) => {
return datePeriod.startDate.getTime() <= datePeriod.endDate.getTime();
}, "Invalid date period. StartDate must be before or equal to endDate.");

export const toDatePeriodParser = z
.object({
startDate: toDateParser,
endDate: toDateParser,
})
.pipe(datePeriodParser);

export const pastDateParser = z.date().max(new Date());
export const futureDateParser = z.date().min(new Date());

export type DatePeriod = z.infer<typeof datePeriodParser>;
11 changes: 7 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
"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",
"test": "tsc --noEmit && node --import tsx --test --test-force-exit ./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/create-database.ts && drizzle-kit migrate --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"
},
Expand All @@ -40,13 +40,16 @@
"@types/express": "^4.17.21",
"@types/node": "^22.7.8",
"@types/pg": "^8.11.10",
"@types/supertest": "^6.0.2",
"@types/swagger-jsdoc": "^6.0.4",
"@types/swagger-ui-express": "^4.1.7",
"@types/validator": "^13.12.2",
"drizzle-kit": "^0.24.2",
"supertest": "^7.0.0",
"tsc-alias": "^1.8.10",
"tsx": "^4.19.1",
"typescript": "^5.6.3",
"yaml": "^2.6.0"
}
}
},
"packageManager": "pnpm@10.6.3+sha512.bb45e34d50a9a76e858a95837301bfb6bd6d35aea2c5d52094fa497a467c43f5c440103ce2511e9e0a2f89c3d6071baac3358fc68ac6fb75e2ceb3d2736065e6"
}
Loading