@knovator/pagecreator-node 0.0.7 → 0.2.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 +13 -13
- package/package.json +3 -6
- package/src/constants/index.ts +26 -0
- package/src/controllers/ItemController.ts +139 -0
- package/src/controllers/PageController.ts +65 -0
- package/src/controllers/UserController.ts +265 -0
- package/src/controllers/WidgetController.ts +165 -0
- package/src/index.ts +29 -0
- package/src/models/Item.ts +29 -0
- package/src/models/Page.ts +17 -0
- package/src/models/SrcSet.ts +16 -0
- package/src/models/Widget.ts +44 -0
- package/src/models/index.ts +6 -0
- package/src/plugins/softDelete.ts +84 -0
- package/src/routes/ItemRoute.ts +32 -0
- package/src/routes/PageRoute.ts +31 -0
- package/src/routes/UserRoute.ts +32 -0
- package/src/routes/WidgetRoute.ts +56 -0
- package/src/services/dbService.ts +82 -0
- package/src/types/{IRequest.d.ts → IRequest.ts} +4 -3
- package/src/types/{IResponse.d.ts → IResponse.ts} +4 -3
- package/src/types/{Router.d.ts → Router.ts} +2 -1
- package/src/types/common.ts +130 -0
- package/src/types/enums.ts +13 -0
- package/src/types/{index.d.ts → index.ts} +0 -0
- package/src/utils/defaults.ts +30 -0
- package/src/utils/helper.ts +133 -0
- package/src/utils/responseHandlers.ts +54 -0
- package/src/utils/validate.ts +22 -0
- package/src/utils/validations/item.ts +51 -0
- package/src/utils/validations/page.ts +59 -0
- package/src/utils/validations/user.ts +9 -0
- package/src/utils/validations/widget.ts +118 -0
- package/src/constants/index.d.ts +0 -16
- package/src/constants/index.js +0 -30
- package/src/constants/index.js.map +0 -1
- package/src/controllers/PageController.d.ts +0 -4
- package/src/controllers/PageController.js +0 -61
- package/src/controllers/PageController.js.map +0 -1
- package/src/controllers/TileController.d.ts +0 -4
- package/src/controllers/TileController.js +0 -45
- package/src/controllers/TileController.js.map +0 -1
- package/src/controllers/UserController.d.ts +0 -2
- package/src/controllers/UserController.js +0 -194
- package/src/controllers/UserController.js.map +0 -1
- package/src/controllers/WidgetController.d.ts +0 -8
- package/src/controllers/WidgetController.js +0 -129
- package/src/controllers/WidgetController.js.map +0 -1
- package/src/index.d.ts +0 -8
- package/src/index.js +0 -29
- package/src/index.js.map +0 -1
- package/src/models/Page.d.ts +0 -3
- package/src/models/Page.js +0 -16
- package/src/models/Page.js.map +0 -1
- package/src/models/Tile.d.ts +0 -3
- package/src/models/Tile.js +0 -29
- package/src/models/Tile.js.map +0 -1
- package/src/models/Widget.d.ts +0 -3
- package/src/models/Widget.js +0 -41
- package/src/models/Widget.js.map +0 -1
- package/src/models/index.d.ts +0 -4
- package/src/models/index.js +0 -11
- package/src/models/index.js.map +0 -1
- package/src/plugins/softDelete.d.ts +0 -7
- package/src/plugins/softDelete.js +0 -64
- package/src/plugins/softDelete.js.map +0 -1
- package/src/routes/PageRoute.d.ts +0 -3
- package/src/routes/PageRoute.js +0 -30
- package/src/routes/PageRoute.js.map +0 -1
- package/src/routes/TileRoute.d.ts +0 -3
- package/src/routes/TileRoute.js +0 -31
- package/src/routes/TileRoute.js.map +0 -1
- package/src/routes/UserRoute.d.ts +0 -3
- package/src/routes/UserRoute.js +0 -22
- package/src/routes/UserRoute.js.map +0 -1
- package/src/routes/WidgetRoute.d.ts +0 -3
- package/src/routes/WidgetRoute.js +0 -47
- package/src/routes/WidgetRoute.js.map +0 -1
- package/src/services/dbService.d.ts +0 -8
- package/src/services/dbService.js +0 -60
- package/src/services/dbService.js.map +0 -1
- package/src/types/IRequest.js +0 -3
- package/src/types/IRequest.js.map +0 -1
- package/src/types/IResponse.js +0 -3
- package/src/types/IResponse.js.map +0 -1
- package/src/types/Router.js +0 -3
- package/src/types/Router.js.map +0 -1
- package/src/types/common.d.ts +0 -78
- package/src/types/common.js +0 -3
- package/src/types/common.js.map +0 -1
- package/src/types/enums.d.ts +0 -11
- package/src/types/enums.js +0 -18
- package/src/types/enums.js.map +0 -1
- package/src/types/index.js +0 -9
- package/src/types/index.js.map +0 -1
- package/src/utils/defaults.d.ts +0 -7
- package/src/utils/defaults.js +0 -28
- package/src/utils/defaults.js.map +0 -1
- package/src/utils/helper.d.ts +0 -30
- package/src/utils/helper.js +0 -90
- package/src/utils/helper.js.map +0 -1
- package/src/utils/responseHandlers.d.ts +0 -6
- package/src/utils/responseHandlers.js +0 -57
- package/src/utils/responseHandlers.js.map +0 -1
- package/src/utils/validate.d.ts +0 -4
- package/src/utils/validate.js +0 -24
- package/src/utils/validate.js.map +0 -1
- package/src/utils/validations/page.d.ts +0 -7
- package/src/utils/validations/page.js +0 -58
- package/src/utils/validations/page.js.map +0 -1
- package/src/utils/validations/tile.d.ts +0 -7
- package/src/utils/validations/tile.js +0 -43
- package/src/utils/validations/tile.js.map +0 -1
- package/src/utils/validations/user.d.ts +0 -3
- package/src/utils/validations/user.js +0 -12
- package/src/utils/validations/user.js.map +0 -1
- package/src/utils/validations/widget.d.ts +0 -9
- package/src/utils/validations/widget.js +0 -108
- package/src/utils/validations/widget.js.map +0 -1
package/README.md
CHANGED
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
|
|
79
79
|
## Getting Started
|
|
80
80
|
|
|
81
|
-
To integrate `@knovator/pagecreator-node`, you should be having basic nodejs application up and running with express (optionally using mongoose for mongodb database). `@knovator/pagecreator-node` provides routes for `widget`, `page`, `
|
|
81
|
+
To integrate `@knovator/pagecreator-node`, you should be having basic nodejs application up and running with express (optionally using mongoose for mongodb database). `@knovator/pagecreator-node` provides routes for `widget`, `page`, `item` and `user` to use in application.
|
|
82
82
|
|
|
83
83
|
### Prerequisites
|
|
84
84
|
|
|
@@ -172,7 +172,7 @@ App/Main file is a good place to use `@knovator/pagecreator-node`
|
|
|
172
172
|
const {
|
|
173
173
|
setConfig,
|
|
174
174
|
WidgetRoutes,
|
|
175
|
-
|
|
175
|
+
ItemRoutes,
|
|
176
176
|
FileUploadRoute,
|
|
177
177
|
PageRoutes,
|
|
178
178
|
UserRoutes,
|
|
@@ -190,7 +190,7 @@ setConfig({
|
|
|
190
190
|
});
|
|
191
191
|
|
|
192
192
|
app.use('/widgets', WidgetRoutes);
|
|
193
|
-
app.use('/
|
|
193
|
+
app.use('/items', ItemRoutes);
|
|
194
194
|
app.use('/media', FileUploadRoute);
|
|
195
195
|
app.use('/pages', PageRoutes);
|
|
196
196
|
app.use('/users', UserRoutes);
|
|
@@ -349,14 +349,14 @@ This are the routes that gets integrated by `@knovator/pagecreator-node`,
|
|
|
349
349
|
| `/:id` | **PUT** | Update `page` |
|
|
350
350
|
| `/:id` | **DELETE** | Delete page whose `id` send in body |
|
|
351
351
|
|
|
352
|
-
####
|
|
352
|
+
#### Item
|
|
353
353
|
|
|
354
354
|
| Route | Method | Description |
|
|
355
355
|
| ------------ | ---------- | ----------------------------------- |
|
|
356
|
-
| `/:widgetId` | **GET** | Get
|
|
357
|
-
| `/` | **POST** | Create `
|
|
358
|
-
| `/:id` | **PUT** | Update `
|
|
359
|
-
| `/:id` | **DELETE** | Delete
|
|
356
|
+
| `/:widgetId` | **GET** | Get Items data for `widgetId` |
|
|
357
|
+
| `/` | **POST** | Create `item` |
|
|
358
|
+
| `/:id` | **PUT** | Update `item` |
|
|
359
|
+
| `/:id` | **DELETE** | Delete item whose `id` send in body |
|
|
360
360
|
|
|
361
361
|
#### User
|
|
362
362
|
|
|
@@ -376,8 +376,8 @@ req?.i18n?.(CODE);
|
|
|
376
376
|
|
|
377
377
|
| CODE | Description |
|
|
378
378
|
| -------------------------- | ------------------------------------------------------------ |
|
|
379
|
-
| `widget.
|
|
380
|
-
| `widget.
|
|
379
|
+
| `widget.getItemsTypes` | While fetching widget types |
|
|
380
|
+
| `widget.getWidgetTypes` | While fetching selection types |
|
|
381
381
|
| `widget.getAll` | While fetching widgets |
|
|
382
382
|
| `widget.create` | While creating widget |
|
|
383
383
|
| `widget.update` | While updating widget |
|
|
@@ -388,9 +388,9 @@ req?.i18n?.(CODE);
|
|
|
388
388
|
| `page.create` | While creating page |
|
|
389
389
|
| `page.update` | While updating page |
|
|
390
390
|
| `page.delete` | While deleting page |
|
|
391
|
-
| `
|
|
392
|
-
| `
|
|
393
|
-
| `
|
|
391
|
+
| `item.getAll` | While getting items for widget |
|
|
392
|
+
| `item.create` | While creating item |
|
|
393
|
+
| `item.update` | While updating item |
|
|
394
394
|
| `user.getWidgetData` | While getting widget data |
|
|
395
395
|
| `user.getPageData` | While getting page data |
|
|
396
396
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knovator/pagecreator-node",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"author": "knovator (https://knovator.com/)",
|
|
6
6
|
"description": "PageCreator Node.js module",
|
|
@@ -27,14 +27,11 @@
|
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"mongoose": "*",
|
|
30
|
-
"express": "*"
|
|
31
|
-
"tslib": "^2.3.0"
|
|
30
|
+
"express": "*"
|
|
32
31
|
},
|
|
33
32
|
"files": [
|
|
34
33
|
"src",
|
|
35
34
|
"package.json",
|
|
36
35
|
"README.md"
|
|
37
|
-
]
|
|
38
|
-
"main": "./src/index.js",
|
|
39
|
-
"typings": "./src/index.d.ts"
|
|
36
|
+
]
|
|
40
37
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const VALIDATION = {
|
|
2
|
+
WIDGET_EXISTS: 'Widget with same code is available',
|
|
3
|
+
};
|
|
4
|
+
export const RESPONSE_CODES = {
|
|
5
|
+
DEFAULT: 'SUCCESS',
|
|
6
|
+
ERROR: 'ERROR',
|
|
7
|
+
};
|
|
8
|
+
export const REGEXS = {
|
|
9
|
+
OBJECTID_CAST_FAILED: /Cast to ObjectId failed/gm,
|
|
10
|
+
};
|
|
11
|
+
export const MONGOOSE_FIND_QUERIES = [
|
|
12
|
+
'count',
|
|
13
|
+
'find',
|
|
14
|
+
'findOne',
|
|
15
|
+
'findOneAndDelete',
|
|
16
|
+
'findOneAndRemove',
|
|
17
|
+
'findOneAndUpdate',
|
|
18
|
+
'update',
|
|
19
|
+
'updateOne',
|
|
20
|
+
'updateMany',
|
|
21
|
+
];
|
|
22
|
+
export const success = 200;
|
|
23
|
+
export const create = 201;
|
|
24
|
+
export const internalServerError = 500;
|
|
25
|
+
export const validationError = 422;
|
|
26
|
+
export const messageRoutePrefix = 'msg';
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Types } from 'mongoose';
|
|
2
|
+
import { SrcSet, Item } from '../models';
|
|
3
|
+
import {
|
|
4
|
+
create,
|
|
5
|
+
remove,
|
|
6
|
+
update,
|
|
7
|
+
deleteAll,
|
|
8
|
+
bulkInsert,
|
|
9
|
+
} from '../services/dbService';
|
|
10
|
+
import {
|
|
11
|
+
successResponse,
|
|
12
|
+
createdDocumentResponse,
|
|
13
|
+
} from '../utils/responseHandlers';
|
|
14
|
+
|
|
15
|
+
import { commonExcludedFields, defaults } from '../utils/defaults';
|
|
16
|
+
import { IRequest, IResponse, IItemSchema, SrcSetItem } from '../types';
|
|
17
|
+
|
|
18
|
+
const catchAsync = (fn: any) => {
|
|
19
|
+
return defaults.catchAsync(fn, 'Notification');
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const createItem = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
23
|
+
const data = req.body;
|
|
24
|
+
const createdItem = (await create(Item, data)) as IItemSchema;
|
|
25
|
+
let response = createdItem.toJSON();
|
|
26
|
+
if (data.srcset) {
|
|
27
|
+
response = {
|
|
28
|
+
...response,
|
|
29
|
+
srcset: (await updateItemSrcSet(
|
|
30
|
+
createdItem._id,
|
|
31
|
+
data.srcset
|
|
32
|
+
)) as SrcSetItem[],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
res.message = req?.i18n?.t('item.create');
|
|
36
|
+
return createdDocumentResponse(response, res);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const updateItem = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
40
|
+
const data = req.body;
|
|
41
|
+
const _id = req.params['id'];
|
|
42
|
+
const updatedItem = (await update(Item, { _id }, data)) as IItemSchema;
|
|
43
|
+
let response = updatedItem.toJSON();
|
|
44
|
+
if (data.srcset) {
|
|
45
|
+
response = {
|
|
46
|
+
...response,
|
|
47
|
+
srcset: (await updateItemSrcSet(_id, data.srcset)) as SrcSetItem[],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
res.message = req?.i18n?.t('item.update');
|
|
51
|
+
return successResponse(response, res);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
export const deleteItem = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
55
|
+
const _id = new Types.ObjectId(req.params['id']);
|
|
56
|
+
const deletedItem = await remove(Item, { _id });
|
|
57
|
+
res.message = req?.i18n?.t('item.delete');
|
|
58
|
+
return successResponse(deletedItem, res);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export const getItems = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
62
|
+
const widgetId = req.params['widgetId'];
|
|
63
|
+
const items = await Item.aggregate([
|
|
64
|
+
{
|
|
65
|
+
$match: {
|
|
66
|
+
widgetId: new Types.ObjectId(widgetId),
|
|
67
|
+
isDeleted: false,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
$project: {
|
|
72
|
+
...commonExcludedFields,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
$lookup: {
|
|
77
|
+
from: 'file',
|
|
78
|
+
let: { imgId: '$img' },
|
|
79
|
+
as: 'img',
|
|
80
|
+
pipeline: [
|
|
81
|
+
{
|
|
82
|
+
$match: {
|
|
83
|
+
$expr: {
|
|
84
|
+
$eq: ['$_id', '$$imgId'],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
$project: {
|
|
90
|
+
...commonExcludedFields,
|
|
91
|
+
width: 0,
|
|
92
|
+
module: 0,
|
|
93
|
+
height: 0,
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
$lookup: {
|
|
101
|
+
from: 'srcsets',
|
|
102
|
+
let: { item: '$_id' },
|
|
103
|
+
as: 'srcset',
|
|
104
|
+
pipeline: [
|
|
105
|
+
{
|
|
106
|
+
$match: {
|
|
107
|
+
$expr: {
|
|
108
|
+
$eq: ['$itemId', '$$item'],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
$project: {
|
|
114
|
+
...commonExcludedFields,
|
|
115
|
+
_id: 0,
|
|
116
|
+
itemId: 0,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
$unwind: '$img',
|
|
124
|
+
},
|
|
125
|
+
]);
|
|
126
|
+
res.message = req?.i18n?.t('item.getAll');
|
|
127
|
+
return successResponse(items, res);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const updateItemSrcSet = async (itemId: string, srcSets: SrcSetItem[]) => {
|
|
131
|
+
await deleteAll(SrcSet, { itemId });
|
|
132
|
+
const modifiedSrcSets = srcSets.map((set) => ({
|
|
133
|
+
...set,
|
|
134
|
+
itemId,
|
|
135
|
+
}));
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
137
|
+
// @ts-ignore
|
|
138
|
+
return await bulkInsert(SrcSet, modifiedSrcSets);
|
|
139
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Types } from 'mongoose';
|
|
2
|
+
import { Page } from './../models';
|
|
3
|
+
import { create, remove, update, list } from '../services/dbService';
|
|
4
|
+
import {
|
|
5
|
+
successResponse,
|
|
6
|
+
createdDocumentResponse,
|
|
7
|
+
} from './../utils/responseHandlers';
|
|
8
|
+
import { IRequest, IResponse } from '../types';
|
|
9
|
+
|
|
10
|
+
import { defaults } from '../utils/defaults';
|
|
11
|
+
|
|
12
|
+
const catchAsync = (fn: any) => {
|
|
13
|
+
return defaults.catchAsync(fn, 'Page');
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const createPage = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
17
|
+
const data = req.body;
|
|
18
|
+
const page = await create(Page, data);
|
|
19
|
+
res.message = req?.i18n?.t('page.create');
|
|
20
|
+
return createdDocumentResponse(page, res);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export const updatePage = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
24
|
+
const data = req.body;
|
|
25
|
+
const _id = req.params['id'];
|
|
26
|
+
const updatedPage = await update(Page, { _id }, data);
|
|
27
|
+
res.message = req?.i18n?.t('page.update');
|
|
28
|
+
return successResponse(updatedPage, res);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const deletePage = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
32
|
+
const _id = new Types.ObjectId(req.params['id']);
|
|
33
|
+
const createdPage = await remove(Page, { _id });
|
|
34
|
+
res.message = req?.i18n?.t('page.delete');
|
|
35
|
+
return successResponse(createdPage, res);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export const getPages = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
39
|
+
const search = req.body.search || '';
|
|
40
|
+
const { page, limit, populate } = req.body.options;
|
|
41
|
+
const customOptions = {
|
|
42
|
+
populate,
|
|
43
|
+
...(page && limit ? { page, limit } : {}),
|
|
44
|
+
};
|
|
45
|
+
const query = {
|
|
46
|
+
isDeleted: false,
|
|
47
|
+
$or: [
|
|
48
|
+
{
|
|
49
|
+
name: {
|
|
50
|
+
$regex: search,
|
|
51
|
+
$options: 'i',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
code: {
|
|
56
|
+
$regex: search,
|
|
57
|
+
$options: 'i',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
const pages = await list(Page, query, customOptions);
|
|
63
|
+
res.message = req?.i18n?.t('page.getAll');
|
|
64
|
+
return successResponse(pages, res);
|
|
65
|
+
});
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { AggregateOptions, models } from 'mongoose';
|
|
2
|
+
import { Widget, Page } from './../models';
|
|
3
|
+
import { AddSrcSetsToItems, appendCollectionData } from '../utils/helper';
|
|
4
|
+
import { successResponse } from './../utils/responseHandlers';
|
|
5
|
+
import { defaults, commonExcludedFields } from '../utils/defaults';
|
|
6
|
+
import { IPageSchema, IRequest, IResponse, IWidgetSchema } from '../types';
|
|
7
|
+
|
|
8
|
+
const catchAsync = (fn: any) => {
|
|
9
|
+
return defaults.catchAsync(fn, 'User');
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// TO Do: Optimize the following
|
|
13
|
+
export const getWidgetData = catchAsync(
|
|
14
|
+
async (req: IRequest, res: IResponse) => {
|
|
15
|
+
const { code } = req.body;
|
|
16
|
+
const widgetDataArr = (await Widget.aggregate([
|
|
17
|
+
{
|
|
18
|
+
$match: {
|
|
19
|
+
isDeleted: false,
|
|
20
|
+
isActive: true,
|
|
21
|
+
code,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
// Get only the fields that are not excluded
|
|
26
|
+
$project: {
|
|
27
|
+
...commonExcludedFields,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
// Get Items data
|
|
32
|
+
$lookup: {
|
|
33
|
+
from: 'items',
|
|
34
|
+
let: { widget: '$_id' },
|
|
35
|
+
pipeline: [
|
|
36
|
+
{
|
|
37
|
+
$match: {
|
|
38
|
+
$expr: {
|
|
39
|
+
$eq: ['$widgetId', '$$widget'],
|
|
40
|
+
},
|
|
41
|
+
isDeleted: false,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
$project: {
|
|
46
|
+
...commonExcludedFields,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
$lookup: {
|
|
51
|
+
from: 'file',
|
|
52
|
+
let: { img: '$img' },
|
|
53
|
+
as: 'image',
|
|
54
|
+
pipeline: [
|
|
55
|
+
{
|
|
56
|
+
$match: {
|
|
57
|
+
$expr: {
|
|
58
|
+
$eq: ['$_id', '$$img'],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
$project: {
|
|
64
|
+
_id: 1,
|
|
65
|
+
uri: 1,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
$lookup: {
|
|
73
|
+
from: 'srcsets',
|
|
74
|
+
let: { item: '$_id' },
|
|
75
|
+
as: 'srcset',
|
|
76
|
+
pipeline: [
|
|
77
|
+
{
|
|
78
|
+
$match: {
|
|
79
|
+
$expr: {
|
|
80
|
+
$eq: ['$itemId', '$$item'],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
$project: {
|
|
86
|
+
...commonExcludedFields,
|
|
87
|
+
_id: 0,
|
|
88
|
+
itemId: 0,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
$unwind: '$image',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
as: 'items',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
])) as Array<IWidgetSchema>;
|
|
102
|
+
|
|
103
|
+
if (!widgetDataArr.length) throw new Error(`Widget not found`);
|
|
104
|
+
const widgetData = widgetDataArr[0];
|
|
105
|
+
|
|
106
|
+
if (widgetData.collectionName && widgetData.collectionItems.length > 0) {
|
|
107
|
+
const collectionConfig = defaults.collections.find(
|
|
108
|
+
(c) => c.collectionName === widgetData.collectionName
|
|
109
|
+
);
|
|
110
|
+
const aggregateQuery: AggregateOptions = {
|
|
111
|
+
$match: {
|
|
112
|
+
_id: {
|
|
113
|
+
$in: widgetData.collectionItems,
|
|
114
|
+
},
|
|
115
|
+
...(collectionConfig?.match || {}),
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
if (collectionConfig?.project)
|
|
119
|
+
aggregateQuery['$project'] = collectionConfig?.project;
|
|
120
|
+
if (collectionConfig?.lookup)
|
|
121
|
+
aggregateQuery['$lookup'] = collectionConfig?.lookup;
|
|
122
|
+
|
|
123
|
+
const aggregateQueryItem: AggregateOptions[] = [];
|
|
124
|
+
if (aggregateQuery['$match'])
|
|
125
|
+
aggregateQueryItem.push({ $match: aggregateQuery['$match'] });
|
|
126
|
+
if (aggregateQuery['$lookup'])
|
|
127
|
+
aggregateQueryItem.push({ $lookup: aggregateQuery['$lookup'] });
|
|
128
|
+
if (aggregateQuery['$project'])
|
|
129
|
+
aggregateQueryItem.push({ $project: aggregateQuery['$project'] });
|
|
130
|
+
|
|
131
|
+
const collectionItems = await models[widgetData.collectionName].aggregate(
|
|
132
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
133
|
+
// @ts-ignore
|
|
134
|
+
aggregateQueryItem
|
|
135
|
+
);
|
|
136
|
+
widgetData.collectionItems = collectionItems;
|
|
137
|
+
}
|
|
138
|
+
AddSrcSetsToItems(widgetData);
|
|
139
|
+
return successResponse(widgetData, res);
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// TO Do: Optimize the following
|
|
144
|
+
export const getPageData = catchAsync(async (req: IRequest, res: IResponse) => {
|
|
145
|
+
const { code } = req.body;
|
|
146
|
+
const pageData: any = (await Page.aggregate([
|
|
147
|
+
{
|
|
148
|
+
$match: {
|
|
149
|
+
isDeleted: false,
|
|
150
|
+
code: code,
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
$project: {
|
|
155
|
+
isDeleted: 0,
|
|
156
|
+
deletedAt: 0,
|
|
157
|
+
__v: 0,
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
$lookup: {
|
|
162
|
+
from: 'widgets',
|
|
163
|
+
let: { widgets: '$widgets' },
|
|
164
|
+
pipeline: [
|
|
165
|
+
{
|
|
166
|
+
$match: {
|
|
167
|
+
$expr: {
|
|
168
|
+
$in: ['$_id', '$$widgets'],
|
|
169
|
+
},
|
|
170
|
+
isDeleted: false,
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
$project: {
|
|
175
|
+
widgetId: 0,
|
|
176
|
+
sequence: 0,
|
|
177
|
+
...commonExcludedFields,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
$lookup: {
|
|
182
|
+
from: 'items',
|
|
183
|
+
let: { widget: '$_id' },
|
|
184
|
+
pipeline: [
|
|
185
|
+
{
|
|
186
|
+
$match: {
|
|
187
|
+
$expr: {
|
|
188
|
+
$eq: ['$widgetId', '$$widget'],
|
|
189
|
+
},
|
|
190
|
+
isDeleted: false,
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
$project: {
|
|
195
|
+
...commonExcludedFields,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
$lookup: {
|
|
200
|
+
from: 'file',
|
|
201
|
+
let: { img: '$img' },
|
|
202
|
+
as: 'image',
|
|
203
|
+
pipeline: [
|
|
204
|
+
{
|
|
205
|
+
$match: {
|
|
206
|
+
$expr: {
|
|
207
|
+
$eq: ['$_id', '$$img'],
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
$project: {
|
|
213
|
+
_id: 1,
|
|
214
|
+
uri: 1,
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
$lookup: {
|
|
222
|
+
from: 'srcsets',
|
|
223
|
+
let: { item: '$_id' },
|
|
224
|
+
as: 'srcset',
|
|
225
|
+
pipeline: [
|
|
226
|
+
{
|
|
227
|
+
$match: {
|
|
228
|
+
$expr: {
|
|
229
|
+
$eq: ['$itemId', '$$item'],
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
$project: {
|
|
235
|
+
...commonExcludedFields,
|
|
236
|
+
_id: 0,
|
|
237
|
+
itemId: 0,
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
$unwind: '$image',
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
as: 'items',
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
as: 'widgets',
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
])) as Array<IPageSchema>;
|
|
255
|
+
|
|
256
|
+
if (!pageData.length) throw new Error('Page not found');
|
|
257
|
+
pageData[0].widgets = await appendCollectionData(pageData[0].widgets);
|
|
258
|
+
if (Array.isArray(pageData[0].widgets) && pageData[0].widgets.length > 0) {
|
|
259
|
+
pageData[0].widgets.forEach((widget: IWidgetSchema) => {
|
|
260
|
+
AddSrcSetsToItems(widget);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
res.message = req?.i18n?.t('user.pageData');
|
|
264
|
+
return successResponse(pageData[0], res);
|
|
265
|
+
});
|