You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
TODO:
.env.examplei do Joi schema validation wapp.module.tste zmienne do połączenia:S3_ENDPOINT,S3_ACCESS_KEY,S3_SECRET_KEY,S3_PUBLIC_URL,S3_BUCKET_EVENTS,S3_BUCKET_FORMSnpm install @aws-sdk/client-s3 @aws-sdk/lib-storageStorageModule(@Global) +StorageServicez metodamiupload(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 AppModulesrc/events/utils/upload-photo.decorator.ts- zamienić diskStorage(...) na memoryStorage() (import z multer), usunąć cały blok z existsSync/mkdirSync i destinationsrc/forms/utils/upload-files-decorator.ts- to samo co wyżej: memoryStorage() zamiast diskStorage/uploads/events/${photo.filename}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.tssprawdzić 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