import { CmsError, HttpError, ReferenceError, UnauthorizedError } from './errors'; import { stringify } from 'query-string'; import { getCmsSettings } from '../tools/settings'; export enum ErrorCode { Reference = 3001, Validation = 3012 } export function getServerPath() { return (getCmsSettings().apiDomain || '') + '/api'; } export const handleFetch = async (path: string, init: RequestInit = {}, isJson = true): Promise => { try { const headers: Headers = new Headers(init.headers); if (isJson) { headers.append('Accept', 'application/json'); headers.append('Content-Type', 'application/json'); } const response = await fetch(`${getServerPath()}${path}`, { ...init, ...(init && init.body && { body: init.body }), headers, credentials: 'include' }); return handleResponse(response); } catch (err) { // Known cases for 'TypeError: failed to fetch': // - invalid session token (most cases) if (err instanceof TypeError && err.message === 'Failed to fetch') { throw new CmsError( err.message, 'Er ging iets mis. Mogelijk ben je niet meer ingelogd. Probeer deze pagina te verversen en probeer het opnieuw.
Blijf je dit bericht krijgen? Neem dan contact op met jouw contactpersoon voor dit CMS.' ); } throw err; } }; export const handleDelete = (path: string): Promise => { return handleFetch(path, { method: 'delete' }, false).catch((error: HttpError) => { // Error code 3001 indicates the item is still referenced somewhere else if (error.errorCode === ErrorCode.Reference) { throw new ReferenceError('', 'Er zijn nog bestaande verwijzingen naar dit item, verwijder deze eerst.', true, error); } throw error; }); }; export const stringifyQuery = (path: string, params: Object): string => { if (params) { const query = stringify(params, { sort: false }); return `${path}?${query}`; } return `${path}`; }; const handleResponse = async (response: Response): Promise => { // TODO: singletonFactory can return a 204 on /{itemName}/latest, we have to take that response into account if (!response.ok) { let message; let friendlyMessage; let errorCode; if (response.body) { const res = await response.json(); message = res.message; friendlyMessage = res.friendlyMessage; errorCode = res.errorCode; } if (response.status === 401) { if (message) { throw new UnauthorizedError(message, errorCode); } throw new UnauthorizedError(`Deze gebruiker heeft geen toegang tot ${response.url}`, errorCode); } if (response.body) { throw new CmsError(message, friendlyMessage, response.status, errorCode); } throw new CmsError(message || response.statusText, undefined, response.status, errorCode); } return response; };