data-primals-engine 1.2.3 → 1.2.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.
Files changed (58) hide show
  1. package/CONTRIBUTING.md +91 -0
  2. package/README.md +50 -22
  3. package/client/src/App.jsx +0 -5
  4. package/client/src/App.scss +6 -0
  5. package/client/src/ConditionBuilder.scss +34 -1
  6. package/client/src/ConditionBuilder2.jsx +179 -53
  7. package/client/src/ContentView.jsx +0 -3
  8. package/client/src/CronBuilder.jsx +0 -1
  9. package/client/src/CronPartBuilder.jsx +0 -2
  10. package/client/src/DashboardView.jsx +0 -5
  11. package/client/src/DataEditor.jsx +8 -10
  12. package/client/src/DataImporter.jsx +469 -0
  13. package/client/src/DataLayout.jsx +0 -1
  14. package/client/src/DataTable.jsx +2 -368
  15. package/client/src/DataTable.scss +18 -1
  16. package/client/src/Field.jsx +85 -48
  17. package/client/src/FlexBuilder.jsx +1 -1
  18. package/client/src/ModelCreator.jsx +29 -25
  19. package/client/src/ModelCreator.scss +13 -0
  20. package/client/src/ModelCreatorField.jsx +1 -5
  21. package/client/src/RTE.jsx +1 -6
  22. package/client/src/RTETrans.jsx +0 -2
  23. package/client/src/RelationField.jsx +1 -1
  24. package/client/src/RelationValue.jsx +1 -2
  25. package/client/src/TourSpotlight.jsx +0 -2
  26. package/client/src/filter.js +87 -0
  27. package/client/src/hooks/data.js +1 -3
  28. package/client/src/hooks/useTutorials.jsx +0 -1
  29. package/client/src/translations.js +60 -26
  30. package/package.json +4 -3
  31. package/server.js +2 -2
  32. package/src/data.js +8 -0
  33. package/src/email.js +2 -2
  34. package/src/engine.js +59 -20
  35. package/src/index.js +1 -1
  36. package/src/middlewares/middleware-mongodb.js +0 -1
  37. package/src/modules/assistant.js +1 -3
  38. package/src/modules/bucket.js +3 -4
  39. package/src/modules/data/data.core.js +17 -0
  40. package/src/modules/{data.js → data/data.js} +4595 -5991
  41. package/src/modules/data/data.routes.js +1637 -0
  42. package/src/modules/data/index.js +1 -0
  43. package/src/modules/file.js +1 -1
  44. package/src/modules/mongodb.js +0 -1
  45. package/src/modules/user.js +1 -1
  46. package/src/modules/workflow.js +38 -38
  47. package/src/packs.js +4 -1
  48. package/test/data.backup.integration.test.js +4 -5
  49. package/test/data.integration.test.js +2 -6
  50. package/test/events.test.js +1 -1
  51. package/test/file.test.js +1 -4
  52. package/test/import_export.integration.test.js +22 -15
  53. package/test/model.integration.test.js +8 -10
  54. package/test/user.test.js +2 -2
  55. package/test/vm.test.js +1 -1
  56. package/test/workflow.integration.test.js +17 -14
  57. package/test/workflow.robustness.test.js +15 -10
  58. package/src/modules/test +0 -147
package/src/modules/test DELETED
@@ -1,147 +0,0 @@
1
- // src/modules/file.js
2
- import { getCollection } from "./mongodb.js";
3
- import { uuidv4, getFileExtension } from "../core.js";
4
- import { getUserS3Config, uploadToS3, deleteFromS3 } from "./bucket.js";
5
- import { maxFileSize } from "../constants.js";
6
- import path from "node:path";
7
- import fs from "node:fs";
8
- import { promises as fsPromises } from "node:fs";
9
- import { Logger } from "../gameObject.js";
10
-
11
- let logger;
12
-
13
- const getLogger = () => {
14
- if (!logger) {
15
- logger = new Logger();
16
- }
17
- return logger;
18
- };
19
-
20
- /**
21
- * Ajoute un fichier au système. Le téléverse sur S3 si configuré, sinon le sauvegarde localement.
22
- * @param {object} file - L'objet fichier provenant de express-formidable.
23
- * @param {object} user - L'objet utilisateur.
24
- * @returns {Promise<string>} Le GUID du fichier nouvellement ajouté.
25
- */
26
- export const addFile = async (file, user) => {
27
- if (!file) {
28
- throw new Error("Aucun fichier fourni.");
29
- }
30
- if (file.size > maxFileSize) {
31
- throw new Error(`La taille du fichier dépasse la limite de ${maxFileSize / 1024 / 1024} Mo.`);
32
- }
33
-
34
- const guid = uuidv4();
35
- const extension = getFileExtension(file.name);
36
- const newFilename = `${guid}.${extension}`;
37
- const s3Config = await getUserS3Config(user);
38
-
39
- const fileData = {
40
- _id: guid,
41
- guid: guid,
42
- originalFilename: file.name,
43
- size: file.size,
44
- mimetype: file.type,
45
- createdAt: new Date(),
46
- user: user.username // Bonne pratique : garder une trace de l'uploader
47
- };
48
-
49
- if (s3Config && s3Config.bucketName) { // Correction: bucketName au lieu de bucket
50
- try {
51
- // Correction: Appel manquant à la fonction de téléversement
52
- await uploadToS3(s3Config, file.path, newFilename);
53
-
54
- fileData.storage = 's3';
55
- fileData.filename = newFilename; // Le nom sur S3
56
- getLogger().log(`Fichier ${newFilename} téléversé sur le bucket S3 ${s3Config.bucketName}.`);
57
- } catch (error) {
58
- getLogger().log(`Le téléversement S3 a échoué pour ${file.name}: ${error.message}`, 'error');
59
- throw new Error("Le téléversement S3 a échoué.");
60
- } finally {
61
- // Nettoyer le fichier temporaire uploadé par express-formidable
62
- await fsPromises.unlink(file.path).catch(e => getLogger().log(`Échec de la suppression du fichier temporaire ${file.path}: ${e.message}`, 'error'));
63
- }
64
- } else {
65
- // Sauvegarde locale
66
- const uploadDir = path.join(process.cwd(), "uploads");
67
- if (!fs.existsSync(uploadDir)) {
68
- fs.mkdirSync(uploadDir, { recursive: true });
69
- }
70
- const newPath = path.join(uploadDir, newFilename);
71
-
72
- try {
73
- // express-formidable place déjà le fichier dans un répertoire temporaire. Nous n'avons qu'éplacer.
74
- await fsPromises.rename(file.path, newPath);
75
- fileData.storage = 'local';
76
- fileData.filename = newFilename; // Le nom dans le dossier uploads
77
- fileData.path = newPath; // Le chemin complet pour les fichiers locaux
78
- getLogger().log(`Fichier ${newFilename} sauvegardé localement dans ${newPath}.`);
79
- } catch (error) {
80
- getLogger().log(`Le déplacement du fichier local a échoué pour ${file.name}: ${error.message}`, 'error');
81
- // Essayer de nettoyer le fichier temporaire même si le renommage échoue
82
- await fsPromises.unlink(file.path).catch(e => getLogger().log(`Échec de la suppression du fichier temporaire ${file.path}: ${e.message}`, 'error'));
83
- throw new Error("Le stockage du fichier local a échoué.");
84
- }
85
- }
86
-
87
- const filesCollection = await getCollection("files");
88
- await filesCollection.insertOne(fileData);
89
-
90
- return guid;
91
- };
92
-
93
- /**
94
- * Récupère les métadonnées d'un fichier depuis la base de données.
95
- * @param {string} guid - Le GUID du fichier.
96
- * @returns {Promise<object|null>} L'objet de métadonnées du fichier ou null si non trouvé.
97
- */
98
- export const getFile = async (guid) => {
99
- const filesCollection = await getCollection("files");
100
- return await filesCollection.findOne({ guid });
101
- };
102
-
103
- /**
104
- * Supprime un fichier du système (S3 ou local) et son enregistrement en base de données.
105
- * @param {string} guid - Le GUID du fichier à supprimer.
106
- * @param {object} user - L'objet utilisateur.
107
- * @returns {Promise<void>}
108
- */
109
- export const deleteFile = async (guid, user) => {
110
- const fileData = await getFile(guid);
111
- if (!fileData) {
112
- getLogger().log(`Tentative de suppression d'un fichier inexistant avec le GUID : ${guid}`, 'warn');
113
- return;
114
- }
115
-
116
- if (fileData.storage === 's3') {
117
- const s3Config = await getUserS3Config(user);
118
- if (s3Config && s3Config.bucketName) { // Correction: bucketName au lieu de bucket
119
- try {
120
- await deleteFromS3(s3Config, fileData.filename);
121
- getLogger().log(`Fichier ${fileData.filename} supprimé du bucket S3 ${s3Config.bucketName}.`);
122
- } catch (error) {
123
- getLogger().log(`La suppression S3 a échoué pour ${fileData.filename}: ${error.message}`, 'error');
124
- throw new Error("La suppression S3 a échoué.");
125
- }
126
- } else {
127
- getLogger().log(`Configuration S3 non trouvée pour l'utilisateur, impossible de supprimer le fichier ${fileData.filename} de S3.`, 'error');
128
- throw new Error("Configuration S3 non trouvée, impossible de supprimer le fichier.");
129
- }
130
- } else if (fileData.storage === 'local') {
131
- try {
132
- if (fileData.path && fs.existsSync(fileData.path)) {
133
- await fsPromises.unlink(fileData.path);
134
- getLogger().log(`Fichier local ${fileData.path} supprimé.`);
135
- } else {
136
- getLogger().log(`Fichier local non trouvé au chemin ${fileData.path}, mais suppression de l'enregistrement en BDD.`, 'warn');
137
- }
138
- } catch (error) {
139
- getLogger().log(`La suppression du fichier local a échoué pour ${fileData.path}: ${error.message}`, 'error');
140
- throw new Error("La suppression du fichier local a échoué.");
141
- }
142
- }
143
-
144
- const filesCollection = await getCollection("files");
145
- await filesCollection.deleteOne({ guid });
146
- getLogger().log(`Enregistrement du fichier ${guid} supprimé de la base de données.`);
147
- };