@geekron/strapi 0.1.3 → 0.1.4
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 +51123 -12
- package/dist/admin/index.mjs +51211 -3
- package/dist/server/index.js +794 -37
- package/dist/server/index.mjs +795 -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,14 +622,22 @@ 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" };
|
|
84
627
|
};
|
|
85
628
|
var refresh = async (ctx) => {
|
|
86
|
-
|
|
629
|
+
try {
|
|
630
|
+
return await fetchWebsite("/api/site/refresh");
|
|
631
|
+
} catch (error) {
|
|
632
|
+
return handleError(ctx, error, "Failed to refresh website cache");
|
|
633
|
+
}
|
|
87
634
|
};
|
|
88
635
|
var dashboard = async (ctx) => {
|
|
89
|
-
|
|
636
|
+
try {
|
|
637
|
+
return await fetchWebsite("/api/common/dashboard");
|
|
638
|
+
} catch (error) {
|
|
639
|
+
return handleError(ctx, error, "Failed to fetch dashboard stats");
|
|
640
|
+
}
|
|
90
641
|
};
|
|
91
642
|
var website = {
|
|
92
643
|
hello,
|
|
@@ -96,47 +647,244 @@ var website = {
|
|
|
96
647
|
var website_default = website;
|
|
97
648
|
|
|
98
649
|
// server/src/controllers/index.ts
|
|
99
|
-
var
|
|
650
|
+
var controllers2 = {
|
|
100
651
|
website: website_default,
|
|
101
652
|
visitors: visitors_default,
|
|
102
|
-
inquiries: inquiries_default
|
|
653
|
+
inquiries: inquiries_default,
|
|
654
|
+
fields: fields_default
|
|
103
655
|
};
|
|
104
|
-
var controllers_default =
|
|
656
|
+
var controllers_default = controllers2;
|
|
105
657
|
|
|
106
658
|
// server/src/destroy.ts
|
|
107
|
-
var destroy = ({ strapi }) => {
|
|
108
|
-
|
|
659
|
+
var destroy = ({ strapi: strapi2 }) => {
|
|
660
|
+
strapi2.log.info("dashboard server plugin: bootstrap");
|
|
109
661
|
};
|
|
110
662
|
var destroy_default = destroy;
|
|
111
663
|
|
|
664
|
+
// server/src/components/index.ts
|
|
665
|
+
var createComponent = (strapi2, { name, displayName, icon, attributes }) => {
|
|
666
|
+
const category = "website";
|
|
667
|
+
if (strapi2.components[`${category}.${name}`])
|
|
668
|
+
return;
|
|
669
|
+
const builder = strapi2.plugin("content-type-builder");
|
|
670
|
+
builder.services.components.createComponent({
|
|
671
|
+
component: {
|
|
672
|
+
icon,
|
|
673
|
+
category,
|
|
674
|
+
displayName,
|
|
675
|
+
attributes
|
|
676
|
+
}
|
|
677
|
+
}).then((r) => {
|
|
678
|
+
console.log(`create ${name} component`, r);
|
|
679
|
+
});
|
|
680
|
+
};
|
|
681
|
+
var registerComponents = (strapi2, components) => {
|
|
682
|
+
components.forEach((component) => {
|
|
683
|
+
createComponent(strapi2, component);
|
|
684
|
+
});
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
// server/src/components/banner.ts
|
|
688
|
+
var component = {
|
|
689
|
+
name: "banner",
|
|
690
|
+
icon: "landscape",
|
|
691
|
+
displayName: "Banner",
|
|
692
|
+
attributes: {
|
|
693
|
+
title: {
|
|
694
|
+
type: "string"
|
|
695
|
+
},
|
|
696
|
+
subtitle: {
|
|
697
|
+
type: "string"
|
|
698
|
+
},
|
|
699
|
+
description: {
|
|
700
|
+
type: "string"
|
|
701
|
+
},
|
|
702
|
+
image: {
|
|
703
|
+
type: "media",
|
|
704
|
+
multiple: false,
|
|
705
|
+
required: true,
|
|
706
|
+
allowedTypes: ["images"]
|
|
707
|
+
},
|
|
708
|
+
mImage: {
|
|
709
|
+
type: "media",
|
|
710
|
+
multiple: false,
|
|
711
|
+
allowedTypes: ["images"]
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
};
|
|
715
|
+
var banner_default = component;
|
|
716
|
+
|
|
717
|
+
// server/src/components/logo.ts
|
|
718
|
+
var component2 = {
|
|
719
|
+
name: "logo",
|
|
720
|
+
icon: "picture",
|
|
721
|
+
displayName: "Logo",
|
|
722
|
+
attributes: {
|
|
723
|
+
main: {
|
|
724
|
+
type: "media",
|
|
725
|
+
multiple: false,
|
|
726
|
+
allowedTypes: ["images"]
|
|
727
|
+
},
|
|
728
|
+
sub: {
|
|
729
|
+
type: "media",
|
|
730
|
+
multiple: false,
|
|
731
|
+
allowedTypes: ["images"]
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
};
|
|
735
|
+
var logo_default = component2;
|
|
736
|
+
|
|
737
|
+
// server/src/components/social.ts
|
|
738
|
+
var component3 = {
|
|
739
|
+
name: "social",
|
|
740
|
+
icon: "paperPlane",
|
|
741
|
+
displayName: "Social",
|
|
742
|
+
attributes: {
|
|
743
|
+
type: {
|
|
744
|
+
type: "enumeration",
|
|
745
|
+
enum: ["url", "qrcode"]
|
|
746
|
+
},
|
|
747
|
+
url: {
|
|
748
|
+
type: "string",
|
|
749
|
+
conditions: {
|
|
750
|
+
visible: {
|
|
751
|
+
"==": [
|
|
752
|
+
{
|
|
753
|
+
var: "type"
|
|
754
|
+
},
|
|
755
|
+
"url"
|
|
756
|
+
]
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
},
|
|
760
|
+
qrcode: {
|
|
761
|
+
type: "media",
|
|
762
|
+
conditions: {
|
|
763
|
+
visible: {
|
|
764
|
+
"==": [
|
|
765
|
+
{
|
|
766
|
+
var: "type"
|
|
767
|
+
},
|
|
768
|
+
"qrcode"
|
|
769
|
+
]
|
|
770
|
+
}
|
|
771
|
+
},
|
|
772
|
+
multiple: false,
|
|
773
|
+
allowedTypes: ["images"]
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
};
|
|
777
|
+
var social_default = component3;
|
|
778
|
+
|
|
779
|
+
// server/src/components/video.ts
|
|
780
|
+
var component4 = {
|
|
781
|
+
name: "video",
|
|
782
|
+
icon: "play",
|
|
783
|
+
displayName: "Video",
|
|
784
|
+
attributes: {
|
|
785
|
+
url: {
|
|
786
|
+
type: "string",
|
|
787
|
+
required: true
|
|
788
|
+
},
|
|
789
|
+
title: {
|
|
790
|
+
type: "string"
|
|
791
|
+
},
|
|
792
|
+
image: {
|
|
793
|
+
type: "media",
|
|
794
|
+
multiple: false,
|
|
795
|
+
allowedTypes: ["images"]
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
};
|
|
799
|
+
var video_default = component4;
|
|
800
|
+
|
|
112
801
|
// server/src/register.ts
|
|
113
|
-
var register = ({ strapi }) => {
|
|
114
|
-
|
|
802
|
+
var register = ({ strapi: strapi2 }) => {
|
|
803
|
+
strapi2.log.info("website server plugin: register");
|
|
804
|
+
registerComponents(strapi2, [
|
|
805
|
+
banner_default,
|
|
806
|
+
social_default,
|
|
807
|
+
logo_default,
|
|
808
|
+
video_default
|
|
809
|
+
]);
|
|
810
|
+
strapi2.customFields.register([
|
|
811
|
+
{
|
|
812
|
+
name: "slugInput",
|
|
813
|
+
plugin: "website",
|
|
814
|
+
type: "string",
|
|
815
|
+
inputSize: {
|
|
816
|
+
default: 6,
|
|
817
|
+
isResizable: true
|
|
818
|
+
}
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
name: "dataNested",
|
|
822
|
+
plugin: "website",
|
|
823
|
+
type: "json",
|
|
824
|
+
inputSize: {
|
|
825
|
+
default: 12,
|
|
826
|
+
isResizable: false
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
name: "dataSelect",
|
|
831
|
+
plugin: "website",
|
|
832
|
+
type: "json",
|
|
833
|
+
inputSize: {
|
|
834
|
+
default: 12,
|
|
835
|
+
isResizable: false
|
|
836
|
+
}
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
name: "iconPicker",
|
|
840
|
+
plugin: "website",
|
|
841
|
+
type: "json",
|
|
842
|
+
inputSize: {
|
|
843
|
+
default: 4,
|
|
844
|
+
isResizable: true
|
|
845
|
+
}
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
name: "colorPicker",
|
|
849
|
+
plugin: "website",
|
|
850
|
+
type: "string",
|
|
851
|
+
inputSize: {
|
|
852
|
+
default: 4,
|
|
853
|
+
isResizable: true
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
]);
|
|
115
857
|
};
|
|
116
858
|
var register_default = register;
|
|
117
859
|
|
|
118
860
|
// server/src/routes/index.ts
|
|
119
|
-
var
|
|
861
|
+
var routes2 = {
|
|
120
862
|
admin: {
|
|
121
863
|
type: "admin",
|
|
122
864
|
routes: [
|
|
865
|
+
{
|
|
866
|
+
method: "POST",
|
|
867
|
+
path: "/fields/check-available",
|
|
868
|
+
handler: "fields.checkAvailable",
|
|
869
|
+
info: {}
|
|
870
|
+
},
|
|
123
871
|
{
|
|
124
872
|
method: "GET",
|
|
125
|
-
path: "/
|
|
873
|
+
path: "/hello",
|
|
126
874
|
handler: "website.hello",
|
|
127
875
|
config: { auth: false },
|
|
128
876
|
info: {}
|
|
129
877
|
},
|
|
130
878
|
{
|
|
131
879
|
method: "GET",
|
|
132
|
-
path: "/
|
|
880
|
+
path: "/refresh",
|
|
133
881
|
handler: "website.refresh",
|
|
134
882
|
config: {},
|
|
135
883
|
info: {}
|
|
136
884
|
},
|
|
137
885
|
{
|
|
138
886
|
method: "GET",
|
|
139
|
-
path: "/
|
|
887
|
+
path: "/dashboard",
|
|
140
888
|
handler: "website.dashboard",
|
|
141
889
|
config: {},
|
|
142
890
|
info: {}
|
|
@@ -186,26 +934,35 @@ var routes = {
|
|
|
186
934
|
]
|
|
187
935
|
}
|
|
188
936
|
};
|
|
189
|
-
var routes_default =
|
|
937
|
+
var routes_default = routes2;
|
|
190
938
|
|
|
191
939
|
// server/src/services/index.ts
|
|
192
|
-
var
|
|
193
|
-
var services_default =
|
|
940
|
+
var services2 = {};
|
|
941
|
+
var services_default = services2;
|
|
194
942
|
|
|
195
943
|
// server/src/index.ts
|
|
196
944
|
var plugin = {
|
|
197
945
|
register: register_default,
|
|
198
946
|
bootstrap: bootstrap_default,
|
|
199
947
|
destroy: destroy_default,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
948
|
+
config: config_default,
|
|
949
|
+
contentTypes: {
|
|
950
|
+
...contentTypes_default,
|
|
951
|
+
...api_default.contentTypes
|
|
952
|
+
},
|
|
953
|
+
controllers: {
|
|
954
|
+
...controllers_default,
|
|
955
|
+
...api_default.controllers
|
|
956
|
+
},
|
|
957
|
+
routes: {
|
|
958
|
+
...routes_default,
|
|
959
|
+
...api_default.routes
|
|
960
|
+
},
|
|
961
|
+
services: {
|
|
962
|
+
...services_default,
|
|
963
|
+
...api_default.services
|
|
964
|
+
},
|
|
204
965
|
policies: {},
|
|
205
|
-
middlewares: {}
|
|
206
|
-
config: {
|
|
207
|
-
default: {},
|
|
208
|
-
validator: () => {}
|
|
209
|
-
}
|
|
966
|
+
middlewares: {}
|
|
210
967
|
};
|
|
211
968
|
var src_default = plugin;
|