Skip to content

feature: migrate to s3 compatible storage instead of local disk #104

@loudsheep

Description

@loudsheep
  • bedzie używany S3 compatible storage to przechowywyania plików
  • te endpointy co zwięrają upload plików będą to wrzucac tam a nie na dysk (tutaj raczej szybciej bedzie żeby to backend robił upload, a nie klient z presigned url)
  • do bazki wtedy zapisujemy url do pliku który jest przechowywany w S3

TODO:

  • dodać do .env.example i do Joi schema validation w app.module.ts te zmienne do połączenia: S3_ENDPOINT, S3_ACCESS_KEY, S3_SECRET_KEY, S3_PUBLIC_URL, S3_BUCKET_EVENTS, S3_BUCKET_FORMS
  • zainstalować paczki npm do obsługi tego s3 npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
  • stworzyć StorageModule (@Global) + StorageService z metodami upload(bucket, file): Promise<string> (zwraca publiczny CDN URL), delete(bucket, url): void (wyciąga klucz z URL, nie rzuca błędu przy niepowodzeniu — tylko loguje), zaimportować w AppModule
  • src/events/utils/upload-photo.decorator.ts - zamienić diskStorage(...) na memoryStorage() (import z multer), usunąć cały blok z existsSync/mkdirSync i destination
  • src/forms/utils/upload-files-decorator.ts - to samo co wyżej: memoryStorage() zamiast diskStorage
  • w EventsController
    • create() - jeśli photo nie jest undefined, wywołać await this.storage.upload(this.config.getOrThrow("S3_BUCKET_EVENTS"), photo) i wynik przypisać do photoUrl zamiast obecnego /uploads/events/${photo.filename}
    • update() - przed uploadem nowego zdjęcia pobrać istniejący event przez this.eventsService.findOne(eventUUID), jeśli ma photoUrl wywołać await this.storage.delete(...) żeby usunąć stary plik, potem uploadować nowy
    • remove() - przed this.eventsService.remove() pobrać event i jeśli ma photoUrl wywołać this.storage.delete()
  • src/forms/forms-public.controller.ts - aktualnie filenames to tablica nazw plików z dysku (files.map(f => f.filename)), zmienić na upload każdego pliku do S3: await Promise.all(files.map(f => this.storage.upload(this.config.getOrThrow("S3_BUCKET_FORMS"), f)))
  • src/forms/forms.service.ts sprawdzić jak filenames jest używane wewnątrz formSubmit i upewnić się że zapisuje URLe do bazy tak jak są (bez żadnego prefixowania ścieżką), bo teraz zamiast nazwy pliku dostaje gotowy URL z S3

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions