@geekron/strapi 0.1.3 → 0.1.5
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/dist/admin/index.js +51201 -12
- package/dist/admin/index.mjs +51289 -3
- package/dist/server/index.js +809 -37
- package/dist/server/index.mjs +810 -37
- package/package.json +18 -7
package/dist/server/index.mjs
CHANGED
|
@@ -1,22 +1,545 @@
|
|
|
1
|
+
// server/src/api/common/content-types/common/schema.json
|
|
2
|
+
var schema_default = {
|
|
3
|
+
kind: "singleType",
|
|
4
|
+
collectionName: "commons",
|
|
5
|
+
info: {
|
|
6
|
+
singularName: "common",
|
|
7
|
+
pluralName: "commons",
|
|
8
|
+
displayName: "Common",
|
|
9
|
+
description: "Define common settings"
|
|
10
|
+
},
|
|
11
|
+
options: {
|
|
12
|
+
draftAndPublish: true
|
|
13
|
+
},
|
|
14
|
+
pluginOptions: {
|
|
15
|
+
i18n: {
|
|
16
|
+
localized: true
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
attributes: {
|
|
20
|
+
favicon: {
|
|
21
|
+
type: "media",
|
|
22
|
+
pluginOptions: {
|
|
23
|
+
i18n: {
|
|
24
|
+
localized: true
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
multiple: false,
|
|
28
|
+
required: false,
|
|
29
|
+
allowedTypes: [
|
|
30
|
+
"images",
|
|
31
|
+
"files",
|
|
32
|
+
"videos"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
title: {
|
|
36
|
+
type: "string",
|
|
37
|
+
pluginOptions: {
|
|
38
|
+
i18n: {
|
|
39
|
+
localized: true
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: true
|
|
43
|
+
},
|
|
44
|
+
description: {
|
|
45
|
+
type: "text",
|
|
46
|
+
pluginOptions: {
|
|
47
|
+
i18n: {
|
|
48
|
+
localized: true
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
required: false
|
|
52
|
+
},
|
|
53
|
+
copyright: {
|
|
54
|
+
type: "string",
|
|
55
|
+
pluginOptions: {
|
|
56
|
+
i18n: {
|
|
57
|
+
localized: true
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
default: "Copyright"
|
|
61
|
+
},
|
|
62
|
+
icp: {
|
|
63
|
+
type: "string",
|
|
64
|
+
pluginOptions: {
|
|
65
|
+
i18n: {
|
|
66
|
+
localized: true
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// server/src/api/common/controllers/common.ts
|
|
74
|
+
import { factories } from "@strapi/strapi";
|
|
75
|
+
var common_default = factories.createCoreController("plugin::website.common");
|
|
76
|
+
|
|
77
|
+
// server/src/api/common/routes/common.ts
|
|
78
|
+
import { factories as factories2 } from "@strapi/strapi";
|
|
79
|
+
var common_default2 = factories2.createCoreRouter("plugin::website.common");
|
|
80
|
+
|
|
81
|
+
// server/src/api/common/services/common.ts
|
|
82
|
+
import { factories as factories3 } from "@strapi/strapi";
|
|
83
|
+
var common_default3 = factories3.createCoreService("plugin::website.common");
|
|
84
|
+
|
|
85
|
+
// server/src/api/common/index.ts
|
|
86
|
+
var common_default4 = {
|
|
87
|
+
schema: schema_default,
|
|
88
|
+
controllers: common_default,
|
|
89
|
+
services: common_default3,
|
|
90
|
+
routes: common_default2
|
|
91
|
+
};
|
|
92
|
+
// server/src/api/menu/content-types/menu/schema.json
|
|
93
|
+
var schema_default2 = {
|
|
94
|
+
kind: "singleType",
|
|
95
|
+
collectionName: "menus",
|
|
96
|
+
info: {
|
|
97
|
+
singularName: "menu",
|
|
98
|
+
pluralName: "menus",
|
|
99
|
+
displayName: "Menu"
|
|
100
|
+
},
|
|
101
|
+
options: {
|
|
102
|
+
draftAndPublish: true
|
|
103
|
+
},
|
|
104
|
+
pluginOptions: {
|
|
105
|
+
i18n: {
|
|
106
|
+
localized: true
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
attributes: {
|
|
110
|
+
title: {
|
|
111
|
+
type: "string",
|
|
112
|
+
pluginOptions: {
|
|
113
|
+
i18n: {
|
|
114
|
+
localized: true
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
required: true
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// server/src/api/menu/controllers/menu.ts
|
|
123
|
+
import { factories as factories4 } from "@strapi/strapi";
|
|
124
|
+
var menu_default = factories4.createCoreController("plugin::website.menu");
|
|
125
|
+
|
|
126
|
+
// server/src/api/menu/routes/menu.ts
|
|
127
|
+
import { factories as factories5 } from "@strapi/strapi";
|
|
128
|
+
var menu_default2 = factories5.createCoreRouter("plugin::website.menu");
|
|
129
|
+
|
|
130
|
+
// server/src/api/menu/services/menu.ts
|
|
131
|
+
import { factories as factories6 } from "@strapi/strapi";
|
|
132
|
+
var menu_default3 = factories6.createCoreService("plugin::website.menu");
|
|
133
|
+
|
|
134
|
+
// server/src/api/menu/index.ts
|
|
135
|
+
var menu_default4 = {
|
|
136
|
+
schema: schema_default2,
|
|
137
|
+
controllers: menu_default,
|
|
138
|
+
services: menu_default3,
|
|
139
|
+
routes: menu_default2
|
|
140
|
+
};
|
|
141
|
+
// server/src/api/site/content-types/site/schema.json
|
|
142
|
+
var schema_default3 = {
|
|
143
|
+
kind: "singleType",
|
|
144
|
+
collectionName: "sites",
|
|
145
|
+
info: {
|
|
146
|
+
singularName: "site",
|
|
147
|
+
pluralName: "sites",
|
|
148
|
+
displayName: "Site"
|
|
149
|
+
},
|
|
150
|
+
options: {
|
|
151
|
+
draftAndPublish: true
|
|
152
|
+
},
|
|
153
|
+
pluginOptions: {
|
|
154
|
+
i18n: {
|
|
155
|
+
localized: true
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
attributes: {
|
|
159
|
+
enabled: {
|
|
160
|
+
type: "boolean",
|
|
161
|
+
pluginOptions: {
|
|
162
|
+
i18n: {
|
|
163
|
+
localized: true
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
required: true,
|
|
167
|
+
default: true
|
|
168
|
+
},
|
|
169
|
+
title: {
|
|
170
|
+
type: "string",
|
|
171
|
+
pluginOptions: {
|
|
172
|
+
i18n: {
|
|
173
|
+
localized: true
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
logo: {
|
|
178
|
+
type: "media",
|
|
179
|
+
pluginOptions: {
|
|
180
|
+
i18n: {
|
|
181
|
+
localized: true
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
multiple: false,
|
|
185
|
+
allowedTypes: [
|
|
186
|
+
"images"
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
icon: {
|
|
190
|
+
type: "media",
|
|
191
|
+
pluginOptions: {
|
|
192
|
+
i18n: {
|
|
193
|
+
localized: true
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
multiple: false,
|
|
197
|
+
allowedTypes: [
|
|
198
|
+
"images"
|
|
199
|
+
]
|
|
200
|
+
},
|
|
201
|
+
url: {
|
|
202
|
+
type: "string",
|
|
203
|
+
pluginOptions: {
|
|
204
|
+
i18n: {
|
|
205
|
+
localized: true
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
robots: {
|
|
210
|
+
type: "text",
|
|
211
|
+
pluginOptions: {
|
|
212
|
+
i18n: {
|
|
213
|
+
localized: true
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
head: {
|
|
218
|
+
type: "text",
|
|
219
|
+
pluginOptions: {
|
|
220
|
+
i18n: {
|
|
221
|
+
localized: true
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
foot: {
|
|
226
|
+
type: "text",
|
|
227
|
+
pluginOptions: {
|
|
228
|
+
i18n: {
|
|
229
|
+
localized: true
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
inquiryEmail: {
|
|
234
|
+
type: "email",
|
|
235
|
+
pluginOptions: {
|
|
236
|
+
i18n: {
|
|
237
|
+
localized: true
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
index: {
|
|
242
|
+
type: "boolean",
|
|
243
|
+
pluginOptions: {
|
|
244
|
+
i18n: {
|
|
245
|
+
localized: true
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
default: false
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
// server/src/api/site/controllers/site.ts
|
|
254
|
+
import { factories as factories7 } from "@strapi/strapi";
|
|
255
|
+
var site_default = factories7.createCoreController("plugin::website.site");
|
|
256
|
+
|
|
257
|
+
// server/src/api/site/routes/site.ts
|
|
258
|
+
import { factories as factories8 } from "@strapi/strapi";
|
|
259
|
+
var site_default2 = factories8.createCoreRouter("plugin::website.site");
|
|
260
|
+
|
|
261
|
+
// server/src/api/site/services/site.ts
|
|
262
|
+
import { factories as factories9 } from "@strapi/strapi";
|
|
263
|
+
var site_default3 = factories9.createCoreService("plugin::website.site");
|
|
264
|
+
|
|
265
|
+
// server/src/api/site/index.ts
|
|
266
|
+
var site_default4 = {
|
|
267
|
+
schema: schema_default3,
|
|
268
|
+
controllers: site_default,
|
|
269
|
+
services: site_default3,
|
|
270
|
+
routes: site_default2
|
|
271
|
+
};
|
|
272
|
+
// server/src/api/translation/content-types/translation/schema.json
|
|
273
|
+
var schema_default4 = {
|
|
274
|
+
kind: "collectionType",
|
|
275
|
+
collectionName: "translations",
|
|
276
|
+
info: {
|
|
277
|
+
singularName: "translation",
|
|
278
|
+
pluralName: "translations",
|
|
279
|
+
displayName: "Translation"
|
|
280
|
+
},
|
|
281
|
+
options: {
|
|
282
|
+
draftAndPublish: true
|
|
283
|
+
},
|
|
284
|
+
pluginOptions: {
|
|
285
|
+
i18n: {
|
|
286
|
+
localized: true
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
attributes: {
|
|
290
|
+
key: {
|
|
291
|
+
type: "string",
|
|
292
|
+
pluginOptions: {
|
|
293
|
+
i18n: {
|
|
294
|
+
localized: false
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
required: true,
|
|
298
|
+
unique: true
|
|
299
|
+
},
|
|
300
|
+
value: {
|
|
301
|
+
type: "text",
|
|
302
|
+
pluginOptions: {
|
|
303
|
+
i18n: {
|
|
304
|
+
localized: true
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
required: true
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
// server/src/api/translation/controllers/translation.ts
|
|
313
|
+
import { factories as factories10 } from "@strapi/strapi";
|
|
314
|
+
var translation_default = factories10.createCoreController("plugin::website.translation");
|
|
315
|
+
|
|
316
|
+
// server/src/api/translation/routes/translation.ts
|
|
317
|
+
import { factories as factories11 } from "@strapi/strapi";
|
|
318
|
+
var translation_default2 = factories11.createCoreRouter("plugin::website.translation");
|
|
319
|
+
|
|
320
|
+
// server/src/api/translation/services/translation.ts
|
|
321
|
+
import { factories as factories12 } from "@strapi/strapi";
|
|
322
|
+
var translation_default3 = factories12.createCoreService("plugin::website.translation");
|
|
323
|
+
|
|
324
|
+
// server/src/api/translation/index.ts
|
|
325
|
+
var translation_default4 = {
|
|
326
|
+
schema: schema_default4,
|
|
327
|
+
controllers: translation_default,
|
|
328
|
+
services: translation_default3,
|
|
329
|
+
routes: translation_default2
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// server/src/api/index.ts
|
|
333
|
+
var contentTypes = {};
|
|
334
|
+
var controllers = {};
|
|
335
|
+
var routes = {};
|
|
336
|
+
var services = {};
|
|
337
|
+
contentTypes.common = {
|
|
338
|
+
schema: common_default4.schema
|
|
339
|
+
};
|
|
340
|
+
contentTypes.menu = {
|
|
341
|
+
schema: menu_default4.schema
|
|
342
|
+
};
|
|
343
|
+
contentTypes.site = {
|
|
344
|
+
schema: site_default4.schema
|
|
345
|
+
};
|
|
346
|
+
contentTypes.translation = {
|
|
347
|
+
schema: translation_default4.schema
|
|
348
|
+
};
|
|
349
|
+
routes.common = common_default4.routes;
|
|
350
|
+
routes.menu = menu_default4.routes;
|
|
351
|
+
routes.site = site_default4.routes;
|
|
352
|
+
routes.translation = translation_default4.routes;
|
|
353
|
+
services.common = common_default4.services;
|
|
354
|
+
services.menu = menu_default4.services;
|
|
355
|
+
services.site = site_default4.services;
|
|
356
|
+
services.translation = translation_default4.services;
|
|
357
|
+
controllers.common = common_default4.controllers;
|
|
358
|
+
controllers.menu = menu_default4.controllers;
|
|
359
|
+
controllers.site = site_default4.controllers;
|
|
360
|
+
controllers.translation = translation_default4.controllers;
|
|
361
|
+
var api_default = {
|
|
362
|
+
contentTypes,
|
|
363
|
+
controllers,
|
|
364
|
+
routes,
|
|
365
|
+
services
|
|
366
|
+
};
|
|
367
|
+
|
|
1
368
|
// server/src/bootstrap.ts
|
|
2
|
-
var bootstrap = ({ strapi }) => {
|
|
3
|
-
|
|
369
|
+
var bootstrap = ({ strapi: strapi2 }) => {
|
|
370
|
+
strapi2.log.info("website server plugin: bootstrap");
|
|
4
371
|
};
|
|
5
372
|
var bootstrap_default = bootstrap;
|
|
6
373
|
|
|
374
|
+
// server/src/config/index.ts
|
|
375
|
+
var config = {
|
|
376
|
+
default: {},
|
|
377
|
+
validator: (config2) => config2
|
|
378
|
+
};
|
|
379
|
+
var config_default = config;
|
|
380
|
+
|
|
7
381
|
// server/src/contentTypes/index.ts
|
|
8
|
-
var
|
|
9
|
-
var contentTypes_default =
|
|
382
|
+
var contentTypes2 = {};
|
|
383
|
+
var contentTypes_default = contentTypes2;
|
|
384
|
+
|
|
385
|
+
// server/src/controllers/fields.ts
|
|
386
|
+
var checkAvailable = async (context) => {
|
|
387
|
+
const body = context.request.body;
|
|
388
|
+
if (body.kind === "collectionType") {
|
|
389
|
+
const entities = await strapi.entityService.findMany(body.uid, {
|
|
390
|
+
filters: {
|
|
391
|
+
[body.field]: {
|
|
392
|
+
$eq: body.value
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
return { isAvailable: !entities?.length };
|
|
397
|
+
}
|
|
398
|
+
return { isAvailable: true };
|
|
399
|
+
};
|
|
400
|
+
var fields = {
|
|
401
|
+
checkAvailable
|
|
402
|
+
};
|
|
403
|
+
var fields_default = fields;
|
|
404
|
+
|
|
405
|
+
// server/src/controllers/utils/request.ts
|
|
406
|
+
var getWebsiteConfig = async () => {
|
|
407
|
+
const locale = await strapi.plugin("i18n").service("locales").getDefaultLocale();
|
|
408
|
+
const [site, [token]] = await Promise.all([
|
|
409
|
+
strapi.db.query("plugin::website.site").findOne({ where: { locale } }),
|
|
410
|
+
strapi.db.query("admin::api-token").findMany({ where: { type: "full-access" } })
|
|
411
|
+
]);
|
|
412
|
+
if (!site || !token) {
|
|
413
|
+
throw new Error("You need to configure Site url and a full-access API token first.");
|
|
414
|
+
}
|
|
415
|
+
const accessKey = strapi.service("admin::encryption").decrypt(token.encryptedKey);
|
|
416
|
+
return {
|
|
417
|
+
url: site?.url,
|
|
418
|
+
token: accessKey
|
|
419
|
+
};
|
|
420
|
+
};
|
|
421
|
+
var buildHeaders = (token, extraHeaders = {}) => {
|
|
422
|
+
const headers = { ...extraHeaders };
|
|
423
|
+
if (token) {
|
|
424
|
+
headers.Authorization = `Bearer ${token}`;
|
|
425
|
+
}
|
|
426
|
+
return headers;
|
|
427
|
+
};
|
|
428
|
+
var fetchWebsite = async (endpoint, options = {}) => {
|
|
429
|
+
const { url, token } = await getWebsiteConfig();
|
|
430
|
+
const fullUrl = `${url}${endpoint}`;
|
|
431
|
+
console.debug("Fetch Website Server Url:", fullUrl);
|
|
432
|
+
const headers = buildHeaders(token, options.headers);
|
|
433
|
+
const response = await fetch(fullUrl, { ...options, headers });
|
|
434
|
+
if (!response.ok) {
|
|
435
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
436
|
+
}
|
|
437
|
+
const result = await response.json();
|
|
438
|
+
return result;
|
|
439
|
+
};
|
|
440
|
+
var handleError = (ctx, error, defaultMessage) => {
|
|
441
|
+
const timestamp = new Date().toISOString();
|
|
442
|
+
let code = 500;
|
|
443
|
+
let message = error.message || defaultMessage;
|
|
444
|
+
if (error.status === 404 || error.message?.includes("404")) {
|
|
445
|
+
code = 404;
|
|
446
|
+
message = error.message || "Resource not found";
|
|
447
|
+
} else if (error.status === 400 || error.message?.includes("400")) {
|
|
448
|
+
code = 400;
|
|
449
|
+
message = error.message || "Bad request";
|
|
450
|
+
} else if (error.status === 401 || error.message?.includes("401")) {
|
|
451
|
+
code = 401;
|
|
452
|
+
message = error.message || "Unauthorized";
|
|
453
|
+
} else if (error.status === 403 || error.message?.includes("403")) {
|
|
454
|
+
code = 403;
|
|
455
|
+
message = error.message || "Forbidden";
|
|
456
|
+
}
|
|
457
|
+
const errorResponse = {
|
|
458
|
+
code,
|
|
459
|
+
message: `${defaultMessage}: ${message}`,
|
|
460
|
+
timestamp
|
|
461
|
+
};
|
|
462
|
+
ctx.status = code;
|
|
463
|
+
return errorResponse;
|
|
464
|
+
};
|
|
465
|
+
var buildQueryParams = (params) => {
|
|
466
|
+
const queryParams = new URLSearchParams;
|
|
467
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
468
|
+
if (value !== undefined && value !== null && value !== "") {
|
|
469
|
+
queryParams.append(key, String(value));
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
return queryParams.toString();
|
|
473
|
+
};
|
|
474
|
+
var paginateData = (data, limit, offset) => {
|
|
475
|
+
const total = data.length;
|
|
476
|
+
const startIndex = offset;
|
|
477
|
+
const endIndex = startIndex + limit;
|
|
478
|
+
const items = data.slice(startIndex, endIndex);
|
|
479
|
+
return {
|
|
480
|
+
code: 200,
|
|
481
|
+
message: "success",
|
|
482
|
+
data: {
|
|
483
|
+
items,
|
|
484
|
+
pagination: {
|
|
485
|
+
page: Math.floor(offset / limit) + 1,
|
|
486
|
+
pageSize: limit,
|
|
487
|
+
total
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
timestamp: new Date().toISOString()
|
|
491
|
+
};
|
|
492
|
+
};
|
|
10
493
|
|
|
11
494
|
// server/src/controllers/inquiries.ts
|
|
12
495
|
var list = async (ctx) => {
|
|
13
|
-
|
|
496
|
+
const {
|
|
497
|
+
page = 1,
|
|
498
|
+
pageSize = 10,
|
|
499
|
+
keyword = "",
|
|
500
|
+
start = "",
|
|
501
|
+
end = "",
|
|
502
|
+
sortBy = "createdAt",
|
|
503
|
+
order = "desc"
|
|
504
|
+
} = ctx.query;
|
|
505
|
+
const queryString = buildQueryParams({
|
|
506
|
+
page,
|
|
507
|
+
pageSize,
|
|
508
|
+
keyword,
|
|
509
|
+
start,
|
|
510
|
+
end,
|
|
511
|
+
sortBy,
|
|
512
|
+
order
|
|
513
|
+
});
|
|
514
|
+
try {
|
|
515
|
+
return await fetchWebsite(`/api/inquiries?${queryString}`);
|
|
516
|
+
} catch (error) {
|
|
517
|
+
return handleError(ctx, error, "Failed to fetch inquiries");
|
|
518
|
+
}
|
|
14
519
|
};
|
|
15
520
|
var detail = async (ctx) => {
|
|
16
|
-
|
|
521
|
+
const { id } = ctx.params;
|
|
522
|
+
try {
|
|
523
|
+
return await fetchWebsite(`/api/inquiries/${id}`);
|
|
524
|
+
} catch (error) {
|
|
525
|
+
return handleError(ctx, error, "Failed to fetch inquiry detail");
|
|
526
|
+
}
|
|
17
527
|
};
|
|
18
528
|
var read = async (ctx) => {
|
|
19
|
-
|
|
529
|
+
const { id } = ctx.params;
|
|
530
|
+
const operatorId = ctx.state?.user?.id;
|
|
531
|
+
if (!operatorId) {
|
|
532
|
+
ctx.throw(400, "operatorId is required");
|
|
533
|
+
}
|
|
534
|
+
try {
|
|
535
|
+
return await fetchWebsite(`/api/inquiries/${id}/read`, {
|
|
536
|
+
method: "PUT",
|
|
537
|
+
headers: { "Content-Type": "application/json" },
|
|
538
|
+
body: JSON.stringify({ operatorId })
|
|
539
|
+
});
|
|
540
|
+
} catch (error) {
|
|
541
|
+
return handleError(ctx, error, "Failed to mark inquiry as read");
|
|
542
|
+
}
|
|
20
543
|
};
|
|
21
544
|
var inquiries = {
|
|
22
545
|
list,
|
|
@@ -27,13 +550,34 @@ var inquiries_default = inquiries;
|
|
|
27
550
|
|
|
28
551
|
// server/src/controllers/visitors.ts
|
|
29
552
|
var pageViews = async (ctx) => {
|
|
30
|
-
|
|
553
|
+
const { limit = 10, offset = 0, start, end, ip } = ctx.query;
|
|
554
|
+
const queryString = buildQueryParams({ start, end, ip });
|
|
555
|
+
try {
|
|
556
|
+
const allData = await fetchWebsite(`/api/visitor/page-views?${queryString}`);
|
|
557
|
+
return paginateData(allData, Number(limit), Number(offset));
|
|
558
|
+
} catch (error) {
|
|
559
|
+
return handleError(ctx, error, "Failed to fetch page views");
|
|
560
|
+
}
|
|
31
561
|
};
|
|
32
562
|
var sessions = async (ctx) => {
|
|
33
|
-
|
|
563
|
+
const { limit = 10, offset = 0, start, end, ip } = ctx.query;
|
|
564
|
+
const queryString = buildQueryParams({ start, end, ip });
|
|
565
|
+
try {
|
|
566
|
+
const allData = await fetchWebsite(`/api/visitor/sessions?${queryString}`);
|
|
567
|
+
return paginateData(allData, Number(limit), Number(offset));
|
|
568
|
+
} catch (error) {
|
|
569
|
+
return handleError(ctx, error, "Failed to fetch visitor sessions");
|
|
570
|
+
}
|
|
34
571
|
};
|
|
35
572
|
var dailyPageStats = async (ctx) => {
|
|
36
|
-
|
|
573
|
+
const { start, end, page, limit = 10, offset = 0 } = ctx.query;
|
|
574
|
+
const queryString = buildQueryParams({ start, end, page });
|
|
575
|
+
try {
|
|
576
|
+
const allData = await fetchWebsite(`/api/visitor/stats/daily-page?${queryString}`);
|
|
577
|
+
return paginateData(allData, Number(limit), Number(offset));
|
|
578
|
+
} catch (error) {
|
|
579
|
+
return handleError(ctx, error, "Failed to fetch daily page stats");
|
|
580
|
+
}
|
|
37
581
|
};
|
|
38
582
|
var visitors = {
|
|
39
583
|
pageViews,
|
|
@@ -43,64 +587,284 @@ var visitors = {
|
|
|
43
587
|
var visitors_default = visitors;
|
|
44
588
|
|
|
45
589
|
// server/src/controllers/website.ts
|
|
46
|
-
var hello = async (
|
|
47
|
-
|
|
590
|
+
var hello = async () => {
|
|
591
|
+
return { message: "hello world" };
|
|
592
|
+
};
|
|
593
|
+
var check = async (ctx) => {
|
|
594
|
+
try {
|
|
595
|
+
return await fetchWebsite("/api/site/hello");
|
|
596
|
+
} catch (error) {
|
|
597
|
+
return handleError(ctx, error, "Failed to refresh website cache");
|
|
598
|
+
}
|
|
48
599
|
};
|
|
49
600
|
var refresh = async (ctx) => {
|
|
50
|
-
|
|
601
|
+
try {
|
|
602
|
+
return await fetchWebsite("/api/site/refresh");
|
|
603
|
+
} catch (error) {
|
|
604
|
+
return handleError(ctx, error, "Failed to refresh website cache");
|
|
605
|
+
}
|
|
51
606
|
};
|
|
52
607
|
var dashboard = async (ctx) => {
|
|
53
|
-
|
|
608
|
+
try {
|
|
609
|
+
return await fetchWebsite("/api/common/dashboard");
|
|
610
|
+
} catch (error) {
|
|
611
|
+
return handleError(ctx, error, "Failed to fetch dashboard stats");
|
|
612
|
+
}
|
|
54
613
|
};
|
|
55
614
|
var website = {
|
|
56
615
|
hello,
|
|
616
|
+
check,
|
|
57
617
|
refresh,
|
|
58
618
|
dashboard
|
|
59
619
|
};
|
|
60
620
|
var website_default = website;
|
|
61
621
|
|
|
62
622
|
// server/src/controllers/index.ts
|
|
63
|
-
var
|
|
623
|
+
var controllers2 = {
|
|
64
624
|
website: website_default,
|
|
65
625
|
visitors: visitors_default,
|
|
66
|
-
inquiries: inquiries_default
|
|
626
|
+
inquiries: inquiries_default,
|
|
627
|
+
fields: fields_default
|
|
67
628
|
};
|
|
68
|
-
var controllers_default =
|
|
629
|
+
var controllers_default = controllers2;
|
|
69
630
|
|
|
70
631
|
// server/src/destroy.ts
|
|
71
|
-
var destroy = ({ strapi }) => {
|
|
72
|
-
|
|
632
|
+
var destroy = ({ strapi: strapi2 }) => {
|
|
633
|
+
strapi2.log.info("dashboard server plugin: bootstrap");
|
|
73
634
|
};
|
|
74
635
|
var destroy_default = destroy;
|
|
75
636
|
|
|
637
|
+
// server/src/components/index.ts
|
|
638
|
+
var createComponent = (strapi2, { name, displayName, icon, attributes }) => {
|
|
639
|
+
const category = "website";
|
|
640
|
+
if (strapi2.components[`${category}.${name}`])
|
|
641
|
+
return;
|
|
642
|
+
const builder = strapi2.plugin("content-type-builder");
|
|
643
|
+
builder.services.components.createComponent({
|
|
644
|
+
component: {
|
|
645
|
+
icon,
|
|
646
|
+
category,
|
|
647
|
+
displayName,
|
|
648
|
+
attributes
|
|
649
|
+
}
|
|
650
|
+
}).then((r) => {
|
|
651
|
+
console.log(`create ${name} component`, r);
|
|
652
|
+
});
|
|
653
|
+
};
|
|
654
|
+
var registerComponents = (strapi2, components) => {
|
|
655
|
+
components.forEach((component) => {
|
|
656
|
+
createComponent(strapi2, component);
|
|
657
|
+
});
|
|
658
|
+
};
|
|
659
|
+
|
|
660
|
+
// server/src/components/banner.ts
|
|
661
|
+
var component = {
|
|
662
|
+
name: "banner",
|
|
663
|
+
icon: "landscape",
|
|
664
|
+
displayName: "Banner",
|
|
665
|
+
attributes: {
|
|
666
|
+
title: {
|
|
667
|
+
type: "string"
|
|
668
|
+
},
|
|
669
|
+
subtitle: {
|
|
670
|
+
type: "string"
|
|
671
|
+
},
|
|
672
|
+
description: {
|
|
673
|
+
type: "string"
|
|
674
|
+
},
|
|
675
|
+
image: {
|
|
676
|
+
type: "media",
|
|
677
|
+
multiple: false,
|
|
678
|
+
required: true,
|
|
679
|
+
allowedTypes: ["images"]
|
|
680
|
+
},
|
|
681
|
+
mImage: {
|
|
682
|
+
type: "media",
|
|
683
|
+
multiple: false,
|
|
684
|
+
allowedTypes: ["images"]
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
};
|
|
688
|
+
var banner_default = component;
|
|
689
|
+
|
|
690
|
+
// server/src/components/logo.ts
|
|
691
|
+
var component2 = {
|
|
692
|
+
name: "logo",
|
|
693
|
+
icon: "picture",
|
|
694
|
+
displayName: "Logo",
|
|
695
|
+
attributes: {
|
|
696
|
+
main: {
|
|
697
|
+
type: "media",
|
|
698
|
+
multiple: false,
|
|
699
|
+
allowedTypes: ["images"]
|
|
700
|
+
},
|
|
701
|
+
sub: {
|
|
702
|
+
type: "media",
|
|
703
|
+
multiple: false,
|
|
704
|
+
allowedTypes: ["images"]
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
};
|
|
708
|
+
var logo_default = component2;
|
|
709
|
+
|
|
710
|
+
// server/src/components/social.ts
|
|
711
|
+
var component3 = {
|
|
712
|
+
name: "social",
|
|
713
|
+
icon: "paperPlane",
|
|
714
|
+
displayName: "Social",
|
|
715
|
+
attributes: {
|
|
716
|
+
type: {
|
|
717
|
+
type: "enumeration",
|
|
718
|
+
enum: ["url", "qrcode"]
|
|
719
|
+
},
|
|
720
|
+
url: {
|
|
721
|
+
type: "string",
|
|
722
|
+
conditions: {
|
|
723
|
+
visible: {
|
|
724
|
+
"==": [
|
|
725
|
+
{
|
|
726
|
+
var: "type"
|
|
727
|
+
},
|
|
728
|
+
"url"
|
|
729
|
+
]
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
qrcode: {
|
|
734
|
+
type: "media",
|
|
735
|
+
conditions: {
|
|
736
|
+
visible: {
|
|
737
|
+
"==": [
|
|
738
|
+
{
|
|
739
|
+
var: "type"
|
|
740
|
+
},
|
|
741
|
+
"qrcode"
|
|
742
|
+
]
|
|
743
|
+
}
|
|
744
|
+
},
|
|
745
|
+
multiple: false,
|
|
746
|
+
allowedTypes: ["images"]
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
};
|
|
750
|
+
var social_default = component3;
|
|
751
|
+
|
|
752
|
+
// server/src/components/video.ts
|
|
753
|
+
var component4 = {
|
|
754
|
+
name: "video",
|
|
755
|
+
icon: "play",
|
|
756
|
+
displayName: "Video",
|
|
757
|
+
attributes: {
|
|
758
|
+
url: {
|
|
759
|
+
type: "string",
|
|
760
|
+
required: true
|
|
761
|
+
},
|
|
762
|
+
title: {
|
|
763
|
+
type: "string"
|
|
764
|
+
},
|
|
765
|
+
image: {
|
|
766
|
+
type: "media",
|
|
767
|
+
multiple: false,
|
|
768
|
+
allowedTypes: ["images"]
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
var video_default = component4;
|
|
773
|
+
|
|
76
774
|
// server/src/register.ts
|
|
77
|
-
var register = ({ strapi }) => {
|
|
78
|
-
|
|
775
|
+
var register = ({ strapi: strapi2 }) => {
|
|
776
|
+
strapi2.log.info("website server plugin: register");
|
|
777
|
+
registerComponents(strapi2, [
|
|
778
|
+
banner_default,
|
|
779
|
+
social_default,
|
|
780
|
+
logo_default,
|
|
781
|
+
video_default
|
|
782
|
+
]);
|
|
783
|
+
strapi2.customFields.register([
|
|
784
|
+
{
|
|
785
|
+
name: "slugInput",
|
|
786
|
+
plugin: "website",
|
|
787
|
+
type: "string",
|
|
788
|
+
inputSize: {
|
|
789
|
+
default: 6,
|
|
790
|
+
isResizable: true
|
|
791
|
+
}
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
name: "dataNested",
|
|
795
|
+
plugin: "website",
|
|
796
|
+
type: "json",
|
|
797
|
+
inputSize: {
|
|
798
|
+
default: 12,
|
|
799
|
+
isResizable: false
|
|
800
|
+
}
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
name: "dataSelect",
|
|
804
|
+
plugin: "website",
|
|
805
|
+
type: "json",
|
|
806
|
+
inputSize: {
|
|
807
|
+
default: 12,
|
|
808
|
+
isResizable: false
|
|
809
|
+
}
|
|
810
|
+
},
|
|
811
|
+
{
|
|
812
|
+
name: "iconPicker",
|
|
813
|
+
plugin: "website",
|
|
814
|
+
type: "json",
|
|
815
|
+
inputSize: {
|
|
816
|
+
default: 4,
|
|
817
|
+
isResizable: true
|
|
818
|
+
}
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
name: "colorPicker",
|
|
822
|
+
plugin: "website",
|
|
823
|
+
type: "string",
|
|
824
|
+
inputSize: {
|
|
825
|
+
default: 4,
|
|
826
|
+
isResizable: true
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
]);
|
|
79
830
|
};
|
|
80
831
|
var register_default = register;
|
|
81
832
|
|
|
82
833
|
// server/src/routes/index.ts
|
|
83
|
-
var
|
|
834
|
+
var routes2 = {
|
|
84
835
|
admin: {
|
|
85
836
|
type: "admin",
|
|
86
837
|
routes: [
|
|
838
|
+
{
|
|
839
|
+
method: "POST",
|
|
840
|
+
path: "/fields/check-available",
|
|
841
|
+
handler: "fields.checkAvailable",
|
|
842
|
+
info: {}
|
|
843
|
+
},
|
|
87
844
|
{
|
|
88
845
|
method: "GET",
|
|
89
|
-
path: "/
|
|
846
|
+
path: "/hello",
|
|
90
847
|
handler: "website.hello",
|
|
91
848
|
config: { auth: false },
|
|
92
849
|
info: {}
|
|
93
850
|
},
|
|
94
851
|
{
|
|
95
852
|
method: "GET",
|
|
96
|
-
path: "/
|
|
853
|
+
path: "/check",
|
|
854
|
+
handler: "website.check",
|
|
855
|
+
config: {},
|
|
856
|
+
info: {}
|
|
857
|
+
},
|
|
858
|
+
{
|
|
859
|
+
method: "GET",
|
|
860
|
+
path: "/refresh",
|
|
97
861
|
handler: "website.refresh",
|
|
98
862
|
config: {},
|
|
99
863
|
info: {}
|
|
100
864
|
},
|
|
101
865
|
{
|
|
102
866
|
method: "GET",
|
|
103
|
-
path: "/
|
|
867
|
+
path: "/dashboard",
|
|
104
868
|
handler: "website.dashboard",
|
|
105
869
|
config: {},
|
|
106
870
|
info: {}
|
|
@@ -150,27 +914,36 @@ var routes = {
|
|
|
150
914
|
]
|
|
151
915
|
}
|
|
152
916
|
};
|
|
153
|
-
var routes_default =
|
|
917
|
+
var routes_default = routes2;
|
|
154
918
|
|
|
155
919
|
// server/src/services/index.ts
|
|
156
|
-
var
|
|
157
|
-
var services_default =
|
|
920
|
+
var services2 = {};
|
|
921
|
+
var services_default = services2;
|
|
158
922
|
|
|
159
923
|
// server/src/index.ts
|
|
160
924
|
var plugin = {
|
|
161
925
|
register: register_default,
|
|
162
926
|
bootstrap: bootstrap_default,
|
|
163
927
|
destroy: destroy_default,
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
928
|
+
config: config_default,
|
|
929
|
+
contentTypes: {
|
|
930
|
+
...contentTypes_default,
|
|
931
|
+
...api_default.contentTypes
|
|
932
|
+
},
|
|
933
|
+
controllers: {
|
|
934
|
+
...controllers_default,
|
|
935
|
+
...api_default.controllers
|
|
936
|
+
},
|
|
937
|
+
routes: {
|
|
938
|
+
...routes_default,
|
|
939
|
+
...api_default.routes
|
|
940
|
+
},
|
|
941
|
+
services: {
|
|
942
|
+
...services_default,
|
|
943
|
+
...api_default.services
|
|
944
|
+
},
|
|
168
945
|
policies: {},
|
|
169
|
-
middlewares: {}
|
|
170
|
-
config: {
|
|
171
|
-
default: {},
|
|
172
|
-
validator: () => {}
|
|
173
|
-
}
|
|
946
|
+
middlewares: {}
|
|
174
947
|
};
|
|
175
948
|
var src_default = plugin;
|
|
176
949
|
export {
|