Compare commits
12 Commits
25b5eaea55
...
docker-imp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e98348cac | ||
|
|
3bf4cebbe6 | ||
|
|
907c24c45b | ||
|
|
b057ea154a | ||
|
|
0e2a7eeeec | ||
|
|
c702946393 | ||
|
|
5260b8a9c5 | ||
|
|
30bd7a0d28 | ||
| 32ea0d7c4d | |||
| c22d1b5b8c | |||
| 56e90a54d8 | |||
| 15fe566d53 |
@@ -1,10 +1,8 @@
|
||||
PORT=3101
|
||||
branch=
|
||||
DATABASE_URL=postgres://greact:pG3526l4@194.36.208.86:5433/cloud
|
||||
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
|
||||
|
||||
# Optional. When set, POST /ingest requires x-api-key: <value>.
|
||||
# Optional. When set, POST /api/ingest requires x-api-key: <value>.
|
||||
INGEST_API_KEY=
|
||||
|
||||
# Poll interval for GET /current/events SSE snapshots.
|
||||
# Poll interval for GET /api/current/events SSE snapshots.
|
||||
CURRENT_EVENTS_POLL_MS=1000
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
PORT=3101
|
||||
DATABASE_URL=postgres://greact:pG3526l4@194.36.208.86:5433/cloud
|
||||
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
|
||||
INGEST_API_KEY=
|
||||
CURRENT_EVENTS_POLL_MS=1000
|
||||
|
||||
20
README.md
20
README.md
@@ -28,15 +28,17 @@ Historical chart ranges use continuous aggregates:
|
||||
|
||||
## API
|
||||
|
||||
- `GET /health`
|
||||
- `GET /edge`
|
||||
- `GET /tag?edge=edge5&search=pressure`
|
||||
- `GET /current?edge=edge5&tags=tag1,tag2`
|
||||
- `GET /history?edge=edge5&tags=tag1,tag2&from=2026-06-01T00:00:00Z&to=2026-06-02T00:00:00Z`
|
||||
- `POST /ingest`
|
||||
- `POST /ingest/:edge`
|
||||
All routes are served under the `/api` prefix.
|
||||
|
||||
`POST /ingest` accepts one point:
|
||||
- `GET /api/health`
|
||||
- `GET /api/edge`
|
||||
- `GET /api/tag?edge=edge5&search=pressure`
|
||||
- `GET /api/current?edge=edge5&tags=tag1,tag2`
|
||||
- `GET /api/history?edge=edge5&tags=tag1,tag2&from=2026-06-01T00:00:00Z&to=2026-06-02T00:00:00Z`
|
||||
- `POST /api/ingest`
|
||||
- `POST /api/ingest/:edge`
|
||||
|
||||
`POST /api/ingest` accepts one point:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -47,7 +49,7 @@ Historical chart ranges use continuous aggregates:
|
||||
}
|
||||
```
|
||||
|
||||
`POST /ingest/:edge` accepts a compact edge payload:
|
||||
`POST /api/ingest/:edge` accepts a compact edge payload:
|
||||
|
||||
```json
|
||||
{
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
services:
|
||||
drill-cloud-v3:
|
||||
container_name: drill-cloud-v3${branch:+-${branch}}
|
||||
build: .
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
PORT: ${PORT}
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS}
|
||||
INGEST_API_KEY: ${INGEST_API_KEY}
|
||||
CURRENT_EVENTS_POLL_MS: ${CURRENT_EVENTS_POLL_MS}
|
||||
expose:
|
||||
|
||||
@@ -9,15 +9,16 @@ import { IngestService } from './ingest.service';
|
||||
export class IngestController {
|
||||
constructor(private readonly ingest: IngestService) {}
|
||||
|
||||
/** Принимает одну сырую точку и сохраняет ее как запись истории/current. */
|
||||
@Post()
|
||||
ingestPoint(@Body() point: IngestPointDto) {
|
||||
return this.ingest.ingestPoint(point);
|
||||
}
|
||||
|
||||
/** Принимает компактное тело запроса по edge и сохраняет каждое значение построчно. */
|
||||
@Post(':edge')
|
||||
ingestEdgeValues(@Param('edge') edge: string, @Body() body: IngestEdgeValuesDto) {
|
||||
ingestEdgeValues(
|
||||
@Param('edge') edge: string,
|
||||
@Body() body: IngestEdgeValuesDto,
|
||||
) {
|
||||
const points = Object.entries(body.values).map(([tag, value]) => ({
|
||||
edge,
|
||||
tag,
|
||||
|
||||
@@ -3,17 +3,10 @@ import { NestFactory } from '@nestjs/core';
|
||||
import compression from 'compression';
|
||||
import { AppModule } from './app.module';
|
||||
|
||||
/** Запускает HTTP API со сжатием, CORS и глобальной валидацией DTO. */
|
||||
async function bootstrap() {
|
||||
const app = await NestFactory.create(AppModule);
|
||||
app.use(compression());
|
||||
|
||||
app.enableCors({
|
||||
origin: process.env.CORS_ALLOWED_ORIGINS,
|
||||
credentials: true,
|
||||
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
|
||||
allowedHeaders: ['Content-Type', 'Authorization', 'x-api-key'],
|
||||
});
|
||||
app.setGlobalPrefix('api');
|
||||
|
||||
app.useGlobalPipes(
|
||||
new ValidationPipe({
|
||||
|
||||
Reference in New Issue
Block a user