From e11a1d8006ba56567897da4a0782c14b5d7afc3b Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 13 Jan 2024 23:10:09 +0100 Subject: [PATCH 1/3] refactor: use camel_case for db model --- .../migration.sql | 49 +++-- prisma/schema.prisma | 77 ++++--- src/lib/server/authAdapter.ts | 7 +- src/lib/server/query/entry.ts | 193 +++++++++--------- src/lib/server/query/mapping.ts | 14 +- src/lib/server/query/patient.ts | 6 +- src/lib/shared/model/model.ts | 26 +-- src/lib/shared/model/validation.ts | 12 +- tests/helpers/reset-db.ts | 14 +- tests/integration/query/entry.ts | 34 +-- tests/integration/query/patient.ts | 22 +- tests/integration/query/room.ts | 2 +- 12 files changed, 226 insertions(+), 230 deletions(-) rename prisma/migrations/{20240106164115_init => 20240113185049_init}/migration.sql (58%) diff --git a/prisma/migrations/20240106164115_init/migration.sql b/prisma/migrations/20240113185049_init/migration.sql similarity index 58% rename from prisma/migrations/20240106164115_init/migration.sql rename to prisma/migrations/20240113185049_init/migration.sql index 1f198ba..bc77201 100644 --- a/prisma/migrations/20240106164115_init/migration.sql +++ b/prisma/migrations/20240113185049_init/migration.sql @@ -21,7 +21,6 @@ CREATE TABLE "users" ( "id" SERIAL NOT NULL, "name" TEXT, "email" TEXT, - "emailVerified" TIMESTAMP(3), CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); @@ -38,7 +37,7 @@ CREATE TABLE "stations" ( CREATE TABLE "rooms" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, - "stationId" INTEGER NOT NULL, + "station_id" INTEGER NOT NULL, CONSTRAINT "rooms_pkey" PRIMARY KEY ("id") ); @@ -46,11 +45,11 @@ CREATE TABLE "rooms" ( -- CreateTable CREATE TABLE "patients" ( "id" SERIAL NOT NULL, - "firstName" TEXT NOT NULL, - "lastName" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, "age" INTEGER, - "roomId" INTEGER, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "room_id" INTEGER, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "patients_pkey" PRIMARY KEY ("id") ); @@ -68,8 +67,8 @@ CREATE TABLE "categories" ( -- CreateTable CREATE TABLE "entries" ( "id" SERIAL NOT NULL, - "patientId" INTEGER NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "patient_id" INTEGER NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "entries_pkey" PRIMARY KEY ("id") ); @@ -77,26 +76,26 @@ CREATE TABLE "entries" ( -- CreateTable CREATE TABLE "entry_versions" ( "id" SERIAL NOT NULL, - "entryId" INTEGER NOT NULL, + "entry_id" INTEGER NOT NULL, "text" TEXT NOT NULL, "date" TIMESTAMP(3) NOT NULL, - "categoryId" INTEGER, + "category_id" INTEGER, "priority" BOOLEAN NOT NULL, - "authorId" INTEGER NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "author_id" INTEGER NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "entry_versions_pkey" PRIMARY KEY ("id") ); -- CreateTable -CREATE TABLE "entry_execution" ( +CREATE TABLE "entry_executions" ( "id" SERIAL NOT NULL, - "entryId" INTEGER NOT NULL, + "entry_id" INTEGER NOT NULL, "text" TEXT NOT NULL, - "authorId" INTEGER NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "author_id" INTEGER NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "entry_execution_pkey" PRIMARY KEY ("id") + CONSTRAINT "entry_executions_pkey" PRIMARY KEY ("id") ); -- CreateIndex @@ -109,25 +108,25 @@ CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); ALTER TABLE "accounts" ADD CONSTRAINT "accounts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "rooms" ADD CONSTRAINT "rooms_stationId_fkey" FOREIGN KEY ("stationId") REFERENCES "stations"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "rooms" ADD CONSTRAINT "rooms_station_id_fkey" FOREIGN KEY ("station_id") REFERENCES "stations"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "patients" ADD CONSTRAINT "patients_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "rooms"("id") ON DELETE SET NULL ON UPDATE CASCADE; +ALTER TABLE "patients" ADD CONSTRAINT "patients_room_id_fkey" FOREIGN KEY ("room_id") REFERENCES "rooms"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "entries" ADD CONSTRAINT "entries_patientId_fkey" FOREIGN KEY ("patientId") REFERENCES "patients"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "entries" ADD CONSTRAINT "entries_patient_id_fkey" FOREIGN KEY ("patient_id") REFERENCES "patients"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "entry_versions" ADD CONSTRAINT "entry_versions_entryId_fkey" FOREIGN KEY ("entryId") REFERENCES "entries"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "entry_versions" ADD CONSTRAINT "entry_versions_entry_id_fkey" FOREIGN KEY ("entry_id") REFERENCES "entries"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "entry_versions" ADD CONSTRAINT "entry_versions_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE; +ALTER TABLE "entry_versions" ADD CONSTRAINT "entry_versions_category_id_fkey" FOREIGN KEY ("category_id") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "entry_versions" ADD CONSTRAINT "entry_versions_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "entry_versions" ADD CONSTRAINT "entry_versions_author_id_fkey" FOREIGN KEY ("author_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "entry_execution" ADD CONSTRAINT "entry_execution_entryId_fkey" FOREIGN KEY ("entryId") REFERENCES "entries"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "entry_executions" ADD CONSTRAINT "entry_executions_entry_id_fkey" FOREIGN KEY ("entry_id") REFERENCES "entries"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "entry_execution" ADD CONSTRAINT "entry_execution_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "entry_executions" ADD CONSTRAINT "entry_executions_author_id_fkey" FOREIGN KEY ("author_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aaf5e4d..0a666eb 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,7 +14,7 @@ datasource db { model Account { id Int @id @default(autoincrement()) - userId Int + user_id Int @map("userId") type String provider String providerAccountId String @@ -26,17 +26,16 @@ model Account { id_token String? @db.Text session_state String? - user User @relation(fields: [userId], references: [id], onDelete: Cascade) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) @@map("accounts") } model User { - id Int @id @default(autoincrement()) - name String? - email String? @unique - emailVerified DateTime? + id Int @id @default(autoincrement()) + name String? + email String? @unique accounts Account[] EntryVersion EntryVersion[] @@ -58,25 +57,25 @@ model Station { // Hospital room model Room { - id Int @id @default(autoincrement()) - name String - station Station @relation(fields: [stationId], references: [id], onDelete: Cascade) - stationId Int - Patient Patient[] + id Int @id @default(autoincrement()) + name String + station Station @relation(fields: [station_id], references: [id], onDelete: Cascade) + station_id Int + Patient Patient[] @@map("rooms") } model Patient { - id Int @id @default(autoincrement()) - firstName String - lastName String - age Int? - room Room? @relation(fields: [roomId], references: [id], onDelete: SetNull) - roomId Int? - Entry Entry[] + id Int @id @default(autoincrement()) + first_name String + last_name String + age Int? + room Room? @relation(fields: [room_id], references: [id], onDelete: SetNull) + room_id Int? + Entry Entry[] - createdAt DateTime @default(now()) + created_at DateTime @default(now()) @@map("patients") } @@ -93,49 +92,49 @@ model Category { } model Entry { - id Int @id @default(autoincrement()) - patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade) - patientId Int + id Int @id @default(autoincrement()) + patient Patient @relation(fields: [patient_id], references: [id], onDelete: Cascade) + patient_id Int EntryVersion EntryVersion[] EntryExecution EntryExecution[] - createdAt DateTime @default(now()) + created_at DateTime @default(now()) @@map("entries") } model EntryVersion { - id Int @id @default(autoincrement()) - entry Entry @relation(fields: [entryId], references: [id], onDelete: Cascade) - entryId Int + id Int @id @default(autoincrement()) + entry Entry @relation(fields: [entry_id], references: [id], onDelete: Cascade) + entry_id Int text String date DateTime - category Category? @relation(fields: [categoryId], references: [id], onDelete: SetNull) - categoryId Int? - priority Boolean + category Category? @relation(fields: [category_id], references: [id], onDelete: SetNull) + category_id Int? + priority Boolean - author User @relation(fields: [authorId], references: [id]) - authorId Int + author User @relation(fields: [author_id], references: [id]) + author_id Int - createdAt DateTime @default(now()) + created_at DateTime @default(now()) @@map("entry_versions") } model EntryExecution { - id Int @id @default(autoincrement()) - entry Entry @relation(fields: [entryId], references: [id], onDelete: Cascade) - entryId Int + id Int @id @default(autoincrement()) + entry Entry @relation(fields: [entry_id], references: [id], onDelete: Cascade) + entry_id Int text String - author User @relation(fields: [authorId], references: [id]) - authorId Int + author User @relation(fields: [author_id], references: [id]) + author_id Int - createdAt DateTime @default(now()) + created_at DateTime @default(now()) - @@map("entry_execution") + @@map("entry_executions") } diff --git a/src/lib/server/authAdapter.ts b/src/lib/server/authAdapter.ts index 93cfedb..7bc5124 100644 --- a/src/lib/server/authAdapter.ts +++ b/src/lib/server/authAdapter.ts @@ -7,7 +7,7 @@ function mapUser(user: User): AdapterUser { id: user.id.toString(), name: user.name, email: user.email!, - emailVerified: user.emailVerified, + emailVerified: null, }; } @@ -18,7 +18,7 @@ function mapUserOpt(user: User | null | undefined): AdapterUser | null { function mapAccount(account: Account): AdapterAccount { return { - userId: account.userId.toString(), + userId: account.user_id.toString(), type: account.type as "oauth" | "oidc" | "email", provider: account.provider, providerAccountId: account.providerAccountId, @@ -39,7 +39,6 @@ export function PrismaAdapter(p: PrismaClient): Adapter { data: { name: data.name, email: data.email, - emailVerified: data.emailVerified, }, }) ), @@ -62,7 +61,7 @@ export function PrismaAdapter(p: PrismaClient): Adapter { mapAccount( await p.account.create({ data: { - userId: parseInt(data.userId), + user_id: parseInt(data.userId), type: data.type, provider: data.provider, providerAccountId: data.providerAccountId, diff --git a/src/lib/server/query/entry.ts b/src/lib/server/query/entry.ts index 1190f3d..d83aa72 100644 --- a/src/lib/server/query/entry.ts +++ b/src/lib/server/query/entry.ts @@ -24,12 +24,12 @@ export async function getEntry(id: number): Promise { patient: { include: { room: { include: { station: true } } } }, EntryVersion: { include: { author: USER_SELECT, category: true }, - orderBy: { createdAt: "desc" }, + orderBy: { created_at: "desc" }, take: 1, }, EntryExecution: { include: { author: USER_SELECT }, - orderBy: { createdAt: "desc" }, + orderBy: { created_at: "desc" }, take: 1, }, }, @@ -38,14 +38,14 @@ export async function getEntry(id: number): Promise { return mapEntry(entry); } -export async function newEntry(authorId: number, entry: EntryNew): Promise { +export async function newEntry(author_id: number, entry: EntryNew): Promise { const data = ZEntryNew.parse(entry); const created = await prisma.entry.create({ data: { - patientId: data.patientId, + patient_id: data.patient_id, EntryVersion: { create: { - authorId, + author_id, ...data.version, }, }, @@ -55,15 +55,15 @@ export async function newEntry(authorId: number, entry: EntryNew): Promise { const data = ZEntryVersionNew.parse(version); const created = await prisma.entryVersion.create({ data: { - entryId, - authorId, + entry_id, + author_id, ...data, }, }); @@ -71,15 +71,15 @@ export async function newEntryVersion( } export async function newEntryExecution( - authorId: number, - entryId: number, + author_id: number, + entry_id: number, execution: EntryExecutionNew ): Promise { const data = ZEntryExecutionNew.parse(execution); const created = await prisma.entryExecution.create({ data: { - entryId, - authorId, + entry_id, + author_id, ...data, }, }); @@ -90,65 +90,64 @@ export async function getEntries(req: EntriesRequest): Promise const qb = new QueryBuilder( `select e.id, - e."createdAt", + e.created_at, ev.text, - ev."date", + ev.date, ev.priority, - ev.id as "versionId", - ev."createdAt" as "versionCreatedAt", - vau.id as "versionAuthorId", - vau."name" as "versionAuthorName", - c.id as "categoryId", - c."name" as "categoryName", - c.color as "categoryColor", - ex.id as "executionId", - ex.text as "executionText", - ex."createdAt" as "executionCreatedAt", - xau.id as "executionAuthorId", - xau.name as "executionAuthorName", - p.id as "patientId", - p."firstName" as "patientFirstName", - p."lastName" as "patientLastName", - p.age as "patientAge", - p."createdAt" as "patientCreatedAt", - r.id as "roomId", - r."name" as "roomName", - s.id as "stationId", - s."name" as "stationName"`, + ev.id as version_id, + ev.created_at as version_created_at, + vau.id as version_author_id, + vau.name as version_author_name, + c.id as category_id, + c.name as category_name, + c.color as category_color, + ex.id as execution_id, + ex.text as execution_text, + ex.created_at as execution_created_at, + xau.id as execution_author_id, + xau.name as execution_author_name, + p.id as patient_id, + p.first_name as patient_first_name, + p.last_name as patient_last_name, + p.age as patient_age, + p.created_at as patient_created_at, + r.id as room_id, + r.name as room_name, + s.id as station_id, + s.name as station_name`, `from entries e join entry_versions ev on - ev."entryId" = e.id + ev.entry_id = e.id and ev.id = ( select id from entry_versions ev2 where - ev2."entryId" = ev."entryId" + ev2.entry_id = ev.entry_id order by - ev2."createdAt" desc + ev2.created_at desc limit 1) -join users vau on vau.id=ev."authorId" -left join categories c on c.id=ev."categoryId" -left join entry_execution ex on - ex."entryId" = e.id +join users vau on vau.id=ev.author_id +left join categories c on c.id=ev.category_id +left join entry_executions ex on + ex.entry_id = e.id and ex.id = ( select id from - entry_execution ex2 + entry_executions ex2 where - ex2."entryId" = ex."entryId" + ex2.entry_id = ex.entry_id order by - ex2."createdAt" desc + ex2.created_at desc limit 1) -left join users xau on xau.id=ex."authorId" -join patients p on p.id = e."patientId" -join rooms r on r.id = p."roomId" -join stations s on s.id = r."stationId"` +left join users xau on xau.id=ex.author_id +join patients p on p.id = e.patient_id +join rooms r on r.id = p.room_id +join stations s on s.id = r.station_id` ); - // qb.addFilterIsNull("ex.id", req.filter?.done); if (req.filter?.done === true) { qb.addFilterClause("ex.id is not null"); } else if (req.filter?.done === false) { @@ -168,41 +167,41 @@ join stations s on s.id = r."stationId"` author = [author]; } qb.addFilterClause( - `${qb.pvar()}::integer[] && (select array_agg(ev2."authorId") from entry_versions ev2 where ev2."entryId"=e.id)`, + `${qb.pvar()}::integer[] && (select array_agg(ev2.author_id) from entry_versions ev2 where ev2.entry_id=e.id)`, author ); } - qb.setOrderClause(`order by e."createdAt" desc`); + qb.setOrderClause(`order by e.created_at desc`); if (req.pagination) qb.setPagination(req.pagination); type RequestItem = { id: number; - createdAt: Date; + created_at: Date; text: string; date: Date; priority: boolean; - versionId: number; - versionCreatedAt: Date; - versionAuthorId: number; - versionAuthorName: string; - categoryId: number; - categoryName: string; - categoryColor: string; - executionId: number; - executionText: string; - executionCreatedAt: Date; - executionAuthorId: number; - executionAuthorName: string; - patientId: number; - patientFirstName: string; - patientLastName: string; - patientAge: number; - patientCreatedAt: Date; - roomId: number; - roomName: string; - stationId: number; - stationName: string; + version_id: number; + version_created_at: Date; + version_author_id: number; + version_author_name: string; + category_id: number; + category_name: string; + category_color: string; + execution_id: number; + execution_text: string; + execution_created_at: Date; + execution_author_id: number; + execution_author_name: string; + patient_id: number; + patient_first_name: string; + patient_last_name: string; + patient_age: number; + patient_created_at: Date; + room_id: number; + room_name: string; + station_id: number; + station_name: string; }; const [res, countRes] = (await Promise.all([ @@ -216,40 +215,40 @@ join stations s on s.id = r."stationId"` return { id: item.id, patient: { - id: item.patientId, - firstName: item.patientFirstName, - lastName: item.patientLastName, - createdAt: item.patientCreatedAt, - age: item.patientAge, + id: item.patient_id, + first_name: item.patient_first_name, + last_name: item.patient_last_name, + created_at: item.patient_created_at, + age: item.patient_age, room: { - id: item.roomId, - name: item.roomName, - station: { id: item.stationId, name: item.stationName }, + id: item.room_id, + name: item.room_name, + station: { id: item.station_id, name: item.station_name }, }, }, - createdAt: item.createdAt, - currentVersion: { - id: item.versionId, + created_at: item.created_at, + current_version: { + id: item.version_id, text: item.text, date: item.date, - category: item.categoryId + category: item.category_id ? { - id: item.categoryId, - name: item.categoryName, - color: item.categoryColor, + id: item.category_id, + name: item.category_name, + color: item.category_color, description: null, } : null, priority: item.priority, - author: { id: item.versionAuthorId, name: item.versionAuthorName }, - createdAt: item.createdAt, + author: { id: item.version_author_id, name: item.version_author_name }, + created_at: item.version_created_at, }, - execution: item.executionId + execution: item.execution_id ? { - id: item.executionId, - author: { id: item.executionAuthorId, name: item.executionAuthorName }, - text: item.executionText, - createdAt: item.executionCreatedAt, + id: item.execution_id, + author: { id: item.execution_author_id, name: item.execution_author_name }, + text: item.execution_text, + created_at: item.execution_created_at, } : null, }; diff --git a/src/lib/server/query/mapping.ts b/src/lib/server/query/mapping.ts index 0c3b3b2..39768c7 100644 --- a/src/lib/server/query/mapping.ts +++ b/src/lib/server/query/mapping.ts @@ -21,9 +21,9 @@ type DbEntryExecutionLn = DbEntryExecution & { author: UserTag }; export function mapPatient(patient: DbPatientLn): Patient { return { id: patient.id, - firstName: patient.firstName, - lastName: patient.lastName, - createdAt: patient.createdAt, + first_name: patient.first_name, + last_name: patient.last_name, + created_at: patient.created_at, age: patient.age, room: patient.room ? { @@ -61,21 +61,21 @@ export function mapEntry( return { id: entry.id, patient: mapPatient(entry.patient), - createdAt: entry.createdAt, - currentVersion: { + created_at: entry.created_at, + current_version: { id: v.id, text: v.text, date: v.date, category: v.category, priority: v.priority, author: v.author, - createdAt: v.createdAt, + created_at: v.created_at, }, execution: x ? { id: x.id, author: x.author, - createdAt: x.createdAt, + created_at: x.created_at, text: x.text, } : null, diff --git a/src/lib/server/query/patient.ts b/src/lib/server/query/patient.ts index d1fef72..73bab04 100644 --- a/src/lib/server/query/patient.ts +++ b/src/lib/server/query/patient.ts @@ -29,9 +29,9 @@ export async function getPatient(id: number): Promise { export async function getPatients(req: PatientsRequest): Promise> { const offset = req.pagination?.offset || 0; const where = { - roomId: convertFilterList(req.filter?.room), + room_id: convertFilterList(req.filter?.room), room: { - stationId: convertFilterList(req.filter?.station), + station_id: convertFilterList(req.filter?.station), }, }; const [patients, total] = await Promise.all([ @@ -40,7 +40,7 @@ export async function getPatients(req: PatientsRequest): Promise; room: Option; - createdAt: Date; + created_at: Date; }; export type PatientNew = { - firstName: string; - lastName: string; + first_name: string; + last_name: string; age: Option; - roomId: number; + room_id: number; }; export type Entry = { id: number; patient: Patient; - createdAt: Date; - currentVersion: EntryVersion; + created_at: Date; + current_version: EntryVersion; execution: Option; }; export type EntryNew = { - patientId: number; + patient_id: number; version: EntryVersionNew; }; @@ -86,13 +86,13 @@ export type EntryVersion = { category: Option; priority: boolean; author: UserTag; - createdAt: Date; + created_at: Date; }; export type EntryVersionNew = { text: string; date: Date; - categoryId: Option; + category_id: Option; priority: boolean; }; @@ -100,7 +100,7 @@ export type EntryExecution = { id: number; author: UserTag; text: string; - createdAt: Date; + created_at: Date; }; export type EntryExecutionNew = { diff --git a/src/lib/shared/model/validation.ts b/src/lib/shared/model/validation.ts index c5902b6..a5b5705 100644 --- a/src/lib/shared/model/validation.ts +++ b/src/lib/shared/model/validation.ts @@ -18,7 +18,7 @@ export const ZStationNew = implement().with({ name: ZNameString }); export const ZRoomNew = implement().with({ name: ZNameString, - stationId: ZEntityId, + station_id: ZEntityId, }); export const ZCategoryNew = implement().with({ @@ -32,21 +32,21 @@ export const ZCategoryNew = implement().with({ }); export const ZPatientNew = implement().with({ - firstName: ZNameString, - lastName: ZNameString, + first_name: ZNameString, + last_name: ZNameString, age: z.number().int().nonnegative().lt(200).nullable(), - roomId: ZEntityId, + room_id: ZEntityId, }); export const ZEntryVersionNew = implement().with({ text: ZTextString, date: z.date(), - categoryId: ZEntityId.nullable(), + category_id: ZEntityId.nullable(), priority: z.boolean(), }); export const ZEntryNew = implement().with({ - patientId: ZEntityId, + patient_id: ZEntityId, version: ZEntryVersionNew, }); diff --git a/tests/helpers/reset-db.ts b/tests/helpers/reset-db.ts index ffa52e2..3461dae 100644 --- a/tests/helpers/reset-db.ts +++ b/tests/helpers/reset-db.ts @@ -29,16 +29,16 @@ export default async () => { }), prisma.room.createMany({ data: [ - { id: 1, name: "R1.1", stationId: 1 }, - { id: 2, name: "R1.2", stationId: 1 }, - { id: 3, name: "R2.1", stationId: 2 }, + { id: 1, name: "R1.1", station_id: 1 }, + { id: 2, name: "R1.2", station_id: 1 }, + { id: 3, name: "R2.1", station_id: 2 }, ], }), prisma.patient.createMany({ data: [ - { id: 1, firstName: "Andreas", lastName: "Bergmann", age: 22, roomId: 1 }, - { id: 2, firstName: "Manuela", lastName: "Kortig", age: 41, roomId: 2 }, - { id: 3, firstName: "Markus", lastName: "Schuster", age: 50, roomId: 3 }, + { id: 1, first_name: "Andreas", last_name: "Bergmann", age: 22, room_id: 1 }, + { id: 2, first_name: "Manuela", last_name: "Kortig", age: 41, room_id: 2 }, + { id: 3, first_name: "Markus", last_name: "Schuster", age: 50, room_id: 3 }, ], }), prisma.$executeRaw`alter sequence users_id_seq restart with 3`, @@ -46,7 +46,7 @@ export default async () => { prisma.$executeRaw`alter sequence stations_id_seq restart with 3`, prisma.$executeRaw`alter sequence rooms_id_seq restart with 4`, prisma.$executeRaw`alter sequence patients_id_seq restart with 4`, - prisma.$executeRaw`alter sequence entry_execution_id_seq restart with 1`, + prisma.$executeRaw`alter sequence entry_executions_id_seq restart with 1`, prisma.$executeRaw`alter sequence entry_versions_id_seq restart with 1`, prisma.$executeRaw`alter sequence entries_id_seq restart with 1`, ]); diff --git a/tests/integration/query/entry.ts b/tests/integration/query/entry.ts index d34b3f8..001a312 100644 --- a/tests/integration/query/entry.ts +++ b/tests/integration/query/entry.ts @@ -8,7 +8,7 @@ import { import { expect, test } from "vitest"; const TEST_VERSION = { - categoryId: 1, + category_id: 1, text: "10ml Blut abnehmen", date: new Date(2024, 1, 1), priority: false, @@ -16,7 +16,7 @@ const TEST_VERSION = { test("create entry", async () => { const eId = await newEntry(1, { - patientId: 1, + patient_id: 1, version: TEST_VERSION, }); expect(eId).gt(0); @@ -24,17 +24,17 @@ test("create entry", async () => { const entry = await getEntry(eId); expect(entry.patient.id).toBe(1); expect(entry.execution).toBeNull(); - expect(entry.currentVersion.id).gt(0); - expect(entry.currentVersion.category?.id).toBe(TEST_VERSION.categoryId); - expect(entry.currentVersion.category?.name).toBe("Laborabnahme"); - expect(entry.currentVersion.text).toBe(TEST_VERSION.text); - expect(entry.currentVersion.date).toStrictEqual(TEST_VERSION.date); - expect(entry.currentVersion.priority).toBe(TEST_VERSION.priority); + expect(entry.current_version.id).gt(0); + expect(entry.current_version.category?.id).toBe(TEST_VERSION.category_id); + expect(entry.current_version.category?.name).toBe("Laborabnahme"); + expect(entry.current_version.text).toBe(TEST_VERSION.text); + expect(entry.current_version.date).toStrictEqual(TEST_VERSION.date); + expect(entry.current_version.priority).toBe(TEST_VERSION.priority); }); test("create extry version", async () => { const eId = await newEntry(1, { - patientId: 1, + patient_id: 1, version: TEST_VERSION, }); const text = "10ml Blut abnehmen\n\nPS: Nadel nicht vergessen"; @@ -45,12 +45,12 @@ test("create extry version", async () => { }); const entry = await getEntry(eId); - expect(entry.currentVersion.text).toBe(text); + expect(entry.current_version.text).toBe(text); }); test("create extry execution", async () => { const eId = await newEntry(1, { - patientId: 1, + patient_id: 1, version: TEST_VERSION, }); const text = "Blutabnahme erledigt."; @@ -64,31 +64,31 @@ test("create extry execution", async () => { async function insertTestEntries() { // Create some entries const eId1 = await newEntry(1, { - patientId: 1, + patient_id: 1, version: TEST_VERSION, }); const eId2 = await newEntry(1, { - patientId: 2, + patient_id: 2, version: { text: "Carrot cake jelly-o bonbon toffee chocolate.", date: new Date(2024, 1, 5), priority: false, - categoryId: null, + category_id: null, }, }); const eId3 = await newEntry(1, { - patientId: 1, + patient_id: 1, version: { text: "Cheesecake danish donut oat cake caramels.", date: new Date(2024, 1, 6), priority: false, - categoryId: null, + category_id: null, }, }); // Update an entry await newEntryVersion(2, eId1, { - categoryId: 3, + category_id: 3, text: "Hello World", date: new Date(2024, 1, 1), priority: true, diff --git a/tests/integration/query/patient.ts b/tests/integration/query/patient.ts index 5cf8ada..fe82e1d 100644 --- a/tests/integration/query/patient.ts +++ b/tests/integration/query/patient.ts @@ -5,16 +5,16 @@ import { S1, S2 } from "../../helpers/testdata"; test("create patient", async () => { const pId = await newPatient({ - firstName: "Max", - lastName: "Müller", + first_name: "Max", + last_name: "Müller", age: 31, - roomId: 1, + room_id: 1, }); const patient = await getPatient(pId); expect(patient).toMatchObject({ id: pId, - firstName: "Max", - lastName: "Müller", + first_name: "Max", + last_name: "Müller", age: 31, room: { id: 1, name: "R1.1", station: S1 }, }); @@ -26,22 +26,22 @@ test("get patients", async () => { items: [ { id: 1, - firstName: "Andreas", - lastName: "Bergmann", + first_name: "Andreas", + last_name: "Bergmann", age: 22, room: { id: 1, name: "R1.1", station: S1 }, }, { id: 2, - firstName: "Manuela", - lastName: "Kortig", + first_name: "Manuela", + last_name: "Kortig", age: 41, room: { id: 2, name: "R1.2", station: S1 }, }, { id: 3, - firstName: "Markus", - lastName: "Schuster", + first_name: "Markus", + last_name: "Schuster", age: 50, room: { id: 3, name: "R2.1", station: S2 }, }, diff --git a/tests/integration/query/room.ts b/tests/integration/query/room.ts index 3f20352..7e823fd 100644 --- a/tests/integration/query/room.ts +++ b/tests/integration/query/room.ts @@ -23,7 +23,7 @@ test("get stations", async () => { }); test("create room", async () => { - const rId = await newRoom({ name: "A1", stationId: 1 }); + const rId = await newRoom({ name: "A1", station_id: 1 }); const room = await getRoom(rId); expect(room).toStrictEqual({ id: rId, From 8862cd713ce03cb8845311e369f9f6044fa85572 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 17 Jan 2024 19:38:41 +0100 Subject: [PATCH 2/3] feat: add basic text search --- package.json | 2 + pnpm-lock.yaml | 32 ++ .../20240113221445_search_index/migration.sql | 29 ++ run/gen-mockdata.ts | 4 + src/lib/server/query/entry.ts | 10 +- src/lib/server/query/util.test.ts | 39 ++- src/lib/server/query/util.ts | 91 ++++++ src/lib/shared/model/requests.ts | 1 + tests/helpers/generate-mockdata.ts | 161 ++++++++++ tests/helpers/mockdata_entries.jsonl | 300 ++++++++++++++++++ tests/helpers/reset-db.ts | 31 +- tests/helpers/testdata.ts | 2 + tests/integration/query/entry.ts | 8 +- 13 files changed, 690 insertions(+), 20 deletions(-) create mode 100644 prisma/migrations/20240113221445_search_index/migration.sql create mode 100644 run/gen-mockdata.ts create mode 100644 tests/helpers/generate-mockdata.ts create mode 100644 tests/helpers/mockdata_entries.jsonl diff --git a/package.json b/package.json index 641e9ba..c6f2d5f 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "zod": "^3.22.4" }, "devDependencies": { + "@faker-js/faker": "^8.3.1", "@playwright/test": "^1.40.1", "@sveltejs/adapter-node": "^2.0.0", "@sveltejs/kit": "^2.0.0", @@ -47,6 +48,7 @@ "svelte-check": "^3.6.2", "tailwindcss": "^3.3.6", "tslib": "^2.6.2", + "tsx": "^4.7.0", "typescript": "^5.3.3", "vite": "^5.0.0", "vitest": "^1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3caa6c1..fecf993 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,9 @@ dependencies: version: 3.22.4 devDependencies: + '@faker-js/faker': + specifier: ^8.3.1 + version: 8.3.1 '@playwright/test': specifier: ^1.40.1 version: 1.40.1 @@ -91,6 +94,9 @@ devDependencies: tslib: specifier: ^2.6.2 version: 2.6.2 + tsx: + specifier: ^4.7.0 + version: 4.7.0 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -396,6 +402,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@faker-js/faker@8.3.1: + resolution: {integrity: sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + dev: true + /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -1650,6 +1661,12 @@ packages: engines: {node: '>=16'} dev: true + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2440,6 +2457,10 @@ packages: engines: {node: '>=4'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -2846,6 +2867,17 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true + /tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.10 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} diff --git a/prisma/migrations/20240113221445_search_index/migration.sql b/prisma/migrations/20240113221445_search_index/migration.sql new file mode 100644 index 0000000..451f20e --- /dev/null +++ b/prisma/migrations/20240113221445_search_index/migration.sql @@ -0,0 +1,29 @@ +ALTER TABLE entries +ADD COLUMN tsvec tsvector; + +CREATE FUNCTION public.update_entry_tsvec () RETURNS TRIGGER LANGUAGE plpgsql AS $function$ +declare + v_text text := ''; + x_text text := ''; +begin + select text into v_text from entry_versions ev where ev.entry_id = new.entry_id order by ev.created_at desc limit 1; + select text into x_text from entry_executions ex where ex.entry_id = new.entry_id order by ex.created_at desc limit 1; + update entries set tsvec = + to_tsvector('german', coalesce(v_text, '')) || + to_tsvector('german', coalesce(x_text, '')) + where id = new.entry_id; + RETURN NEW; +END +$function$; + +CREATE TRIGGER entry_versions_update_tsvec +AFTER INSERT +OR +UPDATE ON entry_versions FOR EACH ROW +EXECUTE PROCEDURE update_entry_tsvec (); + +CREATE TRIGGER entry_execution_update_tsvec +AFTER INSERT +OR +UPDATE ON entry_executions FOR EACH ROW +EXECUTE PROCEDURE update_entry_tsvec (); diff --git a/run/gen-mockdata.ts b/run/gen-mockdata.ts new file mode 100644 index 0000000..3c43fd2 --- /dev/null +++ b/run/gen-mockdata.ts @@ -0,0 +1,4 @@ +// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths +import generateMockdata from "../tests/helpers/generate-mockdata" + +await generateMockdata(); diff --git a/src/lib/server/query/entry.ts b/src/lib/server/query/entry.ts index d83aa72..f918e05 100644 --- a/src/lib/server/query/entry.ts +++ b/src/lib/server/query/entry.ts @@ -13,7 +13,7 @@ import { ZEntryVersionNew, } from "$lib/shared/model/validation"; import { mapEntry } from "./mapping"; -import { QueryBuilder } from "./util"; +import { QueryBuilder, parseSearchQuery } from "./util"; const USER_SELECT = { select: { id: true, name: true } }; @@ -148,6 +148,14 @@ join rooms r on r.id = p.room_id join stations s on s.id = r.station_id` ); + if (req.filter?.search && req.filter.search.length > 0) { + const query = parseSearchQuery(req.filter.search); + qb.addFilterClause( + `to_tsquery('german', ${qb.pvar()}) @@ e.tsvec`, + query.toTsquery() + ); + } + if (req.filter?.done === true) { qb.addFilterClause("ex.id is not null"); } else if (req.filter?.done === false) { diff --git a/src/lib/server/query/util.test.ts b/src/lib/server/query/util.test.ts index d8bf743..e7a3d5b 100644 --- a/src/lib/server/query/util.test.ts +++ b/src/lib/server/query/util.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "vitest"; -import { QueryBuilder } from "./util"; +import { QueryBuilder, parseSearchQuery } from "./util"; test("query builder", () => { const qb = new QueryBuilder("select e.id, e.text, e.category", "from entries e"); @@ -18,3 +18,40 @@ test("query builder", () => { expect(params[2]).toBe(20); expect(params[3]).toBe(10); }); + +test("parse search query", () => { + const q = `"hello world" banana -cherry -"b x y" vis`; + const parsed = parseSearchQuery(q); + expect(parsed.components).toMatchObject([ + { + negative: false, + typ: 2, + word: "hello world", + }, + { + negative: false, + typ: 1, + word: "banana", + }, + { + negative: true, + typ: 1, + word: "cherry", + }, + { + negative: true, + typ: 2, + word: "b x y", + }, + { + negative: false, + typ: 3, + word: "vis", + }, + ]); + + const term = parsed.toTsquery(); + expect(term).toBe( + `''hello'' <-> ''world'' & ''banana'' & !''cherry'' & !(''b'' <-> ''x'' <-> ''y'') & ''vis'':*` + ); +}); diff --git a/src/lib/server/query/util.ts b/src/lib/server/query/util.ts index 17c3582..6095a34 100644 --- a/src/lib/server/query/util.ts +++ b/src/lib/server/query/util.ts @@ -13,6 +13,97 @@ export function convertFilterList( } } +enum QueryComponentType { + Normal = 1, + Exact, + Trailing, +} + +class SearchQueryComponent { + word: string; + typ: QueryComponentType; + negative: boolean; + + constructor(word: string, typ: QueryComponentType, negative: boolean) { + this.word = word; + this.typ = typ; + this.negative = negative; + } + + private quoted(): string { + return `'${this.word}'`; + } + + /** + * Convert the query component to a Postgres Tsquery string + */ + toTsquery(): string { + let tsquery; + let multipleParts = false; + + if (this.typ == QueryComponentType.Exact) { + const parts = this.word.split(" ").map((s) => `''${s}''`); + multipleParts = parts.length > 1; + tsquery = parts.join(" <-> "); + } else if (this.typ == QueryComponentType.Trailing) { + tsquery = this.quoted() + ":*"; + } else { + tsquery = this.quoted(); + } + + if (this.negative) { + if (multipleParts) { + tsquery = "!(" + tsquery + ")"; + } else { + tsquery = "!" + tsquery; + } + } + + return tsquery; + } +} + +class SearchQueryComponents { + components: SearchQueryComponent[]; + + constructor(components: SearchQueryComponent[]) { + this.components = components; + } + + toTsquery(): string { + return this.components.map((c) => c.toTsquery()).join(" & "); + } +} + +/** + * Split a search query into individual components + * + * Supported search syntax: + * - Negative query `-word` + * - Exact query `"word"` + */ +export function parseSearchQuery(q: string): SearchQueryComponents { + const regexpParts = /(-)?(?:"([^"]*)"|([^"\s]+))(?:\s|$)/g; + const components = Array.from(q.matchAll(regexpParts), (m) => { + const negative = m[1] === "-"; + // Exact + if (m[2]) { + return new SearchQueryComponent(m[2], QueryComponentType.Exact, negative); + } else { + return new SearchQueryComponent(m[3], QueryComponentType.Normal, negative); + } + }); + + if ( + components.length > 0 && + components[components.length - 1].typ === QueryComponentType.Normal + ) { + components[components.length - 1].typ = QueryComponentType.Trailing; + } + + return new SearchQueryComponents(components); +} + export class QueryBuilder { private selectClause; private fromClause; diff --git a/src/lib/shared/model/requests.ts b/src/lib/shared/model/requests.ts index a8597ca..823ee28 100644 --- a/src/lib/shared/model/requests.ts +++ b/src/lib/shared/model/requests.ts @@ -6,6 +6,7 @@ export type PaginationRequest = { export type FilterList = T | T[]; export type EntriesFilter = Partial<{ + search: string; done: boolean; author: FilterList; executor: FilterList; diff --git a/tests/helpers/generate-mockdata.ts b/tests/helpers/generate-mockdata.ts new file mode 100644 index 0000000..1cfb031 --- /dev/null +++ b/tests/helpers/generate-mockdata.ts @@ -0,0 +1,161 @@ +import { prisma } from "$lib/server/prisma"; +import { faker } from "@faker-js/faker"; +import fs from "fs"; +import { CATEGORIES, STATIONS } from "./testdata"; +import path from "path"; +import { fileURLToPath } from "url"; + +type MockEntry = { category: string; description: string; result: string }; + +const CATEGORY_IDS: { [id: string]: number } = { + Laborabnahme: 1, + Untersuchungen: 2, + Medikationsumstellung: 3, + "Klinische Visite": 4, + Entlassung: 5, + Sonstiges: 6, +}; +const refDate = new Date(2023, 11, 1); + +const N_USERS = 10; +const N_ROOMS = 20; +const N_PATIENTS = 50; + +export default async () => { + // Reset database + await prisma.$transaction([ + prisma.entryExecution.deleteMany(), + prisma.entryVersion.deleteMany(), + prisma.entry.deleteMany(), + prisma.patient.deleteMany(), + prisma.room.deleteMany(), + prisma.station.deleteMany(), + prisma.category.deleteMany(), + prisma.user.deleteMany(), + prisma.category.createMany({ data: CATEGORIES }), + prisma.station.createMany({ data: STATIONS }), + prisma.$executeRawUnsafe("alter sequence entries_id_seq restart with 1"), + prisma.$executeRawUnsafe("alter sequence entry_executions_id_seq restart with 1"), + prisma.$executeRawUnsafe("alter sequence entry_versions_id_seq restart with 1"), + ]); + + // Make generated data reproducible + faker.seed(42); + + const filepath = path.join( + fileURLToPath(import.meta.url), + "../mockdata_entries.jsonl" + ); + const file = fs.readFileSync(filepath).toString(); + const entryMockdata: MockEntry[] = file + .trim() + .split("\n") + .map((l) => JSON.parse(l)); + + function randomId(len: number): number { + return faker.number.int({ min: 1, max: len - 1 }); + } + + for (let i = 1; i <= N_USERS; i++) { + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + + await prisma.user.create({ + data: { + id: i, + name: firstName + " " + lastName, + email: faker.internet.email({ firstName, lastName }), + }, + }); + } + + let i = 1; + for (let sId = 1; sId <= 2; sId++) { + for (let rId = 1; rId <= 10; rId++) { + await prisma.room.create({ + data: { id: i, name: `R${sId}.${rId}`, station_id: sId }, + }); + i += 1; + } + } + + for (let i = 1; i <= N_PATIENTS; i++) { + await prisma.patient.create({ + data: { + id: i, + first_name: faker.person.firstName(), + last_name: faker.person.lastName(), + age: faker.number.int({ min: 16, max: 100 }), + room_id: randomId(N_ROOMS), + }, + }); + } + + for (let i = 0; i < entryMockdata.length; i++) { + const e = entryMockdata[i]; + const created_at = faker.date.soon({ refDate, days: 30 }); + const todo_date = faker.date.soon({ refDate: created_at, days: 30 }); + const priority = faker.datatype.boolean({ probability: 0.05 }); + const entry = await prisma.entry.create({ + data: { + patient_id: randomId(N_PATIENTS), + created_at, + }, + }); + await prisma.entryVersion.create({ + data: { + entry_id: entry.id, + author_id: randomId(N_USERS), + category_id: CATEGORY_IDS[e.category], + date: todo_date, + priority, + text: e.description, + }, + }); + + // Add additional version(s) with some extra text + for (let n = 0; n < faker.number.int({ min: 0, max: 3 }); n++) { + const extraText = "\n\n> " + faker.lorem.paragraph(); + await prisma.entryVersion.create({ + data: { + entry_id: entry.id, + author_id: randomId(N_USERS), + category_id: CATEGORY_IDS[e.category], + date: todo_date, + priority, + text: e.description + extraText, + }, + }); + } + + // 30% of entries are done + if (faker.datatype.boolean({ probability: 0.3 })) { + await prisma.entryExecution.create({ + data: { + entry_id: entry.id, + author_id: randomId(N_USERS), + text: e.result, + created_at: faker.date.soon({ refDate: todo_date, days: 2 }), + }, + }); + } + + await prisma.$transaction([ + prisma.$executeRawUnsafe( + `alter sequence users_id_seq restart with ${N_USERS + 1}` + ), + prisma.$executeRawUnsafe( + `alter sequence categories_id_seq restart with ${CATEGORIES.length + 1}` + ), + prisma.$executeRawUnsafe( + `alter sequence stations_id_seq restart with ${STATIONS.length + 1}` + ), + prisma.$executeRawUnsafe( + `alter sequence rooms_id_seq restart with ${N_ROOMS + 1}` + ), + prisma.$executeRawUnsafe( + `alter sequence patients_id_seq restart with ${N_PATIENTS + 1}` + ), + ]); + } +}; diff --git a/tests/helpers/mockdata_entries.jsonl b/tests/helpers/mockdata_entries.jsonl new file mode 100644 index 0000000..8405468 --- /dev/null +++ b/tests/helpers/mockdata_entries.jsonl @@ -0,0 +1,300 @@ +{"category": "Laborabnahme", "description": "Dem Patienten wurde Blut abgenommen, um verschiedene Laborwerte zu überprüfen.", "result": "Die Blutprobe wurde entnommen und zur Analyse an das Labor geschickt. Die Ergebnisse werden in Kürze erwartet."} +{"category": "Medikationsumstellung", "description": "Es wurde eine Anpassung der Medikation vorgenommen, um die Behandlung zu optimieren.", "result": "Die Medikationsumstellung wurde erfolgreich durchgeführt. Der Patient wird engmaschig überwacht, um mögliche Reaktionen auf die neuen Medikamente zu erfassen."} +{"category": "Klinische Visite", "description": "Der Patient wurde klinisch untersucht, um den aktuellen Gesundheitszustand zu beurteilen.", "result": "Bei der klinischen Visite wurden vitale Parameter überprüft, einschließlich Blutdruck, Puls und Temperatur. Der Patient zeigt keine ungewöhnlichen Symptome und befindet sich in stabilem Zustand."} +{"category": "Untersuchungen", "description": "Es ist eine radiologische Untersuchung erforderlich, um genaue Informationen zu erhalten.", "result": "Die radiologische Untersuchung wurde durchgeführt, um detaillierte Bilder der betroffenen Bereiche zu erhalten. Die Ergebnisse werden vom Fachpersonal ausgewertet und mit dem behandelnden Arzt besprochen."} +{"category": "Entlassung", "description": "Der Patient wurde erfolgreich aus der stationären Behandlung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung der vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Er wurde über die weiteren Schritte der Nachsorge informiert."} +{"category": "Sonstiges", "description": "Es sind zusätzliche Maßnahmen erforderlich, um die Ursache der Beschwerden zu klären.", "result": "Es wurden weitere diagnostische Maßnahmen eingeleitet, um die genaue Ursache der Beschwerden zu identifizieren. Der Patient wird über die geplanten Untersuchungen informiert."} +{"category": "Klinische Visite", "description": "Der Patient berichtet über Schlafprobleme und Unruhezustände.", "result": "Bei der klinischen Visite wurden psychische und emotionale Aspekte des Patienten angesprochen. Es wurde eine weiterführende Untersuchung der Schlafgewohnheiten und Stressfaktoren empfohlen."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutprobe zur Überprüfung der Leberfunktion entnommen.", "result": "Die Blutabnahme erfolgte ohne Komplikationen. Die Ergebnisse der Leberfunktionstests werden in den nächsten Tagen erwartet."} +{"category": "Medikationsumstellung", "description": "Anpassung der Dosierung aufgrund von Nebenwirkungen.", "result": "Die Medikation wurde aufgrund von auftretenden Nebenwirkungen angepasst. Der Patient wird auf mögliche Verbesserungen oder weitere Reaktionen beobachtet."} +{"category": "Untersuchungen", "description": "Magnetresonanztomographie (MRT) zur detaillierten Darstellung der Gelenke.", "result": "Die MRT-Untersuchung wurde erfolgreich durchgeführt und lieferte detaillierte Bilder der Gelenke. Die Ergebnisse werden vom Radiologen ausgewertet und dem behandelnden Arzt mitgeteilt."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Operation entlassen.", "result": "Nach einer erfolgreichen Operation und Überwachung der postoperativen Phase wurde der Patient in gutem Zustand entlassen. Die weiteren Genesungsschritte wurden besprochen."} +{"category": "Sonstiges", "description": "Empfehlung zur physiotherapeutischen Behandlung", "result": "Nach eingehender Untersuchung wurde eine physiotherapeutische Behandlung empfohlen, um die Beweglichkeit und Muskelkraft des Patienten zu verbessern."} +{"category": "Klinische Visite", "description": "Patient klagt über anhaltende Kopfschmerzen und Schwindelgefühl.", "result": "Die klinische Visite fokussierte sich auf die Symptome von Kopfschmerzen und Schwindel. Weitere neurologische Untersuchungen sind geplant, um die Ursache zu klären."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung der Schilddrüsenwerte.", "result": "Die Blutprobe wurde entnommen, um die Schilddrüsenfunktion zu überprüfen. Die Ergebnisse werden mit dem Patienten besprochen, um gegebenenfalls eine Therapie einzuleiten."} +{"category": "Medikationsumstellung", "description": "Wechsel zu einem alternativen Medikament aufgrund von Unverträglichkeiten.", "result": "Die Medikationsumstellung wurde aufgrund von Unverträglichkeiten erfolgreich durchgeführt. Der Patient wird auf mögliche positive Auswirkungen und eventuelle Nebenwirkungen überwacht."} +{"category": "Untersuchungen", "description": "Ultraschalluntersuchung zur Abklärung von Bauchbeschwerden.", "result": "Die Ultraschalluntersuchung des Bauchraums wurde durchgeführt, um mögliche Ursachen für die Bauchbeschwerden zu identifizieren. Die Ergebnisse werden mit dem Patienten besprochen."} +{"category": "Entlassung", "description": "Patient konnte nach erfolgreicher Rehabilitation nach Hause entlassen werden.", "result": "Nach einer erfolgreichen Rehabilitation und Verbesserung des Gesundheitszustands konnte der Patient in die häusliche Umgebung entlassen werden. Empfehlungen für die Nachsorge wurden gegeben."} +{"category": "Sonstiges", "description": "Empfehlung zur Ernährungsberatung aufgrund von Gewichtsproblemen.", "result": "Nach der Untersuchung wurde eine Ernährungsberatung empfohlen, um das Gewicht des Patienten zu stabilisieren und gesunde Essgewohnheiten zu fördern."} +{"category": "Klinische Visite", "description": "Besprechung der aktuellen Symptome und Fortschritte des Patienten.", "result": "Die klinische Visite konzentrierte sich auf die Besprechung der aktuellen Symptome und Fortschritte des Patienten. Anpassungen der Behandlungspläne wurden vorgenommen."} +{"category": "Laborabnahme", "description": "Blutuntersuchung zur Überprüfung der Blutzuckerwerte.", "result": "Die Blutuntersuchung zur Überprüfung der Blutzuckerwerte wurde durchgeführt. Die Ergebnisse werden mit dem Patienten besprochen, um die Diabetesbehandlung zu optimieren."} +{"category": "Medikationsumstellung", "description": "Änderung der Medikation zur besseren Kontrolle von Bluthochdruck.", "result": "Die Medikationsumstellung wurde durchgeführt, um den Bluthochdruck des Patienten besser zu kontrollieren. Überwachung der Blutdruckwerte und Anpassungen bei Bedarf werden fortgesetzt."} +{"category": "Untersuchungen", "description": "EKG zur Überprüfung der Herzfunktion und Rhythmusstörungen.", "result": "Das EKG wurde durchgeführt, um die Herzfunktion und mögliche Rhythmusstörungen zu überprüfen. Die Ergebnisse werden mit dem Kardiologen besprochen, um weitere Schritte zu planen."} +{"category": "Entlassung", "description": "Patient wurde nach erfolgreicher Behandlung und Stabilisierung entlassen.", "result": "Nach erfolgreicher Behandlung und Stabilisierung des Gesundheitszustands konnte der Patient in gutem Zustand entlassen werden. Empfehlungen für die Nachsorge wurden gegeben."} +{"category": "Sonstiges", "description": "Empfehlung zur psychologischen Beratung aufgrund von emotionalen Belastungen.", "result": "Nach eingehender Besprechung der emotionalen Belastungen wurde eine psychologische Beratung empfohlen, um den Patienten bei der Bewältigung seiner psychischen Herausforderungen zu unterstützen."} +{"category": "Klinische Visite", "description": "Patient zeigt Anzeichen von Gelenksteifigkeit und Schmerzen.", "result": "Die klinische Visite konzentrierte sich auf die Bewertung der Gelenkgesundheit. Weitere rheumatologische Untersuchungen sind geplant, um die Ursache der Gelenksteifigkeit zu identifizieren."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung der Nierenfunktion.", "result": "Die Blutentnahme zur Überprüfung der Nierenfunktion wurde durchgeführt. Die Ergebnisse werden mit dem Nephrologen besprochen, um die geeignete Therapie festzulegen."} +{"category": "Medikationsumstellung", "description": "Änderung der Medikation aufgrund von unzureichender Wirkung.", "result": "Die Medikationsumstellung wurde vorgenommen, da die bisherige Medikation nicht die gewünschte Wirkung zeigte. Der Patient wird engmaschig überwacht, um die Effektivität der neuen Medikamente zu beurteilen."} +{"category": "Untersuchungen", "description": "Röntgenaufnahme zur Diagnose von Atemwegsproblemen.", "result": "Die Röntgenaufnahme der Atemwege wurde durchgeführt, um mögliche Ursachen von Atemwegsproblemen zu identifizieren. Die Ergebnisse werden mit dem Pneumologen besprochen."} +{"category": "Entlassung", "description": "Patient wurde nach erfolgreicher Operation und Rehabilitationsphase entlassen.", "result": "Nach einer erfolgreichen Operation und abschließender Rehabilitationsphase wurde der Patient in gutem Zustand entlassen. Empfehlungen für die weitere Genesung zu Hause wurden gegeben."} +{"category": "Sonstiges", "description": "Empfehlung zur Ergotherapie aufgrund von motorischen Einschränkungen.", "result": "Nach einer eingehenden Untersuchung wurde eine Ergotherapie empfohlen, um die motorischen Einschränkungen des Patienten zu verbessern und die Lebensqualität zu steigern."} +{"category": "Klinische Visite", "description": "Besprechung der Fortschritte in der Schmerztherapie.", "result": "Die klinische Visite konzentrierte sich auf die Fortschritte in der Schmerztherapie. Anpassungen der Medikation und alternative Therapieansätze wurden erörtert."} +{"category": "Laborabnahme", "description": "Blutuntersuchung zur Überprüfung der Schilddrüsenfunktion.", "result": "Die Blutuntersuchung zur Überprüfung der Schilddrüsenfunktion wurde durchgeführt. Die Ergebnisse werden mit dem Endokrinologen besprochen, um die optimale Behandlung festzulegen."} +{"category": "Medikationsumstellung", "description": "Wechsel zu einem neuen Antidepressivum aufgrund von Unverträglichkeiten.", "result": "Die Medikationsumstellung auf ein neues Antidepressivum wurde durchgeführt, um Unverträglichkeiten zu minimieren. Der Patient wird auf mögliche Verbesserungen und Nebenwirkungen überwacht."} +{"category": "Untersuchungen", "description": "CT-Untersuchung zur Abklärung von neurologischen Symptomen.", "result": "Die CT-Untersuchung des Gehirns wurde durchgeführt, um mögliche neurologische Ursachen der Symptome zu identifizieren. Die Ergebnisse werden mit dem Neurologen besprochen."} +{"category": "Entlassung", "description": "Patient konnte nach intensiver Therapie entlassen werden.", "result": "Nach einer intensiven Therapie und Überwachung konnte der Patient in einem stabilen Zustand entlassen werden. Die weitere Genesung wird ambulant fortgesetzt."} +{"category": "Sonstiges", "description": "Empfehlung zur Schlafanalyse aufgrund von Schlafstörungen.", "result": "Nach eingehender Besprechung der Schlafprobleme wurde eine Schlafanalyse empfohlen, um genaue Informationen über mögliche Schlafstörungen zu erhalten."} +{"category": "Klinische Visite", "description": "Patient berichtet über Magen-Darm-Beschwerden und Verdauungsprobleme.", "result": "Die klinische Visite konzentrierte sich auf die Bewertung von Magen-Darm-Beschwerden. Weitere gastroenterologische Untersuchungen sind geplant, um die Ursache zu klären."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung der Eisenspeicher und Blutbild.", "result": "Die Blutentnahme zur Überprüfung der Eisenspeicher und des Blutbilds wurde durchgeführt. Die Ergebnisse werden mit dem Hämatologen besprochen, um eine geeignete Therapie festzulegen."} +{"category": "Medikationsumstellung", "description": "Anpassung der Medikation aufgrund von allergischen Reaktionen.", "result": "Die Medikationsumstellung wurde aufgrund von allergischen Reaktionen erfolgreich durchgeführt. Der Patient wird auf weitere mögliche allergische Reaktionen überwacht."} +{"category": "Untersuchungen", "description": "Doppler-Sonographie zur Überprüfung der Durchblutung in den Beinen.", "result": "Die Doppler-Sonographie wurde durchgeführt, um die Durchblutung in den Beinen zu überprüfen. Die Ergebnisse werden mit dem Angiologen besprochen, um gegebenenfalls weitere Maßnahmen einzuleiten."} +{"category": "Entlassung", "description": "Patient konnte nach erfolgreicher Therapie entlassen werden.", "result": "Nach erfolgreicher Therapie und Überwachung konnte der Patient in gutem Zustand entlassen werden. Empfehlungen für die Nachsorge und Verhaltensmaßnahmen wurden gegeben."} +{"category": "Sonstiges", "description": "Empfehlung zur Physiotherapie aufgrund von Rückenschmerzen.", "result": "Nach der Untersuchung wurde eine Physiotherapie empfohlen, um die Rückenschmerzen zu lindern und die muskuläre Unterstützung zu stärken."} +{"category": "Klinische Visite", "description": "Besprechung der aktuellen Schmerzintensität und Schmerzmanagement.", "result": "Die klinische Visite konzentrierte sich auf die Besprechung der aktuellen Schmerzintensität und die Anpassung des Schmerzmanagements. Alternative Therapieansätze wurden erörtert."} +{"category": "Untersuchungen", "description": "Es wurde eine Ultraschalluntersuchung durchgeführt, um die Organe im Bauchraum zu überprüfen.", "result": "Die Ultraschalluntersuchung zeigte normale Befunde der Bauchorgane. Es wurden keine Anomalien festgestellt."} +{"category": "Laborabnahme", "description": "Zur Überprüfung der Nierenfunktion wurde dem Patienten Blut abgenommen.", "result": "Die Laborergebnisse deuten auf eine normale Nierenfunktion hin. Der Patient wird über mögliche Maßnahmen zur Verbesserung der Nierenfunktion beraten."} +{"category": "Klinische Visite", "description": "Eine routinemäßige klinische Visite wurde durchgeführt, um den Gesundheitszustand des Patienten zu überwachen.", "result": "Bei der klinischen Visite wurden keine besorgniserregenden Symptome festgestellt. Der Patient ist in einem stabilen Zustand."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung aller vitalen Parameter wurde der Patient in einem verbesserten Zustand entlassen. Er erhält Empfehlungen für die weitere Nachsorge."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um mögliche Nebenwirkungen zu minimieren.", "result": "Die Medikationsumstellung wurde vorgenommen, und der Patient wird sorgfältig überwacht, um eventuelle unerwünschte Reaktionen zu identifizieren."} +{"category": "Sonstiges", "description": "Es wurde eine Beratung zur Lebensstiländerung durchgeführt, um die Gesundheit zu verbessern.", "result": "Der Patient erhielt Ratschläge zur Änderung seines Lebensstils, um die Gesundheit zu fördern. Es werden regelmäßige Follow-up-Termine vereinbart."} +{"category": "Laborabnahme", "description": "Eine Blutuntersuchung wurde durchgeführt, um die Schilddrüsenfunktion zu überprüfen.", "result": "Die Blutwerte deuten auf eine normale Schilddrüsenfunktion hin. Weitere Untersuchungen werden bei Bedarf empfohlen."} +{"category": "Klinische Visite", "description": "Der Patient wurde aufgrund von Beschwerden im Magen-Darm-Bereich untersucht.", "result": "Bei der klinischen Visite wurden keine akuten Probleme festgestellt. Der Patient wird aufgefordert, bei anhaltenden Beschwerden erneut Kontakt aufzunehmen."} +{"category": "Untersuchungen", "description": "Es wurde eine Röntgenaufnahme angefertigt, um mögliche Frakturen auszuschließen.", "result": "Die Röntgenaufnahme zeigt keine Anzeichen von Frakturen. Der Patient wird über weitere Schritte zur Schmerzlinderung informiert."} +{"category": "Entlassung", "description": "Der Patient wurde nach Abschluss der Rehabilitationsmaßnahmen entlassen.", "result": "Nach erfolgreicher Rehabilitation und Überprüfung der Fortschritte wurde der Patient in einem verbesserten Zustand entlassen. Es wurden Empfehlungen für die Fortsetzung der Übungen gegeben."} +{"category": "Sonstiges", "description": "Es wurde eine genetische Untersuchung angeordnet, um mögliche genetische Risikofaktoren zu identifizieren.", "result": "Die genetische Untersuchung wurde in die Wege geleitet, um potenzielle genetische Risikofaktoren zu identifizieren. Die Ergebnisse werden mit dem Patienten besprochen, um entsprechende Maßnahmen zu ergreifen."} +{"category": "Medikationsumstellung", "description": "Die Dosierung eines Medikaments wurde angepasst, um die Wirksamkeit zu erhöhen.", "result": "Die Medikationsanpassung wurde vorgenommen, und der Patient wird auf mögliche Veränderungen in den Symptomen hinsichtlich der Medikationsänderung überwacht."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung durchgeführt, um den Eisengehalt im Blut zu überprüfen.", "result": "Die Ergebnisse der Blutuntersuchung deuten auf einen normalen Eisengehalt hin. Empfehlungen zur Verbesserung der Eisenversorgung werden dem Patienten mitgeteilt."} +{"category": "Klinische Visite", "description": "Der Patient stellte sich aufgrund von Kopfschmerzen und Schwindel vor.", "result": "Die klinische Visite ergab keine akuten neurologischen Auffälligkeiten. Der Patient wird aufgefordert, bei weiteren Beschwerden sofort Kontakt aufzunehmen."} +{"category": "Untersuchungen", "description": "Es wurde eine MRT-Untersuchung des Gehirns durchgeführt, um mögliche Ursachen von neurologischen Symptomen zu identifizieren.", "result": "Die MRT-Untersuchung zeigte keine strukturellen Anomalien im Gehirn. Weitere Untersuchungen werden zur genaueren Abklärung der Beschwerden empfohlen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung aller vitalen Parameter wurde der Patient in einem verbesserten Zustand entlassen. Er erhält Empfehlungen für die Fortsetzung der Rehabilitation zu Hause."} +{"category": "Sonstiges", "description": "Es wurde eine Beratung zur Stressbewältigung und Entspannungstechniken durchgeführt.", "result": "Der Patient erhielt Tipps zur Stressbewältigung und Entspannungstechniken. Regelmäßige Übungen werden empfohlen, um das Wohlbefinden zu steigern."} +{"category": "Laborabnahme", "description": "Eine Blutprobe wurde genommen, um die Leberfunktion zu überprüfen.", "result": "Die Blutuntersuchung ergab normale Leberwerte. Der Patient wird über gesunde Ernährungsgewohnheiten informiert, um die Lebergesundheit zu unterstützen."} +{"category": "Klinische Visite", "description": "Der Patient wurde zur routinemäßigen Kontrolle der Herzfunktion untersucht.", "result": "Die klinische Visite zeigte keine Anzeichen von Herzproblemen. Der Patient wird ermutigt, regelmäßige kardiovaskuläre Übungen durchzuführen."} +{"category": "Untersuchungen", "description": "Es wurde eine Endoskopie durchgeführt, um mögliche Magen-Darm-Erkrankungen auszuschließen.", "result": "Die Endoskopie zeigte keine Anomalien im Magen-Darm-Trakt. Der Patient wird über mögliche Ursachen der Beschwerden aufgeklärt."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um Nebenwirkungen zu minimieren.", "result": "Die Medikationsanpassung wurde durchgeführt, und der Patient wird auf mögliche Veränderungen in den Symptomen hinsichtlich der Medikationsänderung überwacht."} +{"category": "Sonstiges", "description": "Es wurde eine Ernährungsberatung durchgeführt, um den Cholesterinspiegel zu kontrollieren.", "result": "Der Patient erhielt Ratschläge zur cholesterinbewussten Ernährung. Regelmäßige Kontrollen werden empfohlen, um den Cholesterinspiegel im Auge zu behalten."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung durchgeführt, um den Vitamin-D-Spiegel zu überprüfen.", "result": "Die Blutwerte zeigen einen niedrigen Vitamin-D-Spiegel. Der Patient wird über Maßnahmen zur Verbesserung der Vitamin-D-Versorgung informiert."} +{"category": "Klinische Visite", "description": "Der Patient wurde aufgrund von Muskelschmerzen und -schwäche untersucht.", "result": "Die klinische Untersuchung ergab keine akuten muskuloskelettalen Probleme. Der Patient wird zu physiotherapeutischen Übungen zur Stärkung der Muskulatur angeleitet."} +{"category": "Untersuchungen", "description": "Es wurde eine Spirometrie durchgeführt, um die Lungenfunktion zu testen.", "result": "Die Spirometrie zeigt normale Ergebnisse der Lungenfunktion. Der Patient wird ermutigt, regelmäßig Atemübungen durchzuführen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung aller vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Er erhält Empfehlungen für die Fortsetzung der medikamentösen Therapie."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um die Symptome besser zu kontrollieren.", "result": "Die Medikationsanpassung wurde durchgeführt, und der Patient wird auf mögliche Verbesserungen der Symptome überwacht."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung durchgeführt, um die Schilddrüsenwerte zu überprüfen.", "result": "Die Blutwerte deuten auf eine normale Schilddrüsenfunktion hin. Der Patient wird über die Bedeutung der Schilddrüsenwerte informiert."} +{"category": "Klinische Visite", "description": "Der Patient stellte sich aufgrund von Schlafproblemen und Erschöpfung vor.", "result": "Bei der klinischen Visite wurden keine akuten körperlichen Ursachen für die Schlafprobleme festgestellt. Der Patient wird zu Schlafhygiene-Maßnahmen beraten."} +{"category": "Untersuchungen", "description": "Es wurde eine Colonoskopie durchgeführt, um mögliche Darmprobleme auszuschließen.", "result": "Die Colonoskopie zeigte keine Anzeichen von Darmproblemen. Der Patient wird über gesunde Darmgewohnheiten aufgeklärt."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung aller vitalen Parameter wurde der Patient in einem verbesserten Zustand entlassen. Er erhält Empfehlungen für die Fortsetzung der physiotherapeutischen Übungen zu Hause."} +{"category": "Sonstiges", "description": "Es wurde eine psychologische Beratung durchgeführt, um den Umgang mit Stress zu verbessern.", "result": "Der Patient erhielt psychologische Unterstützung zur Stressbewältigung. Regelmäßige Sitzungen werden empfohlen, um den emotionalen Wohlbefinden zu fördern."} +{"category": "Medikationsumstellung", "description": "Die Dosierung eines blutdrucksenkenden Medikaments wurde angepasst.", "result": "Die Medikationsanpassung wurde durchgeführt, und der Patient wird auf mögliche Veränderungen im Blutdruck überwacht."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung durchgeführt, um die Blutzuckerwerte zu überprüfen.", "result": "Die Blutwerte deuten auf einen erhöhten Blutzuckerspiegel hin. Der Patient wird über Maßnahmen zur Blutzuckerregulation informiert."} +{"category": "Klinische Visite", "description": "Der Patient wurde zur Nachkontrolle nach einer Operation untersucht.", "result": "Bei der klinischen Visite wurden keine Komplikationen nach der Operation festgestellt. Der Heilungsprozess verläuft zufriedenstellend."} +{"category": "Untersuchungen", "description": "Es wurde eine DEXA-Untersuchung durchgeführt, um die Knochendichte zu messen.", "result": "Die DEXA-Untersuchung ergab normale Knochendichtewerte. Der Patient wird über Maßnahmen zur Erhaltung der Knochengesundheit informiert."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung aller vitalen Parameter wurde der Patient in einem verbesserten Zustand entlassen. Er erhält Empfehlungen für die Fortsetzung der medikamentösen Therapie und regelmäßige Kontrollen."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung durchgeführt, um die Nierenfunktion zu überprüfen.", "result": "Die Laborergebnisse deuten auf normale Nierenfunktion hin. Der Patient wird über gesunde Ernährungsgewohnheiten informiert, um die Nierenfunktion zu unterstützen."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um Nebenwirkungen zu minimieren.", "result": "Die Medikationsumstellung erfolgte aufgrund von auftretenden Nebenwirkungen. Der Patient wird aufmerksam über mögliche Reaktionen geschult und weiterhin überwacht."} +{"category": "Klinische Visite", "description": "Eine ausführliche klinische Untersuchung wurde durchgeführt.", "result": "Die klinische Visite ergab keine neuen Befunde. Der Patient ist symptomfrei und zeigt eine positive Reaktion auf die laufende Therapie."} +{"category": "Untersuchungen", "description": "Eine MRT-Untersuchung wurde angeordnet, um die genaue Lokalisation eines Problems zu bestimmen.", "result": "Das MRT lieferte detaillierte Bilder und ermöglichte eine präzise Diagnose. Die weiteren Behandlungsschritte werden entsprechend den Ergebnissen geplant."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung entlassen.", "result": "Der Patient wurde in einem stabilen Zustand entlassen. Die Entlassungspapiere und Anweisungen für die Nachsorge wurden ausgehändigt."} +{"category": "Sonstiges", "description": "Zusätzliche Tests wurden angeordnet, um unklare Symptome zu klären.", "result": "Weitere diagnostische Tests wurden in Auftrag gegeben, um die Ursache der unklaren Symptome zu ermitteln. Der Patient wird über den Fortschritt informiert."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung zur Überprüfung der Schilddrüsenwerte durchgeführt.", "result": "Die Blutprobe wurde genommen, und die Ergebnisse deuten auf normale Schilddrüsenfunktion hin. Der Patient wird über mögliche Ursachen von Schilddrüsenproblemen informiert."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde optimiert, um die Wirksamkeit zu steigern.", "result": "Die Anpassung der Medikation wurde erfolgreich umgesetzt. Der Patient wird engmaschig überwacht, um auf mögliche Verbesserungen oder Nebenwirkungen zu reagieren."} +{"category": "Klinische Visite", "description": "Eine regelmäßige klinische Untersuchung wurde durchgeführt.", "result": "Bei der klinischen Visite wurden vitale Parameter überprüft, und der Patient zeigte eine stabile Verfassung. Es wurden keine neuen gesundheitlichen Probleme festgestellt."} +{"category": "Untersuchungen", "description": "Es wurde eine Ultraschalluntersuchung zur Abklärung von Bauchbeschwerden angeordnet.", "result": "Die Ultraschalluntersuchung lieferte Hinweise auf leichte Veränderungen im Bauchraum. Der behandelnde Arzt wird weitere Schritte zur Diagnose planen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Genesung aus der Klinik entlassen.", "result": "Der Patient hat die Therapie erfolgreich abgeschlossen und wurde in einem guten Gesundheitszustand entlassen. Empfehlungen für die Nachsorge wurden gegeben."} +{"category": "Sonstiges", "description": "Es sind zusätzliche Tests erforderlich, um eine genaue Diagnose zu stellen.", "result": "Zusätzliche diagnostische Tests wurden angeordnet, um die genaue Ursache der Beschwerden zu identifizieren. Der Patient wird über die geplanten Untersuchungen informiert."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung zur Überprüfung der Leberfunktion durchgeführt.", "result": "Die Blutprobe wurde genommen, und die Ergebnisse deuten auf normale Leberfunktion hin. Der Patient wird über gesunde Lebensgewohnheiten aufgeklärt, um die Lebergesundheit zu unterstützen."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um auf neue gesundheitliche Entwicklungen zu reagieren.", "result": "Die Anpassung der Medikation erfolgte aufgrund neuer Befunde. Der Patient wird über die Gründe und mögliche Auswirkungen informiert."} +{"category": "Klinische Visite", "description": "Der Patient wurde klinisch untersucht, um die Fortschritte der Therapie zu überprüfen.", "result": "Bei der klinischen Visite wurden positive Fortschritte festgestellt. Der Patient zeigt eine verbesserte körperliche Verfassung, und die Therapie wird entsprechend angepasst."} +{"category": "Untersuchungen", "description": "Es wurde eine Röntgenuntersuchung zur Abklärung von Atembeschwerden angeordnet.", "result": "Die Röntgenuntersuchung ergab keine strukturellen Auffälligkeiten. Der behandelnde Arzt wird weitere Aspekte der Atemprobleme untersuchen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Rehabilitation aus der stationären Behandlung entlassen.", "result": "Der Patient hat die Rehabilitation erfolgreich abgeschlossen und wurde in einem stabilen Zustand entlassen. Empfehlungen für die Fortsetzung der Rehabilitationsmaßnahmen wurden gegeben."} +{"category": "Sonstiges", "description": "Es sind weitere diagnostische Maßnahmen erforderlich, um die Symptome zu klären.", "result": "Weitere diagnostische Maßnahmen wurden eingeleitet, um die Ursache der Symptome zu identifizieren. Der Patient wird über den geplanten Untersuchungsverlauf informiert."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung zur Überprüfung der Blutzuckerwerte durchgeführt.", "result": "Die Blutprobe wurde entnommen, und die Ergebnisse deuten auf einen normalen Blutzuckerspiegel hin. Der Patient wird über gesunde Ernährungsgewohnheiten und regelmäßige Bewegung aufgeklärt."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um mögliche Wechselwirkungen zu vermeiden.", "result": "Die Anpassung der Medikation wurde aufgrund von möglichen Wechselwirkungen erfolgreich umgesetzt. Der Patient wird über die Bedeutung der Einhaltung der vorgeschriebenen Einnahmezeiten informiert."} +{"category": "Klinische Visite", "description": "Eine routinemäßige klinische Untersuchung wurde durchgeführt.", "result": "Bei der klinischen Visite wurden keine neuen gesundheitlichen Probleme festgestellt. Der Patient zeigt eine stabile Verfassung und setzt die empfohlene Therapie fort."} +{"category": "Untersuchungen", "description": "Es wurde eine Endoskopie zur genaueren Untersuchung des Magen-Darm-Trakts angeordnet.", "result": "Die Endoskopie lieferte präzise Bilder des Magen-Darm-Trakts. Der behandelnde Arzt wird die Ergebnisse auswerten und die weitere Vorgehensweise mit dem Patienten besprechen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Operation aus dem Krankenhaus entlassen.", "result": "Nach einer erfolgreichen Operation wurde der Patient in einem stabilen Zustand entlassen. Empfehlungen für die postoperative Pflege wurden gegeben."} +{"category": "Sonstiges", "description": "Es sind zusätzliche Tests erforderlich, um eine genaue Diagnose zu stellen.", "result": "Zusätzliche diagnostische Tests wurden angeordnet, um die genaue Ursache der Beschwerden zu ermitteln. Der Patient wird über den geplanten Untersuchungsverlauf informiert."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung zur Überprüfung der Eisenwerte durchgeführt.", "result": "Die Blutprobe wurde entnommen, und die Ergebnisse deuten auf normale Eisenwerte hin. Der Patient wird über eisenreiche Ernährung informiert, um einen optimalen Eisenspiegel aufrechtzuerhalten."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um auf aktuelle Laborergebnisse zu reagieren.", "result": "Die Anpassung der Medikation erfolgte basierend auf aktuellen Laborergebnissen. Der Patient wird über die Bedeutung der regelmäßigen Kontrolluntersuchungen informiert."} +{"category": "Klinische Visite", "description": "Eine umfassende klinische Untersuchung wurde durchgeführt.", "result": "Die klinische Visite ergab keine neuen gesundheitlichen Probleme. Der Patient zeigt eine positive Reaktion auf die Therapie und wird weiterhin engmaschig überwacht."} +{"category": "Untersuchungen", "description": "Es wurde eine CT-Untersuchung zur Abklärung von Kopfschmerzen angeordnet.", "result": "Die CT-Untersuchung des Kopfes zeigte keine strukturellen Auffälligkeiten. Der behandelnde Arzt wird weitere Aspekte der Kopfschmerzen untersuchen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung aus der Klinik entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung der vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Empfehlungen für die Nachsorge wurden gegeben."} +{"category": "Sonstiges", "description": "Es sind weitere diagnostische Maßnahmen erforderlich, um die Ursache der Beschwerden zu klären.", "result": "Weitere diagnostische Maßnahmen wurden eingeleitet, um die genaue Ursache der Beschwerden zu identifizieren. Der Patient wird über den geplanten Untersuchungsverlauf informiert."} +{"category": "Klinische Visite", "description": "Der Patient wurde auf mögliche Infektionen untersucht, um frühzeitig Maßnahmen ergreifen zu können.", "result": "Bei der klinischen Visite wurden Symptome einer Infektion überprüft. Der Patient zeigt keine Anzeichen einer akuten Infektion. Weiterhin werden regelmäßige Kontrollen durchgeführt, um eventuelle Veränderungen frühzeitig zu erkennen."} +{"category": "Medikationsumstellung", "description": "Eine Anpassung der Medikation wurde vorgenommen, um Nebenwirkungen zu minimieren.", "result": "Die Medikationsumstellung erfolgte aufgrund von bisherigen Nebenwirkungen. Der Patient wird über mögliche Veränderungen in den kommenden Tagen informiert. Bei auftretenden Beschwerden sollte umgehend Kontakt aufgenommen werden."} +{"category": "Laborabnahme", "description": "Es wurden verschiedene Blutwerte überprüft, um den Gesundheitszustand zu bewerten.", "result": "Die Blutuntersuchung ergab normale Werte in den meisten Parametern. Einige Werte werden weiter überwacht. Der Patient wird über die Ergebnisse informiert und weitere Schritte werden besprochen."} +{"category": "Untersuchungen", "description": "Es ist eine Ultraschalluntersuchung des Bauchraums geplant.", "result": "Die Ultraschalluntersuchung wurde durchgeführt, um den Zustand der inneren Organe zu beurteilen. Bisher wurden keine Auffälligkeiten festgestellt. Die genauen Ergebnisse werden mit dem Patienten bei der nächsten Visite besprochen."} +{"category": "Sonstiges", "description": "Der Patient benötigt spezielle physiotherapeutische Maßnahmen.", "result": "Physiotherapie wurde verschrieben, um die Genesung zu unterstützen. Der Therapieplan wird individuell angepasst, um auf die Bedürfnisse des Patienten einzugehen."} +{"category": "Klinische Visite", "description": "Es wurden neurologische Tests durchgeführt, um mögliche Veränderungen festzustellen.", "result": "Die neurologische Untersuchung zeigte keine Anzeichen von neurologischen Erkrankungen. Der Patient ist weiterhin stabil. Die Behandlung wird entsprechend fortgesetzt."} +{"category": "Medikationsumstellung", "description": "Änderungen in der Medikation wurden vorgenommen, um die Therapieeffizienz zu steigern.", "result": "Die Medikationsanpassung erfolgte nach eingehender Prüfung. Der Patient wird auf mögliche Nebenwirkungen aufmerksam gemacht. Regelmäßige Kontrollen sind wichtig, um die Wirkung zu überwachen."} +{"category": "Laborabnahme", "description": "Blutproben wurden für eine umfassende Analyse entnommen.", "result": "Die Blutproben wurden dem Labor übergeben, um verschiedene Parameter zu überprüfen. Die Ergebnisse werden in den nächsten Tagen erwartet."} +{"category": "Untersuchungen", "description": "Es ist eine Magnetresonanztomographie (MRT) des Kopfes geplant.", "result": "Die MRT-Untersuchung wurde durchgeführt, um detaillierte Bilder des Gehirns zu erhalten. Die Aufnahmen zeigen keine strukturellen Auffälligkeiten. Die Ergebnisse werden mit dem Patienten besprochen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung der vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Er erhielt Empfehlungen für die Nachsorge und mögliche weiterführende Maßnahmen."} +{"category": "Sonstiges", "description": "Es sind weitere bildgebende Untersuchungen erforderlich, um die Diagnose zu präzisieren.", "result": "Zusätzliche bildgebende Untersuchungen wurden angeordnet, um detaillierte Informationen über den Zustand des betroffenen Bereichs zu erhalten. Die Ergebnisse werden mit dem Patienten ausführlich besprochen."} +{"category": "Laborabnahme", "description": "Es wurden Blutproben entnommen, um die Wirksamkeit der aktuellen Therapie zu überprüfen.", "result": "Die Blutabnahme erfolgte zur Bestimmung von Medikamentenspiegeln und anderen relevanten Parametern. Die Ergebnisse werden genutzt, um die Therapie gegebenenfalls anzupassen."} +{"category": "Klinische Visite", "description": "Eine umfassende körperliche Untersuchung wurde durchgeführt.", "result": "Bei der klinischen Visite wurden alle relevanten Körpersysteme überprüft. Es wurden keine Anomalien festgestellt. Der Patient befindet sich in einem guten Allgemeinzustand."} +{"category": "Medikationsumstellung", "description": "Anpassungen in der Medikation wurden vorgenommen, um die Symptome zu lindern.", "result": "Die Medikationsumstellung erfolgte, um die Behandlungseffizienz zu verbessern. Der Patient wird auf mögliche Nebenwirkungen hingewiesen und sollte Veränderungen im Befinden mitteilen."} +{"category": "Untersuchungen", "description": "Es sind weitere diagnostische Tests erforderlich, um die Ursache der Beschwerden zu identifizieren.", "result": "Zusätzliche Untersuchungen wurden angeordnet, um detaillierte Informationen über den Gesundheitszustand des Patienten zu erhalten. Die Ergebnisse werden zur weiteren Behandlungsplanung genutzt."} +{"category": "Entlassung", "description": "Nach erfolgreicher Behandlung wurde der Patient entlassen.", "result": "Der Patient wurde in einem stabilen Zustand entlassen. Er erhielt schriftliche Empfehlungen für die poststationäre Betreuung und wird regelmäßig nachkontrolliert."} +{"category": "Sonstiges", "description": "Es sind genetische Tests geplant, um mögliche genetische Ursachen auszuschließen.", "result": "Genetische Tests wurden empfohlen, um mögliche genetische Ursachen von Beschwerden zu identifizieren. Der Patient wird über den Ablauf der Tests informiert und um Zustimmung gebeten."} +{"category": "Klinische Visite", "description": "Der Patient wurde auf neurologische Symptome untersucht.", "result": "Die klinische Visite konzentrierte sich auf die Überprüfung von neurologischen Funktionen. Bisher wurden keine Auffälligkeiten festgestellt. Der Patient wird weiterhin sorgfältig überwacht."} +{"category": "Medikationsumstellung", "description": "Anpassungen in der Medikation wurden vorgenommen, um die Wirksamkeit zu steigern.", "result": "Die Medikationsumstellung erfolgte nach sorgfältiger Abwägung. Der Patient wird über mögliche Veränderungen in den nächsten Tagen informiert. Bei auftretenden Problemen sollte sofort Kontakt aufgenommen werden."} +{"category": "Laborabnahme", "description": "Es wurden Blutproben entnommen, um die aktuellen Blutwerte zu überprüfen.", "result": "Die Blutuntersuchung ergab normale Werte in den meisten Parametern. Einige Werte werden weiter überwacht. Der Patient wird über die Ergebnisse informiert und weitere Schritte werden besprochen."} +{"category": "Klinische Visite", "description": "Routinemäßige klinische Untersuchung zur Überwachung des Patientenzustands.", "result": "Vitalparameter wurden überprüft, und es wurden keine signifikanten Veränderungen festgestellt. Der Patient zeigt eine positive Resonanz auf die laufende Behandlung."} +{"category": "Medikationsumstellung", "description": "Anpassung der Medikation aufgrund von Nebenwirkungen.", "result": "Die Medikamentendosis wurde angepasst, um unerwünschte Nebenwirkungen zu minimieren. Der Patient wird weiterhin überwacht, um die Wirksamkeit der Änderungen zu bewerten."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung der Leberfunktion.", "result": "Die Blutprobe wurde entnommen, um Leberenzyme zu überprüfen. Die Ergebnisse werden in den nächsten Tagen erwartet."} +{"category": "Untersuchungen", "description": "Empfohlene bildgebende Untersuchung zur genaueren Diagnose.", "result": "Die bildgebende Untersuchung wurde durchgeführt, um detaillierte Informationen über den Zustand des betroffenen Organs zu erhalten. Die Ergebnisse werden mit dem Patienten besprochen."} +{"category": "Sonstiges", "description": "Besprechung von Lebensstiländerungen zur Verbesserung der Gesundheit.", "result": "Der Patient wurde über notwendige Lebensstiländerungen informiert, um die Gesundheit zu fördern. Ein individueller Plan wurde erstellt und wird aktiv umgesetzt."} +{"category": "Klinische Visite", "description": "Überprüfung der postoperativen Genesung.", "result": "Nach einer kürzlich durchgeführten Operation wurde der Patient klinisch untersucht. Der Heilungsprozess verläuft zufriedenstellend, und es wurden keine Komplikationen festgestellt."} +{"category": "Entlassung", "description": "Abschluss der stationären Behandlung und Entlassungsplanung.", "result": "Der Patient wurde nach erfolgreicher Behandlung entlassen. Ein umfassender Entlassungsplan wurde erstellt, der die notwendige Nachsorge und Medikation umfasst."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung des Cholesterinspiegels.", "result": "Die Blutprobe wurde entnommen, um den Cholesterinspiegel zu überprüfen. Die Ergebnisse werden in Kürze verfügbar sein."} +{"category": "Medikationsumstellung", "description": "Anpassung der Medikation aufgrund von Therapieerfolgen.", "result": "Die Medikation wurde angepasst, da positive Fortschritte in der Behandlung erkennbar sind. Der Patient zeigt eine verbesserte klinische Verfassung."} +{"category": "Sonstiges", "description": "Beratung zu gesundheitsfördernden Maßnahmen.", "result": "Der Patient erhielt eine umfassende Beratung zu gesundheitsfördernden Maßnahmen, einschließlich Ernährung, Bewegung und Stressmanagement."} +{"category": "Klinische Visite", "description": "Überprüfung von Symptomen und Anpassung der Therapie.", "result": "Bei der klinischen Visite wurden aktuelle Symptome besprochen, und die Therapie wurde entsprechend angepasst. Der Patient wird weiterhin überwacht."} +{"category": "Untersuchungen", "description": "Durchführung einer speziellen diagnostischen Untersuchung.", "result": "Die spezielle diagnostische Untersuchung wurde erfolgreich durchgeführt, um genauere Informationen über den Zustand des Patienten zu erhalten. Die Ergebnisse werden analysiert."} +{"category": "Entlassung", "description": "Vorbereitung auf die Entlassung und Abschlussgespräch.", "result": "Der Patient wurde auf die Entlassung vorbereitet, und ein Abschlussgespräch wurde geführt. Der Patient wurde über die wichtigsten Nachsorgemaßnahmen informiert."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung der Schilddrüsenfunktion.", "result": "Die Blutprobe wurde entnommen, um die Schilddrüsenfunktion zu überprüfen. Die Ergebnisse werden in den nächsten Tagen erwartet."} +{"category": "Medikationsumstellung", "description": "Anpassung der Medikation aufgrund von Unverträglichkeiten.", "result": "Die Medikation wurde angepasst, um unerwünschte Nebenwirkungen zu minimieren. Der Patient wird auf mögliche allergische Reaktionen überwacht."} +{"category": "Klinische Visite", "description": "Routinemäßige klinische Untersuchung zur Überwachung des Therapieverlaufs.", "result": "Vitalparameter und Symptome wurden überprüft, und der Patient zeigt eine positive Reaktion auf die laufende Therapie."} +{"category": "Untersuchungen", "description": "Empfohlene gastrointestinale Untersuchung zur weiteren Diagnose.", "result": "Die gastrointestinale Untersuchung wurde durchgeführt, um genaue Informationen über den Zustand des Verdauungssystems zu erhalten. Die Ergebnisse werden mit dem Patienten besprochen."} +{"category": "Sonstiges", "description": "Beratung zur Krankheitsprävention und Gesundheitsförderung.", "result": "Der Patient erhielt eine umfassende Beratung zur Krankheitsprävention und Förderung der allgemeinen Gesundheit. Maßnahmen zur Risikoreduktion wurden besprochen."} +{"category": "Klinische Visite", "description": "Überprüfung der postoperativen Wundheilung.", "result": "Nach einer kürzlich durchgeführten Operation wurde die Wundheilung überprüft. Die Wunde verheilt zufriedenstellend, und es wurden keine Anzeichen von Infektionen festgestellt."} +{"category": "Entlassung", "description": "Abschluss der stationären Behandlung und Entlassungsplanung.", "result": "Der Patient wurde nach erfolgreicher Behandlung entlassen. Ein detaillierter Entlassungsplan wurde erstellt, der die Nachsorge und Medikation umfasst."} +{"category": "Laborabnahme", "description": "Blutentnahme zur Überprüfung der Nierenfunktion.", "result": "Die Blutprobe wurde entnommen, um die Nierenfunktion zu überprüfen. Die Ergebnisse werden in Kürze verfügbar sein."} +{"category": "Medikationsumstellung", "description": "Anpassung der Medikation aufgrund von Therapieerfolgen.", "result": "Die Medikation wurde angepasst, da positive Fortschritte in der Behandlung erkennbar sind. Der Patient zeigt eine verbesserte klinische Verfassung."} +{"category": "Medikationsumstellung", "description": "Es wurden Änderungen in der Medikation vorgenommen, um die Therapie anzupassen.", "result": "Die Medikamentendosis wurde angepasst, um eine optimale Wirkung zu erzielen. Der Patient wird auf mögliche Nebenwirkungen überwacht."} +{"category": "Klinische Visite", "description": "Eine umfassende klinische Untersuchung wurde durchgeführt, um den Gesundheitszustand zu überprüfen.", "result": "Während der klinischen Visite wurden alle relevanten Gesundheitsparameter überprüft. Der Patient zeigt positive Fortschritte und es wurden keine Anzeichen von Komplikationen festgestellt."} +{"category": "Untersuchungen", "description": "Eine Blutuntersuchung wurde angeordnet, um spezifische Laborwerte zu überprüfen.", "result": "Die Blutuntersuchung wurde durchgeführt, um spezifische Laborwerte zu überprüfen. Die Ergebnisse werden dem behandelnden Arzt für weitere Bewertungen vorgelegt."} +{"category": "Sonstiges", "description": "Zusätzliche diagnostische Maßnahmen sind erforderlich, um eine genaue Diagnose zu stellen.", "result": "Aufgrund unklarer Symptome wurden zusätzliche diagnostische Maßnahmen eingeleitet, um die genaue Ursache zu identifizieren. Der Patient wird über den weiteren Ablauf informiert."} +{"category": "Laborabnahme", "description": "Eine routinemäßige Blutabnahme wurde durchgeführt, um die allgemeinen Gesundheitswerte zu überprüfen.", "result": "Die routinemäßige Blutabnahme ergab normale Werte, die auf eine stabile Gesundheit hinweisen. Der Patient wird weiterhin überwacht."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung aus der Klinik entlassen.", "result": "Nach Abschluss der Behandlung wurde der Patient in einem guten Zustand entlassen. Er erhielt Anweisungen für die Nachsorge und die Einnahme von Medikamenten."} +{"category": "Klinische Visite", "description": "Die regelmäßige klinische Visite wurde durchgeführt, um den Therapieverlauf zu bewerten.", "result": "Bei der klinischen Visite wurden Fortschritte im Therapieverlauf festgestellt. Der Patient zeigt eine positive Resonanz auf die aktuelle Behandlung."} +{"category": "Medikationsumstellung", "description": "Es wurden Anpassungen in der Medikation vorgenommen, um Nebenwirkungen zu minimieren.", "result": "Die Medikamentendosis wurde angepasst, um mögliche Nebenwirkungen zu minimieren. Der Patient wird auf Veränderungen im Gesundheitszustand überwacht."} +{"category": "Sonstiges", "description": "Weitere diagnostische Tests wurden angeordnet, um spezifische Symptome zu klären.", "result": "Aufgrund von spezifischen Symptomen wurden zusätzliche diagnostische Tests angeordnet. Die Ergebnisse werden für eine genauere Diagnose ausgewertet."} +{"category": "Untersuchungen", "description": "Es wurde eine bildgebende Untersuchung durchgeführt, um innere Organe zu überprüfen.", "result": "Die bildgebende Untersuchung ergab keine Anomalien in den inneren Organen. Der behandelnde Arzt wird die Ergebnisse mit dem Patienten besprechen."} +{"category": "Laborabnahme", "description": "Blutproben wurden genommen, um die Wirksamkeit der laufenden Behandlung zu überwachen.", "result": "Die Blutproben wurden genommen, um die Wirksamkeit der laufenden Behandlung zu überprüfen. Die Ergebnisse werden für die weitere Therapieplanung berücksichtigt."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Genesung aus der stationären Behandlung entlassen.", "result": "Der Patient hat sich vollständig erholt und wurde in einem stabilen Zustand entlassen. Die Einhaltung der empfohlenen Nachsorgemaßnahmen wird empfohlen."} +{"category": "Sonstiges", "description": "Weitere Spezialuntersuchungen wurden empfohlen, um bestimmte Gesundheitsfragen zu klären.", "result": "Aufgrund spezifischer Gesundheitsfragen wurden weitere Spezialuntersuchungen empfohlen. Der Patient wird über die Notwendigkeit und den Ablauf informiert."} +{"category": "Klinische Visite", "description": "Die regelmäßige klinische Visite wurde durchgeführt, um den Therapieverlauf zu überwachen.", "result": "Bei der klinischen Visite wurden keine Auffälligkeiten festgestellt. Der Patient zeigt eine stabile Gesundheitslage und setzt die Therapie erfolgreich fort."} +{"category": "Untersuchungen", "description": "Eine Ultraschalluntersuchung wurde durchgeführt, um strukturelle Veränderungen zu erkennen.", "result": "Die Ultraschalluntersuchung zeigte keine strukturellen Veränderungen. Der Befund deutet auf eine normale Organstruktur hin."} +{"category": "Laborabnahme", "description": "Blutproben wurden entnommen, um spezifische Werte im Zusammenhang mit der Erkrankung zu überprüfen.", "result": "Die Blutproben wurden entnommen und zur Analyse geschickt. Die Ergebnisse werden für eine individualisierte Behandlungsplanung berücksichtigt."} +{"category": "Medikationsumstellung", "description": "Es wurde eine Anpassung der Medikation vorgenommen, um die Symptomkontrolle zu verbessern.", "result": "Die Anpassung der Medikation führte zu einer verbesserten Symptomkontrolle. Der Patient berichtet über eine subjektive Besserung seines Befindens."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung aus der Klinik entlassen.", "result": "Nach erfolgreicher Behandlung und Stabilisierung wurde der Patient aus der Klinik entlassen. Er wurde über die Bedeutung der Nachsorge informiert."} +{"category": "Sonstiges", "description": "Weitere diagnostische Maßnahmen wurden eingeleitet, um unklare Beschwerden zu klären.", "result": "Zusätzliche diagnostische Maßnahmen wurden eingeleitet, um die Ursache der unklaren Beschwerden zu identifizieren. Der Patient wird über die geplanten Untersuchungen informiert."} +{"category": "Klinische Visite", "description": "Eine umfassende klinische Untersuchung wurde durchgeführt, um den Therapieverlauf zu bewerten.", "result": "Die klinische Untersuchung ergab keine Auffälligkeiten. Der Patient zeigt positive Fortschritte im Therapieverlauf."} +{"category": "Untersuchungen", "description": "Es wurde eine spezielle Laboruntersuchung angeordnet, um auf bestimmte Krankheitsmarker zu testen.", "result": "Die spezielle Laboruntersuchung wurde durchgeführt, um auf bestimmte Krankheitsmarker zu testen. Die Ergebnisse werden zur weiteren Diagnose herangezogen."} +{"category": "Laborabnahme", "description": "Blutproben wurden entnommen, um die Wirkung der aktuellen Therapie zu überwachen.", "result": "Die Blutproben wurden entnommen und werden auf die Wirkung der aktuellen Therapie überprüft. Anpassungen werden bei Bedarf vorgenommen."} +{"category": "Medikationsumstellung", "description": "Es wurden Änderungen in der Medikation vorgenommen, um Nebenwirkungen zu minimieren.", "result": "Die Medikamentendosis wurde angepasst, um mögliche Nebenwirkungen zu minimieren. Der Patient wird auf Veränderungen im Gesundheitszustand überwacht."} +{"category": "Sonstiges", "description": "Weitere diagnostische Tests wurden angeordnet, um spezifische Symptome zu klären.", "result": "Aufgrund von spezifischen Symptomen wurden weitere diagnostische Tests angeordnet. Die Ergebnisse werden für eine genauere Diagnose ausgewertet."} +{"category": "Klinische Visite", "description": "Die regelmäßige klinische Visite wurde durchgeführt, um den Therapieverlauf zu überwachen.", "result": "Bei der klinischen Visite wurden keine Auffälligkeiten festgestellt. Der Patient zeigt eine stabile Gesundheitslage und setzt die Therapie erfolgreich fort."} +{"category": "Untersuchungen", "description": "Eine Ultraschalluntersuchung wurde durchgeführt, um strukturelle Veränderungen zu erkennen.", "result": "Die Ultraschalluntersuchung zeigte keine strukturellen Veränderungen. Der Befund deutet auf eine normale Organstruktur hin."} +{"category": "Laborabnahme", "description": "Blutproben wurden entnommen, um spezifische Werte im Zusammenhang mit der Erkrankung zu überprüfen.", "result": "Die Blutproben wurden entnommen und zur Analyse geschickt. Die Ergebnisse werden für eine individualisierte Behandlungsplanung berücksichtigt."} +{"category": "Medikationsumstellung", "description": "Es wurde eine Anpassung der Medikation vorgenommen, um die Symptomkontrolle zu verbessern.", "result": "Die Anpassung der Medikation führte zu einer verbesserten Symptomkontrolle. Der Patient berichtet über eine subjektive Besserung seines Befindens."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung und Stabilisierung aus der Klinik entlassen.", "result": "Nach erfolgreicher Behandlung und Stabilisierung wurde der Patient aus der Klinik entlassen. Er wurde über die Bedeutung der Nachsorge informiert."} +{"category": "Sonstiges", "description": "Weitere diagnostische Maßnahmen wurden eingeleitet, um unklare Beschwerden zu klären.", "result": "Zusätzliche diagnostische Maßnahmen wurden eingeleitet, um die Ursache der unklaren Beschwerden zu identifizieren. Der Patient wird über die geplanten Untersuchungen informiert."} +{"category": "Klinische Visite", "description": "Eine umfassende klinische Untersuchung wurde durchgeführt, um den Therapieverlauf zu bewerten.", "result": "Die klinische Untersuchung ergab keine Auffälligkeiten. Der Patient zeigt positive Fortschritte im Therapieverlauf."} +{"category": "Untersuchungen", "description": "Es wurde eine spezielle Laboruntersuchung angeordnet, um auf bestimmte Krankheitsmarker zu testen.", "result": "Die spezielle Laboruntersuchung wurde durchgeführt, um auf bestimmte Krankheitsmarker zu testen. Die Ergebnisse werden zur weiteren Diagnose herangezogen."} +{"category": "Laborabnahme", "description": "Blutproben wurden entnommen, um die Wirkung der aktuellen Therapie zu überwachen.", "result": "Die Blutproben wurden entnommen und werden auf die Wirkung der aktuellen Therapie überprüft. Anpassungen werden bei Bedarf vorgenommen."} +{"category": "Medikationsumstellung", "description": "Es wurden Änderungen in der Medikation vorgenommen, um Nebenwirkungen zu minimieren.", "result": "Die Medikamentendosis wurde angepasst, um mögliche Nebenwirkungen zu minimieren. Der Patient wird auf Veränderungen im Gesundheitszustand überwacht."} +{"category": "Sonstiges", "description": "Weitere diagnostische Tests wurden angeordnet, um spezifische Symptome zu klären.", "result": "Aufgrund von spezifischen Symptomen wurden weitere diagnostische Tests angeordnet. Die Ergebnisse werden für eine genauere Diagnose ausgewertet."} +{"category": "Klinische Visite", "description": "Die regelmäßige klinische Visite wurde durchgeführt, um den Therapieverlauf zu überwachen.", "result": "Bei der klinischen Visite wurden keine Auffälligkeiten festgestellt. Der Patient zeigt eine stabile Gesundheitslage und setzt die Therapie erfolgreich fort."} +{"category": "Untersuchungen", "description": "Eine Ultraschalluntersuchung wurde durchgeführt, um strukturelle Veränderungen zu erkennen.", "result": "Die Ultraschalluntersuchung zeigte keine strukturellen Veränderungen. Der Befund deutet auf eine normale Organstruktur hin."} +{"category": "Untersuchungen", "description": "Es ist eine Ultraschalluntersuchung des Bauchraums notwendig.", "result": "Die Ultraschalluntersuchung wurde durchgeführt, um die inneren Organe im Bauchraum zu überprüfen. Es wurden keine Auffälligkeiten festgestellt."} +{"category": "Medikationsumstellung", "description": "Anpassung der Dosierung eines Blutdruckmedikaments.", "result": "Die Dosierung des Blutdruckmedikaments wurde angepasst, um eine optimale Blutdruckkontrolle zu erreichen. Der Patient wird regelmäßig überwacht, um eventuelle Nebenwirkungen zu erfassen."} +{"category": "Klinische Visite", "description": "Routinekontrolle des postoperativen Zustands.", "result": "Die klinische Visite nach einer Operation ergab, dass der Patient eine normale postoperative Erholung zeigt. Wundheilung und vitale Parameter sind im normalen Bereich."} +{"category": "Laborabnahme", "description": "Bestimmung der Nierenfunktion durch Blutuntersuchung.", "result": "Die Blutabnahme zur Bestimmung der Nierenfunktion wurde durchgeführt. Die Laborergebnisse werden ausgewertet und mit dem Patienten besprochen."} +{"category": "Entlassung", "description": "Der Patient wird nach erfolgreicher Therapie aus der Klinik entlassen.", "result": "Nach Abschluss der geplanten Therapie wurde der Patient in einem stabilen Zustand entlassen. Empfehlungen für die Nachsorge wurden dem Patienten mitgeteilt."} +{"category": "Sonstiges", "description": "Notwendigkeit einer weiteren neurologischen Untersuchung.", "result": "Aufgrund spezifischer Symptome wird eine vertiefende neurologische Untersuchung empfohlen. Die genauen Untersuchungen werden mit dem Patienten besprochen."} +{"category": "Klinische Visite", "description": "Überwachung der vitalen Parameter bei akuten Beschwerden.", "result": "Die klinische Visite erfolgte aufgrund akuter Beschwerden. Die vitalen Parameter wurden überwacht, und entsprechende Maßnahmen wurden eingeleitet, um den Zustand zu stabilisieren."} +{"category": "Medikationsumstellung", "description": "Änderung der Medikation aufgrund neuer Laborergebnisse.", "result": "Die Medikation wurde aufgrund aktueller Laborergebnisse angepasst. Der Patient wird auf mögliche Veränderungen im Behandlungsverlauf überwacht."} +{"category": "Laborabnahme", "description": "Blutuntersuchung zur Überprüfung der Schilddrüsenfunktion.", "result": "Die Blutuntersuchung zur Überprüfung der Schilddrüsenfunktion wurde durchgeführt. Die Ergebnisse werden analysiert, um die weitere Behandlungsstrategie festzulegen."} +{"category": "Untersuchungen", "description": "MRT-Untersuchung zur detaillierten Darstellung des Rückenmarks.", "result": "Die MRT-Untersuchung des Rückenmarks liefert detaillierte Bilder für die genaue Beurteilung. Die Ergebnisse werden mit dem behandelnden Arzt besprochen."} +{"category": "Entlassung", "description": "Patient wird nach erfolgreicher Therapie aus der Rehabilitationsklinik entlassen.", "result": "Der Patient hat die Rehabilitationsmaßnahmen erfolgreich abgeschlossen und wird in einem verbesserten Zustand entlassen. Empfehlungen für die weitere Gesundheitspflege wurden mitgeteilt."} +{"category": "Sonstiges", "description": "Empfehlung für physiotherapeutische Maßnahmen bei muskulären Beschwerden.", "result": "Aufgrund von muskulären Beschwerden wird dem Patienten eine physiotherapeutische Behandlung empfohlen. Der Therapieplan wird individuell angepasst."} +{"category": "Klinische Visite", "description": "Überwachung der postoperativen Wundheilung.", "result": "Die klinische Visite konzentrierte sich auf die Überwachung der postoperativen Wundheilung. Es wurden keine Anzeichen von Infektionen oder Komplikationen festgestellt."} +{"category": "Medikationsumstellung", "description": "Umstellung der Schmerzmedikation aufgrund vermehrter Nebenwirkungen.", "result": "Die Schmerzmedikation wurde aufgrund vermehrter Nebenwirkungen umgestellt. Der Patient wird engmaschig überwacht, um die Verträglichkeit der neuen Medikamente zu überprüfen."} +{"category": "Laborabnahme", "description": "Blutprobe zur Bestimmung des Vitamin-D-Spiegels.", "result": "Die Blutprobe zur Bestimmung des Vitamin-D-Spiegels wurde entnommen. Die Ergebnisse werden genutzt, um eine angemessene Supplementierung zu planen."} +{"category": "Untersuchungen", "description": "Durchführung einer Endoskopie zur Abklärung von Magenbeschwerden.", "result": "Die Endoskopie ermöglichte eine genaue Untersuchung des Magens. Es wurden keine ernsthaften Anomalien festgestellt, und die Beschwerden werden weiter beobachtet."} +{"category": "Entlassung", "description": "Der Patient wird nach Abschluss der Therapie aus der psychiatrischen Station entlassen.", "result": "Der Patient hat die psychiatrische Therapie erfolgreich abgeschlossen und wird in einem stabilen Zustand entlassen. Empfehlungen für die Nachsorge wurden übermittelt."} +{"category": "Sonstiges", "description": "Empfehlung für eine Ernährungsberatung aufgrund von Gewichtsproblemen.", "result": "Aufgrund von Gewichtsproblemen wird dem Patienten eine Ernährungsberatung empfohlen. Die Beratung zielt darauf ab, eine gesunde und ausgewogene Ernährung zu fördern."} +{"category": "Klinische Visite", "description": "Überprüfung der Medikamentenverträglichkeit bei langfristiger Therapie.", "result": "Die klinische Visite diente der Überprüfung der Medikamentenverträglichkeit bei einer langfristigen Therapie. Der Patient zeigt keine Anzeichen von Nebenwirkungen, und die Therapie wird fortgesetzt."} +{"category": "Medikationsumstellung", "description": "Anpassung der Dosierung eines Antidiabetikums aufgrund von Blutzuckerwerten.", "result": "Die Dosierung des Antidiabetikums wurde angepasst, um die Blutzuckerwerte zu stabilisieren. Der Patient wird regelmäßig überwacht, um die Effektivität der Therapie zu überprüfen."} +{"category": "Laborabnahme", "description": "Blutuntersuchung zur Überprüfung der Leberfunktion.", "result": "Die Blutuntersuchung zur Überprüfung der Leberfunktion wurde durchgeführt. Die Ergebnisse werden analysiert, um die weitere Vorgehensweise in der Behandlung zu bestimmen."} +{"category": "Untersuchungen", "description": "Durchführung eines EEGs zur Abklärung von neurologischen Symptomen.", "result": "Das EEG lieferte wichtige Informationen zur Abklärung der neurologischen Symptome. Die Ergebnisse werden mit einem Neurologen besprochen, um die Diagnose zu vervollständigen."} +{"category": "Entlassung", "description": "Der Patient wird nach erfolgreicher Behandlung aus der pädiatrischen Abteilung entlassen.", "result": "Der kleine Patient hat die Behandlung erfolgreich abgeschlossen und wird in einem verbesserten Zustand entlassen. Empfehlungen für die elterliche Nachsorge wurden mitgeteilt."} +{"category": "Sonstiges", "description": "Empfehlung für eine psychologische Beratung aufgrund von Stresssymptomen.", "result": "Aufgrund von Stresssymptomen wird dem Patienten eine psychologische Beratung empfohlen. Die Sitzungen werden darauf abzielen, stressbewältigende Strategien zu entwickeln."} +{"category": "Klinische Visite", "description": "Überwachung der Atmung und Sauerstoffsättigung bei Atembeschwerden.", "result": "Die klinische Visite konzentrierte sich auf die Überwachung der Atmung und Sauerstoffsättigung bei Atembeschwerden. Entsprechende Maßnahmen wurden eingeleitet, um die Atemfunktion zu unterstützen."} +{"category": "Medikationsumstellung", "description": "Anpassung der Schmerzmedikation aufgrund veränderter Schmerzsymptomatik.", "result": "Die Schmerzmedikation wurde aufgrund veränderter Schmerzsymptomatik angepasst. Der Patient wird über mögliche Nebenwirkungen informiert und engmaschig überwacht."} +{"category": "Laborabnahme", "description": "Blutprobe zur Bestimmung des Cholesterinspiegels.", "result": "Die Blutprobe zur Bestimmung des Cholesterinspiegels wurde entnommen. Die Ergebnisse werden genutzt, um das Risiko von Herz-Kreislauf-Erkrankungen zu bewerten."} +{"category": "Untersuchungen", "description": "Durchführung einer Röntgenaufnahme zur Beurteilung von Gelenkproblemen.", "result": "Die Röntgenaufnahme ermöglichte eine detaillierte Beurteilung von Gelenkproblemen. Die Bilder werden mit einem Orthopäden besprochen, um eine geeignete Behandlungsstrategie festzulegen."} +{"category": "Entlassung", "description": "Der Patient wird nach erfolgreicher Chemotherapie aus der Onkologie entlassen.", "result": "Der Patient hat die Chemotherapie erfolgreich abgeschlossen und wird in einem verbesserten Zustand entlassen. Empfehlungen für die langfristige Nachsorge wurden mitgeteilt."} +{"category": "Sonstiges", "description": "Empfehlung für eine Ernährungsanpassung aufgrund von Magen-Darm-Beschwerden.", "result": "Aufgrund von Magen-Darm-Beschwerden wird dem Patienten eine Ernährungsanpassung empfohlen. Ein Ernährungsplan wird in Absprache mit einem Ernährungsspezialisten erstellt."} +{"category": "Klinische Visite", "description": "Überprüfung der Wundheilung nach einer Hautoperation.", "result": "Die klinische Visite konzentrierte sich auf die Überprüfung der Wundheilung nach einer Hautoperation. Die Wunde zeigt eine normale Heilung, und der Verband wird entsprechend angepasst."} +{"category": "Medikationsumstellung", "description": "Anpassung der Antidepressiva-Dosierung aufgrund von Stimmungsschwankungen.", "result": "Die Dosierung der Antidepressiva wurde angepasst, um auf aktuelle Stimmungsschwankungen des Patienten zu reagieren. Eine engmaschige Betreuung wird sicherstellen, dass die Anpassung gut vertragen wird."} +{"category": "Laborabnahme", "description": "Blutuntersuchung zur Überprüfung der Schilddrüsenhormone.", "result": "Die Blutuntersuchung zur Überprüfung der Schilddrüsenhormone wurde durchgeführt. Die Ergebnisse werden genutzt, um die Schilddrüsenfunktion zu bewerten und die Behandlung anzupassen."} +{"category": "Untersuchungen", "description": "Durchführung einer Spirometrie zur Beurteilung der Lungenfunktion.", "result": "Die Spirometrie lieferte detaillierte Informationen zur Beurteilung der Lungenfunktion. Die Ergebnisse werden mit einem Lungenfacharzt besprochen."} +{"category": "Entlassung", "description": "Der Patient wird nach erfolgreicher Physiotherapie aus der orthopädischen Abteilung entlassen.", "result": "Der Patient hat die physiotherapeutischen Maßnahmen erfolgreich abgeschlossen und wird in einem verbesserten Zustand entlassen. Übungen für die Heimtherapie wurden erläutert."} +{"category": "Sonstiges", "description": "Empfehlung für eine Schlafstudie aufgrund von Schlafstörungen.", "result": "Aufgrund von Schlafstörungen wird dem Patienten eine Schlafstudie empfohlen. Die Ergebnisse werden mit einem Schlafspezialisten besprochen, um die Ursache der Schlafprobleme zu klären."} +{"category": "Medikationsumstellung", "description": "Die Dosierung eines Medikaments wurde angepasst, um Nebenwirkungen zu minimieren.", "result": "Die Medikationsanpassung wurde vorgenommen, und der Patient wird auf mögliche Reaktionen überwacht. Bisher gibt es keine ungewöhnlichen Symptome."} +{"category": "Klinische Visite", "description": "Der Patient wurde aufgrund von Fieber und Husten klinisch untersucht.", "result": "Die klinische Visite ergab erhöhte Körpertemperatur und Atemprobleme. Es wurde eine geeignete Behandlung eingeleitet, und der Patient wird intensiv betreut."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutprobe entnommen, um den Hämoglobinspiegel zu überprüfen.", "result": "Die Blutabnahme wurde erfolgreich durchgeführt, und die Ergebnisse werden in Kürze erwartet. Dies dient der Überwachung der Hämoglobinkonzentration im Blut."} +{"category": "Untersuchungen", "description": "Es ist eine Ultraschalluntersuchung des Bauchraums notwendig.", "result": "Die Ultraschalluntersuchung lieferte detaillierte Bilder des Bauchraums. Es wurden keine pathologischen Veränderungen festgestellt. Die Ergebnisse werden mit dem behandelnden Arzt besprochen."} +{"category": "Sonstiges", "description": "Der Patient berichtet über Schlafstörungen und Unruhezustände.", "result": "Weitere Anamnese und Untersuchungen sind erforderlich, um die genaue Ursache der Schlafstörungen zu ermitteln. Ein Schlafprotokoll wird angelegt, um weitere Informationen zu sammeln."} +{"category": "Entlassung", "description": "Nach erfolgreicher Therapie wurde der Patient aus der stationären Behandlung entlassen.", "result": "Die Therapie war erfolgreich, und der Patient befindet sich in einem guten Zustand. Er wurde über die Fortsetzung der Behandlung zu Hause informiert."} +{"category": "Klinische Visite", "description": "Routinekontrolle zur Überwachung des Gesundheitszustands des Patienten.", "result": "Die klinische Visite zeigte keine Auffälligkeiten. Der Patient ist in stabilem Zustand, und die nächsten Kontrolltermine werden vereinbart."} +{"category": "Medikationsumstellung", "description": "Umstellung der Schmerzmedikation aufgrund unzureichender Wirkung.", "result": "Die neue Schmerzmedikation wurde eingeführt. Der Patient wird auf mögliche Nebenwirkungen überwacht, und die Wirksamkeit wird regelmäßig evaluiert."} +{"category": "Laborabnahme", "description": "Routine-Blutuntersuchung zur Überprüfung der allgemeinen Gesundheit.", "result": "Die Blutprobe wurde entnommen und zur Untersuchung ins Labor geschickt. Die Ergebnisse werden genutzt, um den Gesundheitszustand des Patienten zu bewerten."} +{"category": "Untersuchungen", "description": "Es wurde eine Röntgenaufnahme der Lunge durchgeführt.", "result": "Die Röntgenuntersuchung ergab keine Anzeichen von Auffälligkeiten oder Infektionen. Die Lungenfunktion des Patienten scheint normal zu sein."} +{"category": "Sonstiges", "description": "Der Patient beklagt sich über Magenbeschwerden und Verdauungsprobleme.", "result": "Es wurden weitere Untersuchungen eingeleitet, darunter eine gastrointestinale Untersuchung, um die Ursache der Magenbeschwerden zu klären. Der Patient wird entsprechend behandelt."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung der vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Er erhielt Anweisungen zur weiteren Nachsorge."} +{"category": "Klinische Visite", "description": "Der Patient berichtet über Kopfschmerzen und Schwindel.", "result": "Bei der klinischen Visite wurden neurologische Tests durchgeführt. Es wurden keine schwerwiegenden Auffälligkeiten festgestellt. Der Patient wird weiterhin überwacht, um mögliche Ursachen zu identifizieren."} +{"category": "Medikationsumstellung", "description": "Aufgrund von Nebenwirkungen wurde die Medikation angepasst.", "result": "Die Medikationsumstellung wurde vorgenommen, um unerwünschte Nebenwirkungen zu minimieren. Der Patient wird auf Veränderungen in seinem Gesundheitszustand überwacht."} +{"category": "Laborabnahme", "description": "Es wurde Blut abgenommen, um den Cholesterinspiegel zu überprüfen.", "result": "Die Blutprobe wurde entnommen, und die Laborergebnisse deuten auf einen erhöhten Cholesterinspiegel hin. Eine Ernährungsberatung wird eingeleitet."} +{"category": "Untersuchungen", "description": "Der Patient hat Beschwerden im Bewegungsapparat; eine orthopädische Untersuchung ist notwendig.", "result": "Die orthopädische Untersuchung zeigte leichte Abnutzungserscheinungen. Der Patient wird physiotherapeutisch behandelt, um die Beschwerden zu lindern."} +{"category": "Sonstiges", "description": "Der Patient benötigt eine spezialisierte Konsultation aufgrund von unklaren Symptomen.", "result": "Eine spezialisierte Konsultation wurde eingeleitet, um die unklaren Symptome des Patienten genauer zu untersuchen. Weitere Untersuchungen werden in Absprache mit den Fachärzten durchgeführt."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Therapie und Stabilisierung entlassen.", "result": "Die Therapie war erfolgreich, und der Patient zeigt eine verbesserte Stabilität. Er wurde umfassend über die Maßnahmen zur weiteren Genesung informiert."} +{"category": "Klinische Visite", "description": "Routinemäßige Überprüfung der Vitalparameter und allgemeinen Gesundheit.", "result": "Die klinische Visite ergab keine besorgniserregenden Veränderungen. Der Patient befindet sich in gutem Zustand, und die medizinische Betreuung wird entsprechend angepasst."} +{"category": "Medikationsumstellung", "description": "Es wurde eine Anpassung der Medikation aufgrund von Unverträglichkeiten vorgenommen.", "result": "Die Medikationsanpassung wurde durchgeführt, um unerwünschte Reaktionen zu vermeiden. Der Patient wird über mögliche alternative Medikamente aufgeklärt."} +{"category": "Laborabnahme", "description": "Routine-Blutuntersuchung zur Überprüfung der Leberfunktion.", "result": "Die Blutprobe wurde entnommen, und die Laborergebnisse deuten auf eine normale Leberfunktion hin. Der Patient wird über gesunde Lebensgewohnheiten beraten."} +{"category": "Untersuchungen", "description": "Es wurde eine MRT-Untersuchung des Kopfes durchgeführt.", "result": "Die MRT-Untersuchung zeigte keine strukturellen Veränderungen im Gehirn. Der Patient wird weiterhin neurologisch betreut, um mögliche Ursachen für seine Symptome zu klären."} +{"category": "Sonstiges", "description": "Der Patient berichtet über Hautausschläge und Juckreiz.", "result": "Eine dermatologische Untersuchung wurde eingeleitet, um die Ursache der Hautprobleme zu klären. Die notwendigen Maßnahmen zur Behandlung werden ergriffen."} +{"category": "Entlassung", "description": "Nach erfolgreicher Therapie und Stabilisierung wurde der Patient entlassen.", "result": "Der Patient zeigt eine deutliche Besserung. Nach Abschluss der Therapie wurde er in einem stabilen Zustand entlassen und erhält Anweisungen zur Nachsorge."} +{"category": "Klinische Visite", "description": "Der Patient kommt zur Nachsorgeuntersuchung nach einer vorangegangenen Operation.", "result": "Die klinische Visite ergab keine postoperativen Komplikationen. Die Wundheilung verläuft zufriedenstellend, und der Patient wird für die weitere Rehabilitation empfohlen."} +{"category": "Medikationsumstellung", "description": "Aufgrund von Nebenwirkungen wurde die Medikation angepasst.", "result": "Die Medikationsumstellung erfolgte, um Nebenwirkungen zu minimieren. Der Patient wird auf Veränderungen in seinem Gesundheitszustand überwacht."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutprobe entnommen, um den Vitamin-D-Spiegel zu überprüfen.", "result": "Die Blutabnahme wurde erfolgreich durchgeführt, und die Laborergebnisse weisen auf einen niedrigen Vitamin-D-Spiegel hin. Eine Supplementierung wird empfohlen."} +{"category": "Untersuchungen", "description": "Es wurde eine Endoskopie des Magen-Darm-Trakts durchgeführt.", "result": "Die Endoskopie lieferte klare Bilder des Magen-Darm-Trakts. Es wurden keine pathologischen Veränderungen festgestellt. Der Patient wird über die Ergebnisse informiert."} +{"category": "Sonstiges", "description": "Der Patient hat Schlafprobleme und wird zur weiteren Abklärung überwiesen.", "result": "Weitere diagnostische Maßnahmen, einschließlich eines Schlaflabors, wurden empfohlen, um die Ursachen der Schlafprobleme zu identifizieren. Der Patient wird zur weiteren Abklärung überwiesen."} +{"category": "Entlassung", "description": "Der Patient wurde nach Abschluss der Behandlung erfolgreich entlassen.", "result": "Nach erfolgreicher Behandlung und Überprüfung der vitalen Parameter wurde der Patient entlassen. Er erhielt klare Anweisungen für die Nachsorge und mögliche Kontrolltermine."} +{"category": "Klinische Visite", "description": "Routinemäßige Überprüfung des Gesundheitszustands und der vitalen Parameter.", "result": "Die klinische Visite zeigte keine signifikanten Veränderungen. Der Patient befindet sich in gutem Zustand, und die medizinische Betreuung wird entsprechend angepasst."} +{"category": "Medikationsumstellung", "description": "Die Dosierung eines blutdrucksenkenden Medikaments wurde angepasst.", "result": "Die Dosieranpassung wurde vorgenommen, um den Blutdruck optimal zu regulieren. Der Patient wird regelmäßig überwacht, um die Wirksamkeit der Therapie zu überprüfen."} +{"category": "Laborabnahme", "description": "Routine-Blutuntersuchung zur Überprüfung der Schilddrüsenfunktion.", "result": "Die Blutprobe wurde entnommen, und die Laborergebnisse deuten auf eine normale Schilddrüsenfunktion hin. Der Patient wird über die Bedeutung regelmäßiger Kontrollen informiert."} +{"category": "Untersuchungen", "description": "Es wurde eine Spirometrie zur Überprüfung der Lungenfunktion durchgeführt.", "result": "Die Spirometrie lieferte normale Werte der Lungenfunktion. Es gibt keine Anzeichen von Atemwegsproblemen. Der Patient wird weiterhin pneumologisch betreut."} +{"category": "Sonstiges", "description": "Der Patient klagt über Sehstörungen, eine augenärztliche Untersuchung ist notwendig.", "result": "Die augenärztliche Untersuchung ergab leichte Sehstörungen, die wahrscheinlich auf eine refraktive Anpassung zurückzuführen sind. Eine Brille wird empfohlen, und der Patient wird entsprechend beraten."} +{"category": "Entlassung", "description": "Nach erfolgreicher Therapie und Stabilisierung wurde der Patient entlassen.", "result": "Der Patient zeigt eine deutliche Verbesserung. Nach Abschluss der Therapie wurde er in einem stabilen Zustand entlassen und erhält Anweisungen zur weiteren Nachsorge."} +{"category": "Klinische Visite", "description": "Der Patient wurde zur Überwachung der postoperativen Wundheilung klinisch untersucht.", "result": "Die postoperative Untersuchung ergab eine zufriedenstellende Wundheilung. Der Patient wird für die weitere Rehabilitation und Nachsorge empfohlen."} +{"category": "Klinische Visite", "description": "Der Patient wurde heute für die regelmäßige klinische Visite vorgestellt.", "result": "Während der Visite wurden die vitalen Parameter überprüft, und es wurden keine auffälligen Veränderungen festgestellt. Der Patient berichtet über eine stabile gesundheitliche Verfassung."} +{"category": "Laborabnahme", "description": "Es ist eine umfassende Blutuntersuchung erforderlich, um spezifische Laborwerte zu überprüfen.", "result": "Die Blutentnahme wurde durchgeführt, und die Proben wurden zur Analyse ins Labor geschickt. Die Ergebnisse werden zeitnah erwartet."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um mögliche Nebenwirkungen zu minimieren.", "result": "Die Anpassung der Medikation erfolgte entsprechend den aktuellen Gesundheitsparametern des Patienten. Die Reaktion wird aufmerksam überwacht, und weitere Anpassungen können bei Bedarf vorgenommen werden."} +{"category": "Untersuchungen", "description": "Es ist eine Ultraschalluntersuchung des Bauchraums geplant.", "result": "Die Ultraschalluntersuchung wurde erfolgreich durchgeführt, um den Bauchraum zu überprüfen. Es wurden keine pathologischen Befunde festgestellt."} +{"category": "Sonstiges", "description": "Zusätzliche Informationen werden benötigt, um eine genaue Diagnose zu stellen.", "result": "Der Patient wird zu weiteren Untersuchungen überwiesen, um zusätzliche Informationen zu sammeln und eine umfassende Diagnose zu erstellen."} +{"category": "Klinische Visite", "description": "Der Patient zeigt leichte Symptome, daher wurde eine zusätzliche klinische Visite anberaumt.", "result": "Während der klinischen Visite wurden die aktuellen Symptome des Patienten besprochen. Es wurden vorläufige Maßnahmen ergriffen, und der Patient wird weiterhin engmaschig überwacht."} +{"category": "Entlassung", "description": "Der Patient hat die stationäre Behandlung erfolgreich abgeschlossen und wird entlassen.", "result": "Nach einer positiven Beurteilung des Gesundheitszustands und einer abschließenden ärztlichen Überprüfung wird der Patient in gutem Zustand entlassen. Er erhält klare Anweisungen für die Nachsorge."} +{"category": "Laborabnahme", "description": "Blutproben wurden genommen, um die Wirksamkeit der laufenden Therapie zu überprüfen.", "result": "Die Blutproben wurden entnommen und zur Überprüfung der Therapieeffektivität analysiert. Die vorläufigen Ergebnisse deuten auf eine positive Entwicklung hin."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde aufgrund von Unverträglichkeiten angepasst.", "result": "Aufgrund von Unverträglichkeiten wurde die Medikation angepasst. Der Patient wird auf mögliche Verbesserungen überwacht, und gegebenenfalls werden weitere Anpassungen vorgenommen."} +{"category": "Untersuchungen", "description": "Es sind weiterführende bildgebende Untersuchungen zur Klärung von Symptomen geplant.", "result": "Aufgrund unklarer Symptome werden zusätzliche bildgebende Untersuchungen durchgeführt. Die Ergebnisse werden mit dem Patienten besprochen, um eine geeignete Behandlungsstrategie zu planen."} +{"category": "Klinische Visite", "description": "Der Patient berichtet über eine Verschlechterung der Symptome, daher wurde eine dringende klinische Visite angeordnet.", "result": "Während der Visite wurden die aktuellen Symptome bewertet. Sofortmaßnahmen wurden ergriffen, und der Patient wird intensiver überwacht, um weitere Komplikationen zu verhindern."} +{"category": "Sonstiges", "description": "Es sind psychologische Beratungsgespräche zur Unterstützung des Patienten geplant.", "result": "Zur Unterstützung des Patienten werden psychologische Beratungsgespräche geplant. Der Fokus liegt darauf, die psychische Gesundheit zu stabilisieren und das Wohlbefinden zu fördern."} +{"category": "Laborabnahme", "description": "Spezifische Blutwerte müssen für die Anpassung der Behandlung überprüft werden.", "result": "Die Blutabnahme erfolgte, um spezifische Werte für die Anpassung der laufenden Behandlung zu erhalten. Die Ergebnisse werden zur weiteren Therapieplanung genutzt."} +{"category": "Medikationsumstellung", "description": "Aufgrund von Nebenwirkungen wurde eine Umstellung der Medikation empfohlen.", "result": "Die Medikationsumstellung wurde durchgeführt, um mögliche Nebenwirkungen zu minimieren. Der Patient wird auf Veränderungen in seinem Befinden überwacht."} +{"category": "Klinische Visite", "description": "Die regelmäßige klinische Visite zeigt weiterhin stabile Gesundheitswerte des Patienten.", "result": "Die klinische Visite bestätigt, dass der Patient in einem stabilen Gesundheitszustand ist. Es wurden keine neuen Symptome oder Probleme festgestellt."} +{"category": "Untersuchungen", "description": "Es sind genetische Untersuchungen zur Klärung von erblichen Faktoren geplant.", "result": "Genetische Untersuchungen wurden eingeleitet, um mögliche erbliche Faktoren zu identifizieren. Die Ergebnisse werden mit dem Patienten und gegebenenfalls mit einem Genetiker besprochen."} +{"category": "Entlassung", "description": "Der Patient wurde nach erfolgreicher Behandlung aus der stationären Aufnahme entlassen.", "result": "Nach Abschluss der erfolgreichen Therapie und Überprüfung der vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Er erhält klare Anweisungen für die Nachsorge."} +{"category": "Sonstiges", "description": "Es sind weiterführende Beratungsgespräche mit dem Patienten geplant.", "result": "Zur umfassenden Betreuung des Patienten sind weiterführende Beratungsgespräche geplant. Der Fokus liegt auf der Erklärung der aktuellen Situation und der Unterstützung des Patienten."} +{"category": "Klinische Visite", "description": "Der Patient zeigt eine Verbesserung der Symptome, daher wird die klinische Visite in regelmäßigen Abständen fortgesetzt.", "result": "Die regelmäßige klinische Visite bestätigt eine kontinuierliche Verbesserung der Symptome. Die Behandlung wird entsprechend angepasst, um den Heilungsprozess zu fördern."} +{"category": "Laborabnahme", "description": "Es wurden Blutproben entnommen, um die Auswirkungen der neuen Medikation zu überprüfen.", "result": "Die Blutproben wurden entnommen, um die Auswirkungen der kürzlich durchgeführten Medikationsumstellung zu überprüfen. Die vorläufigen Ergebnisse deuten auf eine positive Verträglichkeit hin."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um auf aktuelle Laborergebnisse zu reagieren.", "result": "Aufgrund neuer Laborergebnisse wurde die Medikation angepasst, um auf spezifische Gesundheitsparameter zu reagieren. Der Patient wird auf mögliche Veränderungen in seinem Befinden überwacht."} +{"category": "Klinische Visite", "description": "Der Patient berichtet über eine Verschlechterung der Schlafqualität, daher wurde eine klinische Visite angeordnet.", "result": "Während der klinischen Visite wurden Schlafmuster und mögliche Ursachen für die Schlafprobleme besprochen. Empfehlungen zur Verbesserung der Schlafqualität wurden gegeben."} +{"category": "Untersuchungen", "description": "Es sind weiterführende neurologische Untersuchungen zur Klärung von Symptomen geplant.", "result": "Neurologische Untersuchungen wurden eingeleitet, um die Ursachen bestimmter Symptome zu klären. Die Ergebnisse werden mit dem Neurologen besprochen, um eine geeignete Behandlungsstrategie zu entwickeln."} +{"category": "Entlassung", "description": "Der Patient hat die stationäre Behandlung erfolgreich abgeschlossen und wird entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung der vitalen Parameter wird der Patient in einem stabilen Zustand entlassen. Er erhält klare Anweisungen für die Nachsorge."} +{"category": "Sonstiges", "description": "Es sind ergänzende physiotherapeutische Maßnahmen zur Unterstützung der Rehabilitation geplant.", "result": "Zur Förderung der Rehabilitation werden ergänzende physiotherapeutische Maßnahmen geplant. Der Fokus liegt auf der Wiederherstellung der körperlichen Funktionen und der Steigerung der Lebensqualität."} +{"category": "Laborabnahme", "description": "Es wurden Blutproben entnommen, um die Wirksamkeit der laufenden Therapie zu überprüfen.", "result": "Die Blutproben wurden entnommen und zur Überprüfung der Therapieeffektivität analysiert. Die vorläufigen Ergebnisse zeigen eine positive Entwicklung."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um auf aktuelle Laborergebnisse zu reagieren.", "result": "Aufgrund neuer Laborergebnisse wurde die Medikation angepasst, um auf spezifische Gesundheitsparameter zu reagieren. Der Patient wird auf mögliche Veränderungen in seinem Befinden überwacht."} +{"category": "Klinische Visite", "description": "Der Patient berichtet über anhaltende Beschwerden, daher wurde eine dringende klinische Visite angeordnet.", "result": "Während der klinischen Visite wurden die aktuellen Beschwerden des Patienten bewertet. Sofortmaßnahmen wurden ergriffen, und der Patient wird intensiver überwacht, um weitere Komplikationen zu verhindern."} +{"category": "Untersuchungen", "description": "Es sind weiterführende bildgebende Untersuchungen zur Klärung von Symptomen geplant.", "result": "Aufgrund unklarer Symptome werden zusätzliche bildgebende Untersuchungen durchgeführt. Die Ergebnisse werden mit dem Patienten besprochen, um eine geeignete Behandlungsstrategie zu planen."} +{"category": "Entlassung", "description": "Der Patient wurde erfolgreich aus der stationären Behandlung entlassen.", "result": "Nach Abschluss der Therapie und Überprüfung der vitalen Parameter wurde der Patient in einem stabilen Zustand entlassen. Er erhält klare Anweisungen für die Nachsorge."} +{"category": "Sonstiges", "description": "Es sind zusätzliche Maßnahmen erforderlich, um die Ursache der Beschwerden zu klären.", "result": "Es wurden weitere diagnostische Maßnahmen eingeleitet, um die genaue Ursache der Beschwerden zu identifizieren. Der Patient wird über die geplanten Untersuchungen informiert."} +{"category": "Klinische Visite", "description": "Der Patient wurde heute für die regelmäßige klinische Visite vorgestellt.", "result": "Während der Visite wurden die vitalen Parameter überprüft, und es wurden keine auffälligen Veränderungen festgestellt. Der Patient berichtet über eine stabile gesundheitliche Verfassung."} +{"category": "Laborabnahme", "description": "Es ist eine umfassende Blutuntersuchung erforderlich, um spezifische Laborwerte zu überprüfen.", "result": "Die Blutentnahme wurde durchgeführt, und die Proben wurden zur Analyse ins Labor geschickt. Die Ergebnisse werden zeitnah erwartet."} +{"category": "Medikationsumstellung", "description": "Die Medikation wurde angepasst, um mögliche Nebenwirkungen zu minimieren.", "result": "Die Anpassung der Medikation erfolgte entsprechend den aktuellen Gesundheitsparametern des Patienten. Die Reaktion wird aufmerksam überwacht, und weitere Anpassungen können bei Bedarf vorgenommen werden."} +{"category": "Untersuchungen", "description": "Es ist eine Ultraschalluntersuchung des Bauchraums geplant.", "result": "Die Ultraschalluntersuchung wurde erfolgreich durchgeführt, um den Bauchraum zu überprüfen. Es wurden keine pathologischen Befunde festgestellt."} +{"category": "Medikationsumstellung", "description": "Es wurde eine Anpassung der Medikation vorgenommen, um die Therapieeffizienz zu steigern.", "result": "Die Medikationsanpassung wurde erfolgreich umgesetzt. Der Patient wird auf mögliche Nebenwirkungen überwacht, und entsprechende Maßnahmen werden ergriffen, um eventuelle Komplikationen zu verhindern."} +{"category": "Klinische Visite", "description": "Der Patient wurde aufgrund akuter Beschwerden klinisch untersucht.", "result": "Bei der klinischen Visite wurden spezifische Symptome des Patienten eingehend untersucht. Der Arzt hat eine vorläufige Diagnose gestellt und weitere diagnostische Maßnahmen veranlasst."} +{"category": "Laborabnahme", "description": "Es wurde eine Blutuntersuchung angeordnet, um spezifische Laborwerte zu überprüfen.", "result": "Die Blutabnahme wurde durchgeführt, und die Proben werden für verschiedene Laboranalysen vorbereitet. Die Ergebnisse werden dem Patienten in Kürze mitgeteilt."} diff --git a/tests/helpers/reset-db.ts b/tests/helpers/reset-db.ts index 3461dae..e3b710e 100644 --- a/tests/helpers/reset-db.ts +++ b/tests/helpers/reset-db.ts @@ -1,7 +1,5 @@ -import { PrismaClient } from "@prisma/client"; -import { CATEGORIES } from "./testdata"; - -const prisma = new PrismaClient(); +import { prisma } from "$lib/server/prisma"; +import { CATEGORIES, STATIONS } from "./testdata"; export default async () => { await prisma.$transaction([ @@ -21,12 +19,7 @@ export default async () => { ], }), prisma.category.createMany({ data: CATEGORIES }), - prisma.station.createMany({ - data: [ - { id: 1, name: "S1" }, - { id: 2, name: "S2" }, - ], - }), + prisma.station.createMany({ data: STATIONS }), prisma.room.createMany({ data: [ { id: 1, name: "R1.1", station_id: 1 }, @@ -42,12 +35,16 @@ export default async () => { ], }), prisma.$executeRaw`alter sequence users_id_seq restart with 3`, - prisma.$executeRaw`alter sequence categories_id_seq restart with 7`, - prisma.$executeRaw`alter sequence stations_id_seq restart with 3`, - prisma.$executeRaw`alter sequence rooms_id_seq restart with 4`, - prisma.$executeRaw`alter sequence patients_id_seq restart with 4`, - prisma.$executeRaw`alter sequence entry_executions_id_seq restart with 1`, - prisma.$executeRaw`alter sequence entry_versions_id_seq restart with 1`, - prisma.$executeRaw`alter sequence entries_id_seq restart with 1`, + prisma.$executeRawUnsafe( + `alter sequence categories_id_seq restart with ${CATEGORIES.length + 1}` + ), + prisma.$executeRawUnsafe( + `alter sequence stations_id_seq restart with ${STATIONS.length + 1}` + ), + prisma.$executeRawUnsafe(`alter sequence rooms_id_seq restart with 4`), + prisma.$executeRawUnsafe(`alter sequence patients_id_seq restart with 4`), + prisma.$executeRawUnsafe(`alter sequence entry_executions_id_seq restart with 1`), + prisma.$executeRawUnsafe(`alter sequence entry_versions_id_seq restart with 1`), + prisma.$executeRawUnsafe(`alter sequence entries_id_seq restart with 1`), ]); }; diff --git a/tests/helpers/testdata.ts b/tests/helpers/testdata.ts index 3aa19b0..6288a8f 100644 --- a/tests/helpers/testdata.ts +++ b/tests/helpers/testdata.ts @@ -3,6 +3,8 @@ import type { Category, Station } from "$lib/shared/model"; export const S1: Station = { id: 1, name: "S1" }; export const S2: Station = { id: 2, name: "S2" }; +export const STATIONS: Station[] = [S1, S2]; + export const CATEGORIES: Category[] = [ { id: 1, diff --git a/tests/integration/query/entry.ts b/tests/integration/query/entry.ts index 001a312..f12694d 100644 --- a/tests/integration/query/entry.ts +++ b/tests/integration/query/entry.ts @@ -89,7 +89,7 @@ async function insertTestEntries() { // Update an entry await newEntryVersion(2, eId1, { category_id: 3, - text: "Hello World", + text: TEST_VERSION.text + "\n\n> Hello World", date: new Date(2024, 1, 1), priority: true, }); @@ -159,4 +159,10 @@ test("get entries", async () => { expect(entriesPrio.items).length(1); expect(entriesPrio.total).toBe(1); expect(entriesPrio.items[0].id).toBe(eId1); + + // Search + const entriesSearch = await getEntries({ filter: { search: "Blu" } }); + expect(entriesSearch.items).length(1); + expect(entriesSearch.total).toBe(1); + expect(entriesSearch.items[0].id).toBe(eId1); }); From 34bed279db404085de600af4aa2f610d0b3b4982 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 20 Jan 2024 17:34:08 +0100 Subject: [PATCH 3/3] feat: prevent entry version/execution conflicts --- src/lib/server/query/category.ts | 2 +- src/lib/server/query/entry.ts | 77 +++++++++++++++++++++++------ src/lib/server/query/mapping.ts | 3 +- src/lib/server/query/patient.ts | 2 +- src/lib/server/query/room.ts | 4 +- src/lib/server/query/util.test.ts | 2 +- src/lib/server/query/util.ts | 2 +- src/lib/shared/model/model.ts | 13 +++-- src/lib/shared/model/validation.ts | 18 +++++-- src/lib/shared/util/error.ts | 13 +++++ tests/integration/query/entry.ts | 79 ++++++++++++++++++++++++++++-- 11 files changed, 181 insertions(+), 34 deletions(-) create mode 100644 src/lib/shared/util/error.ts diff --git a/src/lib/server/query/category.ts b/src/lib/server/query/category.ts index 8190038..fe5a6f7 100644 --- a/src/lib/server/query/category.ts +++ b/src/lib/server/query/category.ts @@ -4,7 +4,7 @@ import { prisma } from "$lib/server/prisma"; export async function newCategory(category: CategoryNew): Promise { const data = ZCategoryNew.parse(category); - const created = await prisma.category.create({ data }); + const created = await prisma.category.create({ data, select: { id: true } }); return created.id; } diff --git a/src/lib/server/query/entry.ts b/src/lib/server/query/entry.ts index f918e05..2f6659c 100644 --- a/src/lib/server/query/entry.ts +++ b/src/lib/server/query/entry.ts @@ -12,6 +12,7 @@ import { ZEntryNew, ZEntryVersionNew, } from "$lib/shared/model/validation"; +import { ErrorConflict } from "$lib/shared/util/error"; import { mapEntry } from "./mapping"; import { QueryBuilder, parseSearchQuery } from "./util"; @@ -50,6 +51,7 @@ export async function newEntry(author_id: number, entry: EntryNew): Promise { const data = ZEntryVersionNew.parse(version); - const created = await prisma.entryVersion.create({ - data: { - entry_id, - author_id, - ...data, - }, + + return prisma.$transaction(async (tx) => { + const entry = await tx.entry.findUniqueOrThrow({ + where: { id: entry_id }, + include: { + EntryVersion: { + orderBy: { created_at: "desc" }, + take: 1, + }, + }, + }); + const cver = entry.EntryVersion[0]; + + // Check if the entry has been updated by someone else + if (data.old_version && (!cver || cver.id !== data.old_version)) { + throw new ErrorConflict("old version id does not match"); + } + + const created = await tx.entryVersion.create({ + data: { + // Old version + entry_id, + author_id, + text: data.text || cver.text, + date: data.date || cver.date, + category_id: data.category_id || cver.category_id, + priority: data.priority || cver.priority, + }, + select: { id: true }, + }); + return created.id; }); - return created.id; } export async function newEntryExecution( @@ -76,14 +102,37 @@ export async function newEntryExecution( execution: EntryExecutionNew ): Promise { const data = ZEntryExecutionNew.parse(execution); - const created = await prisma.entryExecution.create({ - data: { - entry_id, - author_id, - ...data, - }, + + return prisma.$transaction(async (tx) => { + const entry = await tx.entry.findUniqueOrThrow({ + where: { id: entry_id }, + include: { + EntryExecution: { + orderBy: { created_at: "desc" }, + take: 1, + }, + }, + }); + const cex = entry.EntryExecution[0]; + + // Check if the execution has been updated by someone else + if ( + (data.old_execution && (!cex || cex.id !== data.old_execution)) || + (data.old_execution === null && cex) + ) { + throw new ErrorConflict("old execution id does not match"); + } + + const created = await prisma.entryExecution.create({ + data: { + entry_id, + author_id, + text: data.text, + }, + select: { id: true }, + }); + return created.id; }); - return created.id; } export async function getEntries(req: EntriesRequest): Promise> { diff --git a/src/lib/server/query/mapping.ts b/src/lib/server/query/mapping.ts index 39768c7..cd560e0 100644 --- a/src/lib/server/query/mapping.ts +++ b/src/lib/server/query/mapping.ts @@ -1,4 +1,5 @@ import type { Entry, Patient, User, UserTag, Room } from "$lib/shared/model"; +import { ErrorNotFound } from "$lib/shared/util/error"; import type { Patient as DbPatient, Room as DbRoom, @@ -55,7 +56,7 @@ export function mapEntry( } ): Entry { const v = entry.EntryVersion[0]; - if (!v) throw new Error("no version associated with that entry"); + if (!v) throw new ErrorNotFound("no version associated with that entry"); const x = entry.EntryExecution[0]; return { diff --git a/src/lib/server/query/patient.ts b/src/lib/server/query/patient.ts index 73bab04..44c4e53 100644 --- a/src/lib/server/query/patient.ts +++ b/src/lib/server/query/patient.ts @@ -12,7 +12,7 @@ import { convertFilterList } from "./util"; export async function newPatient(patient: PatientNew): Promise { const data = ZPatientNew.parse(patient); - const created = await prisma.patient.create({ data }); + const created = await prisma.patient.create({ data, select: { id: true } }); return created.id; } diff --git a/src/lib/server/query/room.ts b/src/lib/server/query/room.ts index 4b9478e..b3b62ff 100644 --- a/src/lib/server/query/room.ts +++ b/src/lib/server/query/room.ts @@ -5,7 +5,7 @@ import { mapRoom } from "./mapping"; export async function newStation(station: StationNew): Promise { const data = ZStationNew.parse(station); - const created = await prisma.station.create({ data }); + const created = await prisma.station.create({ data, select: { id: true } }); return created.id; } @@ -19,7 +19,7 @@ export async function getStations(): Promise { export async function newRoom(room: RoomNew): Promise { const data = ZRoomNew.parse(room); - const created = await prisma.room.create({ data }); + const created = await prisma.room.create({ data, select: { id: true } }); return created.id; } diff --git a/src/lib/server/query/util.test.ts b/src/lib/server/query/util.test.ts index e7a3d5b..03489e2 100644 --- a/src/lib/server/query/util.test.ts +++ b/src/lib/server/query/util.test.ts @@ -52,6 +52,6 @@ test("parse search query", () => { const term = parsed.toTsquery(); expect(term).toBe( - `''hello'' <-> ''world'' & ''banana'' & !''cherry'' & !(''b'' <-> ''x'' <-> ''y'') & ''vis'':*` + `'hello' <-> 'world' & 'banana' & !'cherry' & !('b' <-> 'x' <-> 'y') & 'vis':*` ); }); diff --git a/src/lib/server/query/util.ts b/src/lib/server/query/util.ts index 6095a34..0ace9d7 100644 --- a/src/lib/server/query/util.ts +++ b/src/lib/server/query/util.ts @@ -42,7 +42,7 @@ class SearchQueryComponent { let multipleParts = false; if (this.typ == QueryComponentType.Exact) { - const parts = this.word.split(" ").map((s) => `''${s}''`); + const parts = this.word.split(" ").map((s) => `'${s}'`); multipleParts = parts.length > 1; tsquery = parts.join(" <-> "); } else if (this.typ == QueryComponentType.Trailing) { diff --git a/src/lib/shared/model/model.ts b/src/lib/shared/model/model.ts index 83e6781..ebc9d6b 100644 --- a/src/lib/shared/model/model.ts +++ b/src/lib/shared/model/model.ts @@ -76,7 +76,7 @@ export type Entry = { export type EntryNew = { patient_id: number; - version: EntryVersionNew; + version: EntryVersionNdata; }; export type EntryVersion = { @@ -89,13 +89,18 @@ export type EntryVersion = { created_at: Date; }; -export type EntryVersionNew = { +export type EntryVersionNdata = { text: string; date: Date; category_id: Option; priority: boolean; }; +export type EntryVersionNew = Partial<{ + old_version: number; +}> & + Partial; + export type EntryExecution = { id: number; author: UserTag; @@ -103,6 +108,8 @@ export type EntryExecution = { created_at: Date; }; -export type EntryExecutionNew = { +export type EntryExecutionNew = Partial<{ + old_execution: number | null; +}> & { text: string; }; diff --git a/src/lib/shared/model/validation.ts b/src/lib/shared/model/validation.ts index a5b5705..0901551 100644 --- a/src/lib/shared/model/validation.ts +++ b/src/lib/shared/model/validation.ts @@ -4,6 +4,7 @@ import type { CategoryNew, EntryExecutionNew, EntryNew, + EntryVersionNdata, EntryVersionNew, PatientNew, RoomNew, @@ -39,17 +40,24 @@ export const ZPatientNew = implement().with({ }); export const ZEntryVersionNew = implement().with({ - text: ZTextString, - date: z.date(), - category_id: ZEntityId.nullable(), - priority: z.boolean(), + old_version: ZEntityId.optional(), + text: ZTextString.optional(), + date: z.date().optional(), + category_id: ZEntityId.optional().nullable(), + priority: z.boolean().optional(), }); export const ZEntryNew = implement().with({ patient_id: ZEntityId, - version: ZEntryVersionNew, + version: implement().with({ + text: ZTextString, + date: z.date(), + category_id: ZEntityId.nullable(), + priority: z.boolean(), + }), }); export const ZEntryExecutionNew = implement().with({ + old_execution: ZEntityId.optional().nullable(), text: ZTextString, }); diff --git a/src/lib/shared/util/error.ts b/src/lib/shared/util/error.ts new file mode 100644 index 0000000..35972c5 --- /dev/null +++ b/src/lib/shared/util/error.ts @@ -0,0 +1,13 @@ +export class ErrorConflict extends Error { + constructor(msg: string) { + super("conflict: " + msg); + Object.setPrototypeOf(this, ErrorConflict.prototype); + } +} + +export class ErrorNotFound extends Error { + constructor(msg: string) { + super(msg); + Object.setPrototypeOf(this, ErrorNotFound.prototype); + } +} diff --git a/tests/integration/query/entry.ts b/tests/integration/query/entry.ts index f12694d..941a83b 100644 --- a/tests/integration/query/entry.ts +++ b/tests/integration/query/entry.ts @@ -5,6 +5,7 @@ import { newEntryExecution, newEntryVersion, } from "$lib/server/query"; +import { ErrorConflict } from "$lib/shared/util/error"; import { expect, test } from "vitest"; const TEST_VERSION = { @@ -32,35 +33,103 @@ test("create entry", async () => { expect(entry.current_version.priority).toBe(TEST_VERSION.priority); }); -test("create extry version", async () => { +test("create entry version", async () => { const eId = await newEntry(1, { patient_id: 1, version: TEST_VERSION, }); const text = "10ml Blut abnehmen\n\nPS: Nadel nicht vergessen"; + const date = new Date(2024, 1, 2); await newEntryVersion(1, eId, { - ...TEST_VERSION, + date, + text, + category_id: 2, + priority: true, + }); + + const entry = await getEntry(eId); + expect(entry.current_version).toMatchObject({ + author: { id: 1 }, + date, + text, + category: { id: 2 }, + priority: true, + }); +}); + +test("create entry version (partial)", async () => { + const eId = await newEntry(1, { + patient_id: 1, + version: TEST_VERSION, + }); + const oldEntry = await getEntry(eId); + const text = "10ml Blut abnehmen\n\nPS: Nadel nicht vergessen"; + + await newEntryVersion(2, eId, { + old_version: oldEntry.current_version.id, text, }); const entry = await getEntry(eId); - expect(entry.current_version.text).toBe(text); + expect(entry.current_version).toMatchObject({ + author: { id: 2 }, + date: oldEntry.current_version.date, + text, + category: oldEntry.current_version.category, + priority: oldEntry.current_version.priority, + }); }); -test("create extry execution", async () => { +test("create entry version (wrong old vid)", async () => { + const eId = await newEntry(1, { + patient_id: 1, + version: TEST_VERSION, + }); +}); + +test("create entry execution", async () => { const eId = await newEntry(1, { patient_id: 1, version: TEST_VERSION, }); const text = "Blutabnahme erledigt."; - await newEntryExecution(1, eId, { text }); + const xId = await newEntryExecution(1, eId, { old_execution: null, text }); + const entry = await getEntry(eId); + expect(entry.execution?.id).toBe(xId); expect(entry.execution?.author.id).toBe(1); expect(entry.execution?.text).toBe(text); }); +test("create entry execution (update)", async () => { + const eId = await newEntry(1, { + patient_id: 1, + version: TEST_VERSION, + }); + + const x1 = await newEntryExecution(1, eId, { old_execution: null, text: "x1" }); + const x2 = await newEntryExecution(2, eId, { old_execution: x1, text: "x2" }); + + const entry = await getEntry(eId); + expect(entry.execution?.id).toBe(x2); + expect(entry.execution?.text).toBe("x2"); + expect(entry.execution?.author.id).toBe(2); +}); + +test("create entry execution (wrong old xid)", async () => { + const eId = await newEntry(1, { + patient_id: 1, + version: TEST_VERSION, + }); + const x1 = await newEntryExecution(1, eId, { old_execution: null, text: "x1" }); + + expect(async () => + newEntryExecution(1, eId, { old_execution: x1 + 1, text: "x2" }) + ).rejects.toThrowError(new ErrorConflict("old execution id does not match")); +}); + async function insertTestEntries() { // Create some entries const eId1 = await newEntry(1, {