Убран лишний код. Скорректированы docker и package файлы. Переработано взаимодействие с бд - упрощена логика. #1

Merged
APervov merged 12 commits from dev into main 2026-07-01 19:07:59 +00:00
Owner
No description provided.
APervov added 1 commit 2026-06-19 12:00:11 +00:00
NBizyaev reviewed 2026-06-20 11:40:32 +00:00
@@ -15,2 +10,2 @@
HISTORY_TARGET_POINTS: ${HISTORY_TARGET_POINTS:-2000}
HISTORY_MAX_TARGET_POINTS: ${HISTORY_MAX_TARGET_POINTS:-5000}
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS}
INGEST_API_KEY: ${INGEST_API_KEY}
Contributor

Не нужно специально ограничивать размер пакета присылаемых данных

Не нужно специально ограничивать размер пакета присылаемых данных
NBizyaev marked this conversation as resolved
NBizyaev reviewed 2026-06-20 11:45:41 +00:00
package.json Outdated
@@ -8,3 +8,2 @@
"build": "nest build",
"start": "nest start",
"start:dev": "nest start --watch",
"start": "node --env-file=.env ./node_modules/@nestjs/cli/bin/nest.js start",
Contributor

вот это ./node_modules/@nestjs/cli/bin/nest.js - неправильно

у тебя во фреймворке nest уже подключен

import { ConfigModule } from '@nestjs/config';

он всё делает: ConfigModule.forRoot({ isGlobal: true }),
считывает .env,
ему же можно добавить всю необходимую валидацию значений переменных окружения,

так что оставь строки

"start": "nest start",
"start:dev": "nest start --watch",

в покое

вот это `./node_modules/@nestjs/cli/bin/nest.js` - неправильно у тебя во фреймворке nest уже подключен ```ts import { ConfigModule } from '@nestjs/config'; ``` он всё делает: ConfigModule.forRoot({ isGlobal: true }), считывает .env, ему же можно добавить всю необходимую валидацию значений переменных окружения, так что оставь строки ``` "start": "nest start", "start:dev": "nest start --watch", ``` в покое
NBizyaev marked this conversation as resolved
NBizyaev reviewed 2026-06-20 12:05:31 +00:00
package.json Outdated
@@ -9,2 +9,2 @@
"start": "nest start",
"start:dev": "nest start --watch",
"start": "node --env-file=.env ./node_modules/@nestjs/cli/bin/nest.js start",
"start:dev": "node --env-file=.env ./node_modules/@nestjs/cli/bin/nest.js start --watch",
Contributor

а
понял
здесь ты как раз убрал сервис чтения и валидации переменных окружения import { ConfigModule } from '@nestjs/config';

ну ок
тогда

"start:dev": "nest start --watch --exec \"node --env-file=.env\""

то есть к типовым

"start": "nest start",
"start:dev": "nest start --watch",

добавляется --exec "node --env-file=.env":

"start": "nest start --exec \"node --env-file=.env\"",
"start:dev": "nest start --watch --exec \"node --env-file=.env\""

это ок

а понял здесь ты как раз убрал сервис чтения и валидации переменных окружения `import { ConfigModule } from '@nestjs/config';` ну ок тогда ```json "start:dev": "nest start --watch --exec \"node --env-file=.env\"" ``` --- то есть к типовым ```json "start": "nest start", "start:dev": "nest start --watch", ``` добавляется `--exec "node --env-file=.env"`: ```json "start": "nest start --exec \"node --env-file=.env\"", "start:dev": "nest start --watch --exec \"node --env-file=.env\"" ``` это ок
NBizyaev marked this conversation as resolved
NBizyaev reviewed 2026-06-20 12:06:30 +00:00
@@ -89,10 +81,7 @@ export class IngestService {
/** Защищает API от слишком больших ingest-запросов, занимающих соединение с БД надолго. */
private assertBatchSize(size: number): void {
Contributor

это не надо такое зачем

это не надо такое зачем
NBizyaev marked this conversation as resolved
NBizyaev reviewed 2026-06-20 12:07:36 +00:00
NBizyaev reviewed 2026-06-20 12:08:51 +00:00
@@ -103,4 +92,2 @@
private normalizePoint(point: IngestPointDto): NormalizedPoint {
const edge = normalizeRequiredText(point.edge, 'edge');
const tag = normalizeRequiredText(point.tag, 'tag');
const time = this.parsePointTime(point);
Contributor

это избыточная валидация,
давай считать, что мы в mqtt-ingest всё делаем хорошо (передаём время нормально сразу)
а если мы делаем там не хорошо - то это достойно возникновения исключения

это избыточная валидация, давай считать, что мы в mqtt-ingest всё делаем хорошо (передаём время нормально сразу) а если мы делаем там не хорошо - то это достойно возникновения исключения
NBizyaev reviewed 2026-06-20 12:14:11 +00:00
@@ -140,0 +35,4 @@
AND timestamp < $4
) AS bucketed
GROUP BY bucket
ORDER BY bucket ASC
Contributor

не понимаю, почему запрос сложнее, чем обговоренный и проверенный

SELECT
  time_bucket(INTERVAL $5, timestamp) AS bucket,
  min(value) AS min_value,
  max(value) AS max_value,
  avg(value) AS avg_value,
  count(*) AS point_count
FROM history
WHERE edge = $1
  AND tag = $2
  AND timestamp >= TIMESTAMP $3
  AND timestamp <  TIMESTAMP $4
GROUP BY bucket;

в чем практическая польза этого усложнения?

не понимаю, почему запрос сложнее, чем обговоренный и проверенный ```sql SELECT time_bucket(INTERVAL $5, timestamp) AS bucket, min(value) AS min_value, max(value) AS max_value, avg(value) AS avg_value, count(*) AS point_count FROM history WHERE edge = $1 AND tag = $2 AND timestamp >= TIMESTAMP $3 AND timestamp < TIMESTAMP $4 GROUP BY bucket; ``` в чем практическая польза этого усложнения?
NBizyaev marked this conversation as resolved
APervov added 1 commit 2026-06-20 23:21:39 +00:00
APervov added 1 commit 2026-06-20 23:24:10 +00:00
APervov added 1 commit 2026-06-20 23:32:06 +00:00
APervov added 1 commit 2026-06-20 23:51:39 +00:00
APervov added 1 commit 2026-06-21 00:42:00 +00:00
NBizyaev reviewed 2026-06-21 17:29:35 +00:00
@@ -16,3 +11,3 @@
};
/** Превращает плоские строки истории в стабильный API-формат для графиков. */
/** Переводит строки агрегированной истории в формат графика min/avg/max. */
Contributor

за время работы по улучшению кода случилось прекрасное:
строки агрегированной истории ТЕПЕРЬ СОВПАДАЮТ с форматом графика min/avg/max.
То есть теперь их можно отдавать на фронтенд практически в том же виде, в котором они были выбраны из базы без какой-либо нормализации.

за время работы по улучшению кода случилось прекрасное: строки агрегированной истории ТЕПЕРЬ СОВПАДАЮТ с форматом графика min/avg/max. То есть теперь их можно отдавать на фронтенд практически в том же виде, в котором они были выбраны из базы без какой-либо нормализации.
NBizyaev reviewed 2026-06-21 17:34:12 +00:00
@@ -7,4 +4,2 @@
const DEFAULT_MAX_BATCH_SIZE = 10_000;
type NormalizedPoint = {
Contributor

за время работы по улучшению кода случилось прекрасное:
строки входящих данных (timestamp, edge, tag, value) ТЕПЕРЬ СОВПАДАЮТ с форматом таблиц базы данных.
То есть теперь их можно отдавать на сохранять практически в том же виде, в котором они пришли в контроллер без какой-либо нормализации.

за время работы по улучшению кода случилось прекрасное: строки входящих данных (timestamp, edge, tag, value) ТЕПЕРЬ СОВПАДАЮТ с форматом таблиц базы данных. То есть теперь их можно отдавать на сохранять практически в том же виде, в котором они пришли в контроллер без какой-либо нормализации.
NBizyaev marked this conversation as resolved
APervov added 1 commit 2026-06-21 23:50:30 +00:00
APervov added 1 commit 2026-06-22 00:20:33 +00:00
APervov added 1 commit 2026-06-22 00:29:56 +00:00
NBizyaev reviewed 2026-06-22 18:34:10 +00:00
@@ -56,4 +22,4 @@
await this.db.query(
`
INSERT INTO current (edge, tag, value, "createdAt", "updatedAt")
Contributor

так как у createdAt на уровне БД установлено автоприсвоение NOW, то достаточно

        INSERT INTO current (edge, tag, value, "updatedAt")
        VALUES ($1, $2, $3, NOW())
        ON CONFLICT (edge, tag)
        DO UPDATE SET
          value = $3,
          "updatedAt" = NOW()

(только проверь)

так как у createdAt на уровне БД установлено автоприсвоение NOW, то достаточно ```sql INSERT INTO current (edge, tag, value, "updatedAt") VALUES ($1, $2, $3, NOW()) ON CONFLICT (edge, tag) DO UPDATE SET value = $3, "updatedAt" = NOW() ``` (только проверь)
APervov added 1 commit 2026-06-22 19:03:38 +00:00
APervov added 1 commit 2026-06-23 10:53:40 +00:00
APervov added 1 commit 2026-07-01 18:50:33 +00:00
NBizyaev approved these changes 2026-07-01 19:06:31 +00:00
APervov merged commit 15fe566d53 into main 2026-07-01 19:07:59 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: APervov/cloud-v3#1