Add group cloud: files index api, web UI, archive sync bot
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.
This commit is contained in:
parent
eb1b60f67d
commit
d58db63fe6
58 changed files with 5543 additions and 4 deletions
27
apps/api/src/group-files/group-files.module.ts
Normal file
27
apps/api/src/group-files/group-files.module.ts
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
import { Module } from "@nestjs/common";
|
||||
import { GroupFilesController, PublicFileShareController } from "./group-files.controller.js";
|
||||
import { GroupFilesService } from "./group-files.service.js";
|
||||
|
||||
/**
|
||||
* Group files module — the metadata index + share/link lifecycle over
|
||||
* chat_media_archive (029) and the oCIS WebDAV port (occ-files deploy).
|
||||
*
|
||||
* NOT registered in AppModule by this slice: per the deployment contract
|
||||
* (infra/occupymedia/files/README.md) the oCIS service is scaffolded
|
||||
* separately and admission checks are mandatory before this surface accepts
|
||||
* user payloads. Wiring is one line in apps/api/src/app.module.ts:
|
||||
*
|
||||
* imports: [..., GroupFilesModule]
|
||||
*
|
||||
* until that gate is passed — the ChatgovModule precedent.
|
||||
*
|
||||
* The oCIS client is built lazily from env on first use, so importing the
|
||||
* module never requires FILES_OCID_* to be present; routes fail 503 when the
|
||||
* deployment is absent instead of breaking startup.
|
||||
*/
|
||||
@Module({
|
||||
controllers: [GroupFilesController, PublicFileShareController],
|
||||
providers: [GroupFilesService],
|
||||
exports: [GroupFilesService],
|
||||
})
|
||||
export class GroupFilesModule {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue