From bc36a84d1a3cb378251db593f489a403d1e1f3eb Mon Sep 17 00:00:00 2001 From: Lanskikh Date: Tue, 22 Jul 2025 18:12:28 +0500 Subject: [PATCH] session summary endpoint --- bun.lock | 3 ++ package.json | 1 + src/controllers/sessionsController.ts | 43 +++++++++++++++++++++++---- src/db/schema/sessions.ts | 4 +++ src/types/summary.ts | 14 +++++++++ 5 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 src/types/summary.ts diff --git a/bun.lock b/bun.lock index a434e5f..0e5561e 100644 --- a/bun.lock +++ b/bun.lock @@ -12,6 +12,7 @@ "elysia": "^1.3.5", "got": "^14.4.7", "jose": "^6.0.10", + "marked": "^16.1.1", "node-cron": "^4.1.0", "postgres": "^3.4.5", }, @@ -188,6 +189,8 @@ "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], + "marked": ["marked@16.1.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ=="], + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], diff --git a/package.json b/package.json index 17e2dd0..6ab4b4f 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "elysia": "^1.3.5", "got": "^14.4.7", "jose": "^6.0.10", + "marked": "^16.1.1", "node-cron": "^4.1.0", "postgres": "^3.4.5" }, diff --git a/src/controllers/sessionsController.ts b/src/controllers/sessionsController.ts index 8e1835a..b894a12 100644 --- a/src/controllers/sessionsController.ts +++ b/src/controllers/sessionsController.ts @@ -7,8 +7,41 @@ import db from "../db"; import { eq } from "drizzle-orm"; import { sessionsTable } from "../db/schema/sessions"; import getCount from "../services/sessions/getCountSessions"; +import { marked, type Tokens } from "marked"; const sessionsController = new Elysia({ prefix: "/sessions" }) + .put('/summary/:id', async ({ body: { summary, ...metriks }, params: { id } }) => { + const paragraphes = marked.lexer(summary).filter(token => token.type === 'paragraph') as Tokens.Paragraph[] + const lists = marked.lexer(summary).filter(token => token.type === 'list') as Tokens.List[] + + const introduction = paragraphes[0].text + const resume = lists[0].raw + const goal = lists[1].items.map(item => item.raw) + const presentation = lists[2].items.map(item => item.raw) + const finance = lists[3].items.map(item => item.raw) + const discussionTone = lists[4].raw + const questions = lists[5].items.map(item => item.text) + const nextSteps = lists[6].raw + const conclusion = paragraphes[1].text + + try { + const [session] = await db.update(sessionsTable).set({ summary: { ...metriks, introduction, resume, goal, presentation, finance, discussionTone, questions, nextSteps, conclusion } }).where(eq(sessionsTable.id, id)).returning() + return session + } catch (error) { + console.log((error as Error).message) + return status(500, "Internal Server Error") + } + }, { + body: t.Object({ + efficiency: t.Number(), + duration: t.Number(), + budget: t.Number(), + summary: t.String() + }), + params: t.Object({ + id: t.String(), + }) + }) .use(authMiddleware) .get("/", ({ auth, query }) => getSessions(auth, query), { query: t.Partial( @@ -75,11 +108,11 @@ const sessionsController = new Elysia({ prefix: "/sessions" }) updateSession( params.id, body.status as - | "starting" - | "started" - | "restarting" - | "ending" - | "ended" + | "starting" + | "started" + | "restarting" + | "ending" + | "ended" ), { params: t.Object({ diff --git a/src/db/schema/sessions.ts b/src/db/schema/sessions.ts index bb114bf..4a03155 100644 --- a/src/db/schema/sessions.ts +++ b/src/db/schema/sessions.ts @@ -5,6 +5,8 @@ import { varchar, uniqueIndex, integer, + text, + json, } from "drizzle-orm/pg-core"; import { companiesTable } from "./companies"; import { managersTable } from "./managers"; @@ -14,6 +16,7 @@ import { clientsTable } from "./clients"; import { appsTable } from "./apps"; import { sql } from "drizzle-orm"; import { commentsTable } from "./comments"; +import type { Summary } from "../../types/summary"; export const sessionsTable = pgTable( "sessions", @@ -25,6 +28,7 @@ export const sessionsTable = pgTable( .notNull() .default("starting"), pid: integer("pid"), + summary: json("summary").$type(), appId: uuid("app_id") .notNull() .references(() => appsTable.id, { onDelete: "cascade" }), diff --git a/src/types/summary.ts b/src/types/summary.ts new file mode 100644 index 0000000..dbecd15 --- /dev/null +++ b/src/types/summary.ts @@ -0,0 +1,14 @@ +export interface Summary { + efficiency: number; + duration: number; + budget: number; + introduction: string; + resume: string; + goal: string[]; + presentation: string[]; + finance: string[]; + discussionTone: string + questions: string[]; + nextSteps: string; + conclusion: string; +} \ No newline at end of file