frontend/app/utils/master-api-service.ts (575 lines of code) (raw):

import axios from "axios"; import { etEE } from "@material-ui/core/locale"; import { SystemNotifcationKind, SystemNotification, } from "@guardian/pluto-headers"; import MainstreamMaster from "../Master/MainstreamMaster"; import DailymotionMaster from "../Master/DailymotionMaster"; const API = "/api"; const API_DELIVERABLE = `${API}/bundle`; const API_PATH_GNM = "gnmwebsite"; const API_PATH_YOUTUBE = "youtube"; const API_PATH_DAILYMOTION = "dailymotion"; const API_PATH_MAINSTREAM = "mainstream"; const API_PATH_OOVVUU = "oovvuu"; const API_PATH_REUTERSCONNECT = "reutersconnect"; export const getDeliverableGNM = async ( deliverableId: string, assetId: string ): Promise<GuardianMaster> => { try { const { status, data } = await axios.get<GuardianMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_GNM}` ); if (status === 200) { return data; } else { throw new Error(`Could not fetch Asset GNM Website`); } } catch (error) { // Due to GET returns 404 if the metadata entry does not exists // do not treat this is an error if (error?.response?.status === 404) { return Promise.reject(); } console.error(error); return Promise.reject(`Could not fetch Asset GNM Website`); } }; export const createGNMDeliverable = async ( deliverableId: string, assetId: string, guardianMaster: CreateGuardianMaster ): Promise<GuardianMaster> => { const { production_office, tags, website_title, website_description, primary_tone, } = guardianMaster; try { const { status, data } = await axios.put<GuardianMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_GNM}`, { production_office, tags, website_title, website_description, primary_tone, } ); if (status === 200) { return data; } else { throw new Error(`Could not create Asset GNM Website`); } } catch (error) { console.error(error); return Promise.reject(`Could not create Asset GNM Website`); } }; export const updateGNMDeliverable = async ( deliverableId: string, assetId: string, guardianMaster: GuardianMaster ): Promise<GuardianMaster> => { try { const { status, data } = await axios.put<GuardianMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_GNM}`, guardianMaster ); if (status === 200) { return data; } else { throw new Error(`Could not update Asset GNM Website`); } } catch (error) { console.error(error); return Promise.reject(`Could not update Asset GNM Website`); } }; export const deleteGNMDeliverable = async ( deliverableId: string, assetId: string ): Promise<void> => { try { await axios.delete<void>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_GNM}` ); } catch (error) { console.error(error); return Promise.reject(`Could not delete Asset GNM Website`); } }; export async function requestResync(projectId: string, assetId: string) { try { await resyncToPublished(projectId, assetId); SystemNotification.open( SystemNotifcationKind.Success, "Requested resync, data should arrive within a couple of minutes." ); } catch (err) { SystemNotification.open( SystemNotifcationKind.Error, `Could not request resync, ${err}` ); } } export const resyncToPublished = async ( bundleId: string, assetId: string ): Promise<void> => { try { const result = await axios.post( `${API_DELIVERABLE}/${bundleId}/asset/${assetId}/atomresync` ); if (result.data.hasOwnProperty("status") && result.data.status == "error") { if (result.data.hasOwnProperty("detail")) { return Promise.reject(result.data.detail); } else { return Promise.reject("Launchdetector reported an error"); } } } catch (err) { console.error(err); try { if ( err.response && err.response.hasOwnProperty("data") && err.response.data.hasOwnProperty("details") ) { return Promise.reject(err.response.data.details); } return Promise.reject("see browser console for details"); } catch (responseErr) { console.error("Caught error when handling response: ", responseErr); } return Promise.reject(`see browser console for details`); } }; export const getDeliverableYoutube = async ( deliverableId: string, assetId: string ): Promise<YoutubeMaster> => { try { const { status, data } = await axios.get<YoutubeMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_YOUTUBE}` ); if (status === 200) { return data; } else { throw new Error(`Could not fetch Asset Youtube master`); } } catch (error) { // Due to GET returns 404 if the metadata entry does not exists // do not treat this is an error if (error?.response?.status === 404) { return Promise.reject(); } console.error(error); return Promise.reject(`Could not fetch Asset Youtube master`); } }; export const createYoutubeDeliverable = async ( deliverableId: string, assetId: string, youtubeMaster: CreateYoutubeMaster ): Promise<YoutubeMaster> => { const { youtube_id, youtube_title, youtube_description, youtube_tags, } = youtubeMaster; try { const { status, data } = await axios.put<YoutubeMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_YOUTUBE}`, { youtube_id, youtube_title, youtube_description, youtube_tags, } ); if (status === 200) { return data; } else { throw new Error(`Could not create Asset Youtube Master`); } } catch (error) { console.error(error); return Promise.reject(`Could not create Asset Youtube Master`); } }; export const updateYoutubeDeliverable = async ( deliverableId: string, assetId: string, youtubeMaster: YoutubeMaster ): Promise<YoutubeMaster> => { try { const { status, data } = await axios.put<YoutubeMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_YOUTUBE}`, youtubeMaster ); if (status === 200) { return data; } else { throw new Error(`Could not update Asset Youtube Master`); } } catch (error) { console.error(error); return Promise.reject(`Could not update Asset Youtube Master`); } }; export const deleteYoutubeDeliverable = async ( deliverableId: string, assetId: string ): Promise<void> => { try { await axios.delete<void>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_YOUTUBE}` ); } catch (error) { console.error(error); return Promise.reject(`Could not delete Asset Youtube Master`); } }; export const getDeliverableDailymotion = async ( deliverableId: string, assetId: string ): Promise<DailymotionMaster> => { try { const { status, data } = await axios.get<DailymotionMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_DAILYMOTION}` ); if (status === 200) { return data; } else { throw new Error(`Could not fetch Asset Dailymotion master`); } } catch (error) { // Due to GET returns 404 if the metadata entry does not exists // do not treat this is an error if (error?.response?.status === 404) { return Promise.reject(); } console.error(error); return Promise.reject(`Could not fetch Asset Dailymotion master`); } }; export const createDailymotionDeliverable = async ( deliverableId: string, assetId: string, dailymotionMaster: CreateDailymotionMaster ): Promise<DailymotionMaster> => { const { daily_motion_url, daily_motion_title, daily_motion_description, daily_motion_tags, daily_motion_no_mobile_access, daily_motion_contains_adult_content, daily_motion_category, } = dailymotionMaster; try { const response = await genericUpdate<CreateDailymotionMaster>( deliverableId, assetId, API_PATH_DAILYMOTION, { daily_motion_url, daily_motion_title, daily_motion_description, daily_motion_tags, daily_motion_no_mobile_access, daily_motion_contains_adult_content, daily_motion_category, } ); return response as DailymotionMaster; } catch (error) { console.error(error); return Promise.reject(`Could not create Asset Dailymotion Master`); } }; export const updateDailymotionDeliverable = async ( deliverableId: string, assetId: string, dailymotionMaster: DailymotionMaster ): Promise<DailymotionMaster> => { try { return genericUpdate<DailymotionMaster>( deliverableId, assetId, API_PATH_DAILYMOTION, dailymotionMaster ); } catch (error) { console.error(error); return Promise.reject(`Could not update Asset Dailymotion Master`); } }; export const deleteDailymotionDeliverable = async ( deliverableId: string, assetId: string ): Promise<void> => { try { await axios.delete<void>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_DAILYMOTION}` ); } catch (error) { console.error(error); return Promise.reject(`Could not delete Asset Dailymotion Master`); } }; export const getDeliverableMainstream = async ( deliverableId: string, assetId: string ): Promise<MainstreamMaster> => { try { const { status, data } = await axios.get<MainstreamMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_MAINSTREAM}` ); if (status === 200) { return data; } else { throw new Error(`Could not fetch Asset Mainstream master`); } } catch (error) { // Due to GET returns 404 if the metadata entry does not exists // do not treat this is an error if (error?.response?.status === 404) { return Promise.reject(); } console.error(error); return Promise.reject(`Could not fetch Asset Mainstream master`); } }; export const createMainstreamDeliverable = async ( deliverableId: string, assetId: string, mainstreamMaster: CreateMainstreamMaster ): Promise<MainstreamMaster> => { const { mainstream_title, mainstream_description, mainstream_tags, mainstream_rules_contains_adult_content, } = mainstreamMaster; try { const result = await genericUpdate<CreateMainstreamMaster>( deliverableId, assetId, API_PATH_MAINSTREAM, { mainstream_title, mainstream_description, mainstream_tags, mainstream_rules_contains_adult_content, publication_date: undefined, } ); return result as MainstreamMaster; } catch (error) { console.error(error); return Promise.reject( `Could not create Asset Mainstream Master, see browser console` ); } }; export const updateMainstreamDeliverable = async ( deliverableId: string, assetId: string, mainstreamMaster: MainstreamMaster ): Promise<MainstreamMaster> => { try { return genericUpdate<MainstreamMaster>( deliverableId, assetId, API_PATH_MAINSTREAM, mainstreamMaster ); } catch (error) { console.error(error); return Promise.reject(`Could not update Asset Mainstream Master`); } }; export const deleteMainstreamDeliverable = async ( deliverableId: string, assetId: string ): Promise<void> => { try { await axios.delete<void>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_MAINSTREAM}` ); } catch (error) { console.error(error); return Promise.reject(`Could not delete Asset Mainstream Master`); } }; export const getDeliverableOovvuu = async ( deliverableId: string, assetId: string ): Promise<OovvuuMaster> => { try { const { status, data } = await axios.get<OovvuuMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_OOVVUU}` ); if (status === 200) { return data; } else { throw new Error(`Could not fetch Asset Mainstream master`); } } catch (error) { // Due to GET returns 404 if the metadata entry does not exists // do not treat this is an error if (error?.response?.status === 404) { return Promise.reject(); } console.error(error); return Promise.reject(`Could not fetch Asset Mainstream master`); } }; export const createOovvuuDeliverable = async ( deliverableId: string, assetId: string, content: OovvuuMaster ): Promise<OovvuuMaster> => { try { const result = await genericUpdate<CreateOovvuuMaster>( deliverableId, assetId, API_PATH_OOVVUU, { seen_on_channel: content.seen_on_channel, } ); return result as OovvuuMaster; } catch (error) { console.error(error); return Promise.reject( `Could not create Asset Oovvuu Master, see browser console` ); } }; export const updateOovvuuDeliverable = async ( deliverableId: string, assetId: string, content: OovvuuMaster ): Promise<OovvuuMaster> => { try { return genericUpdate<OovvuuMaster>( deliverableId, assetId, API_PATH_OOVVUU, content ); } catch (error) { console.error(error); return Promise.reject(`Could not update Asset Oovvuu Master`); } }; export const deleteOovvuuDeliverable = async ( deliverableId: string, assetId: string ): Promise<void> => { try { await axios.delete<void>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_OOVVUU}` ); } catch (error) { console.error(error); return Promise.reject(`Could not delete Asset Oovvuu Master`); } }; export const getDeliverableReutersConnect = async ( deliverableId: string, assetId: string ): Promise<ReutersConnectMaster> => { try { const { status, data } = await axios.get<ReutersConnectMaster>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_REUTERSCONNECT}` ); if (status === 200) { return data; } else { throw new Error(`Could not fetch Asset Mainstream master`); } } catch (error) { // Due to GET returns 404 if the metadata entry does not exists // do not treat this is an error if (error?.response?.status === 404) { return Promise.reject(); } console.error(error); return Promise.reject(`Could not fetch Asset Mainstream master`); } }; export const createReutersConnectDeliverable = async ( deliverableId: string, assetId: string, content: CreateReutersConnectMaster ): Promise<ReutersConnectMaster> => { try { const result = await genericUpdate<CreateReutersConnectMaster>( deliverableId, assetId, API_PATH_REUTERSCONNECT, { seen_on_channel: content.seen_on_channel, } ); return result as ReutersConnectMaster; } catch (error) { console.error(error); return Promise.reject( `Could not create Asset Reuters Connect Master, see browser console` ); } }; export const updateReutersConnectDeliverable = async ( deliverableId: string, assetId: string, content: ReutersConnectMaster ): Promise<ReutersConnectMaster> => { try { return genericUpdate<ReutersConnectMaster>( deliverableId, assetId, API_PATH_REUTERSCONNECT, content ); } catch (error) { console.error(error); return Promise.reject(`Could not update Asset Reuters Connect Master`); } }; export const deleteReutersConnectDeliverable = async ( deliverableId: string, assetId: string ): Promise<void> => { try { await axios.delete<void>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${API_PATH_REUTERSCONNECT}` ); } catch (error) { console.error(error); return Promise.reject(`Could not delete Asset Reuters Connect Master`); } }; async function genericUpdate<T>( deliverableId: string, assetId: string, apiPath: string, update: T ): Promise<T> { const { status, data } = await axios.put<ResponseWrapper<T>>( `${API_DELIVERABLE}/${deliverableId}/asset/${assetId}/${apiPath}`, update, { validateStatus: (status) => status == 200 || status == 409, } ); switch (status) { case 200: return data.data; case 409: return Promise.reject( "There was a conflict, somebody else has updated in the meantime. Please reload and try again." ); default: return Promise.reject( `Got an unknown response ${status} from the server` ); } }