import axios from 'axios'; import FileUploadResponse from '@/interfaces/responses/FileUploadResponse'; import FileStatusResponse from '@/interfaces/responses/FileStatusResponse'; export default class ApiService { /** @type {string} */ private readonly baseUrl: string = window.location.origin; /** @type { [key:string] : string; } */ private readonly apiRoutes = { file: this.baseUrl + '/api/file', fileDownload: this.baseUrl + '/api/file/convert', fileDiscard: this.baseUrl + '/api/file/', searchAndDisplace: this.baseUrl + '/search-and-displace', sdOnOriginalDocument: `${this.baseUrl}/search-and-displace/original-document`, }; constructor() { } /** * Upload a file to the server and return its response. * Throws an error if the response wasn't successful * * TODO: Annotate the return type correctly * * @param {File} file The file we want to upload * * @returns {Promise} The response from the server */ public async uploadFile(file: File): Promise { let formData = new FormData(); formData.append('file', file); try { let response = await axios.post( this.apiRoutes.file, formData, { headers: { 'Content-Type': 'multipart/form-data' } } ) return response.data; } catch (err) { throw err; } } /** * * @param document * @param searchers */ public async sdOnOriginalDocument( document: File, searchers: Array<{ key: string; type: string; value: string; }> ): Promise { let formData = new FormData(); formData.append('document', document); formData.append('searchers', JSON.stringify(searchers)); try { let response = await axios.post( this.apiRoutes.sdOnOriginalDocument, formData, { headers: { 'Content-Type': 'multipart/form-data' } } ) return response.data; } catch (err) { throw err; } } public async verifySdOnOriginalDocumentIsDone(id: string) { try { let response = await axios.get( `${this.apiRoutes.sdOnOriginalDocument}/${id}`); return response.data; } catch (err) { throw err; } } /** * Get data for a file from the server. * Throws an error if the response wasn't successful * * @param {string} fileId The id of the file we want to query * * @returns {Promise} The response from the server * * @throws */ public async getFileData(fileId: string): Promise { try { let response = await axios.get(this.apiRoutes.searchAndDisplace + `/${fileId}`); return response.data; } catch (err) { throw err; } } /** * Perform a search and displace operation on a document * * @param {string} content The content of the document * @param {Array} searchers The list of searchers and their replace values * @param {boolean} searchOnly Whether or not to also displace the content (default yes) */ public async filterDocument( file: string, searchers: Array<{ key: string; type: string; value: string; }>, searchOnly: boolean = false, ) { try { let response = await axios.post( this.apiRoutes.searchAndDisplace, { 'file': file, 'searchers': searchers, 'searchOnly': searchOnly } ); return response.data; } catch (err) { throw err; } } /** * Convert a file from MD to ODT * * @param {string} content * @param {string} fileId * * @returns */ public async convertFile(file: {id: string, name: string}, searchers: Array<{ key: string; type: string; value: string; }>) { try { let response = await axios.post( this.apiRoutes.fileDownload, { 'file': { 'id': file.id, 'type': (file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length) !== 'pdf') ? 'odt' : 'pdf' }, 'searchers': searchers } ); return response.data; } catch (err) { throw err; } } /** * Discard a file in progress * * @param {string} fileId */ public async discardFile(fileId: string) { try { let response = await axios.delete( this.apiRoutes.fileDiscard + fileId ); return response.data; } catch (err) { throw err; } } }