diff --git a/client/.env b/client/.env index e69de29..cd41370 100644 --- a/client/.env +++ b/client/.env @@ -0,0 +1 @@ +VITE_API_URL=http://localhost:3000 \ No newline at end of file diff --git a/client/src/lib/api.ts b/client/src/lib/api.ts index 52dd4c8..64dc208 100644 --- a/client/src/lib/api.ts +++ b/client/src/lib/api.ts @@ -2,7 +2,7 @@ import ky from "ky"; // Базовый API клиент export const api = ky.create({ - prefixUrl: "http://localhost:3000", + prefixUrl: import.meta.env.VITE_API_URL, headers: { "Content-Type": "application/json", }, @@ -11,6 +11,7 @@ export const api = ky.create({ (request) => { // Автоматически добавляем токен из localStorage если есть const token = localStorage.getItem("authToken"); + if (token) { request.headers.set("Authorization", `Bearer ${token}`); } diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json index a9b5a59..564df6f 100644 --- a/client/tsconfig.app.json +++ b/client/tsconfig.app.json @@ -24,5 +24,5 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src", "vite-env.d.ts"] } diff --git a/client/vite-env.d.ts b/client/vite-env.d.ts new file mode 100644 index 0000000..29c29a1 --- /dev/null +++ b/client/vite-env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly VITE_API_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/server/src/db/schema/apps.ts b/server/src/db/schema/apps.ts index 1e0d5b2..de67984 100644 --- a/server/src/db/schema/apps.ts +++ b/server/src/db/schema/apps.ts @@ -15,8 +15,12 @@ export const apps = pgTable("apps", { title: varchar("title").notNull(), // Название приложения (например, "Майнкрафт") gpuLimitMb: integer("gpu_limit_mb"), // Лимит GPU в мегабайтах (только для stream серверов) psVersion: integer("ps_version"), // Версия Pixel Streaming (например, "1") - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at").defaultNow().notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), }); // Zod schemas for validation diff --git a/server/src/db/schema/branches.ts b/server/src/db/schema/branches.ts index 98b73be..9ba7911 100644 --- a/server/src/db/schema/branches.ts +++ b/server/src/db/schema/branches.ts @@ -11,8 +11,12 @@ export const branches = pgTable("branches", { address: varchar("address", { length: 500 }), city: varchar("city", { length: 100 }), country: varchar("country", { length: 100 }), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at").defaultNow().notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), }); // Zod schemas for validation diff --git a/server/src/db/schema/companies.ts b/server/src/db/schema/companies.ts index cbcf004..b234752 100644 --- a/server/src/db/schema/companies.ts +++ b/server/src/db/schema/companies.ts @@ -5,8 +5,12 @@ export const companies = pgTable("companies", { id: uuid("id").primaryKey().defaultRandom(), name: varchar("name", { length: 255 }).notNull(), description: varchar("description", { length: 1000 }), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at").defaultNow().notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), }); // Zod schemas for validation diff --git a/server/src/db/schema/serverSessions.ts b/server/src/db/schema/serverSessions.ts index 19fc4a5..576fab7 100644 --- a/server/src/db/schema/serverSessions.ts +++ b/server/src/db/schema/serverSessions.ts @@ -31,8 +31,12 @@ export const serverSessions = pgTable("server_sessions", { cirrusPid: integer("cirrus_pid"), mode: sessionModeEnum("mode").notNull(), // stream, local status: sessionStatusEnum("status").notNull(), // starting, started, ending, ended - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at").defaultNow().notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), }); // Relations diff --git a/server/src/db/schema/servers.ts b/server/src/db/schema/servers.ts index e82b6f0..4aa070e 100644 --- a/server/src/db/schema/servers.ts +++ b/server/src/db/schema/servers.ts @@ -1,7 +1,8 @@ -import { pgTable, uuid, varchar, pgEnum } from "drizzle-orm/pg-core"; +import { pgTable, uuid, varchar, pgEnum, timestamp } from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; import { serverSessions } from "./serverSessions"; +import { branches } from "./branches"; // Enums export const serverLocationEnum = pgEnum("server_location", ["ru1", "uae1"]); @@ -11,10 +12,17 @@ export const serverTierEnum = pgEnum("server_tier", ["demo", "prod"]); export const servers = pgTable("servers", { id: uuid("id").primaryKey().defaultRandom(), localIp: varchar("local_ip", { length: 45 }).notNull(), // IPv6 can be up to 45 chars - hostname: varchar("hostname").notNull(), + hostname: varchar("hostname").notNull(), // hostname сервера type: serverTypeEnum("type").notNull(), // stream, local + branchId: uuid("branch_id").references(() => branches.id), // филиал, на котором находится сервер (nullable для локальных серверов) location: serverLocationEnum("location"), // ru1, uae1 (только для stream) tier: serverTierEnum("tier"), // demo, prod (только для stream) + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .defaultNow() + .notNull(), }); // Zod schemas for validation diff --git a/server/src/db/schema/userBranches.ts b/server/src/db/schema/userBranches.ts index 56db018..0aeb861 100644 --- a/server/src/db/schema/userBranches.ts +++ b/server/src/db/schema/userBranches.ts @@ -14,7 +14,9 @@ export const userBranches = pgTable( branchId: uuid("branch_id") .notNull() .references(() => branches.id, { onDelete: "cascade" }), - createdAt: timestamp("created_at").defaultNow().notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), }, (table) => ({ pk: primaryKey({ columns: [table.userId, table.branchId] }),