upd
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -25,6 +25,7 @@ yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
|
||||
@@ -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=="],
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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],
|
||||
}),
|
||||
}));
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 }) => ({
|
||||
|
||||
@@ -20,5 +20,4 @@ export const companiesRelations = relations(companiesTable, ({ many }) => ({
|
||||
users: many(usersTable),
|
||||
servers: many(serversTable),
|
||||
apps: many(appsTable),
|
||||
// actions: many(actionsTable),
|
||||
}));
|
||||
|
||||
@@ -5,5 +5,4 @@ export * from "./servers";
|
||||
export * from "./sessions";
|
||||
export * from "./clients";
|
||||
export * from "./apps";
|
||||
export * from "./actions";
|
||||
export * from "./comments";
|
||||
|
||||
@@ -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 }) => ({
|
||||
|
||||
@@ -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),
|
||||
}));
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user