From c0a3da4635d24ca6dfa4cae5b89927781fcca881 Mon Sep 17 00:00:00 2001 From: Gabriel De Los Rios Date: Thu, 5 Feb 2026 22:45:46 -0300 Subject: [PATCH] feat: add utility service for handling file types --- src/app/services/filetype-utils.spec.ts | 52 +++++++++++++++++++++++++ src/app/services/filetype-utils.ts | 44 +++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/app/services/filetype-utils.spec.ts create mode 100644 src/app/services/filetype-utils.ts diff --git a/src/app/services/filetype-utils.spec.ts b/src/app/services/filetype-utils.spec.ts new file mode 100644 index 0000000..9d42052 --- /dev/null +++ b/src/app/services/filetype-utils.spec.ts @@ -0,0 +1,52 @@ +import { TestBed } from '@angular/core/testing'; + +import { FiletypeUtils } from './filetype-utils'; + +describe('Filetype', () => { + let service: FiletypeUtils; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FiletypeUtils); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should validate image mimetypes', () => { + expect(service.isValidImageMimeType('image/png')).toBe(true); + expect(service.isValidImageMimeType('text/lua')).toBe(false); + }); + + describe('getImageMimeTypeFromFilename', () => { + it('should return appropriate MimeType for valid file extension', () => { + const FILENAME_MOCK = 'mock.png'; + const mimeType = service.getImageMimeTypeFromFilename(FILENAME_MOCK); + expect(mimeType).toEqual('image/png'); + }); + + it('should throw error for files without extension', async () => { + const FILENAME_MOCK = 'mock'; + expect(() => service.getImageMimeTypeFromFilename(FILENAME_MOCK)).toThrow(); + }); + + it('should throw error for unknown file extensions', () => { + const FILENAME_MOCK = 'mock.txt'; + expect(() => service.getImageMimeTypeFromFilename(FILENAME_MOCK)).toThrow(); + }); + }); + + describe('getImageExtensionFromMimeType', () => { + it('should return appropriate file extension for valid MimeType', () => { + const MIMETYPE_MOCK = 'image/jpeg'; + const fileExt = service.getImageExtensionFromMimeType(MIMETYPE_MOCK); + expect(fileExt).toEqual('jpeg'); + }); + + it('should throw error for uknown mimetypes', () => { + const MIMETYPE_MOCK = 'text/lua'; + expect(() => service.getImageExtensionFromMimeType(MIMETYPE_MOCK)).toThrow(); + }); + }); +}); diff --git a/src/app/services/filetype-utils.ts b/src/app/services/filetype-utils.ts new file mode 100644 index 0000000..ea0f5ee --- /dev/null +++ b/src/app/services/filetype-utils.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class FiletypeUtils { + + isValidImageMimeType(mimeType: string) { + try { + this.getImageExtensionFromMimeType(mimeType); + return true; + }catch(e) { + console.error(e); + return false; + } + } + + getImageMimeTypeFromFilename(filename: string): string { + const ext = filename.split('.')[1]?.toLowerCase(); + if (!ext) throw new Error('File has no extension!'); + const mimeMap: Record = { + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + webp: 'image/webp', + gif: 'image/gif', + }; + if (!mimeMap[ext]) throw new Error('Invalid file extension!'); + return mimeMap[ext]; + } + + getImageExtensionFromMimeType(mimeType: string) { + const extMap: Record = { + 'image/jpeg': 'jpeg', + 'image/png': 'png', + 'image/webp': 'webp', + 'image/gif': 'gif', + }; + if (!extMap[mimeType]) throw new Error('Invalid mimetype!'); + return extMap[mimeType]; + } + + +}