frontend/app/PremiereVersionChange/VersionChangeService.ts (107 lines of code) (raw):

import axios from "axios"; import { getProjectsDefaultStorageId } from "../multistep/projectcreate_new/ProjectStorageService"; async function lookupVersion( clientVersionString: string ): Promise<PremiereVersionTranslation> { try { const response = await axios.get<PremiereVersionTranslationResponse>( `/api/premiereVersion/${encodeURIComponent(clientVersionString)}` ); if (response.data.count == 0) { return Promise.reject( `We did not recognise your installed version of Premiere, ${clientVersionString}. Please report this to Multimedia tech.` ); } else { return response.data.result[0]; } } catch (err) { console.error( `Could not look up client version string ${clientVersionString}: `, err ); return Promise.reject( "There was a server error trying to find your installed version of Premiere, please retry in a few minutes." ); } } function getBasename(filePath: string): string { const xtractor = /\/([^\/]+)$/; const result = xtractor.exec(filePath); if (result) { return result[1]; //first capture group } else { console.log(`warning, file path ${filePath} has no path part`); return filePath; } } async function lookupProjectFile(filePath: string): Promise<FileEntry> { try { let queryData: FileEntryFilterTerms = { filePath: getBasename(filePath), match: "W_EXACT", }; //limit the storage query to the storage where primary projects should be. try { const defaultStorageId = await getProjectsDefaultStorageId(); queryData.storageId = defaultStorageId; } catch (err) { if (err.response && err.response.status == 404) { console.warn( "There is no default storage set, so backups cannot be excluded. Consider setting a default project storage to improve reliability of this operation." ); } else { throw err; } } const response = await axios.put<ObjectListResponse<FileEntry>>( "/api/file/list", queryData ); if (response.data.count == 0) { return Promise.reject( "Could not find this project file in the system. Please report this error to Multimedia tech, along with the page URL above." ); } else { const liveProjects = response.data.result.filter((f) => !f.backupOf); return liveProjects[0]; } } catch (err) { console.error("Could not look up project file information: ", err); return Promise.reject( "There was a server error trying to find your project. Please try again in a few minutes." ); } } /** * Asks the backend to change the version in the given premiere file to suit a given premiere version * @param fileId numeric identifier of the file to change * @param requiredVersion user's installed premiere version, in the form x.y.z * @returns Promise<FileEntry> Promise that resolves to an updated FileEntry object for the updated file entry. On error, the promise rejects. */ async function performConversion( fileId: number, requiredVersion: string ): Promise<FileEntry> { try { const response = await axios.post( `/api/file/${fileId}/changePremiereVersion?requiredDisplayVersion=${encodeURIComponent( requiredVersion )}`, null, { validateStatus: (status) => status === 200 || status === 400 } ); switch (response.status) { case 200: //conversion was done ok const data = response.data as ConversionResponse; return data.entry; case 400: //there was a problem with the input const problem = response.data as GenericErrorResponse; return Promise.reject( problem.detail ?? "Server returned an unknown error" ); default: //the construct of the axios call above should guarantee that only 200 or 400 responses come through here return Promise.reject( `Internal error, unexpected return code ${response.status} should not happen` ); } } catch (err) { console.error("Could not request conversion: ", err); return Promise.reject( "Unable to request conversion, please see the javascript console log for details." ); } } export { lookupVersion, lookupProjectFile, performConversion, getBasename };