This commit is contained in:
2025-06-17 12:27:30 +05:00
parent 050ba744c7
commit 67f6283ea4
14 changed files with 141 additions and 93 deletions
+1 -1
View File
@@ -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
+1
View File
@@ -25,6 +25,7 @@ yarn-debug.log*
yarn-error.log*
# local env files
.env
.env.local
.env.development.local
.env.test.local
+3
View File
@@ -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=="],
+1
View File
@@ -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",
-25
View File
@@ -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],
}),
}));
+39 -16
View File
@@ -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],
}),
}));
+2 -2
View File
@@ -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(),
+4 -4
View File
@@ -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 }) => ({
-1
View File
@@ -20,5 +20,4 @@ export const companiesRelations = relations(companiesTable, ({ many }) => ({
users: many(usersTable),
servers: many(serversTable),
apps: many(appsTable),
// actions: many(actionsTable),
}));
-1
View File
@@ -5,5 +5,4 @@ export * from "./servers";
export * from "./sessions";
export * from "./clients";
export * from "./apps";
export * from "./actions";
export * from "./comments";
+9 -8
View File
@@ -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 }) => ({
+8 -6
View File
@@ -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),
}));
+3 -2
View File
@@ -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),
}));
+70 -27
View File
@@ -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();