Files
wgenerator/src/app/modules/songs/services/upload.service.ts
benjamin 5efd44e710
Some checks failed
Angular Build / build (push) Has been cancelled
fix bundle size
2026-03-20 19:43:50 +01:00

47 lines
1.5 KiB
TypeScript

import {EnvironmentInjector, Injectable, inject, runInInjectionContext} from '@angular/core';
import {Upload} from './upload';
import {FileDataService} from './file-data.service';
import {ref, Storage, uploadBytesResumable} from '@angular/fire/storage';
import {FileBase} from './fileBase';
import {FileServer} from './fileServer';
@Injectable()
export class UploadService extends FileBase {
private fileDataService = inject(FileDataService);
private storage = inject(Storage);
private environmentInjector = inject(EnvironmentInjector);
public pushUpload(songId: string, upload: Upload): void {
const directory = this.directory(songId);
const filePath = `${directory}/${upload.file.name}`;
upload.path = directory;
const task = runInInjectionContext(this.environmentInjector, () => this.startUpload(filePath, upload.file));
task.on(
'state_changed',
snapshot => {
upload.progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
},
() => {
// Keep current UX: upload errors are ignored by this service.
},
() => void this.saveFileData(songId, upload)
);
}
private async saveFileData(songId: string, upload: Upload) {
const file: FileServer = {
name: upload.file.name,
path: upload.path,
createdAt: new Date(),
};
await this.fileDataService.set(songId, file);
}
private startUpload(filePath: string, file: File) {
const storageRef = ref(this.storage, filePath);
return uploadBytesResumable(storageRef, file);
}
}