Skip to content

Commit b0530cf

Browse files
committed
add repository for project
1 parent b63121f commit b0530cf

File tree

4 files changed

+84
-1
lines changed

4 files changed

+84
-1
lines changed

services/src/kysely/migrations/2024-04-28T09:42:38Z_init.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export async function up(db: Kysely<unknown>): Promise<void> {
1111
await createTableMigration(db, 'projects')
1212
.addColumn('name', 'text', (col) => col.unique().notNull())
1313
.addColumn('base_language', 'integer', (col) =>
14-
col.references('languages.id').onDelete('restrict').notNull()
14+
col.references('languages.id').onDelete('restrict')
1515
)
1616
.execute()
1717

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { beforeEach, describe, expect, it } from 'vitest'
2+
import type { PojectCreationParams, SelectableProject } from './project'
3+
import { db } from '../db/database'
4+
import { runMigration } from '../db/database-migration-util'
5+
import { createProject, deleteProjectById, getProjectById } from './project.repository'
6+
7+
const projectCreationObject: PojectCreationParams = {
8+
name: 'some project name'
9+
}
10+
11+
beforeEach(async () => {
12+
db.reset()
13+
await runMigration()
14+
})
15+
16+
describe('Project Repository', () => {
17+
describe('createProject', () => {
18+
it('should create a project with the correct attributes', async () => {
19+
await createProject(projectCreationObject)
20+
21+
const projects = await db.selectFrom('projects').selectAll().execute()
22+
expect(projects).toHaveLength(1)
23+
24+
const project = projects[0] as SelectableProject
25+
26+
expect(project).toMatchObject(projectCreationObject)
27+
expect(project.id).toBeTypeOf('number')
28+
})
29+
})
30+
31+
describe('getProjectById', () => {
32+
it('should get a created project with its ID', async () => {
33+
const createdProject = await createProject(projectCreationObject)
34+
35+
const retrievedProject = await getProjectById(createdProject.id)
36+
37+
expect(retrievedProject.id).toBe(createdProject.id)
38+
})
39+
})
40+
41+
describe('deleteProjectById', () => {
42+
it('should delete a project based on its ID', async () => {
43+
const createdProject = await createProject(projectCreationObject)
44+
45+
const retrievedProject = await getProjectById(createdProject.id)
46+
expect(retrievedProject).toBeTruthy()
47+
48+
await deleteProjectById(createdProject.id)
49+
expect(() => getProjectById(createdProject.id)).rejects.toThrowError()
50+
})
51+
})
52+
})
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { db } from '../db/database'
2+
import type { PojectCreationParams } from './project'
3+
4+
export function createProject(projectParams: PojectCreationParams) {
5+
return db
6+
.insertInto('projects')
7+
.values({
8+
...projectParams
9+
})
10+
.returningAll()
11+
.executeTakeFirstOrThrow(() => new Error('Error creating Project'))
12+
}
13+
14+
export function getProjectById(projectId: number) {
15+
return db
16+
.selectFrom('projects')
17+
.selectAll()
18+
.where('projects.id', '==', projectId)
19+
.executeTakeFirstOrThrow(() => new Error(`Could not find Project with ID "${projectId}"`))
20+
}
21+
22+
export function deleteProjectById(projectId: number) {
23+
return db.deleteFrom('projects').where('projects.id', '==', projectId).execute()
24+
}

services/src/project/project.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { Insertable, Selectable } from 'kysely'
2+
import type { Projects } from 'kysely-codegen'
3+
4+
export type PojectCreationParams = Insertable<
5+
Omit<Projects, 'id' | 'created_at' | 'updated_at' | 'base_language'>
6+
>
7+
export type SelectableProject = Selectable<Projects>

0 commit comments

Comments
 (0)