import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { randomUUID } from 'crypto'; import { createClient, WebDAVClient } from 'webdav'; import { StorageProvider } from './storage-provider'; /// Nextcloud (or any WebDAV server) as file storage backend. @Injectable() export class WebDavStorageProvider implements StorageProvider { private readonly client: WebDAVClient; constructor(config: ConfigService) { this.client = createClient(config.getOrThrow('WEBDAV_URL'), { username: config.getOrThrow('WEBDAV_USERNAME'), password: config.getOrThrow('WEBDAV_PASSWORD'), }); } async upload(kcId: string, filename: string, data: Buffer): Promise { const dir = `/${kcId}`; if (!(await this.client.exists(dir))) { await this.client.createDirectory(dir, { recursive: true }); } const storageKey = `${dir}/${randomUUID()}-${filename}`; await this.client.putFileContents(storageKey, data, { overwrite: false }); return storageKey; } async download(storageKey: string): Promise { const content = await this.client.getFileContents(storageKey); return Buffer.isBuffer(content) ? content : Buffer.from(content as ArrayBuffer); } async delete(storageKey: string): Promise { await this.client.deleteFile(storageKey); } }