Each colony can now hold its hive setup (Ist-Zustand) as validated JSON with an append-only change log: - catalog: hive systems and part types with dimensions, placement rules and state fields; Liebig-Zander 10 seeded with fixed ids (owner's equipment incl. Bausperre, Futterzarge, Nassenheider) - pure domain module (operations, validator, derived facts) with shared JSON fixtures the frontend runs too - API: catalog (hive-systems:manage), setup create/change/history/ state at a day (colonies:read/update), 409 HIVE_CONFLICT with the current state, idempotent writes, HiveChanged event - inspections can carry hive ops saved in the same transaction - backup export/import of the new tables (backup wins per colony) - docs: ARCHITECTURE section 13, Annahmen 95-100 Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
155 lines
6.4 KiB
TypeScript
155 lines
6.4 KiB
TypeScript
import { Module } from '@nestjs/common';
|
|
import { ConfigModule } from '@nestjs/config';
|
|
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
|
|
import { ThrottlerModule } from '@nestjs/throttler';
|
|
import { ClientIpThrottlerGuard } from './common/throttler/client-ip-throttler.guard';
|
|
import { PrismaThrottlerStorage } from './common/throttler/prisma-throttler.storage';
|
|
import { ThrottlerStorageModule } from './common/throttler/throttler-storage.module';
|
|
import { PrismaModule } from './prisma/prisma.module';
|
|
import { HealthModule } from './health/health.module';
|
|
import { AuditModule } from './audit/audit.module';
|
|
import { DomainEventsModule } from './domain-events/domain-events.module';
|
|
import { UsersModule } from './users/users.module';
|
|
import { AuthModule } from './auth/auth.module';
|
|
import { RolesModule } from './roles/roles.module';
|
|
import { ApiariesModule } from './apiaries/apiaries.module';
|
|
import { ColoniesModule } from './colonies/colonies.module';
|
|
import { QueensModule } from './queens/queens.module';
|
|
import { InspectionsModule } from './inspections/inspections.module';
|
|
import { TasksModule } from './tasks/tasks.module';
|
|
import { VarroaModule } from './varroa/varroa.module';
|
|
import { TreatmentsModule } from './treatments/treatments.module';
|
|
import { FeedingsModule } from './feedings/feedings.module';
|
|
import { HarvestsModule } from './harvests/harvests.module';
|
|
import { ExtractionsModule } from './extractions/extractions.module';
|
|
import { HoneyBatchesModule } from './honey-batches/honey-batches.module';
|
|
import { StorageModule } from './storage/storage.module';
|
|
import { DashboardModule } from './dashboard/dashboard.module';
|
|
import { SearchModule } from './search/search.module';
|
|
import { ExportModule } from './export/export.module';
|
|
import { QrModule } from './qr/qr.module';
|
|
import { PhenologyModule } from './phenology/phenology.module';
|
|
import { RemindersModule } from './reminders/reminders.module';
|
|
import { ProductsModule } from './products/products.module';
|
|
import { BottlingModule } from './bottling/bottling.module';
|
|
import { ProductionBatchesModule } from './production-batches/production-batches.module';
|
|
import { RawMaterialsModule } from './raw-materials/raw-materials.module';
|
|
import { EquipmentModule } from './equipment/equipment.module';
|
|
import { CalendarModule } from './calendar/calendar.module';
|
|
import { CalendarSyncModule } from './calendar-sync/calendar-sync.module';
|
|
import { NotificationsModule } from './notifications/notifications.module';
|
|
import { StatisticsModule } from './statistics/statistics.module';
|
|
import { WebhooksModule } from './webhooks/webhooks.module';
|
|
import { DocumentsModule } from './documents/documents.module';
|
|
import { AutomationModule } from './automation/automation.module';
|
|
import { LabelTemplatesModule } from './label-templates/label-templates.module';
|
|
import { ImportModule } from './import/import.module';
|
|
import { PublicModule } from './public/public.module';
|
|
import { TaskTemplatesModule } from './task-templates/task-templates.module';
|
|
import { SwarmControlModule } from './swarm-control/swarm-control.module';
|
|
import { WinterChecksModule } from './winter-checks/winter-checks.module';
|
|
import { WeatherModule } from './weather/weather.module';
|
|
import { ProfileModule } from './profile/profile.module';
|
|
import { SiteSettingsModule } from './site-settings/site-settings.module';
|
|
import { BackupModule } from './backup/backup.module';
|
|
import { ShopSyncModule } from './shop-sync/shop-sync.module';
|
|
import { ErpExportModule } from './erp-export/erp-export.module';
|
|
import { ApiKeysModule } from './api-keys/api-keys.module';
|
|
import { CleanupModule } from './suggestions/cleanup.module';
|
|
import { SuggestionsModule } from './suggestions/suggestions.module';
|
|
import { AutopilotModule } from './autopilot/autopilot.module';
|
|
import { SystemModule } from './system/system.module';
|
|
import { WithdrawalModule } from './withdrawal/withdrawal.module';
|
|
import { HiveModule } from './hive/hive.module';
|
|
import { VeterinaryMedicinesModule } from './veterinary-medicines/veterinary-medicines.module';
|
|
import { ComplianceModule } from './compliance/compliance.module';
|
|
import { ReadinessModule } from './compliance/readiness/readiness.module';
|
|
import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';
|
|
import { PermissionsGuard } from './auth/guards/permissions.guard';
|
|
import { PermissionsModule } from './auth/permissions/permissions.module';
|
|
import { IdempotencyInterceptor } from './common/idempotency/idempotency.interceptor';
|
|
|
|
@Module({
|
|
imports: [
|
|
ConfigModule.forRoot({ isGlobal: true }),
|
|
ThrottlerModule.forRootAsync({
|
|
imports: [ThrottlerStorageModule],
|
|
inject: [PrismaThrottlerStorage],
|
|
useFactory: (storage: PrismaThrottlerStorage) => ({
|
|
throttlers: [{ name: 'default', ttl: 60000, limit: 100 }],
|
|
storage,
|
|
}),
|
|
}),
|
|
PrismaModule,
|
|
PermissionsModule,
|
|
AuditModule,
|
|
DomainEventsModule,
|
|
HealthModule,
|
|
UsersModule,
|
|
AuthModule,
|
|
RolesModule,
|
|
ApiariesModule,
|
|
ColoniesModule,
|
|
QueensModule,
|
|
InspectionsModule,
|
|
TasksModule,
|
|
VarroaModule,
|
|
TreatmentsModule,
|
|
FeedingsModule,
|
|
HarvestsModule,
|
|
ExtractionsModule,
|
|
HoneyBatchesModule,
|
|
StorageModule,
|
|
DashboardModule,
|
|
SearchModule,
|
|
ExportModule,
|
|
QrModule,
|
|
ProductsModule,
|
|
BottlingModule,
|
|
ProductionBatchesModule,
|
|
RawMaterialsModule,
|
|
EquipmentModule,
|
|
CalendarModule,
|
|
CalendarSyncModule,
|
|
NotificationsModule,
|
|
StatisticsModule,
|
|
WebhooksModule,
|
|
DocumentsModule,
|
|
AutomationModule,
|
|
SuggestionsModule,
|
|
CleanupModule,
|
|
AutopilotModule,
|
|
PhenologyModule,
|
|
WithdrawalModule,
|
|
RemindersModule,
|
|
LabelTemplatesModule,
|
|
ImportModule,
|
|
PublicModule,
|
|
TaskTemplatesModule,
|
|
SwarmControlModule,
|
|
WinterChecksModule,
|
|
WeatherModule,
|
|
ProfileModule,
|
|
SiteSettingsModule,
|
|
BackupModule,
|
|
ShopSyncModule,
|
|
ErpExportModule,
|
|
ApiKeysModule,
|
|
SystemModule,
|
|
VeterinaryMedicinesModule,
|
|
HiveModule,
|
|
ComplianceModule,
|
|
ReadinessModule,
|
|
],
|
|
controllers: [],
|
|
providers: [
|
|
// Throttle first: a request with a wrong token or API key must count
|
|
// against the limit too, before any database lookup is spent on it.
|
|
{ provide: APP_GUARD, useClass: ClientIpThrottlerGuard },
|
|
{ provide: APP_GUARD, useClass: JwtAuthGuard },
|
|
{ provide: APP_GUARD, useClass: PermissionsGuard },
|
|
{ provide: APP_INTERCEPTOR, useClass: IdempotencyInterceptor },
|
|
],
|
|
})
|
|
export class AppModule {}
|