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