imageManager.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import ApiRequestService from "./apiRequestService";
  2. import ImageUtils from "~/services/utils/imageUtils";
  3. /**
  4. * Permet le requêtage, l'upload et la manipulation des images via l'API Opentalent
  5. */
  6. class ImageManager {
  7. private apiRequestService: ApiRequestService;
  8. public static readonly defaultImage = '/images/default/picture.jpeg'
  9. public constructor(apiRequestService: ApiRequestService) {
  10. this.apiRequestService = apiRequestService
  11. }
  12. /**
  13. * Retourne l'image correspondante sous forme d'un blob encodé au format base64,
  14. * ou l'url d'une image par défaut si l'image est introuvable ou si l'id passé en paramètre est null
  15. *
  16. * Attention, les dimensions (hauteur / largeur) ne s'appliqueront pas à l'image par défaut, il est nécessaire de
  17. * les redéfinir dans le composant lui-même.
  18. *
  19. * @param id The id of the image; if null, the url to the default image is returned
  20. * @param defaultImage The path of an image in the 'public' folder, default: '/images/default/picture.jpeg'
  21. * @param height Height of the image (does not apply to default image)
  22. * @param width Width of the image (does not apply to default image)
  23. */
  24. public async get(
  25. id: number | null,
  26. defaultImage: string | null = null,
  27. height: number = 0,
  28. width: number = 0
  29. ): Promise<string | ArrayBuffer> {
  30. const defaultUrl = defaultImage ?? ImageManager.defaultImage
  31. if (id === null) {
  32. return defaultUrl
  33. }
  34. const imageUrl = `api/download/${id}`
  35. // Set requested size if needed
  36. if (height > 0 || width > 0) {
  37. // @see https://thumbor.readthedocs.io/en/latest/crop_and_resize_algorithms.html
  38. // TODO: ajouter le support de ces options dans ap2i
  39. // url = UrlUtils.join(url, `${height}x${width}`)
  40. }
  41. // Une image doit toujours avoir le time en options pour éviter les problèmes de cache
  42. const query = [this.getCacheKey()]
  43. const response: any = await this.apiRequestService.get(imageUrl, query)
  44. if(!response || response.size === 0) {
  45. console.error('Error: image ' + id + ' not found or invalid')
  46. return defaultUrl
  47. }
  48. return await this.toBase64(response)
  49. }
  50. /**
  51. * Convert the API response into base64
  52. * @param data
  53. * @protected
  54. */
  55. protected async toBase64(data: string) {
  56. const blob = ImageUtils.newBlob(data)
  57. return await ImageUtils.blobToBase64(blob) ?? ''
  58. }
  59. /**
  60. * On passe cette clé en paramètres des requêtes pour éviter les problèmes de cache
  61. *
  62. * @protected
  63. */
  64. protected getCacheKey() {
  65. return new Date().getTime().toString()
  66. }
  67. }
  68. export default ImageManager