imageManager.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import ApiRequestService from './apiRequestService'
  2. import FileUtils from '~/services/utils/fileUtils'
  3. import { FILE_TYPE, FILE_VISIBILITY, IMAGE_SIZE } from '~/types/enum/enums'
  4. /**
  5. * Permet le requêtage, l'upload et la manipulation des images via l'API Opentalent
  6. */
  7. class ImageManager {
  8. private apiRequestService: ApiRequestService
  9. public static readonly defaultImage = '/images/default/picture.jpeg'
  10. public constructor(apiRequestService: ApiRequestService) {
  11. this.apiRequestService = apiRequestService
  12. }
  13. /**
  14. * Retourne l'image correspondante sous forme d'un blob encodé au format base64,
  15. * ou l'url d'une image par défaut si l'image est introuvable ou si l'id passé en paramètre est null
  16. *
  17. * Attention, les dimensions (hauteur / largeur) ne s'appliqueront pas à l'image par défaut, il est nécessaire de
  18. * les redéfinir dans le composant lui-même.
  19. *
  20. * @param id The id of the image; if null, the url to the default image is returned
  21. * @param defaultImage The path of an image in the 'public' folder, default: '/images/default/picture.jpeg'
  22. * @param size
  23. */
  24. public async get(
  25. id: number | null,
  26. defaultImage: string | null = null,
  27. size: IMAGE_SIZE = IMAGE_SIZE.MD
  28. ): Promise<string> {
  29. const defaultUrl = defaultImage ?? ImageManager.defaultImage
  30. if (id === null) {
  31. return defaultUrl
  32. }
  33. const imageUrl = `api/image/download/${id}/${size}`
  34. // Une image doit toujours avoir le time en options pour éviter les problèmes de cache
  35. const query = [this.getCacheKey()]
  36. const response = await this.apiRequestService.get(imageUrl, query);
  37. const cachedImageUrl = response.toString()
  38. if (!cachedImageUrl) {
  39. console.error('Error: image ' + id + ' not found');
  40. return defaultUrl;
  41. }
  42. return cachedImageUrl
  43. }
  44. public async upload(
  45. filename: string,
  46. content: string,
  47. visibility: string = FILE_VISIBILITY.NOBODY,
  48. config: string | null = null,
  49. ) {
  50. content = content.replace(/^data:image\/[\w/]+;base64,/, '')
  51. const data = JSON.stringify({
  52. filename,
  53. content,
  54. type: FILE_TYPE.UPLOADED,
  55. visibility,
  56. config,
  57. })
  58. return await this.apiRequestService.post('api/upload', data)
  59. }
  60. /**
  61. * Convert the API response into base64
  62. * @param data
  63. * @protected
  64. */
  65. protected async toBase64(data: BlobPart) {
  66. const blob = FileUtils.newBlob(data)
  67. return (await FileUtils.blobToBase64(blob)) ?? ''
  68. }
  69. /**
  70. * On passe cette clé en paramètres des requêtes pour éviter les problèmes de cache
  71. *
  72. * @protected
  73. */
  74. protected getCacheKey() {
  75. return new Date().getTime().toString()
  76. }
  77. }
  78. export default ImageManager