@fraym/crud 0.11.0 → 0.13.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/README.md CHANGED
@@ -106,12 +106,33 @@ await client.update("tenantId", "YourCrudType", "id", {
106
106
  ### Delete data
107
107
 
108
108
  The name of `YourCrudType` has to equal your type name in your schema (also in casing).
109
- The `id` has to match the id of the data that you want to delete.
109
+
110
+ Delete all data of a type:
111
+
112
+ ```typescript
113
+ await client.delete("tenantId", "YourCrudType");
114
+ ```
115
+
116
+ Delete data matching a specific ID:
110
117
 
111
118
  ```typescript
112
119
  await client.delete("tenantId", "YourCrudType", "id");
113
120
  ```
114
121
 
122
+ Delete data matching a filter (see filter parameter for `getDataList` for details):
123
+
124
+ ```typescript
125
+ await client.delete("tenantId", "YourCrudType", undefined, {
126
+ fields: {
127
+ fieldName: {
128
+ operation: "equals",
129
+ type: "Int",
130
+ value: 123,
131
+ },
132
+ },
133
+ });
134
+ ```
135
+
115
136
  ### Get a single data element
116
137
 
117
138
  The name of `YourCrudType` has to equal your type name in your schema (also in casing).
@@ -127,7 +148,7 @@ You can specify a fourth parameter if you want to return a empty dataset instead
127
148
  const data = await client.getData("tenantId", "YourCrudType", "id", true);
128
149
  ```
129
150
 
130
- ### Get (paginated / filtered) data
151
+ ### Get (paginated / filtered / ordered) data
131
152
 
132
153
  The name of `YourCrudType` has to equal your type name in your schema (also in casing).
133
154
 
@@ -198,6 +219,19 @@ Avaliable options for the filter type `Int` and `Float`:
198
219
  - `lessThanOrEqual`
199
220
  - `greaterThanOrEqual`
200
221
 
222
+ With order:
223
+
224
+ All order definitions are prioritized in the order that they are defined (the first definition is prioritized over the second).
225
+
226
+ ```typescript
227
+ const data = await client.getDataList("tenantId", "YourCrudType", undefined, undefined, undefined, [
228
+ {
229
+ field: "fieldName",
230
+ descending: true, // omit this value for asc order
231
+ },
232
+ ]);
233
+ ```
234
+
201
235
  ### Gracefully close the clients
202
236
 
203
237
  You won't lose any data if you don't. Use it for your peace of mind.
@@ -1,12 +1,14 @@
1
1
  import { ClientConfig } from "../config/config";
2
2
  import { CreatedCrudData } from "./create";
3
- import { Filter, GetCrudDataList } from "./getDataList";
3
+ import { GetCrudDataList } from "./getDataList";
4
+ import { Filter } from "./filter";
5
+ import { Order } from "./order";
4
6
  export interface DeliveryClient {
5
- create: (tenantId: string, type: string, data: Record<string, any>) => Promise<CreatedCrudData>;
7
+ create: (tenantId: string, type: string, data: Record<string, any>, id?: string) => Promise<CreatedCrudData>;
6
8
  update: (tenantId: string, type: string, id: string, data: Record<string, any>) => Promise<void>;
7
- delete: (tenantId: string, type: string, id: string) => Promise<void>;
9
+ delete: (tenantId: string, type: string, id?: string, filter?: Filter) => Promise<void>;
8
10
  getData: <T extends {}>(tenantId: string, type: string, id: string, returnEmptyDataIfNotFound?: boolean) => Promise<T>;
9
- getDataList: <T extends {}>(tenantId: string, type: string, limit?: number, page?: number, filter?: Filter) => Promise<GetCrudDataList<T>>;
11
+ getDataList: <T extends {}>(tenantId: string, type: string, limit?: number, page?: number, filter?: Filter, order?: Order[]) => Promise<GetCrudDataList<T>>;
10
12
  close: () => Promise<void>;
11
13
  }
12
14
  export declare const newDeliveryClient: (config?: ClientConfig) => Promise<DeliveryClient>;
@@ -16,20 +16,20 @@ const newDeliveryClient = async (config) => {
16
16
  "grpc.keepalive_timeout_ms": config.keepaliveTimeout,
17
17
  "grpc.keepalive_permit_without_calls": 1,
18
18
  });
19
- const create = async (tenantId, type, data) => {
20
- return await (0, create_1.createCrudData)(tenantId, type, data, serviceClient);
19
+ const create = async (tenantId, type, data, id = "") => {
20
+ return await (0, create_1.createCrudData)(tenantId, type, data, id, serviceClient);
21
21
  };
22
22
  const update = async (tenantId, type, id, data) => {
23
23
  return await (0, update_1.updateCrudData)(tenantId, type, id, data, serviceClient);
24
24
  };
25
- const deleter = async (tenantId, type, id) => {
26
- return await (0, delete_1.deleteCrudData)(tenantId, type, id, serviceClient);
25
+ const deleter = async (tenantId, type, id = "", filter = { fields: {}, and: [], or: [] }) => {
26
+ return await (0, delete_1.deleteCrudData)(tenantId, type, id, filter, serviceClient);
27
27
  };
28
28
  const getData = async (tenantId, type, id, returnEmptyDataIfNotFound = false) => {
29
29
  return await (0, getData_1.getCrudData)(tenantId, type, id, returnEmptyDataIfNotFound, serviceClient);
30
30
  };
31
- const getDataList = async (tenantId, type, limit = 0, page = 1, filter = { fields: {}, and: [], or: [] }) => {
32
- return await (0, getDataList_1.getCrudDataList)(tenantId, type, limit, page, filter, serviceClient);
31
+ const getDataList = async (tenantId, type, limit = 0, page = 1, filter = { fields: {}, and: [], or: [] }, order = []) => {
32
+ return await (0, getDataList_1.getCrudDataList)(tenantId, type, limit, page, filter, order, serviceClient);
33
33
  };
34
34
  const close = async () => {
35
35
  serviceClient.close();
@@ -2,4 +2,4 @@ import { DeliveryServiceClient } from "@fraym/crud-proto";
2
2
  export interface CreatedCrudData {
3
3
  id: string;
4
4
  }
5
- export declare const createCrudData: (tenantId: string, type: string, data: Record<string, any>, serviceClient: DeliveryServiceClient) => Promise<CreatedCrudData>;
5
+ export declare const createCrudData: (tenantId: string, type: string, data: Record<string, any>, id: string, serviceClient: DeliveryServiceClient) => Promise<CreatedCrudData>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createCrudData = void 0;
4
- const createCrudData = async (tenantId, type, data, serviceClient) => {
4
+ const createCrudData = async (tenantId, type, data, id, serviceClient) => {
5
5
  const requestData = {};
6
6
  for (const key in data) {
7
7
  if (typeof data[key] === "string") {
@@ -16,6 +16,7 @@ const createCrudData = async (tenantId, type, data, serviceClient) => {
16
16
  tenantId,
17
17
  type,
18
18
  data: requestData,
19
+ id,
19
20
  }, (error, response) => {
20
21
  if (error) {
21
22
  reject(error.message);
@@ -1,2 +1,3 @@
1
1
  import { DeliveryServiceClient } from "@fraym/crud-proto";
2
- export declare const deleteCrudData: (tenantId: string, type: string, id: string, serviceClient: DeliveryServiceClient) => Promise<void>;
2
+ import { Filter } from "./filter";
3
+ export declare const deleteCrudData: (tenantId: string, type: string, id: string, filter: Filter, serviceClient: DeliveryServiceClient) => Promise<void>;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteCrudData = void 0;
4
- const deleteCrudData = async (tenantId, type, id, serviceClient) => {
4
+ const filter_1 = require("./filter");
5
+ const deleteCrudData = async (tenantId, type, id, filter, serviceClient) => {
5
6
  return new Promise((resolve, reject) => {
6
- serviceClient.deleteEntry({
7
+ serviceClient.deleteEntries({
7
8
  tenantId,
8
9
  type,
9
10
  id,
11
+ filter: (0, filter_1.getProtobufEntryFilter)(filter),
10
12
  }, error => {
11
13
  if (error) {
12
14
  reject(error.message);
@@ -0,0 +1,12 @@
1
+ import { EntryFilter } from "@fraym/crud-proto";
2
+ export interface Filter {
3
+ fields: Record<string, FieldFilter>;
4
+ and?: Filter[];
5
+ or?: Filter[];
6
+ }
7
+ export interface FieldFilter {
8
+ type: string;
9
+ operation: string;
10
+ value: any;
11
+ }
12
+ export declare const getProtobufEntryFilter: (filter: Filter) => EntryFilter;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProtobufEntryFilter = void 0;
4
+ const getProtobufEntryFilter = (filter) => {
5
+ const fields = {};
6
+ for (const fieldName in filter.fields) {
7
+ const field = filter.fields[fieldName];
8
+ let value = "";
9
+ if (field.type === "String" && typeof field.value == "string") {
10
+ value = field.value;
11
+ }
12
+ else {
13
+ value = JSON.stringify(field.value);
14
+ }
15
+ fields[fieldName] = {
16
+ operation: field.operation,
17
+ type: field.type,
18
+ value,
19
+ };
20
+ }
21
+ return {
22
+ fields: fields,
23
+ and: filter.and ? filter.and.map(and => (0, exports.getProtobufEntryFilter)(and)) : [],
24
+ or: filter.or ? filter.or.map(or => (0, exports.getProtobufEntryFilter)(or)) : [],
25
+ };
26
+ };
27
+ exports.getProtobufEntryFilter = getProtobufEntryFilter;
@@ -11,6 +11,7 @@ const getCrudData = async (tenantId, type, id, returnEmptyDataIfNotFound, servic
11
11
  page: 0,
12
12
  returnEmptyDataIfNotFound,
13
13
  filter: { fields: {}, and: [], or: [] },
14
+ order: [],
14
15
  }, (error, response) => {
15
16
  if (error) {
16
17
  reject(error.message);
@@ -1,17 +1,9 @@
1
1
  import { DeliveryServiceClient } from "@fraym/crud-proto";
2
+ import { Filter } from "./filter";
3
+ import { Order } from "./order";
2
4
  export interface GetCrudDataList<T extends {}> {
3
5
  limit: number;
4
6
  page: number;
5
7
  data: T[];
6
8
  }
7
- export interface Filter {
8
- fields: Record<string, FieldFilter>;
9
- and?: Filter[];
10
- or?: Filter[];
11
- }
12
- export interface FieldFilter {
13
- type: string;
14
- operation: string;
15
- value: any;
16
- }
17
- export declare const getCrudDataList: <T extends {}>(tenantId: string, type: string, limit: number, page: number, filter: Filter, serviceClient: DeliveryServiceClient) => Promise<GetCrudDataList<T>>;
9
+ export declare const getCrudDataList: <T extends {}>(tenantId: string, type: string, limit: number, page: number, filter: Filter, order: Order[], serviceClient: DeliveryServiceClient) => Promise<GetCrudDataList<T>>;
@@ -1,30 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCrudDataList = void 0;
4
- const getProtobufEntryFilter = (filter) => {
5
- const fields = {};
6
- for (const fieldName in filter.fields) {
7
- const field = filter.fields[fieldName];
8
- let value = "";
9
- if (field.type === "String" && typeof field.value == "string") {
10
- value = field.value;
11
- }
12
- else {
13
- value = JSON.stringify(field.value);
14
- }
15
- fields[fieldName] = {
16
- operation: field.operation,
17
- type: field.type,
18
- value,
19
- };
20
- }
21
- return {
22
- fields: fields,
23
- and: filter.and ? filter.and.map(and => getProtobufEntryFilter(and)) : [],
24
- or: filter.or ? filter.or.map(or => getProtobufEntryFilter(or)) : [],
25
- };
26
- };
27
- const getCrudDataList = async (tenantId, type, limit, page, filter, serviceClient) => {
4
+ const filter_1 = require("./filter");
5
+ const order_1 = require("./order");
6
+ const getCrudDataList = async (tenantId, type, limit, page, filter, order, serviceClient) => {
28
7
  return new Promise((resolve, reject) => {
29
8
  serviceClient.getEntries({
30
9
  tenantId,
@@ -33,7 +12,8 @@ const getCrudDataList = async (tenantId, type, limit, page, filter, serviceClien
33
12
  limit,
34
13
  page,
35
14
  returnEmptyDataIfNotFound: false,
36
- filter: getProtobufEntryFilter(filter),
15
+ filter: (0, filter_1.getProtobufEntryFilter)(filter),
16
+ order: (0, order_1.getProtobufEntryOrder)(order),
37
17
  }, (error, response) => {
38
18
  if (error) {
39
19
  reject(error.message);
@@ -0,0 +1,6 @@
1
+ import { EntryOrder } from "@fraym/crud-proto";
2
+ export interface Order {
3
+ field: string;
4
+ descending?: boolean;
5
+ }
6
+ export declare const getProtobufEntryOrder: (order: Order[]) => EntryOrder[];
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProtobufEntryOrder = void 0;
4
+ const getProtobufEntryOrder = (order) => {
5
+ return order.map(o => {
6
+ var _a;
7
+ return ({
8
+ field: o.field,
9
+ descending: (_a = o.descending) !== null && _a !== void 0 ? _a : false,
10
+ });
11
+ });
12
+ };
13
+ exports.getProtobufEntryOrder = getProtobufEntryOrder;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fraym/crud",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "license": "UNLICENSED",
5
5
  "homepage": "https://github.com/fraym/crud-nodejs",
6
6
  "repository": {
@@ -27,10 +27,10 @@
27
27
  "crud": "dist/cmd/crud.js"
28
28
  },
29
29
  "dependencies": {
30
- "@fraym/crud-proto": "1.0.0-alpha.8",
30
+ "@fraym/crud-proto": "1.0.0-alpha.12",
31
31
  "@graphql-tools/graphql-file-loader": "^7.5.14",
32
32
  "@graphql-tools/load": "^7.8.9",
33
- "@grpc/grpc-js": "1.7.2",
33
+ "@grpc/grpc-js": "^1.8.7",
34
34
  "dotenv": "^16.0.3",
35
35
  "graphql": "^16.6.0",
36
36
  "yargs": "^17.6.2"