Mise en place de l'export foundry ; modification des Arc, chapitres et scènes..... => Suppression de la section maps pour arc, chapitres ; et dans scène on importe les maps format foundry (image / vidéo + json)
All checks were successful
Build & Push Images / build (brain) (push) Successful in 1m35s
Build & Push Images / build (web) (push) Successful in 1m56s
Build & Push Images / build (core) (push) Successful in 3m37s
Build & Push Images / build-switcher (push) Successful in 19s

This commit is contained in:
2026-06-25 12:16:27 +02:00
parent 5bc038acd8
commit c0e1da78c8
72 changed files with 2274 additions and 223 deletions

View File

@@ -0,0 +1,38 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { StoredFile } from './stored-file.model';
/**
* Service HTTP pour les fichiers generiques (/api/files).
* Pendant de {@link ImageService} pour les battlemaps : media (image/video) +
* sidecar JSON Universal VTT, qui sortent du perimetre des images (mp4, json,
* taille jusqu'a 128 Mo).
*/
@Injectable({ providedIn: 'root' })
export class StoredFileService {
readonly apiBase = '';
private apiUrl = `${this.apiBase}/api/files`;
constructor(private http: HttpClient) {}
/** Upload multipart/form-data. Le backend valide le MIME et la taille (128 Mo max). */
upload(file: File): Observable<StoredFile> {
const form = new FormData();
form.append('file', file);
return this.http.post<StoredFile>(this.apiUrl, form);
}
getById(id: string): Observable<StoredFile> {
return this.http.get<StoredFile>(`${this.apiUrl}/${id}`);
}
delete(id: string): Observable<void> {
return this.http.delete<void>(`${this.apiUrl}/${id}`);
}
/** URL absolue du binaire (peu utile : la battlemap n'est pas affichee). */
contentUrl(id: string): string {
return `${this.apiUrl}/${id}/content`;
}
}