All files / route JsonApiRouter.js

100% Statements 10/10
100% Branches 0/0
100% Functions 4/4
100% Lines 10/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82                                                                                                      1x   1x 1x                 1x 1x   1x   1x     1x         1x 1x        
import { ResourcefulApi } from '../api/ResourcefulApi'
import { Router } from './Router'
import { JsonApiRoute } from './JsonApiRoute'
 
/**
 * A simple router implementation querying a json:api endpoint which delivers all
 * necessary route information
 *
 * The endpoint must return a list of Route objects:
 *
 * ```json
 * {
 *     "data": [
 *         {
 *             "type": "VuexJsonApiRoute",
 *             "id": 1,
 *             "attributes": {
 *                 "parameters": [],
 *                 "url": "api/route",
 *                 "method": "list",
 *                 "module": "route"
 *             }
 *        },
 *        {
 *            "type": "VuexJsonApiRoute",
 *            "id": 2,
 *            "attributes": {
 *                "parameters": [
 *                    "id"
 *                ],
 *                "url": "api/route/{id}",
 *                "method": "get",
 *                 "module": "route"
 *            }
 *        }
 *     ]
 * }
 * ```
 *
 * To initialize this router, simply `new` it with the desired fetch path,
 * e.g. `new JsonApiRouter('/api/route')`.
 *
 * @class JsonApiRouter
 */
export class JsonApiRouter extends Router {
  /**
   *
   * @param {String} baseUrl
   * @param {String} fetchPath
   */
  constructor (baseUrl, fetchPath) {
    super()
 
    this.baseUrl = baseUrl
    this.fetchPath = fetchPath
  }
 
  /**
   * Update routes
   *
   * @returns {*}
   */
  async updateRoutes () {
    const api = new ResourcefulApi()
    api.setBaseUrl(this.baseUrl)
 
    return api.get(this.fetchPath)
      .then(({ data }) => {
        this.parseApiResult(data)
 
        // returning self to make working with this in chained promises easier
        return this
      })
  }
 
  parseApiResult (data) {
    for (const routeResource of Object.values(data.vuexJsonApiRoute)) {
      this.addRoute(new JsonApiRoute(routeResource))
    }
  }
}