From 67f6283ea4fe50cf2acde81353a87ede51c6d324 Mon Sep 17 00:00:00 2001 From: Lanskikh Date: Tue, 17 Jun 2025 12:27:30 +0500 Subject: [PATCH] upd --- .env | 2 +- .gitignore | 1 + bun.lock | 3 ++ package.json | 1 + src/db/schema/actions.ts | 25 ---------- src/db/schema/apps.ts | 55 ++++++++++++++------- src/db/schema/clients.ts | 4 +- src/db/schema/comments.ts | 8 ++-- src/db/schema/companies.ts | 1 - src/db/schema/index.ts | 1 - src/db/schema/servers.ts | 17 +++---- src/db/schema/sessions.ts | 14 +++--- src/db/schema/users.ts | 5 +- src/index.ts | 97 +++++++++++++++++++++++++++----------- 14 files changed, 141 insertions(+), 93 deletions(-) delete mode 100644 src/db/schema/actions.ts diff --git a/.env b/.env index ef146b6..6c40c06 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ PORT=3001 DB_URL=postgres://postgres:v1sq3vD5faXL@194.26.138.94:5432/mate HMAC_SECRET=9a9ccda5db157ccfd04b4094264c55f58097f85d1fd6c22fbab0a86680dd3efd -API_URL=http://192.168.1.170:3000 +API_URL=http://192.168.1.122:3000 COMPANY_ID=2a4f54db-7a1f-42c2-a965-3b185d92b063 diff --git a/.gitignore b/.gitignore index 6ca856c..4ca63df 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ yarn-debug.log* yarn-error.log* # local env files +.env .env.local .env.development.local .env.test.local diff --git a/bun.lock b/bun.lock index 97935b4..ac5616e 100644 --- a/bun.lock +++ b/bun.lock @@ -6,6 +6,7 @@ "dependencies": { "@types/node-cron": "^3.0.11", "cron": "^4.1.0", + "date-fns": "^4.1.0", "drizzle-orm": "^0.40.0", "got": "^14.4.6", "jose": "^6.0.10", @@ -110,6 +111,8 @@ "cron": ["cron@4.1.0", "", { "dependencies": { "@types/luxon": "~3.4.0", "luxon": "~3.5.0" } }, "sha512-wmcuXr2qP0UZStYgwruG6jC2AYSO9n5VMm2t93hmcEXEjWY3S2bsXe3sfGUrTs/uQ1AvRCrZ0Pp9Q032L/V9tw=="], + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], diff --git a/package.json b/package.json index 334c768..6a5674d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dependencies": { "@types/node-cron": "^3.0.11", "cron": "^4.1.0", + "date-fns": "^4.1.0", "drizzle-orm": "^0.40.0", "got": "^14.4.6", "jose": "^6.0.10", diff --git a/src/db/schema/actions.ts b/src/db/schema/actions.ts deleted file mode 100644 index f2d9525..0000000 --- a/src/db/schema/actions.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { pgTable, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; -import { serversTable } from "./servers"; -import { relations } from "drizzle-orm"; - -export const actionsTable = pgTable("actions", { - id: uuid("id").defaultRandom().primaryKey(), - name: varchar("name").notNull(), - serverId: uuid("server_id") - .notNull() - .references(() => serversTable.id), - createdAt: timestamp("created_at", { withTimezone: true }) - .notNull() - .defaultNow(), - updatedAt: timestamp("updated_at", { withTimezone: true }) - .notNull() - .defaultNow() - .$onUpdate(() => new Date()), -}); - -export const actionsRelations = relations(actionsTable, ({ one }) => ({ - server: one(serversTable, { - fields: [actionsTable.serverId], - references: [serversTable.id], - }), -})); diff --git a/src/db/schema/apps.ts b/src/db/schema/apps.ts index bebe427..86d78d5 100644 --- a/src/db/schema/apps.ts +++ b/src/db/schema/apps.ts @@ -1,26 +1,49 @@ -import { pgTable, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; +import { + pgTable, + timestamp, + uniqueIndex, + uuid, + varchar, +} from "drizzle-orm/pg-core"; import { companiesTable } from "./companies"; import { relations } from "drizzle-orm"; +import { serversTable } from "./servers"; -export const appsTable = pgTable("apps", { - id: uuid("id").defaultRandom().primaryKey(), - name: varchar("name").notNull(), - fileName: varchar("filename").notNull(), - companyId: uuid("company_id") - .notNull() - .references(() => companiesTable.id), - createdAt: timestamp("created_at", { withTimezone: true }) - .notNull() - .defaultNow(), - updatedAt: timestamp("updated_at", { withTimezone: true }) - .notNull() - .defaultNow() - .$onUpdate(() => new Date()), -}); +export const appsTable = pgTable( + "apps", + { + id: uuid("id").defaultRandom().primaryKey(), + name: varchar("name").notNull(), + fileName: varchar("filename").notNull(), + serverId: uuid("server_id") + .notNull() + .references(() => serversTable.id, { onDelete: "cascade" }), + companyId: uuid("company_id") + .notNull() + .references(() => companiesTable.id, { onDelete: "cascade" }), + createdAt: timestamp("created_at", { withTimezone: true }) + .notNull() + .defaultNow(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .notNull() + .defaultNow() + .$onUpdate(() => new Date()), + }, + (table) => ({ + uniqueFileNameServerId: uniqueIndex("unique_file_name_server_id").on( + table.fileName, + table.serverId + ), + }) +); export const appsRelations = relations(appsTable, ({ one }) => ({ company: one(companiesTable, { fields: [appsTable.companyId], references: [companiesTable.id], }), + server: one(serversTable, { + fields: [appsTable.serverId], + references: [serversTable.id], + }), })); diff --git a/src/db/schema/clients.ts b/src/db/schema/clients.ts index 98662a9..59a82da 100644 --- a/src/db/schema/clients.ts +++ b/src/db/schema/clients.ts @@ -11,10 +11,10 @@ export const clientsTable = pgTable("clients", { email: varchar("email"), ownerId: uuid("owner_id") .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: "cascade" }), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), diff --git a/src/db/schema/comments.ts b/src/db/schema/comments.ts index 1d3c47e..b2ce13f 100644 --- a/src/db/schema/comments.ts +++ b/src/db/schema/comments.ts @@ -1,19 +1,19 @@ -import { pgTable, serial, text, timestamp, uuid } from "drizzle-orm/pg-core"; +import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core"; import { usersTable } from "./users"; import { sessionsTable } from "./sessions"; import { relations } from "drizzle-orm"; export const commentsTable = pgTable("comments", { - id: serial("id").primaryKey(), + id: uuid("id").defaultRandom().primaryKey(), text: text("text").notNull(), createdAt: timestamp("created_at").notNull().defaultNow(), updatedAt: timestamp("updated_at").notNull().defaultNow(), ownerId: uuid("owner_id") .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: "cascade" }), sessionId: uuid("session_id") .notNull() - .references(() => sessionsTable.id), + .references(() => sessionsTable.id, { onDelete: "cascade" }), }); export const commentsRelations = relations(commentsTable, ({ one }) => ({ diff --git a/src/db/schema/companies.ts b/src/db/schema/companies.ts index b475dac..10b7840 100644 --- a/src/db/schema/companies.ts +++ b/src/db/schema/companies.ts @@ -20,5 +20,4 @@ export const companiesRelations = relations(companiesTable, ({ many }) => ({ users: many(usersTable), servers: many(serversTable), apps: many(appsTable), - // actions: many(actionsTable), })); diff --git a/src/db/schema/index.ts b/src/db/schema/index.ts index 84efe89..44967f9 100644 --- a/src/db/schema/index.ts +++ b/src/db/schema/index.ts @@ -5,5 +5,4 @@ export * from "./servers"; export * from "./sessions"; export * from "./clients"; export * from "./apps"; -export * from "./actions"; export * from "./comments"; diff --git a/src/db/schema/servers.ts b/src/db/schema/servers.ts index 0e776ed..f2c71fd 100644 --- a/src/db/schema/servers.ts +++ b/src/db/schema/servers.ts @@ -1,4 +1,4 @@ -import { pgTable, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; +import { pgTable, timestamp, uuid, varchar, inet } from "drizzle-orm/pg-core"; import { companiesTable } from "./companies"; import { relations } from "drizzle-orm"; import { sessionsTable } from "./sessions"; @@ -6,12 +6,14 @@ import { appsTable } from "./apps"; export const serversTable = pgTable("servers", { id: uuid("id").primaryKey().defaultRandom(), - hostname: varchar("hostname", { length: 15 }).unique().notNull(), - name: varchar("name").notNull(), - location: varchar("location").notNull(), + hostname: varchar("hostname", { length: 15 }).notNull(), + name: varchar("name").notNull().default("Новый стол"), + description: varchar("description").notNull(), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { + onDelete: "cascade", + }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), @@ -19,9 +21,8 @@ export const serversTable = pgTable("servers", { .notNull() .defaultNow() .$onUpdate(() => new Date()), - status: varchar("status", { enum: ["online", "offline"] }) - .notNull() - .default("online"), + status: varchar("status", { enum: ["online", "offline"] }).default("online"), + ipAddress: inet("ip_address"), }); export const serversRelations = relations(serversTable, ({ one, many }) => ({ diff --git a/src/db/schema/sessions.ts b/src/db/schema/sessions.ts index 785931b..8d9f06f 100644 --- a/src/db/schema/sessions.ts +++ b/src/db/schema/sessions.ts @@ -13,6 +13,7 @@ import { serversTable } from "./servers"; import { clientsTable } from "./clients"; import { appsTable } from "./apps"; import { sql } from "drizzle-orm"; +import { commentsTable } from "./comments"; export const sessionsTable = pgTable( "sessions", @@ -26,19 +27,19 @@ export const sessionsTable = pgTable( pid: integer("pid"), appId: uuid("app_id") .notNull() - .references(() => appsTable.id), + .references(() => appsTable.id, { onDelete: "cascade" }), ownerId: uuid("owner_id") .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: "cascade" }), serverId: uuid("server_id") .notNull() - .references(() => serversTable.id), + .references(() => serversTable.id, { onDelete: "cascade" }), clientId: uuid("client_id") .notNull() - .references(() => clientsTable.id), + .references(() => clientsTable.id, { onDelete: "cascade" }), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), @@ -54,7 +55,7 @@ export const sessionsTable = pgTable( }) ); -export const sessionsRelations = relations(sessionsTable, ({ one }) => ({ +export const sessionsRelations = relations(sessionsTable, ({ one, many }) => ({ owner: one(usersTable, { fields: [sessionsTable.ownerId], references: [usersTable.id], @@ -75,4 +76,5 @@ export const sessionsRelations = relations(sessionsTable, ({ one }) => ({ fields: [sessionsTable.appId], references: [appsTable.id], }), + comments: many(commentsTable), })); diff --git a/src/db/schema/users.ts b/src/db/schema/users.ts index ce0999f..456499d 100644 --- a/src/db/schema/users.ts +++ b/src/db/schema/users.ts @@ -2,16 +2,16 @@ import { relations } from "drizzle-orm"; import { pgTable, text, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; import { tokensTable } from "./tokens"; import { companiesTable } from "./companies"; +import { commentsTable } from "./comments"; export const usersTable = pgTable("users", { id: uuid("id").defaultRandom().primaryKey(), fullname: text("fullname"), email: varchar("email").unique().notNull(), password: varchar("password", { length: 72 }).notNull(), - // roles: text("roles").array().notNull(), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), @@ -27,4 +27,5 @@ export const usersRelations = relations(usersTable, ({ one, many }) => ({ references: [companiesTable.id], }), tokens: many(tokensTable), + comments: many(commentsTable), })); diff --git a/src/index.ts b/src/index.ts index dbc7aec..671aaa1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ -import { serve } from "bun"; +import { format } from "date-fns"; +import { file, serve } from "bun"; import db from "./db"; import { serversTable, sessionsTable } from "./db/schema"; import { and, desc, eq, or } from "drizzle-orm"; @@ -23,11 +24,17 @@ type Session = typeof sessionsTable.$inferSelect & { const hostname = os.hostname(); +const ipAddress = os + .networkInterfaces() + ["Ethernet"]?.find((e) => e.family === "IPv4")?.address; + +console.log(ipAddress); + const json = { hostname, - name: "Новый стол", - location: "В переговорке", + description: "В переговорке", companyId: process.env.COMPANY_ID, + ipAddress, }; const signature = createHmac("sha256", process.env.HMAC_SECRET) @@ -49,14 +56,10 @@ try { await createServer(); console.log("Server created"); } catch (error) { - // console.log((error as HTTPError).response.body); + console.log((error as Error).message); } -// TODO: -// - получать список приложений -// - отправить список приложений на сервер - -let serverInfo; +let serverInfo: typeof serversTable.$inferSelect | undefined; try { serverInfo = await getServerInfo(); @@ -71,11 +74,14 @@ async function getServerInfo() { }); return serverInfo; - } catch (error) {} + } catch (error) { + console.log((error as Error).message); + } } async function addApps() { try { + if (!serverInfo) return; const apps = readdirSync("C:/apps"); const json = { @@ -234,23 +240,60 @@ cron.schedule("*/10 * * * * *", updateStatus); serve({ port: process.env["PORT"], - fetch: () => new Response("Hello World"), + routes: { + "/files/:appName/:timestamp": async ({ + params: { appName, timestamp }, + }) => { + try { + const files = readdirSync( + `C://Users/User/Documents/${appName}ClientData/${format( + +timestamp, + "dd-MM-yyyy_HH-mm" + )}` + ); + + return Response.json( + files.map((filename) => { + const sizeBytes = file( + `C://Users/User/Documents/${appName}ClientData/${format( + +timestamp, + "dd-MM-yyyy_HH-mm" + )}/${filename}` + ).size; + let sizeStr = ""; + if (sizeBytes >= 1024 * 1024) { + sizeStr = (sizeBytes / 1024 / 1024).toFixed(2) + " MB"; + } else { + sizeStr = (sizeBytes / 1024).toFixed(2) + " KB"; + } + return { + filename, + size: sizeStr, + }; + }) + ); + } catch (error) { + return Response.json([]); + } + }, + "/files/:appName/:timestamp/:fileName": async ({ + params: { appName, timestamp, fileName }, + }) => { + try { + return new Response( + file( + `C://Users/User/Documents/${appName}ClientData/${format( + +timestamp, + "dd-MM-yyyy_HH-mm" + )}/${fileName}` + ) + ); + } catch (error) { + return Response.json("..."); + } + }, + }, + fetch: () => new Response("venom"), }); console.log("Server is running at http://localhost:3001"); - -// let count = 0; - -// function test() { -// if (!(count % 100)) { -// console.log(count); -// } - -// count++; - -// setTimeout(() => { -// test(); -// }, 0); -// } - -// test();