Variables

main
DenisN 2025-07-01 04:40:34 -04:00
parent 9b18bf46a6
commit 630f4f9658
16 changed files with 1716 additions and 1163 deletions

View File

@ -12,5 +12,4 @@ RUN npm run build
EXPOSE 9999 EXPOSE 9999
CMD ["npm", "run", "start:dev"] ENTRYPOINT ["node", "dist/main"]

View File

@ -20,44 +20,47 @@
"test:e2e": "jest --config ./test/jest-e2e.json" "test:e2e": "jest --config ./test/jest-e2e.json"
}, },
"dependencies": { "dependencies": {
"@nestjs/common": "^11.0.1", "@nestjs/common": "^11.1.3",
"@nestjs/core": "^11.0.1", "@nestjs/config": "^4.0.2",
"@nestjs/platform-express": "^11.0.1", "@nestjs/core": "^11.1.3",
"@nestjs/platform-express": "^11.1.3",
"axios": "1.8.4", "axios": "1.8.4",
"mathjs": "^14.4.0", "class-transformer": "^0.5.1",
"clickhouse": "^2.6.0",
"mathjs": "^14.5.2",
"module": "^1.2.5", "module": "^1.2.5",
"mqtt": "^5.10.4", "mqtt": "^5.13.1",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1", "rxjs": "^7.8.2",
"source-map-resolve": "0.6.0", "source-map-resolve": "0.6.0",
"source-map-url": "0.4.1" "source-map-url": "0.4.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.2.0", "@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.18.0", "@eslint/js": "^9.29.0",
"@nestjs/cli": "^11.0.0", "@nestjs/cli": "^11.0.7",
"@nestjs/schematics": "^11.0.0", "@nestjs/schematics": "^11.0.5",
"@nestjs/testing": "^11.0.1", "@nestjs/testing": "^11.1.3",
"@swc/cli": "^0.6.0", "@swc/cli": "^0.6.0",
"@swc/core": "^1.10.7", "@swc/core": "^1.12.6",
"@types/express": "^5.0.0", "@types/express": "^5.0.3",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.14",
"@types/node": "^22.10.7", "@types/node": "^22.15.33",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.3",
"eslint": "^9.18.0", "eslint": "^9.29.0",
"eslint-config-prettier": "^10.0.1", "eslint-config-prettier": "^10.1.5",
"eslint-plugin-prettier": "^5.2.2", "eslint-plugin-prettier": "^5.5.0",
"globals": "^16.0.0", "globals": "^16.2.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"prettier": "^3.4.2", "prettier": "^3.6.0",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"supertest": "^7.0.0", "supertest": "^7.1.1",
"ts-jest": "^29.2.5", "ts-jest": "^29.4.0",
"ts-loader": "^9.5.2", "ts-loader": "^9.5.2",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tsconfig-paths": "^4.2.0", "tsconfig-paths": "^4.2.0",
"typescript": "^5.7.3", "typescript": "^5.8.3",
"typescript-eslint": "^8.20.0" "typescript-eslint": "^8.35.0"
}, },
"jest": { "jest": {
"moduleFileExtensions": [ "moduleFileExtensions": [

File diff suppressed because it is too large Load Diff

2
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,2 @@
onlyBuiltDependencies:
- '@swc/core'

View File

@ -4,9 +4,13 @@ import { AppService } from './app.service';
import { ZvksmetricsModule } from './zvksmetrics/zvksmetrics.module'; import { ZvksmetricsModule } from './zvksmetrics/zvksmetrics.module';
import { GruberModule } from './gruber/gruber.module'; import { GruberModule } from './gruber/gruber.module';
import { DatabaseModule } from './database/database.module'; import { DatabaseModule } from './database/database.module';
import { ConfigModule } from '@nestjs/config';
@Module({ @Module({
imports: [ZvksmetricsModule, GruberModule, DatabaseModule], imports: [ZvksmetricsModule, GruberModule, DatabaseModule, ConfigModule.forRoot({
isGlobal: true,
envFilePath: './.env',
}),],
controllers: [AppController], controllers: [AppController],
providers: [AppService], providers: [AppService],
}) })

View File

@ -0,0 +1,7 @@
import { Module } from '@nestjs/common';
import { ClickhouseService } from './clickhouse.service';
@Module({
providers: [ClickhouseService]
})
export class ClickhouseModule {}

View File

@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ClickhouseService } from './clickhouse.service';
describe('ClickhouseService', () => {
let service: ClickhouseService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [ClickhouseService],
}).compile();
service = module.get<ClickhouseService>(ClickhouseService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,79 @@
import { Injectable } from '@nestjs/common';
import { ClickHouse } from 'clickhouse';
import { isInternalThread } from 'node:worker_threads';
@Injectable()
export class ClickhouseService {
async ClickHouseConnect(parameterBody: any): Promise<any> {
let variable = new ClickHouse({
// url: 'http://192.168.2.37',
// port: 8123,
url: DATABASE_NAME,
PORT: DATABASE_PORT,
debug: false,
basicAuth: {
username: 'root',
password: 'dbss',
},
isUseGzip: false,
trimQuery: false,
usePost: false,
format: "json", // "json" || "csv" || "tsv"
raw: false,
config: {
session_id: 'session_id if neeed',
session_timeout: 60,
output_format_json_quote_64bit_integers: 0,
enable_http_compression: 0,
database: 'zvks',
},
// This object merge with request params (see request lib docs)
// reqParams: {
// ...
// },
});
// let queries = [
// 'DROP TABLE IF EXISTS session_temp',
// `CREATE TABLE IF NOT EXISTS session_temp (
// id UInt128,
// body TEXT,
// ips Array(UInt32),
// ueries Nested (
// id UInt32,
// act String,
// uptime DateTime64
// ),
// create_date DateTime64,
// update_time DateTime64,
// ) ENGINE = MergeTree()
// PRIMARY KEY (id)`
// ];
let queries = [
`CREATE TABLE IF NOT EXISTS raw_parameters (
EventTimestamp DateTime64,
ParameterBody String,
CreateDate DateTime64,
) ENGINE = MergeTree()
PRIMARY KEY (EventTimestamp)`
];
let insertQuery = '\nINSERT INTO raw_parameters VALUES(toDateTime(now()), \'{{parameterBody}}\', toDateTime(now()));';
insertQuery = insertQuery.replace('{{parameterBody}}', parameterBody);
console.log(insertQuery);
// console.log(insertQuery);
queries.push(insertQuery);
for (let query of queries) {
let r = await variable.query(query).toPromise();
// console.log(query, r);
}
console.log(variable);
return variable;
}
}

View File

@ -1,4 +1,10 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { DatabaseService } from './database.service';
import { ClickhouseModule } from './clickhouse/clickhouse.module';
import { PostgresqlModule } from './postgresql/postgresql.module';
@Module({}) @Module({
providers: [DatabaseService],
imports: [ClickhouseModule, PostgresqlModule]
})
export class DatabaseModule {} export class DatabaseModule {}

View File

@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { DatabaseService } from './database.service';
describe('DatabaseService', () => {
let service: DatabaseService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [DatabaseService],
}).compile();
service = module.get<DatabaseService>(DatabaseService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,4 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class DatabaseService {}

View File

@ -0,0 +1,7 @@
import { Module } from '@nestjs/common';
import { PostgresqlService } from './postgresql.service';
@Module({
providers: [PostgresqlService]
})
export class PostgresqlModule {}

View File

@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PostgresqlService } from './postgresql.service';
describe('PostgresqlService', () => {
let service: PostgresqlService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [PostgresqlService],
}).compile();
service = module.get<PostgresqlService>(PostgresqlService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,4 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostgresqlService {}

View File

@ -12,7 +12,7 @@ export class ZvksmetricsController {
let sum: any = { value: (a + b) / 4 * b + a }; let sum: any = { value: (a + b) / 4 * b + a };
await this.metricsService.useStatusModel(inputMetrics); await this.metricsService.useStatusModel(inputMetrics);
// let a = await this.metricsService.showStatus(); // let a = await this.metricsService.showStatus();
// console.log(inputMetrics); console.log(inputMetrics);
return sum.value; return sum.value;
} }
@ -26,7 +26,7 @@ export class ZvksmetricsController {
return ret; return ret;
} }
//Заглушка для будующей API под граничные значения //Заглушка для будующей API под граничные значения
@Post('ranges/:code') @Post('ranges/:code')
async setRanges(@Body() inputRanges: any, @Param('code', ParseIntPipe) code: number): Promise<string> { async setRanges(@Body() inputRanges: any, @Param('code', ParseIntPipe) code: number): Promise<string> {
let ret: string = "Controller Error"; let ret: string = "Controller Error";
@ -48,8 +48,9 @@ export class ZvksmetricsController {
@Post('input') @Post('input')
async getPostMessage(@Body() inputMetrics: any): Promise<string> { async getPostMessage(@Body() inputMetrics: any): Promise<string> {
// console.log(inputMetrics); console.log(inputMetrics);
let out: any = await this.metricsService.useStatusModel(inputMetrics); let out: any = await this.metricsService.useStatusModel(inputMetrics);
return out; return out;
} }

View File

@ -3,7 +3,10 @@ import axios, { Axios, AxiosResponse } from 'axios';
import { readFile, writeFile } from 'node:fs/promises'; import { readFile, writeFile } from 'node:fs/promises';
import { response } from 'express'; import { response } from 'express';
import { json } from 'node:stream/consumers'; import { json } from 'node:stream/consumers';
import math, { create, all, evaluate, number, random, complex, string, SQRT1_2 } from 'mathjs' import math, { create, all, evaluate, number, random, complex, string, SQRT1_2 } from 'mathjs';
import { ClickhouseService } from 'src/database/clickhouse/clickhouse.service';
import { classToPlain } from 'class-transformer';
@Injectable() @Injectable()
@ -74,8 +77,13 @@ export class ZvksmetricsService {
// console.log(prev); // console.log(prev);
let intermediate = await this.getComplexMetricsValues(inp, prev, complex, model, scope); let intermediate = await this.getComplexMetricsValues(inp, prev, complex, model, scope);
console.log(intermediate); // console.log(intermediate);
let ctp: any = classToPlain(intermediate);
let parameterBody: string = JSON.stringify(ctp);
// console.log(parameterBody);
let abc = new ClickhouseService();
abc.ClickHouseConnect(parameterBody);
// const val = JSON.parse(JSON.stringify(model[0].values)); // const val = JSON.parse(JSON.stringify(model[0].values));
@ -118,16 +126,16 @@ export class ZvksmetricsService {
let length: number = complexCalc.length; let length: number = complexCalc.length;
let metrics: MetricK2[] = complexData.metrics; let metrics: MetricK2[] = complexData.metrics;
let devices: number [] = [18,19]; let devices: number[] = [18, 19];
let device_len: number = devices.length; let device_len: number = devices.length;
// const jsonData = require('../conf/devices.json'); // const jsonData = require('../conf/devices.json');
// console.log(jsonData); // console.log(jsonData);
for (let d = 0; d<device_len; d++){ for (let d = 0; d < device_len; d++) {
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
let metr = {"source": ""}; let metr = { "source": "" };
let val = await this.setComplexMetricValue(complexCalc[i].values, complexCalc[i].formula, inputData.metrics, prevousData.metrics, devices[d], metr); let val = await this.setComplexMetricValue(complexCalc[i].values, complexCalc[i].formula, inputData.metrics, prevousData.metrics, devices[d], metr);
if(val !=null || val != undefined){ if (val != null || val != undefined) {
let complexMetric = new MetricK2(); let complexMetric = new MetricK2();
complexMetric.id = complexCalc[i].id; complexMetric.id = complexCalc[i].id;
complexMetric.name = complexCalc[i].name; complexMetric.name = complexCalc[i].name;
@ -162,7 +170,7 @@ export class ZvksmetricsService {
arr[i] = currMetrics.find(element => element.name == arr[i] && element.device == device)?.value; arr[i] = currMetrics.find(element => element.name == arr[i] && element.device == device)?.value;
// if(!arr[i]){ // if(!arr[i]){
// console.log(arr[i], temp, device); // console.log(arr[i], temp, device);
// arr[i]=0; // arr[i]=0;
// } // }
} }
@ -171,17 +179,17 @@ export class ZvksmetricsService {
let prevarr_len: number = prevarr.length; let prevarr_len: number = prevarr.length;
for (let i = 0; i < prevarr_len; i++) { for (let i = 0; i < prevarr_len; i++) {
let temp1 = prevarr[i]; let temp1 = prevarr[i];
prevarr[i] = prevMetrics.find(element => element.name == prevarr[i] && element.device == device)?.value; prevarr[i] = prevMetrics.find(element => element.name == prevarr[i] && element.device == device)?.value;
// console.log(prevarr[i], temp1, device); // console.log(prevarr[i], temp1, device);
} }
} }
// console.log(obj.soure); // console.log(obj.soure);
try{ try {
let result: number = evaluate(formula, val); let result: number = evaluate(formula, val);
// console.log(result); // console.log(result);
return result; return result;
// console.log(result); // console.log(result);
} catch { } catch {
return null; return null;
} }
@ -251,11 +259,11 @@ export class ZvksmetricsService {
let filePath = './src/zvksmetrics/conf/ranges.json'; let filePath = './src/zvksmetrics/conf/ranges.json';
console.log(inputRanges); console.log(inputRanges);
let inp: string = JSON.stringify(inputRanges); let inp: string = JSON.stringify(inputRanges);
try{ try {
await writeFile(filePath, inp); await writeFile(filePath, inp);
ret = "200 OK"; ret = "200 OK";
} }
catch{ catch {
ret = "Error write file"; ret = "Error write file";
console.log(ret); console.log(ret);
} }