CMS API

Om requests naar de API af te handelen is een standaard request handler gemaakt.

Deze is te vinden in: /api/default/request-handler.js Deze handler wordt o.a. gebruikt om de site en categorie data op te halen.

Je geeft een endpoint, type request en de eventuele post-data mee.

Example

requesthandler
import {Cms} from '../index';

const HTTP_METHOD_GET = "GET";
const HTTP_METHOD_POST = "POST";

const CONTENT_TYPE_JSON = "application/json";

function containsContentWithType(response, expectedContentType) {
   const contentTypeHeader = response.headers.get("Content-Type");
   return contentTypeHeader?.indexOf(expectedContentType) > -1;
}

export default {
    executeRequest(endPoint, method, data = null) {
        const url = Cms.$apiBaseUrl + endPoint;
      const request = this.createRequestInfo(method, data);

      return fetch(url, request)
         .catch(this.handleRequestError)
         .then(response => {
            if (!response)
               return Promise.reject();

            // Handle error response status (non-2xx status code).
            if (!response.ok) {
               // No json data in response -> reject with status code only.
               if (!containsContentWithType(response, CONTENT_TYPE_JSON))
                  return Promise.reject({ status: response.status });

               // Json data in response -> reject with status code and response data.
               return response
                  .json()
                  .then(data => Promise.reject({ status: response.status, data: data }));
            }

            // Handle success response status.
            // Store authorization tokens from response.
            const cmsAuthToken = response.headers.get("SetAuthorization");
            if (cmsAuthToken)
            {
               Cms.$cookies.set('cmsAuthToken', `Bearer ${cmsAuthToken}`);
               Cms.$store.commit('SiteStore/setCmsAuthToken', `Bearer ${cmsAuthToken}`);
            }

            // Return the json content of the response, if there is any.
            if (containsContentWithType(response, CONTENT_TYPE_JSON))
               return response.json();
         });
  },

   createRequestInfo(method, data) {
      const request = {
         method: method,
         headers: {}
      };

      const token = Cms.$store.getters['SiteStore/getCmsAuthToken'];
      if (token)
         request.headers['Authorization'] = token;

      const hash = Cms.$store.getters['SiteStore/getPretendDate']?.hash;
      if (hash != null)
         request.headers['PretendHash'] = hash;

      if (data) {
         request.headers['Content-Type'] = CONTENT_TYPE_JSON;
         request.body = JSON.stringify(data);
      }

      return request;
   },

   handleRequestError(error) {
      if(error) {
         console.error('REQUEST ERROR', `${error}`, '|', error.response || error.code || error.status);
         return Promise.reject(error.response || error.code || error.status);
      }
      console.error('REQUEST ERROR WITHOUT ERROR OBJECT');
   },

  get(endPoint, query) {
    if (query == null)
      query = '';
    else if (typeof query === 'object') {
      let result = '';

      for (let prop in query)
        result += `&${prop}=${encodeURIComponent(query[prop])}`;

      query = result.length ? '?' + result.substr(1) : '';
    }
    else
      query = '?' + query;

    if (query === '?')
      query = '';

    const url = `${endPoint}${query}`;

    return this.executeRequest(url, HTTP_METHOD_GET);
  },

  post(endPoint, body) {
    const url = `${endPoint}`;
    return this.executeRequest(url, HTTP_METHOD_POST, body);
  }
};
CMS
import RequestHandler from './requesthandler.js';

export default {
  getCategory(siteId, path) {
    const containsSiteId = /[\?\&]steID=\d+/gi;

    path = path || '';

    if (!containsSiteId.test(path)) {
      if (path.indexOf('?') > -1)
        path += `&steID=${siteId}`;
      else
        path += `?steID=${siteId}`;
    }

    if (!path.startsWith('/'))
      path = '/' + path;

    const url = `/categories/category${path}`;

    return RequestHandler.get(url);
  },
  getCategories(siteId, refresh) {
    let url = `/categories?steID=${siteId}`;

    if (refresh === true)
      url += '&refresh=1';

    return RequestHandler.get(url);
  },
  async getLastChange(siteId) {
    const url = `/categories/last-change/${siteId}`;
    const lastChange = await RequestHandler.get(url);

    return lastChange.dateTime;

  },
  getPretendHash(pretendDateId, siteId, categoryId) {
    let url = `/misc/pretendhash?noDelete=1&pdtID=${pretendDateId}`;

    if (siteId !== undefined)
      url += `&steID=${siteId}`;

    if (categoryId !== undefined)
      url += `&catID=${categoryId}`;

    return RequestHandler.get(url);
  },
  checkRedirect(url, siteId) {
    return RequestHandler.post(`/redirect/get?url=${url}&steID=${siteId}`);
  },
  getUser() {
    return RequestHandler.get('/authentication/current');
  },
  login(username, password) {
    return RequestHandler.post('/authentication/authenticate', {username: username, password: password})
  },
  ratings: {
    get(siteId, typeId, objectId, pageSize, page) {
      const request = {typeId, objectId, pageSize, page};
      return RequestHandler.post(`/ratings/get?steId=${siteId}`, request);
    },
    getBase(siteId, typeId, objectId) {
      return RequestHandler.get(`/ratings/base/${typeId}/${objectId}?steId=${siteId}`);
    },
    getTotals(siteId, typeId, objectId) {
      return RequestHandler.get(`/ratings/get-totals/${typeId}/${objectId || ""}?steId=${siteId}`);
    },
    init(siteId, guid) {
      return RequestHandler.get(`/ratings/initialize/${guid}?steId=${siteId}`);
    },
  },
}
Example usage
import CmsApi from '@snakeware/library.module.cms/src/api/api.js'

export const emptyResponse = new Promise((resolve) =>
  resolve({ category: null })
)

export const decapitalize = (value) => {
  return value.substr(0, 1).toLocaleLowerCase() + value.substr(1)
}

export const getLayout = (context) => {
  if (context.category == null) return 'default'

  if (context.category.alias != null) {
    const name = decapitalize(context.category.alias)
    return `layout-${name}`
  } else return `layout-${context.category.categoryStyleId}`
}

export const handleCatch = (context, error, path, number) => {
  if (number === undefined) number = 1

  if (number > 5)
    return context.error({
      statusCode: 500,
      message: `To many failures requesting the current category.`
    })

  console.log('Error cms handleCatch', error)

  if (error == null || error.status === 500)
    return context.error({ statusCode: 500, message: `${error}` })

  if (error.status === 401) {
    return context.app.$auth.logout().then(() => {
      CmsApi.getCategory(context.siteId, path)
        .then((response) => context.app.$cms.setCurrentPage(response))
        .catch((error) => handleCatch(context, error, path, ++number))
    })
  }

  if (error.status === 301) context.redirect(301, error.data)
  else if (error.status === 302) context.redirect(302, error.data)
  else {
    context.$cookies.set('error_event', {
      event: '404',
      message: 'Page not found',
      '404url': context.route.path
    })
    return context.error({ statusCode: 404, message: 'Page not found.' })
  }
}

export const getCategory = (context, path) => {
  const cms = context.app.$cms
  const siteId = context.siteId
  if (path != '/' && path.endsWith('/')) {
    context.redirect(301, path.slice(0, -1))
    return
  }

  if (path.startsWith('/_')) return emptyResponse

  if (path.startsWith('/misc/')) return emptyResponse

  return CmsApi.getCategory(siteId, path)
    .then(async (response) => {
      return await context.store
        .dispatch('CmsApiWebshopStore/getProductTemplateData', response)
        .then(() => {
          return cms.setCurrentPage(response)
        })
    })
    .catch((error) => handleCatch(context, error, path))
}