@webiny/api-prerendering-service-so-ddb 0.0.0-mt-1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @webiny/api-prerendering-service
2
+ [![](https://img.shields.io/npm/dw/@webiny/api-prerendering-service.svg)](https://www.npmjs.com/package/@webiny/api-prerendering-service)
3
+ [![](https://img.shields.io/npm/v/@webiny/api-prerendering-service.svg)](https://www.npmjs.com/package/@webiny/api-prerendering-service)
4
+ [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
5
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
@@ -0,0 +1,8 @@
1
+ import { Entity, Table } from "dynamodb-toolbox";
2
+ import { Attributes } from "../types";
3
+ export interface Params {
4
+ table: Table;
5
+ entityName: string;
6
+ attributes: Attributes;
7
+ }
8
+ export declare const createQueueJobEntity: (params: Params) => Entity<any>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createQueueJobEntity = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _dynamodbToolbox = require("dynamodb-toolbox");
13
+
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
15
+
16
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17
+
18
+ const createQueueJobEntity = params => {
19
+ const {
20
+ entityName,
21
+ attributes,
22
+ table
23
+ } = params;
24
+ return new _dynamodbToolbox.Entity({
25
+ name: entityName,
26
+ table,
27
+ attributes: _objectSpread({
28
+ PK: {
29
+ partitionKey: true
30
+ },
31
+ SK: {
32
+ sortKey: true
33
+ },
34
+ TYPE: {
35
+ type: "string"
36
+ },
37
+ id: {
38
+ type: "string"
39
+ },
40
+ args: {
41
+ type: "map"
42
+ }
43
+ }, attributes || {})
44
+ });
45
+ };
46
+
47
+ exports.createQueueJobEntity = createQueueJobEntity;
@@ -0,0 +1,8 @@
1
+ import { Entity, Table } from "dynamodb-toolbox";
2
+ import { Attributes } from "../types";
3
+ export interface Params {
4
+ table: Table;
5
+ entityName: string;
6
+ attributes: Attributes;
7
+ }
8
+ export declare const createRenderEntity: (params: Params) => Entity<any>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createRenderEntity = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _dynamodbToolbox = require("dynamodb-toolbox");
13
+
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
15
+
16
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17
+
18
+ const createRenderEntity = params => {
19
+ const {
20
+ entityName,
21
+ attributes,
22
+ table
23
+ } = params;
24
+ return new _dynamodbToolbox.Entity({
25
+ name: entityName,
26
+ table,
27
+ attributes: _objectSpread({
28
+ PK: {
29
+ partitionKey: true
30
+ },
31
+ SK: {
32
+ sortKey: true
33
+ },
34
+ TYPE: {
35
+ type: "string"
36
+ },
37
+ namespace: {
38
+ type: "string"
39
+ },
40
+ url: {
41
+ type: "string"
42
+ },
43
+ args: {
44
+ type: "map"
45
+ },
46
+ configuration: {
47
+ type: "map"
48
+ },
49
+ files: {
50
+ type: "list"
51
+ }
52
+ }, attributes || {})
53
+ });
54
+ };
55
+
56
+ exports.createRenderEntity = createRenderEntity;
@@ -0,0 +1,8 @@
1
+ import { DocumentClient } from "aws-sdk/clients/dynamodb";
2
+ import { Table } from "dynamodb-toolbox";
3
+ import { TableModifier } from "../types";
4
+ export interface Params {
5
+ table?: TableModifier;
6
+ documentClient: DocumentClient;
7
+ }
8
+ export declare const createTable: (params: Params) => Table;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createTable = void 0;
7
+
8
+ var _dynamodbToolbox = require("dynamodb-toolbox");
9
+
10
+ const createTable = params => {
11
+ const {
12
+ table,
13
+ documentClient
14
+ } = params;
15
+ const tableConfig = {
16
+ name: process.env.DB_TABLE_PRERENDERING_SERVICE || process.env.DB_TABLE,
17
+ partitionKey: "PK",
18
+ sortKey: "SK",
19
+ DocumentClient: documentClient
20
+ };
21
+ const config = typeof table === "function" ? table(tableConfig) : tableConfig;
22
+ return new _dynamodbToolbox.Table(config);
23
+ };
24
+
25
+ exports.createTable = createTable;
@@ -0,0 +1,8 @@
1
+ import { Entity, Table } from "dynamodb-toolbox";
2
+ import { Attributes } from "../types";
3
+ export interface Params {
4
+ table: Table;
5
+ entityName: string;
6
+ attributes: Attributes;
7
+ }
8
+ export declare const createTagUrlLinkEntity: (params: Params) => Entity<{}>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createTagUrlLinkEntity = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _dynamodbToolbox = require("dynamodb-toolbox");
13
+
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
15
+
16
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17
+
18
+ const createTagUrlLinkEntity = params => {
19
+ const {
20
+ entityName,
21
+ attributes,
22
+ table
23
+ } = params;
24
+ return new _dynamodbToolbox.Entity({
25
+ name: entityName,
26
+ table,
27
+ attributes: _objectSpread({
28
+ PK: {
29
+ partitionKey: true
30
+ },
31
+ SK: {
32
+ sortKey: true
33
+ },
34
+ TYPE: {
35
+ type: "string"
36
+ },
37
+ namespace: {
38
+ type: "string"
39
+ },
40
+ url: {
41
+ type: "string"
42
+ },
43
+ value: {
44
+ type: "string"
45
+ },
46
+ key: {
47
+ type: "string"
48
+ }
49
+ }, attributes || {})
50
+ });
51
+ };
52
+
53
+ exports.createTagUrlLinkEntity = createTagUrlLinkEntity;
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { PrerenderingServiceFactory } from "./types";
2
+ export declare const createPrerenderingServiceStorageOperations: PrerenderingServiceFactory;
package/index.js ADDED
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createPrerenderingServiceStorageOperations = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _error = _interopRequireDefault(require("@webiny/error"));
13
+
14
+ var _types = require("./types");
15
+
16
+ var _table = require("./definitions/table");
17
+
18
+ var _render = require("./definitions/render");
19
+
20
+ var _queueJob = require("./definitions/queueJob");
21
+
22
+ var _render2 = require("./operations/render");
23
+
24
+ var _queueJob2 = require("./operations/queueJob");
25
+
26
+ var _tagUrlLink = require("./definitions/tagUrlLink");
27
+
28
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
29
+
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
+
32
+ const reservedFields = ["PK", "SK", "index", "data", "TYPE", "__type", "GSI1_PK", "GSI1_SK"];
33
+
34
+ const isReserved = name => {
35
+ if (reservedFields.includes(name) === false) {
36
+ return;
37
+ }
38
+
39
+ throw new _error.default(`Attribute name "${name}" is not allowed.`, "ATTRIBUTE_NOT_ALLOWED", {
40
+ name
41
+ });
42
+ };
43
+
44
+ const createPrerenderingServiceStorageOperations = params => {
45
+ const {
46
+ attributes = {},
47
+ table,
48
+ documentClient
49
+ } = params;
50
+
51
+ if (attributes) {
52
+ Object.values(attributes).forEach(attrs => {
53
+ Object.keys(attrs).forEach(isReserved);
54
+ });
55
+ }
56
+
57
+ const tableInstance = (0, _table.createTable)({
58
+ table,
59
+ documentClient
60
+ });
61
+ const entities = {
62
+ render: (0, _render.createRenderEntity)({
63
+ entityName: _types.ENTITIES.RENDER,
64
+ table: tableInstance,
65
+ attributes: attributes[_types.ENTITIES.RENDER]
66
+ }),
67
+ queueJob: (0, _queueJob.createQueueJobEntity)({
68
+ entityName: _types.ENTITIES.QUEUE_JOB,
69
+ table: tableInstance,
70
+ attributes: attributes[_types.ENTITIES.QUEUE_JOB]
71
+ }),
72
+ tagUrlLink: (0, _tagUrlLink.createTagUrlLinkEntity)({
73
+ entityName: _types.ENTITIES.TAG_URL_LINK,
74
+ table: tableInstance,
75
+ attributes: attributes[_types.ENTITIES.TAG_URL_LINK]
76
+ })
77
+ };
78
+ return _objectSpread(_objectSpread({
79
+ getTable: () => tableInstance,
80
+ getEntities: () => entities
81
+ }, (0, _render2.createRenderStorageOperations)({
82
+ entity: entities.render,
83
+ tagUrlLinkEntity: entities.tagUrlLink
84
+ })), (0, _queueJob2.createQueueJobStorageOperations)({
85
+ entity: entities.queueJob
86
+ }));
87
+ };
88
+
89
+ exports.createPrerenderingServiceStorageOperations = createPrerenderingServiceStorageOperations;
@@ -0,0 +1,6 @@
1
+ import { PrerenderingServiceQueueJobStorageOperations } from "@webiny/api-prerendering-service/types";
2
+ import { Entity } from "dynamodb-toolbox";
3
+ export interface Params {
4
+ entity: Entity<any>;
5
+ }
6
+ export declare const createQueueJobStorageOperations: (params: Params) => PrerenderingServiceQueueJobStorageOperations;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createQueueJobStorageOperations = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _error = _interopRequireDefault(require("@webiny/error"));
13
+
14
+ var _batchWrite = require("@webiny/db-dynamodb/utils/batchWrite");
15
+
16
+ var _query = require("@webiny/db-dynamodb/utils/query");
17
+
18
+ var _cleanup = require("@webiny/db-dynamodb/utils/cleanup");
19
+
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
23
+
24
+ const createQueueJobStorageOperations = params => {
25
+ const {
26
+ entity
27
+ } = params;
28
+
29
+ const createQueueJobPartitionKey = () => {
30
+ return "PS#Q#JOB";
31
+ };
32
+
33
+ const createQueueJobSortKey = id => {
34
+ return id;
35
+ };
36
+
37
+ const createQueueJobType = () => {
38
+ return "ps.queue.job";
39
+ };
40
+
41
+ const createQueueJob = async params => {
42
+ const {
43
+ queueJob
44
+ } = params;
45
+ const keys = {
46
+ PK: createQueueJobPartitionKey(),
47
+ SK: createQueueJobSortKey(queueJob.id)
48
+ };
49
+
50
+ try {
51
+ await entity.put(_objectSpread(_objectSpread(_objectSpread({}, queueJob), keys), {}, {
52
+ TYPE: createQueueJobType()
53
+ }));
54
+ return queueJob;
55
+ } catch (ex) {
56
+ throw new _error.default(ex.message || "Could not create render record.", ex.code || "CREATE_RENDER_ERROR", {
57
+ keys,
58
+ queueJob
59
+ });
60
+ }
61
+ }; // eslint-disable-next-line
62
+
63
+
64
+ const listQueueJobs = async _ => {
65
+ const queryAllParams = {
66
+ entity,
67
+ partitionKey: createQueueJobPartitionKey(),
68
+ options: {
69
+ gte: " "
70
+ }
71
+ };
72
+
73
+ try {
74
+ const results = await (0, _query.queryAll)(queryAllParams);
75
+ return (0, _cleanup.cleanupItems)(entity, results);
76
+ } catch (ex) {
77
+ throw new _error.default(ex.message || "Could not list queue jobs records.", ex.code || "LIST_QUEUE_JOBS_ERROR", {
78
+ partitionKey: queryAllParams.partitionKey,
79
+ options: queryAllParams.options
80
+ });
81
+ }
82
+ };
83
+
84
+ const deleteQueueJobs = async params => {
85
+ const {
86
+ queueJobs
87
+ } = params;
88
+ const items = queueJobs.map(job => {
89
+ return entity.deleteBatch({
90
+ PK: createQueueJobPartitionKey(),
91
+ SK: createQueueJobSortKey(job.id)
92
+ });
93
+ });
94
+
95
+ try {
96
+ await (0, _batchWrite.batchWriteAll)({
97
+ table: entity.table,
98
+ items
99
+ });
100
+ return queueJobs;
101
+ } catch (ex) {
102
+ throw new _error.default(ex.message || "Could not delete queue jobs records.", ex.code || "DELETE_QUEUE_JOBS_ERROR", {
103
+ queueJobs
104
+ });
105
+ }
106
+ };
107
+
108
+ return {
109
+ createQueueJob,
110
+ deleteQueueJobs,
111
+ listQueueJobs
112
+ };
113
+ };
114
+
115
+ exports.createQueueJobStorageOperations = createQueueJobStorageOperations;
@@ -0,0 +1,16 @@
1
+ import { PrerenderingServiceRenderStorageOperations } from "@webiny/api-prerendering-service/types";
2
+ import { Entity } from "dynamodb-toolbox";
3
+ import { Tag } from "@webiny/api-prerendering-service/queue/add/types";
4
+ export interface Params {
5
+ entity: Entity<any>;
6
+ tagUrlLinkEntity: Entity<any>;
7
+ }
8
+ export interface CreateTagUrlLinkPartitionKeyParams {
9
+ namespace: string;
10
+ tag: Pick<Tag, "key">;
11
+ }
12
+ export interface CreateTagUrlLinkSortKeyParams {
13
+ tag: Tag;
14
+ url?: string;
15
+ }
16
+ export declare const createRenderStorageOperations: (params: Params) => PrerenderingServiceRenderStorageOperations;
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createRenderStorageOperations = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _error = _interopRequireDefault(require("@webiny/error"));
13
+
14
+ var _get = require("@webiny/db-dynamodb/utils/get");
15
+
16
+ var _query = require("@webiny/db-dynamodb/utils/query");
17
+
18
+ var _batchRead = require("@webiny/db-dynamodb/utils/batchRead");
19
+
20
+ var _batchWrite = require("@webiny/db-dynamodb/utils/batchWrite");
21
+
22
+ var _cleanup = require("@webiny/db-dynamodb/utils/cleanup");
23
+
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
25
+
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
27
+
28
+ const createRenderStorageOperations = params => {
29
+ const {
30
+ entity,
31
+ tagUrlLinkEntity
32
+ } = params;
33
+
34
+ const createRenderPartitionKey = namespace => {
35
+ /**
36
+ * For backwards compatibility remove the T# if it exists.
37
+ */
38
+ if (namespace.startsWith("T#")) {
39
+ namespace = namespace.replace(/^T#/, "");
40
+ }
41
+
42
+ return `T#${namespace}#PS#RENDER`;
43
+ };
44
+
45
+ const createRenderSortKey = url => {
46
+ return url;
47
+ };
48
+
49
+ const createRenderType = () => {
50
+ return "ps.render";
51
+ };
52
+
53
+ const createTagUrlLinkPartitionKey = params => {
54
+ const {
55
+ tag
56
+ } = params;
57
+ let {
58
+ namespace
59
+ } = params;
60
+
61
+ if (namespace.startsWith("T#")) {
62
+ namespace = namespace.replace(/^T#/, "");
63
+ }
64
+
65
+ return `T#${namespace}#PS#TAG#${tag.key}`;
66
+ };
67
+
68
+ const createTagUrlLinkSortKey = params => {
69
+ const {
70
+ tag,
71
+ url
72
+ } = params;
73
+ const values = [tag.value];
74
+
75
+ if (url) {
76
+ values.push(url);
77
+ }
78
+
79
+ return values.join("#");
80
+ };
81
+
82
+ const createTagUrlLinkType = () => {
83
+ return "ps.tagUrlLink";
84
+ };
85
+
86
+ const getRender = async params => {
87
+ const {
88
+ where
89
+ } = params;
90
+ const keys = {
91
+ PK: createRenderPartitionKey(where.namespace),
92
+ SK: createRenderSortKey(where.url)
93
+ };
94
+
95
+ try {
96
+ const result = await (0, _get.get)({
97
+ entity,
98
+ keys
99
+ });
100
+ return (0, _cleanup.cleanupItem)(entity, result);
101
+ } catch (ex) {
102
+ throw new _error.default(ex.message || "Could not get render record by given key.", ex.code || "GET_RENDER_ERROR", {
103
+ keys,
104
+ params
105
+ });
106
+ }
107
+ };
108
+
109
+ const createRender = async params => {
110
+ const {
111
+ render
112
+ } = params;
113
+ const keys = {
114
+ PK: createRenderPartitionKey(render.namespace),
115
+ SK: createRenderSortKey(render.url)
116
+ };
117
+
118
+ try {
119
+ await entity.put(_objectSpread(_objectSpread(_objectSpread({}, render), keys), {}, {
120
+ TYPE: createRenderType()
121
+ }));
122
+ return render;
123
+ } catch (ex) {
124
+ throw new _error.default(ex.message || "Could not create render record.", ex.code || "CREATE_RENDER_ERROR", {
125
+ keys,
126
+ render
127
+ });
128
+ }
129
+ };
130
+
131
+ const deleteRender = async params => {
132
+ const {
133
+ render
134
+ } = params;
135
+ const keys = {
136
+ PK: createRenderPartitionKey(render.namespace),
137
+ SK: createRenderSortKey(render.url)
138
+ };
139
+
140
+ try {
141
+ await entity.delete(keys);
142
+ } catch (ex) {
143
+ throw new _error.default(ex.message || "Could not delete render record.", ex.code || "DELETE_RENDER_ERROR", {
144
+ keys,
145
+ render
146
+ });
147
+ }
148
+ };
149
+
150
+ const listRendersByTag = async params => {
151
+ const {
152
+ where
153
+ } = params;
154
+ const {
155
+ namespace,
156
+ tag
157
+ } = where;
158
+ /**
159
+ * Possibly there is no tag.key so no need to go further
160
+ */
161
+
162
+ if (!tag || !tag.key) {
163
+ return [];
164
+ }
165
+
166
+ const links = await listTagUrlLinks({
167
+ where: {
168
+ namespace,
169
+ tag
170
+ }
171
+ });
172
+ const items = links.map(link => {
173
+ return entity.getBatch({
174
+ PK: createRenderPartitionKey(namespace),
175
+ SK: createRenderSortKey(link.url)
176
+ });
177
+ });
178
+
179
+ try {
180
+ const results = await (0, _batchRead.batchReadAll)({
181
+ table: entity.table,
182
+ items
183
+ });
184
+ return (0, _cleanup.cleanupItems)(entity, results);
185
+ } catch (ex) {
186
+ throw new _error.default(ex.message || "Could not list render records after links.", ex.code || "LIST_LINKS_RENDER_ERROR", {
187
+ links
188
+ });
189
+ }
190
+ };
191
+
192
+ const listRenders = async params => {
193
+ const {
194
+ where
195
+ } = params;
196
+ const {
197
+ namespace,
198
+ tag
199
+ } = where;
200
+
201
+ if (tag) {
202
+ return listRendersByTag(params);
203
+ }
204
+
205
+ const queryAllParams = {
206
+ entity,
207
+ partitionKey: createRenderPartitionKey(namespace),
208
+ options: {
209
+ gte: " "
210
+ }
211
+ };
212
+
213
+ try {
214
+ const results = await (0, _query.queryAll)(queryAllParams);
215
+ return (0, _cleanup.cleanupItems)(entity, results);
216
+ } catch (ex) {
217
+ throw new _error.default(ex.message || "Could not list render records.", ex.code || "LIST_RENDER_ERROR", {
218
+ partitionKey: queryAllParams.partitionKey,
219
+ options: queryAllParams.options
220
+ });
221
+ }
222
+ };
223
+
224
+ const createTagUrlLinks = async params => {
225
+ const {
226
+ tagUrlLinks
227
+ } = params;
228
+ const items = tagUrlLinks.map(item => {
229
+ return tagUrlLinkEntity.putBatch(_objectSpread(_objectSpread({}, item), {}, {
230
+ TYPE: createTagUrlLinkType(),
231
+ PK: createTagUrlLinkPartitionKey({
232
+ namespace: item.namespace,
233
+ tag: item
234
+ }),
235
+ SK: createTagUrlLinkSortKey({
236
+ tag: item,
237
+ url: item.url
238
+ })
239
+ }));
240
+ });
241
+
242
+ try {
243
+ await (0, _batchWrite.batchWriteAll)({
244
+ table: tagUrlLinkEntity.table,
245
+ items
246
+ });
247
+ return tagUrlLinks;
248
+ } catch (ex) {
249
+ throw new _error.default(ex.message || "Could not create tagUrlLink records.", ex.code || "CREATE_URL_TAG_LINKS_ERROR", {
250
+ tagUrlLinks
251
+ });
252
+ }
253
+ };
254
+
255
+ const deleteTagUrlLinks = async params => {
256
+ const {
257
+ namespace,
258
+ tags,
259
+ url
260
+ } = params;
261
+ const items = tags.map(tag => {
262
+ return tagUrlLinkEntity.deleteBatch({
263
+ PK: createTagUrlLinkPartitionKey({
264
+ tag,
265
+ namespace
266
+ }),
267
+ SK: createTagUrlLinkSortKey({
268
+ tag,
269
+ url
270
+ })
271
+ });
272
+ });
273
+
274
+ try {
275
+ await (0, _batchWrite.batchWriteAll)({
276
+ table: tagUrlLinkEntity.table,
277
+ items
278
+ });
279
+ } catch (ex) {
280
+ throw new _error.default(ex.message || "Could not delete tagUrlLink records.", ex.code || "DELETE_URL_TAG_LINKS_ERROR", {
281
+ tags,
282
+ namespace,
283
+ url
284
+ });
285
+ }
286
+ };
287
+
288
+ const listTagUrlLinks = async params => {
289
+ const {
290
+ where
291
+ } = params;
292
+ const {
293
+ namespace,
294
+ tag
295
+ } = where;
296
+ const partitionKey = createTagUrlLinkPartitionKey({
297
+ namespace,
298
+ tag
299
+ });
300
+ const options = {};
301
+
302
+ if (tag.value) {
303
+ options.beginsWith = `${tag.value}#`;
304
+ } else {
305
+ options.gte = " ";
306
+ }
307
+
308
+ const queryAllParams = {
309
+ entity: tagUrlLinkEntity,
310
+ partitionKey,
311
+ options
312
+ };
313
+
314
+ try {
315
+ const results = await (0, _query.queryAll)(queryAllParams);
316
+ return (0, _cleanup.cleanupItems)(tagUrlLinkEntity, results);
317
+ } catch (ex) {
318
+ throw new _error.default(ex.message || "Could not list tagUrlLink records.", ex.code || "LIST_TAG_URL_LINK_ERROR", {
319
+ partitionKey,
320
+ options
321
+ });
322
+ }
323
+ };
324
+
325
+ return {
326
+ createRender,
327
+ deleteRender,
328
+ listRenders,
329
+ getRender,
330
+ createTagUrlLinks,
331
+ deleteTagUrlLinks,
332
+ listTagUrlLinks
333
+ };
334
+ };
335
+
336
+ exports.createRenderStorageOperations = createRenderStorageOperations;
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@webiny/api-prerendering-service-so-ddb",
3
+ "version": "0.0.0-mt-1",
4
+ "main": "index.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/webiny/webiny-js.git",
8
+ "directory": "packages/api-prerendering-service-so-ddb"
9
+ },
10
+ "keywords": [
11
+ "@webiny/api-prerendering-service",
12
+ "storage-operations",
13
+ "dynamodb",
14
+ "ps:ddb"
15
+ ],
16
+ "description": "A DynamoDB storage operations for the Prerendering Service API.",
17
+ "author": "Webiny Ltd",
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "@babel/runtime": "7.15.4",
21
+ "@webiny/api-prerendering-service": "0.0.0-mt-1",
22
+ "@webiny/error": "0.0.0-mt-1",
23
+ "dynamodb-toolbox": "0.3.4"
24
+ },
25
+ "devDependencies": {
26
+ "@babel/cli": "^7.5.5",
27
+ "@babel/core": "^7.5.5",
28
+ "@babel/plugin-proposal-export-default-from": "^7.5.2",
29
+ "@babel/preset-env": "^7.5.5",
30
+ "@babel/preset-typescript": "^7.8.3",
31
+ "@webiny/cli": "^0.0.0-mt-1",
32
+ "@webiny/db": "^0.0.0-mt-1",
33
+ "@webiny/db-dynamodb": "^0.0.0-mt-1",
34
+ "@webiny/handler-aws": "^0.0.0-mt-1",
35
+ "@webiny/project-utils": "^0.0.0-mt-1",
36
+ "jest-dynalite": "^3.3.1",
37
+ "jest-environment-node": "^27.3.0",
38
+ "prettier": "^2.3.2",
39
+ "rimraf": "^3.0.2",
40
+ "ttypescript": "^1.5.12",
41
+ "typescript": "^4.1.3"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public",
45
+ "directory": "dist"
46
+ },
47
+ "scripts": {
48
+ "build": "yarn webiny run build",
49
+ "watch": "yarn webiny run watch"
50
+ },
51
+ "adio": {
52
+ "ignore": {
53
+ "src": [
54
+ "aws-sdk"
55
+ ]
56
+ }
57
+ },
58
+ "gitHead": "37736d8456a6ecb342a6c3645060bd9a3f2d4bb0"
59
+ }
package/types.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { DocumentClient } from "aws-sdk/clients/dynamodb";
2
+ import { Table, Entity } from "dynamodb-toolbox";
3
+ import { DynamoDBTypes, TableConstructor } from "dynamodb-toolbox/dist/classes/Table";
4
+ import { EntityAttributeConfig, EntityCompositeAttributes } from "dynamodb-toolbox/dist/classes/Entity";
5
+ import { PrerenderingServiceStorageOperations as BasePrerenderingServiceStorageOperations } from "@webiny/api-prerendering-service/types";
6
+ export declare type AttributeDefinition = DynamoDBTypes | EntityAttributeConfig | EntityCompositeAttributes;
7
+ export declare type Attributes = Record<string, AttributeDefinition>;
8
+ export declare enum ENTITIES {
9
+ RENDER = "PrerenderingServiceRender",
10
+ QUEUE_JOB = "PrerenderingServiceQueueJob",
11
+ TAG_URL_LINK = "PrerenderingServiceTagUrlLink"
12
+ }
13
+ export interface PrerenderingServiceFactoryParams {
14
+ documentClient: DocumentClient;
15
+ table?: TableModifier;
16
+ attributes?: Record<ENTITIES, Attributes>;
17
+ }
18
+ export declare type Entities = "render" | "queueJob" | "tagUrlLink";
19
+ export interface PrerenderingServiceStorageOperations extends BasePrerenderingServiceStorageOperations {
20
+ getTable(): Table;
21
+ getEntities(): Record<Entities, Entity<any>>;
22
+ }
23
+ export interface PrerenderingServiceFactory {
24
+ (params: PrerenderingServiceFactoryParams): PrerenderingServiceStorageOperations;
25
+ }
26
+ export interface TableModifier {
27
+ (table: TableConstructor): TableConstructor;
28
+ }
package/types.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ENTITIES = void 0;
7
+ let ENTITIES;
8
+ exports.ENTITIES = ENTITIES;
9
+
10
+ (function (ENTITIES) {
11
+ ENTITIES["RENDER"] = "PrerenderingServiceRender";
12
+ ENTITIES["QUEUE_JOB"] = "PrerenderingServiceQueueJob";
13
+ ENTITIES["TAG_URL_LINK"] = "PrerenderingServiceTagUrlLink";
14
+ })(ENTITIES || (exports.ENTITIES = ENTITIES = {}));