Files
tessera-ctl/apps/api/src/nextcloud-files/nextcloud-files.module.ts
T
schalli 8bee65c306 feat(nextcloud-files): Dateien auflisten, Vorschau, Ordner anlegen, umbenennen, verschieben und löschen
- PROPFIND-Auswertung (mehrere propstat, Kleinbuchstaben-Hex, Speicher -3 = unbegrenzt, nur Zeichenketten)
- WebDAV-Schicht mit Zugangsschluessel und Aufrufsperre, Destination immer aus der Basis, Overwrite: F
- mapNcFailure als einzige Fehlerabbildung (nie 401/403 an den Browser), sendUpstreamStream prueft vor dem ersten Byte
- Dateidienst und Routen files, folders, move, preview im eigenen Konto; zweiter Benutzer bekommt notConnected
- Web-API-Funktionen listFolder, createFolder, moveEntry, deleteEntry, previewUrl
- e2e-files.sh gegen die Test-Nextcloud

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 18:14:54 +02:00

58 lines
2.3 KiB
TypeScript

import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { ModuleRegistryModule } from '../module-registry/module-registry.module';
import { ModuleRegistryService } from '../module-registry/module-registry.service';
import { NextcloudCallGate } from './nextcloud-call-gate';
import { NextcloudFilesController } from './nextcloud-files.controller';
import { seedNextcloudFilesModule } from './nextcloud-files.seed';
import { NextcloudFilesService } from './nextcloud-files.service';
import { NextcloudFilesAccountService } from './nextcloud-files-account.service';
import {
defaultStatusFetcher,
NEXTCLOUD_STATUS_FETCHER,
NextcloudFilesSettingsService,
} from './nextcloud-files-settings.service';
import { NEXTCLOUD_TRANSPORT, undiciTransport } from './nextcloud-http';
import { LoginFlowStore, NextcloudLoginGuard } from './nextcloud-login-guard';
/**
* Modul "Dateien" (quick-261008-mzu): die Nextcloud-Dateien jedes Benutzers in
* Tessera. Traegt sich beim Start in die Modulverwaltung ein; aktiviert wird per
* Marktplatz. `CryptoService` kommt aus dem globalen `CryptoModule`,
* `PrismaService` ist global. Die Aufrufsperre ist ein einziges Objekt fuer den
* ganzen Prozess (alle Benutzer teilen die Server-Adresse gegenueber Nextcloud).
*/
@Module({
imports: [ModuleRegistryModule],
controllers: [NextcloudFilesController],
providers: [
NextcloudFilesSettingsService,
NextcloudFilesAccountService,
NextcloudFilesService,
NextcloudLoginGuard,
LoginFlowStore,
NextcloudCallGate,
{ provide: NEXTCLOUD_TRANSPORT, useValue: undiciTransport },
{ provide: NEXTCLOUD_STATUS_FETCHER, useValue: defaultStatusFetcher },
],
exports: [
NextcloudCallGate,
NextcloudFilesSettingsService,
NextcloudFilesAccountService,
NEXTCLOUD_TRANSPORT,
],
})
export class NextcloudFilesModule implements OnModuleInit {
private readonly logger = new Logger(NextcloudFilesModule.name);
constructor(private readonly moduleRegistryService: ModuleRegistryService) {}
async onModuleInit(): Promise<void> {
try {
await seedNextcloudFilesModule(this.moduleRegistryService);
this.logger.log('Nextcloud files module seeded in registry');
} catch (error) {
this.logger.error('Failed to seed nextcloud files module', error);
}
}
}