@geekron/strapi 0.1.2 → 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 +844 -32
- package/dist/server/index.mjs +845 -32
- package/package.json +22 -11
package/dist/server/index.js
CHANGED
|
@@ -33,55 +33,858 @@ __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
|
+
};
|
|
528
|
+
|
|
529
|
+
// server/src/controllers/inquiries.ts
|
|
530
|
+
var list = async (ctx) => {
|
|
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
|
+
}
|
|
554
|
+
};
|
|
555
|
+
var detail = async (ctx) => {
|
|
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
|
+
}
|
|
562
|
+
};
|
|
563
|
+
var read = async (ctx) => {
|
|
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
|
+
}
|
|
578
|
+
};
|
|
579
|
+
var inquiries = {
|
|
580
|
+
list,
|
|
581
|
+
detail,
|
|
582
|
+
read
|
|
583
|
+
};
|
|
584
|
+
var inquiries_default = inquiries;
|
|
585
|
+
|
|
586
|
+
// server/src/controllers/visitors.ts
|
|
587
|
+
var pageViews = async (ctx) => {
|
|
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
|
+
}
|
|
596
|
+
};
|
|
597
|
+
var sessions = async (ctx) => {
|
|
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
|
+
}
|
|
606
|
+
};
|
|
607
|
+
var dailyPageStats = async (ctx) => {
|
|
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
|
+
}
|
|
616
|
+
};
|
|
617
|
+
var visitors = {
|
|
618
|
+
pageViews,
|
|
619
|
+
sessions,
|
|
620
|
+
dailyPageStats
|
|
621
|
+
};
|
|
622
|
+
var visitors_default = visitors;
|
|
623
|
+
|
|
624
|
+
// server/src/controllers/website.ts
|
|
625
|
+
var hello = async () => {
|
|
626
|
+
return { message: "hello world" };
|
|
627
|
+
};
|
|
628
|
+
var refresh = async (ctx) => {
|
|
629
|
+
try {
|
|
630
|
+
return await fetchWebsite("/api/site/refresh");
|
|
631
|
+
} catch (error) {
|
|
632
|
+
return handleError(ctx, error, "Failed to refresh website cache");
|
|
633
|
+
}
|
|
634
|
+
};
|
|
635
|
+
var dashboard = async (ctx) => {
|
|
636
|
+
try {
|
|
637
|
+
return await fetchWebsite("/api/common/dashboard");
|
|
638
|
+
} catch (error) {
|
|
639
|
+
return handleError(ctx, error, "Failed to fetch dashboard stats");
|
|
640
|
+
}
|
|
641
|
+
};
|
|
642
|
+
var website = {
|
|
643
|
+
hello,
|
|
644
|
+
refresh,
|
|
645
|
+
dashboard
|
|
646
|
+
};
|
|
647
|
+
var website_default = website;
|
|
46
648
|
|
|
47
649
|
// server/src/controllers/index.ts
|
|
48
|
-
var
|
|
49
|
-
|
|
650
|
+
var controllers2 = {
|
|
651
|
+
website: website_default,
|
|
652
|
+
visitors: visitors_default,
|
|
653
|
+
inquiries: inquiries_default,
|
|
654
|
+
fields: fields_default
|
|
655
|
+
};
|
|
656
|
+
var controllers_default = controllers2;
|
|
50
657
|
|
|
51
658
|
// server/src/destroy.ts
|
|
52
|
-
var destroy = ({ strapi }) => {
|
|
53
|
-
|
|
659
|
+
var destroy = ({ strapi: strapi2 }) => {
|
|
660
|
+
strapi2.log.info("dashboard server plugin: bootstrap");
|
|
54
661
|
};
|
|
55
662
|
var destroy_default = destroy;
|
|
56
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
|
+
|
|
57
801
|
// server/src/register.ts
|
|
58
|
-
var register = ({ strapi }) => {
|
|
59
|
-
|
|
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
|
+
]);
|
|
60
857
|
};
|
|
61
858
|
var register_default = register;
|
|
62
859
|
|
|
63
860
|
// server/src/routes/index.ts
|
|
64
|
-
var
|
|
861
|
+
var routes2 = {
|
|
65
862
|
admin: {
|
|
66
863
|
type: "admin",
|
|
67
864
|
routes: [
|
|
865
|
+
{
|
|
866
|
+
method: "POST",
|
|
867
|
+
path: "/fields/check-available",
|
|
868
|
+
handler: "fields.checkAvailable",
|
|
869
|
+
info: {}
|
|
870
|
+
},
|
|
68
871
|
{
|
|
69
872
|
method: "GET",
|
|
70
|
-
path: "/
|
|
873
|
+
path: "/hello",
|
|
71
874
|
handler: "website.hello",
|
|
72
875
|
config: { auth: false },
|
|
73
876
|
info: {}
|
|
74
877
|
},
|
|
75
878
|
{
|
|
76
879
|
method: "GET",
|
|
77
|
-
path: "/
|
|
880
|
+
path: "/refresh",
|
|
78
881
|
handler: "website.refresh",
|
|
79
882
|
config: {},
|
|
80
883
|
info: {}
|
|
81
884
|
},
|
|
82
885
|
{
|
|
83
886
|
method: "GET",
|
|
84
|
-
path: "/
|
|
887
|
+
path: "/dashboard",
|
|
85
888
|
handler: "website.dashboard",
|
|
86
889
|
config: {},
|
|
87
890
|
info: {}
|
|
@@ -89,68 +892,77 @@ var routes = {
|
|
|
89
892
|
{
|
|
90
893
|
method: "GET",
|
|
91
894
|
path: "/inquiries",
|
|
92
|
-
handler: "
|
|
895
|
+
handler: "inquiries.list",
|
|
93
896
|
config: {},
|
|
94
897
|
info: {}
|
|
95
898
|
},
|
|
96
899
|
{
|
|
97
900
|
method: "GET",
|
|
98
901
|
path: "/inquiries/:id",
|
|
99
|
-
handler: "
|
|
902
|
+
handler: "inquiries.detail",
|
|
100
903
|
config: {},
|
|
101
904
|
info: {}
|
|
102
905
|
},
|
|
103
906
|
{
|
|
104
907
|
method: "PUT",
|
|
105
908
|
path: "/inquiries/:id/read",
|
|
106
|
-
handler: "
|
|
909
|
+
handler: "inquiries.read",
|
|
107
910
|
config: {},
|
|
108
911
|
info: {}
|
|
109
912
|
},
|
|
110
913
|
{
|
|
111
914
|
method: "GET",
|
|
112
915
|
path: "/visitors/page-views",
|
|
113
|
-
handler: "
|
|
916
|
+
handler: "visitors.pageViews",
|
|
114
917
|
config: {},
|
|
115
918
|
info: {}
|
|
116
919
|
},
|
|
117
920
|
{
|
|
118
921
|
method: "GET",
|
|
119
922
|
path: "/visitors/sessions",
|
|
120
|
-
handler: "
|
|
923
|
+
handler: "visitors.sessions",
|
|
121
924
|
config: {},
|
|
122
925
|
info: {}
|
|
123
926
|
},
|
|
124
927
|
{
|
|
125
928
|
method: "GET",
|
|
126
929
|
path: "/visitors/stats/daily-page",
|
|
127
|
-
handler: "
|
|
930
|
+
handler: "visitors.dailyPageStats",
|
|
128
931
|
config: {},
|
|
129
932
|
info: {}
|
|
130
933
|
}
|
|
131
934
|
]
|
|
132
935
|
}
|
|
133
936
|
};
|
|
134
|
-
var routes_default =
|
|
937
|
+
var routes_default = routes2;
|
|
135
938
|
|
|
136
939
|
// server/src/services/index.ts
|
|
137
|
-
var
|
|
138
|
-
var services_default =
|
|
940
|
+
var services2 = {};
|
|
941
|
+
var services_default = services2;
|
|
139
942
|
|
|
140
943
|
// server/src/index.ts
|
|
141
944
|
var plugin = {
|
|
142
945
|
register: register_default,
|
|
143
946
|
bootstrap: bootstrap_default,
|
|
144
947
|
destroy: destroy_default,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
+
},
|
|
149
965
|
policies: {},
|
|
150
|
-
middlewares: {}
|
|
151
|
-
config: {
|
|
152
|
-
default: {},
|
|
153
|
-
validator: () => {}
|
|
154
|
-
}
|
|
966
|
+
middlewares: {}
|
|
155
967
|
};
|
|
156
968
|
var src_default = plugin;
|