axe-api 0.18.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Release Notes
2
2
 
3
+ ## [0.19.0 (2021-12-05)](https://github.com/axe-api/axe-api/compare/0.19.0...0.18.1)
4
+
5
+ ### Fixed
6
+
7
+ - [#110](https://github.com/axe-api/axe-api/issues/110)
8
+
9
+ ### Enhancements
10
+
11
+ - [#106](https://github.com/axe-api/axe-api/issues/106)
12
+
3
13
  ## [0.18.1 (2021-12-02)](https://github.com/axe-api/axe-api/compare/0.18.1...0.18.0)
4
14
 
5
15
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axe-api",
3
- "version": "0.18.1",
3
+ "version": "0.19.0",
4
4
  "description": "AXE API is a simple tool which has been created based on Express and Knex.js to create Rest APIs quickly.",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/src/constants.js CHANGED
@@ -13,6 +13,7 @@ const HOOK_FUNCTIONS = {
13
13
  onBeforeDeleteQuery: "onBeforeDeleteQuery",
14
14
  onBeforeDelete: "onBeforeDelete",
15
15
  onBeforePaginate: "onBeforePaginate",
16
+ onBeforeAll: "onBeforeAll",
16
17
  onBeforeShow: "onBeforeShow",
17
18
  onAfterInsert: "onAfterInsert",
18
19
  onAfterUpdateQuery: "onAfterUpdateQuery",
@@ -20,6 +21,7 @@ const HOOK_FUNCTIONS = {
20
21
  onAfterDeleteQuery: "onAfterDeleteQuery",
21
22
  onAfterDelete: "onAfterDelete",
22
23
  onAfterPaginate: "onAfterPaginate",
24
+ onAfterAll: "onAfterAll",
23
25
  onAfterShow: "onAfterShow",
24
26
  };
25
27
 
@@ -52,7 +54,8 @@ const HANDLERS = {
52
54
  SHOW: "show",
53
55
  UPDATE: "update",
54
56
  DELETE: "destroy",
55
- AUTOSAVE: "autosave",
57
+ PATCH: "patch",
58
+ ALL: "all",
56
59
  };
57
60
 
58
61
  const DEFAULT_HANDLERS = [
@@ -60,6 +63,7 @@ const DEFAULT_HANDLERS = [
60
63
  HANDLERS.PAGINATE,
61
64
  HANDLERS.SHOW,
62
65
  HANDLERS.UPDATE,
66
+ HANDLERS.PATCH,
63
67
  HANDLERS.DELETE,
64
68
  ];
65
69
 
@@ -68,6 +72,7 @@ const HTTP_METHODS = {
68
72
  GET: "GET",
69
73
  PUT: "PUT",
70
74
  DELETE: "DELETE",
75
+ PATCH: "PATCH",
71
76
  };
72
77
 
73
78
  const API_ROUTE_TEMPLATES = {
@@ -79,6 +84,11 @@ const API_ROUTE_TEMPLATES = {
79
84
  url: (prefix, parentUrl, resource) => `/${prefix}/${parentUrl}${resource}`,
80
85
  method: HTTP_METHODS.GET,
81
86
  },
87
+ [HANDLERS.ALL]: {
88
+ url: (prefix, parentUrl, resource) =>
89
+ `/${prefix}/${parentUrl}${resource}/all`,
90
+ method: HTTP_METHODS.GET,
91
+ },
82
92
  [HANDLERS.SHOW]: {
83
93
  url: (prefix, parentUrl, resource, primaryKey) =>
84
94
  `/${prefix}/${parentUrl}${resource}/:${primaryKey}`,
@@ -89,10 +99,10 @@ const API_ROUTE_TEMPLATES = {
89
99
  `/${prefix}/${parentUrl}${resource}/:${primaryKey}`,
90
100
  method: HTTP_METHODS.PUT,
91
101
  },
92
- [HANDLERS.AUTOSAVE]: {
102
+ [HANDLERS.PATCH]: {
93
103
  url: (prefix, parentUrl, resource, primaryKey) =>
94
- `/${prefix}/${parentUrl}${resource}/:${primaryKey}/autosave`,
95
- method: HTTP_METHODS.PUT,
104
+ `/${prefix}/${parentUrl}${resource}/:${primaryKey}`,
105
+ method: HTTP_METHODS.PATCH,
96
106
  },
97
107
  [HANDLERS.DELETE]: {
98
108
  url: (prefix, parentUrl, resource, primaryKey) =>
package/src/core/Model.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import pluralize from "pluralize";
2
2
  import { snakeCase } from "snake-case";
3
- import { RELATIONSHIPS, HANDLERS } from "./../constants.js";
4
- const { INSERT, SHOW, UPDATE, PAGINATE, DELETE } = HANDLERS;
3
+ import { RELATIONSHIPS, DEFAULT_HANDLERS } from "./../constants.js";
5
4
 
6
5
  class Model {
7
6
  constructor() {
@@ -25,7 +24,7 @@ class Model {
25
24
  }
26
25
 
27
26
  get handlers() {
28
- return [INSERT, SHOW, PAGINATE, UPDATE, DELETE];
27
+ return [...DEFAULT_HANDLERS];
29
28
  }
30
29
 
31
30
  get middlewares() {
@@ -0,0 +1,73 @@
1
+ import {
2
+ callHooks,
3
+ getRelatedData,
4
+ filterHiddenFields,
5
+ serializeData,
6
+ addForeignKeyQuery,
7
+ } from "./helpers.js";
8
+ import { HOOK_FUNCTIONS, HANDLERS } from "./../constants.js";
9
+ import QueryParser from "./../core/QueryParser.js";
10
+
11
+ export default async (context) => {
12
+ const { request, response, model, models, trx, relation, parentModel } =
13
+ context;
14
+
15
+ const queryParser = new QueryParser({ model, models });
16
+
17
+ // We should parse URL query string to use as condition in Lucid query
18
+ const conditions = queryParser.get(request.query);
19
+
20
+ // Creating a new database query
21
+ const query = trx.from(model.instance.table);
22
+
23
+ // Users should be able to select some fields to show.
24
+ queryParser.applyFields(query, conditions.fields);
25
+
26
+ // Binding parent id if there is.
27
+ addForeignKeyQuery(request, query, relation, parentModel);
28
+
29
+ // Users should be able to filter records
30
+ queryParser.applyWheres(query, conditions.q);
31
+
32
+ await callHooks(model, HOOK_FUNCTIONS.onBeforeAll, {
33
+ ...context,
34
+ conditions,
35
+ query,
36
+ });
37
+
38
+ // User should be able to select sorting fields and types
39
+ queryParser.applySorting(query, conditions.sort);
40
+
41
+ const result = await query;
42
+
43
+ // We should try to get related data if there is any
44
+ await getRelatedData(
45
+ result.data,
46
+ conditions.with,
47
+ model,
48
+ models,
49
+ trx,
50
+ HANDLERS.ALL,
51
+ request
52
+ );
53
+
54
+ await callHooks(model, HOOK_FUNCTIONS.onAfterAll, {
55
+ ...context,
56
+ result,
57
+ conditions,
58
+ query,
59
+ });
60
+
61
+ // Serializing the data by the model's serialize method
62
+ result.data = await serializeData(
63
+ result.data,
64
+ model.instance.serialize,
65
+ HANDLERS.ALL,
66
+ request
67
+ );
68
+
69
+ // Filtering hidden fields from the response data.
70
+ filterHiddenFields(result.data, model.instance.hiddens);
71
+
72
+ return response.json(result);
73
+ };
@@ -1,8 +1,9 @@
1
- import autosave from "./autosave.js";
1
+ import all from "./all.js";
2
+ import patch from "./patch.js";
2
3
  import store from "./store.js";
3
4
  import show from "./show.js";
4
5
  import paginate from "./paginate.js";
5
6
  import update from "./update.js";
6
7
  import destroy from "./destroy.js";
7
8
 
8
- export default { autosave, store, show, paginate, update, destroy };
9
+ export default { all, patch, store, show, paginate, update, destroy };
@@ -84,7 +84,7 @@ export default async (context) => {
84
84
  item = await serializeData(
85
85
  item,
86
86
  model.instance.serialize,
87
- HANDLERS.AUTOSAVE,
87
+ HANDLERS.PATCH,
88
88
  request
89
89
  );
90
90
 
@@ -166,6 +166,7 @@ const getModelMiddlewares = (model, handler) => {
166
166
 
167
167
  const getRootPrefix = () => {
168
168
  if (Config.Application.prefix) {
169
+ // NOSONAR
169
170
  return Config.Application.prefix.replace(/^\/|\/$/g, "");
170
171
  }
171
172
  return "api";