The Telegram-like group file contract (packages/core shared-files.ts) becomes a working subsystem, built in three parallel tracks: API (NestJS): migration 029 group_files (chat_media_archive metadata-only index with partial replay-unique + RLS, group_file_shares with sha256 token persistence, archive_sync_state/outbox durable-claim seam incl. a unique claim_key index), group-files module (list/search with cursor pagination, direct upload ≤20 MiB streamed+hashed to oCIS WebDAV, download with ACL + retention rechecks, share links with expiry, retention modes incl. legalHold) — RBAC group-membership authz + audit chain events. Web: Files section per group — group picker, drag-drop upload (20 MiB cap), search + MIME/origin filters, cursor pagination, download via authenticated blob fetch, share dialog with expiry + shown-once token, admin retention dialog; bilingual EN/ES (wiki i18n pattern); nav sidebar/palette/bottom-nav wiring; MIME classes aligned to the DB CHECK (document/other). Archive bot (apps/archive-bot): plain sync-loop Matrix bot mirroring attachments from explicitly-mapped unencrypted archive rooms — raw /sync with durable since-cursor, outbox-claimed ingestion (hash-verified stream, no temp files), magic-byte MIME sniffing, safe-name normalization, WebDAV upload, indexed + replied with link, redaction→unavailable; health endpoint; Dockerfile. Tests 74/74, typecheck clean across api/web/bot.
62 lines
3.7 KiB
TypeScript
62 lines
3.7 KiB
TypeScript
import { Module } from "@nestjs/common";
|
|
import { HealthModule } from "./health/health.module";
|
|
import { DemoController } from "./demo/demo.controller";
|
|
import { PublishingController } from "./publishing/publishing.controller";
|
|
import { pool, withTenant } from "./db/client";
|
|
import { PublishingExecutionRepository, assertPublishingSchema } from "@tactical-media-broadcast-hub/publishing-execution";
|
|
import { ApprovalGateService } from "./publishing/approval-gate.service.js";
|
|
import { PUBLISHING_DEPENDENCIES, TemporalWorkflowStarter, PublishingService } from "./publishing/publishing.service";
|
|
import { AuthController } from "./auth/auth.controller";
|
|
import { AuthService } from "./auth/auth.service";
|
|
import { ConnectionsController } from "./connections/connections.controller";
|
|
import { ConnectionsService } from "./connections/connections.service";
|
|
import { TeamController } from "./team/team.controller";
|
|
import { TeamService } from "./team/team.service";
|
|
import { InviteLinkController, InviteClaimController } from "./team/invite-link.controller";
|
|
import { InviteLinkService } from "./team/invite-link.service";
|
|
import { AuditController } from "./audit/audit.controller";
|
|
import { AuditQueryService } from "./audit/audit.query";
|
|
import { GroupsController } from "./groups/groups.controller";
|
|
import { GroupsService } from "./groups/groups.service";
|
|
import { VideoController } from "./video/video.controller";
|
|
import { VideoService } from "./video/video.service";
|
|
import { LiveMonitorModule } from "./live-monitor/live-monitor.module";
|
|
import { MediaControlModule } from "./media-control/media-control.module";
|
|
import { ProductionModule } from "./production/production.module";
|
|
import { RealtimeModule } from "./realtime/realtime.module";
|
|
import { LiveChatModule } from "./live-chat/live-chat.module";
|
|
import { LiveModule } from "./live/live.module.js";
|
|
import { ChatgovModule } from "./chatgov/chatgov.module.js";
|
|
import { IntakeModule } from "./intake/intake.module.js";
|
|
import { GroupFilesModule } from "./group-files/group-files.module.js";
|
|
import { SettingsModule } from "./settings/settings.module.js";
|
|
import { SettingsController } from "./settings/settings.controller.js";
|
|
import { SettingsService } from "./settings/settings.service.js";
|
|
import { VirtualChannelsModule } from "./virtual-channels/virtual-channels.module.js";
|
|
import { DirectorModule } from "./director/director.module.js";
|
|
import { AnalyticsController } from "./analytics/analytics.controller";
|
|
import { SnapshotService } from "./analytics/snapshot.service";
|
|
|
|
@Module({
|
|
imports: [HealthModule, LiveMonitorModule, MediaControlModule, ProductionModule, RealtimeModule, LiveChatModule, LiveModule, VirtualChannelsModule, ChatgovModule, IntakeModule, GroupFilesModule, SettingsModule],
|
|
controllers: [
|
|
DemoController,
|
|
PublishingController,
|
|
AuthController,
|
|
ConnectionsController,
|
|
TeamController,
|
|
InviteLinkController,
|
|
InviteClaimController,
|
|
AuditController,
|
|
VideoController,
|
|
GroupsController,
|
|
AnalyticsController,
|
|
SettingsController,
|
|
],
|
|
providers: [
|
|
{ provide: PublishingExecutionRepository, useFactory: () => new PublishingExecutionRepository(pool) },
|
|
TemporalWorkflowStarter,
|
|
{ provide: PUBLISHING_DEPENDENCIES, inject: [PublishingExecutionRepository, TemporalWorkflowStarter, ApprovalGateService], useFactory: (repository: PublishingExecutionRepository, workflowStarter: TemporalWorkflowStarter, approvalGate: ApprovalGateService) => ({ repository, workflowStarter, approvalGate, tenantTransaction: withTenant, assertReady: () => assertPublishingSchema(pool) }) },
|
|
PublishingService, ApprovalGateService, AuthService, ConnectionsService, TeamService, InviteLinkService, AuditQueryService, VideoService, GroupsService, SnapshotService, SettingsService],
|
|
})
|
|
export class AppModule {}
|