import { Injectable } from '@angular/core'; import { AngularFireDatabase, AngularFireList } from '@angular/fire/compat/database'; import { AngularFireStorage } from '@angular/fire/compat/storage'; import { Observable } from 'rxjs'; import { finalize } from 'rxjs/operators'; import { Upload } from '../../models'; @Injectable({ providedIn: 'root' }) export class UploadService { private basePath = '/uploads'; constructor(private db: AngularFireDatabase, private storage: AngularFireStorage) { } pushFileToStorage(fileUpload: Upload): Observable { const filePath = `${this.basePath}/${fileUpload.file.name}`; const storageRef = this.storage.ref(filePath); const uploadTask = this.storage.upload(filePath, fileUpload.file); uploadTask.snapshotChanges().pipe( finalize(() => { storageRef.getDownloadURL().subscribe(downloadURL => { fileUpload.url = downloadURL; fileUpload.name = fileUpload.file.name; this.saveFileData(fileUpload); }); }) ).subscribe(); return uploadTask.percentageChanges(); } private saveFileData(fileUpload: Upload): void { this.db.list(this.basePath).push(fileUpload); } getFiles(numberItems:number): AngularFireList { return this.db.list(this.basePath, ref => ref.limitToLast(numberItems)); } deleteFile(fileUpload: Upload): void { this.deleteFileDatabase(fileUpload.key) .then(() => { this.deleteFileStorage(fileUpload.name); }) .catch(error => console.log(error)); } private deleteFileDatabase(key: string): Promise { return this.db.list(this.basePath).remove(key); } private deleteFileStorage(name: string): void { const storageRef = this.storage.ref(this.basePath); storageRef.child(name).delete(); } }