This commit is contained in:
MaKarin
2026-04-04 20:37:56 +03:00
parent 698bc64d41
commit 05946a51b5
6 changed files with 72 additions and 44 deletions

View File

@@ -1,4 +1,4 @@
FROM node:20-alpine AS build FROM node:20-bookworm-slim AS build
WORKDIR /app WORKDIR /app

View File

@@ -54,6 +54,26 @@ function appendSearchParam(
searchParams.append(key, String(value)); searchParams.append(key, String(value));
} }
function parseListBody(json: unknown): { rows: unknown[]; totalHint?: number } {
if (Array.isArray(json)) {
return { rows: json };
}
if (
json !== null &&
typeof json === "object" &&
"data" in json &&
Array.isArray((json as { data: unknown }).data)
) {
const body = json as { data: unknown[]; total?: unknown };
const totalHint =
typeof body.total === "number" && Number.isFinite(body.total)
? body.total
: undefined;
return { rows: body.data, totalHint };
}
return { rows: [] };
}
function buildListUrl(resource: string, params: any): string { function buildListUrl(resource: string, params: any): string {
const resourcePath = resource === "equipment" ? "equipments" : resource; const resourcePath = resource === "equipment" ? "equipments" : resource;
const searchParams = new URLSearchParams(); const searchParams = new URLSearchParams();
@@ -83,16 +103,16 @@ export const dataProvider: DataProvider = {
return { data: [json], total: 1 }; return { data: [json], total: 1 };
} }
const { json, headers } = await fetchJson(buildListUrl(resource, params)); const { json, headers } = await fetchJson(buildListUrl(resource, params));
const { rows, totalHint } = parseListBody(json);
const contentRange = headers.get("Content-Range"); const contentRange = headers.get("Content-Range");
const total = contentRange const total = contentRange
? Number( ? Number(
contentRange.split("/").pop() ?? contentRange.split("/").pop() ??
(Array.isArray(json) ? json.length : 0), totalHint ??
rows.length,
) )
: Array.isArray(json) : (totalHint ?? rows.length);
? json.length return { data: rows as any[], total };
: 0;
return { data: Array.isArray(json) ? json : [], total };
}, },
getOne: async (resource, params) => { getOne: async (resource, params) => {
const resourcePath = resource === "equipment" ? "equipments" : resource; const resourcePath = resource === "equipment" ? "equipments" : resource;

View File

@@ -7,28 +7,35 @@ export const equipmentStatusChoices = [
export const laborOperationChoices = ["Manual", "MachineManual", "Machine"].map( export const laborOperationChoices = ["Manual", "MachineManual", "Machine"].map(
(value) => ({ id: value, name: value }), (value) => ({ id: value, name: value }),
); );
/** id = Prisma/API wire value; name = human label (matches DB enum @map). */
export const periodicityChoices = [ export const periodicityChoices = [
"Ежедневное", { id: "EZHEDNEVNOE", name: "Ежедневное" },
"Еженедельное", { id: "EZHENEDELNOE", name: "Еженедельное" },
"Ежемесячное", { id: "EZHEMESYACHNOE", name: "Ежемесячное" },
"Полугодовое", { id: "POLUGODOVOE", name: "Полугодовое" },
"Годовое", { id: "GODOVOE", name: "Годовое" },
].map((value) => ({ id: value, name: value })); ];
export const roleChoices = ["Исполнитель", "Подписант", "Пользователь"].map(
(value) => ({ id: value, name: value }), export const roleChoices = [
); { id: "ISPOLNITEL", name: "Исполнитель" },
{ id: "PODPISANT", name: "Подписант" },
{ id: "POLZOVATEL", name: "Пользователь" },
];
export const categoryPartChoices = [ export const categoryPartChoices = [
"Расходник", { id: "RASKHODNIK", name: "Расходник" },
"Запчасть", { id: "ZAPCHAST", name: "Запчасть" },
"Инструмент", { id: "INSTRUMENT", name: "Инструмент" },
"Спецодежда", { id: "SPETSODEZHDA", name: "Спецодежда" },
].map((value) => ({ id: value, name: value })); ];
export const equipmentTypeChoices = [ export const equipmentTypeChoices = [
"Производственное", { id: "PROIZVODSTVENNOE", name: "Производственное" },
"Энергетическое", { id: "ENERGETICHESKOE", name: "Энергетическое" },
"Насосное", { id: "NASOSNOE", name: "Насосное" },
"Компрессорное", { id: "KOMPRESSORNOE", name: "Компрессорное" },
].map((value) => ({ id: value, name: value })); ];
export const equipmentOptionText = ( export const equipmentOptionText = (
record?: Record<string, unknown> | null, record?: Record<string, unknown> | null,

View File

@@ -12,7 +12,7 @@ fi
export PRISMA_HIDE_UPDATE_MESSAGE=1 export PRISMA_HIDE_UPDATE_MESSAGE=1
run_migrate() { run_migrate() {
"$PRISMA_BIN" migrate deploy --schema "$SCHEMA" --skip-generate "$PRISMA_BIN" migrate deploy --schema "$SCHEMA"
} }
echo "Applying database migrations (schema=$SCHEMA)..." echo "Applying database migrations (schema=$SCHEMA)..."
@@ -38,4 +38,4 @@ while [ "$i" -lt 15 ]; do
done done
echo "Starting NestJS..." echo "Starting NestJS..."
exec node dist/main.js exec node dist/src/main.js

View File

@@ -11,7 +11,7 @@
"start": "nest start", "start": "nest start",
"start:dev": "nest start --watch", "start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch", "start:debug": "nest start --debug --watch",
"start:prod": "node dist/main", "start:prod": "node dist/src/main.js",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest", "test": "jest",
"test:watch": "jest --watch", "test:watch": "jest --watch",

View File

@@ -11,30 +11,31 @@ export enum laborOperation {
Machine = 'Machine', Machine = 'Machine',
} }
/** Values must match Prisma `$Enums` (schema variant names), not DB @map labels. */
export enum EnumPeriodicityTO { export enum EnumPeriodicityTO {
EZHEDNEVNOE = 'Ежедневное', EZHEDNEVNOE = 'EZHEDNEVNOE',
EZHENEDELNOE = 'Еженедельное', EZHENEDELNOE = 'EZHENEDELNOE',
EZHEMESYACHNOE = 'Ежемесячное', EZHEMESYACHNOE = 'EZHEMESYACHNOE',
POLUGODOVOE = 'Полугодовое', POLUGODOVOE = 'POLUGODOVOE',
GODOVOE = 'Годовое', GODOVOE = 'GODOVOE',
} }
export enum Role { export enum Role {
ISPOLNITEL = 'Исполнитель', ISPOLNITEL = 'ISPOLNITEL',
PODPISANT = 'Подписант', PODPISANT = 'PODPISANT',
POLZOVATEL = 'Пользователь', POLZOVATEL = 'POLZOVATEL',
} }
export enum CategoryPart { export enum CategoryPart {
RASKHODNIK = 'Расходник', RASKHODNIK = 'RASKHODNIK',
ZAPCHAST = 'Запчасть', ZAPCHAST = 'ZAPCHAST',
INSTRUMENT = 'Инструмент', INSTRUMENT = 'INSTRUMENT',
SPETSODEZHDA = 'Спецодежда', SPETSODEZHDA = 'SPETSODEZHDA',
} }
export enum EquipmentType { export enum EquipmentType {
PROIZVODSTVENNOE = 'Производственное', PROIZVODSTVENNOE = 'PROIZVODSTVENNOE',
ENERGETICHESKOE = 'Энергетическое', ENERGETICHESKOE = 'ENERGETICHESKOE',
NASOSNOE = 'Насосное', NASOSNOE = 'NASOSNOE',
KOMPRESSORNOE = 'Компрессорное', KOMPRESSORNOE = 'KOMPRESSORNOE',
} }