@communecter/cocolight-api-client 1.0.7 → 1.0.8

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.
@@ -1,4 +1,6 @@
1
1
  import { EntityMixin } from "./EntityMixin.js";
2
+ import { NewsMixin } from "./NewsMixin.js";
3
+ import { UtilMixin } from "./UtilMixin.js";
2
4
 
3
5
  // Organization.js
4
6
  export class Organization {
@@ -26,6 +28,10 @@ export class Organization {
26
28
  get id() {
27
29
  return this.#id;
28
30
  }
31
+
32
+ _id(newId) {
33
+ this.#id = newId;
34
+ }
29
35
 
30
36
  get slug() {
31
37
  return this.#slug;
@@ -64,16 +70,62 @@ export class Organization {
64
70
  *
65
71
  * @returns {Promise<Object>} Le profil complet.
66
72
  */
67
- async getProfile() {
73
+ async getProfil() {
68
74
  return this.apiClient.safeCall(async () => {
69
- const response = await this.getPublicProfile();
70
- this._setData(response.data);
71
- return response.data;
75
+ const data = await this.getPublicProfile();
76
+ this._setData(data);
77
+ return data;
72
78
  });
73
79
  }
74
80
 
81
+ /**
82
+ * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.
83
+ * Constant : GET_NEWS
84
+ * @param {Object} data - Les données à envoyer.
85
+ * @param {number} data.dateLimit - Limite de date timestamp ou 0 (default: 0)
86
+ * @param {object} data.search - data.search
87
+ * @param {string} data.search.name - Nom ou terme recherché (default: "")
88
+ * @param {number} data.indexStep - Nombre de résultats par page (default: 12)
89
+ * @returns {Promise<Object>} - Les données de réponse.
90
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
91
+ * @throws {Error} - En cas d'erreur inattendue.
92
+ */
93
+ async getNews(data = {}) {
94
+ data.pathParams = { type: this.getEntityType(), id: this.id };
95
+ return this._getNews(data);
96
+ }
97
+
98
+ /**
99
+ * Ajouter une actualité : Ajoute une nouvelle actualité.
100
+ * Constant : ADD_NEWS
101
+ * @param {Object} data - Les données à envoyer.
102
+ * @param {string} data.text - Contenu de l’actualité
103
+ * @param {string} data.scope - Portée de l'actualité (ex: public, privé...) (default: "public")
104
+ * @param {boolean} data.markdownActive - Markdown activé (true/false) (default: true)
105
+ * @param {string} data.type - Type de l'objet, toujours 'news'. (default: "news")
106
+ * @param {boolean} data.json - Indique que la réponse est au format JSON. (default: true)
107
+ * @param {array | string} data.tags - Tags : "" pour effacer tous les tags, ou tableau de mots-clés.
108
+ * @param {object} data.mediaImg - Optionnel. Informations sur les images associées à la news.
109
+ * @param {number} data.mediaImg.countImages - Nombre d'images.
110
+ * @param {Array<string>} data.mediaImg.images - Liste des identifiants ou chemins d'images.
111
+ * @param {object} data.mediaFile - Optionnel. Informations sur les fichiers associés à la news.
112
+ * @param {number} data.mediaFile.countFiles - Nombre de fichiers.
113
+ * @param {Array<string>} data.mediaFile.files - Liste des identifiants ou chemins de fichiers.
114
+ * @param {object} data.mentions - Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.
115
+ * @param {Object.<string, object>} data.mentions - Objet dont les clés keys matching ^[0-9]+$
116
+ * @returns {Promise<Object>} - Les données de réponse.
117
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
118
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
119
+ * @throws {Error} - En cas d'erreur inattendue.
120
+ */
121
+ async addNews(data = {}) {
122
+ data.parentId = this.id;
123
+ data.parentType = this.getEntityType();
124
+ return this.callIsConnected(() => this._addNews(data));
125
+ }
126
+
75
127
  }
76
128
 
77
129
  // Incorporation du mixin dans Organization
78
- Object.assign(Organization.prototype, EntityMixin);
130
+ Object.assign(Organization.prototype, EntityMixin, UtilMixin, NewsMixin);
79
131
 
@@ -1,4 +1,6 @@
1
1
  import { EntityMixin } from "./EntityMixin.js";
2
+ import { NewsMixin } from "./NewsMixin.js";
3
+ import { UtilMixin } from "./UtilMixin.js";
2
4
 
3
5
  // Project.js
4
6
  export class Project {
@@ -26,6 +28,10 @@ export class Project {
26
28
  get id() {
27
29
  return this.#id;
28
30
  }
31
+
32
+ _id(newId) {
33
+ this.#id = newId;
34
+ }
29
35
 
30
36
  get slug() {
31
37
  return this.#slug;
@@ -64,16 +70,62 @@ export class Project {
64
70
  *
65
71
  * @returns {Promise<Object>} Le profil complet.
66
72
  */
67
- async getProfile() {
73
+ async getProfil() {
68
74
  return this.apiClient.safeCall(async () => {
69
- const response = await this.getPublicProfile();
70
- this._setData(response.data);
71
- return response.data;
75
+ const data = await this.getPublicProfile();
76
+ this._setData(data);
77
+ return data;
72
78
  });
73
79
  }
80
+
81
+ /**
82
+ * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.
83
+ * Constant : GET_NEWS
84
+ * @param {Object} data - Les données à envoyer.
85
+ * @param {number} data.dateLimit - Limite de date timestamp ou 0 (default: 0)
86
+ * @param {object} data.search - data.search
87
+ * @param {string} data.search.name - Nom ou terme recherché (default: "")
88
+ * @param {number} data.indexStep - Nombre de résultats par page (default: 12)
89
+ * @returns {Promise<Object>} - Les données de réponse.
90
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
91
+ * @throws {Error} - En cas d'erreur inattendue.
92
+ */
93
+ async getNews(data = {}) {
94
+ data.pathParams = { type: this.getEntityType(), id: this.id };
95
+ return this._getNews(data);
96
+ }
97
+
98
+ /**
99
+ * Ajouter une actualité : Ajoute une nouvelle actualité.
100
+ * Constant : ADD_NEWS
101
+ * @param {Object} data - Les données à envoyer.
102
+ * @param {string} data.text - Contenu de l’actualité
103
+ * @param {string} data.scope - Portée de l'actualité (ex: public, privé...) (default: "public")
104
+ * @param {boolean} data.markdownActive - Markdown activé (true/false) (default: true)
105
+ * @param {string} data.type - Type de l'objet, toujours 'news'. (default: "news")
106
+ * @param {boolean} data.json - Indique que la réponse est au format JSON. (default: true)
107
+ * @param {array | string} data.tags - Tags : "" pour effacer tous les tags, ou tableau de mots-clés.
108
+ * @param {object} data.mediaImg - Optionnel. Informations sur les images associées à la news.
109
+ * @param {number} data.mediaImg.countImages - Nombre d'images.
110
+ * @param {Array<string>} data.mediaImg.images - Liste des identifiants ou chemins d'images.
111
+ * @param {object} data.mediaFile - Optionnel. Informations sur les fichiers associés à la news.
112
+ * @param {number} data.mediaFile.countFiles - Nombre de fichiers.
113
+ * @param {Array<string>} data.mediaFile.files - Liste des identifiants ou chemins de fichiers.
114
+ * @param {object} data.mentions - Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.
115
+ * @param {Object.<string, object>} data.mentions - Objet dont les clés keys matching ^[0-9]+$
116
+ * @returns {Promise<Object>} - Les données de réponse.
117
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
118
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
119
+ * @throws {Error} - En cas d'erreur inattendue.
120
+ */
121
+ async addNews(data = {}) {
122
+ data.parentId = this.id;
123
+ data.parentType = this.getEntityType();
124
+ return this.callIsConnected(() => this._addNews(data));
125
+ }
74
126
 
75
127
  }
76
128
 
77
129
  // Incorporation du mixin dans Project
78
- Object.assign(Project.prototype, EntityMixin);
130
+ Object.assign(Project.prototype, EntityMixin, UtilMixin, NewsMixin);
79
131
 
package/src/api/User.js CHANGED
@@ -1,4 +1,8 @@
1
+ import { ApiResponseError } from "../error.js";
1
2
  import { EntityMixin } from "./EntityMixin.js";
3
+ import { NewsMixin } from "./NewsMixin.js";
4
+ import { UserMixin } from "./UserMixin.js";
5
+ import { UtilMixin } from "./UtilMixin.js";
2
6
 
3
7
  // User.js
4
8
  export class User {
@@ -28,6 +32,10 @@ export class User {
28
32
  get id() {
29
33
  return this.#id;
30
34
  }
35
+
36
+ _id(newId) {
37
+ this.#id = newId;
38
+ }
31
39
 
32
40
  get slug() {
33
41
  return this.#slug;
@@ -70,20 +78,149 @@ export class User {
70
78
  *
71
79
  * @returns {Promise<Object>} Le profil complet.
72
80
  */
73
- async getProfile() {
81
+ async getProfil() {
74
82
  return this.apiClient.safeCall(async () => {
75
83
  if (this.isMe) {
76
- const response = await this.apiClient.callEndpoint("ME_INFO_URL", {});
77
- return response.data;
84
+ const data = await this._meInfoUrl();
85
+ return data;
78
86
  } else {
79
- const response = await this.getPublicProfile();
80
- return response.data;
87
+ const data = await this.getPublicProfile();
88
+ return data;
81
89
  }
82
90
  });
83
91
  }
92
+
93
+ /**
94
+ * Changer le mot de passe : Permet de changer le mot de passe d'un utilisateur.
95
+ * Constant : CHANGE_PASSWORD
96
+ */
97
+ async changePassword(data = {}) {
98
+ return this.callIsMe(() => this._changePassword(data));
99
+ }
100
+
101
+ /**
102
+ * Supprimer un compte : Permet de supprimer un compte utilisateur.
103
+ * Constant : DELETE_ACCOUNT
104
+ */
105
+ async delete(data = {}) {
106
+ return this.callIsMe(() => this._deleteAccount(data));
107
+ }
108
+
109
+ /**
110
+ * Mettre à jour les paramètres utilisateur : Mise à jour des paramètres spécifiques d'un utilisateur.
111
+ * Constant : UPDATE_SETTINGS
112
+ */
113
+ async updateSettings(data = {}) {
114
+ return this.callIsMe(() => this._updateSettings(data));
115
+ }
116
+
117
+ /**
118
+ * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.
119
+ * Constant : UPDATE_BLOCK_DESCRIPTION
120
+ */
121
+ async updateDescription(data = {}) {
122
+ return this.callIsMe(() => this._updateBlockDescription(data));
123
+ }
124
+
125
+ /**
126
+ * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).
127
+ * Constant : UPDATE_BLOCK_INFO
128
+ */
129
+ async updateInfo(data = {}) {
130
+ return this.callIsMe(() => this._updateBlockInfo(data));
131
+ }
132
+
133
+ /**
134
+ * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.
135
+ * Constant : UPDATE_BLOCK_SOCIAL
136
+ */
137
+ async updateSocial(data = {}) {
138
+ return this.callIsMe(() => this._updateBlockSocial(data));
139
+ }
84
140
 
141
+ /**
142
+ * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.
143
+ * Constant : UPDATE_BLOCK_LOCALITY
144
+ */
145
+ async updateLocality(data = {}) {
146
+ return this.callIsMe(() => this._updateBlockLocality(data));
147
+ }
148
+
149
+ /**
150
+ * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.
151
+ * Constant : UPDATE_BLOCK_SLUG
152
+ */
153
+ async updateSlug(slug) {
154
+ try {
155
+ await this._check({ slug });
156
+ } catch (error) {
157
+ if(error instanceof ApiResponseError) {
158
+ throw new ApiResponseError("Erreur lors de la vérification du slug.", error.status, error.data);
159
+ }
160
+ throw error;
161
+ }
162
+ return this.callIsMe(() => this._updateBlockSlug({ slug }));
163
+ }
164
+
165
+ /**
166
+ * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.
167
+ * Constant : PROFIL_IMAGE
168
+ */
169
+ async updateImageProfil(image) {
170
+ image = await this.validateImage(image);
171
+ return this.callIsMe(() => this._profilImage({ profil_avatar: image }));
172
+ }
173
+
174
+ /**
175
+ * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.
176
+ * Constant : GET_NEWS
177
+ */
178
+ async getNews(data = {}) {
179
+ if (data.pathParams) {
180
+ delete data.pathParams;
181
+ }
182
+ if (!this.isMe){
183
+ // is not me add id
184
+ data.pathParams = { id: this.id };
185
+ }
186
+ return this._getNews(data);
187
+ }
188
+
189
+ /**
190
+ * Ajouter une actualité : Ajoute une nouvelle actualité.
191
+ * Constant : ADD_NEWS
192
+ * @param {Object} data - Les données à envoyer.
193
+ * @param {string} data.text - Contenu de l’actualité
194
+ * @param {string} data.scope - Portée de l'actualité (ex: public, privé...) (default: "public")
195
+ * @param {boolean} data.markdownActive - Markdown activé (true/false) (default: true)
196
+ * @param {string} data.type - Type de l'objet, toujours 'news'. (default: "news")
197
+ * @param {boolean} data.json - Indique que la réponse est au format JSON. (default: true)
198
+ * @param {array | string} data.tags - Tags : "" pour effacer tous les tags, ou tableau de mots-clés.
199
+ * @param {object} data.mediaImg - Optionnel. Informations sur les images associées à la news.
200
+ * @param {number} data.mediaImg.countImages - Nombre d'images.
201
+ * @param {Array<string>} data.mediaImg.images - Liste des identifiants ou chemins d'images.
202
+ * @param {object} data.mediaFile - Optionnel. Informations sur les fichiers associés à la news.
203
+ * @param {number} data.mediaFile.countFiles - Nombre de fichiers.
204
+ * @param {Array<string>} data.mediaFile.files - Liste des identifiants ou chemins de fichiers.
205
+ * @param {object} data.mentions - Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.
206
+ * @param {Object.<string, object>} data.mentions - Objet dont les clés keys matching ^[0-9]+$
207
+ * @returns {Promise<Object>} - Les données de réponse.
208
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
209
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
210
+ * @throws {Error} - En cas d'erreur inattendue.
211
+ */
212
+ async addNews(data = {}) {
213
+ if (data.parentId) {
214
+ delete data.parentId;
215
+ }
216
+ if (data.parentType) {
217
+ delete data.parentType;
218
+ }
219
+ return this.callIsMe(() => this._addNews(data));
220
+ }
221
+
85
222
  }
86
223
 
87
- // Incorporation du mixin dans User
88
- Object.assign(User.prototype, EntityMixin);
224
+ // Incorporation des mixins dans User
225
+ Object.assign(User.prototype, EntityMixin, UtilMixin, UserMixin, NewsMixin);
89
226
 
@@ -0,0 +1,59 @@
1
+ // eslint-disable-next-line no-unused-vars
2
+ import { ApiResponseError } from "../error.js";
3
+
4
+ // UserMixin.js
5
+ export const UserMixin = {
6
+
7
+ /**
8
+ * Récupérer les informations utilisateur : Récupère les informations du profil utilisateur pour un token donné.
9
+ * Constant : ME_INFO_URL
10
+ * @returns {Promise<Object>} - Les données de réponse.
11
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
12
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
13
+ * @throws {Error} - En cas d'erreur inattendue.
14
+ */
15
+ async _meInfoUrl() {
16
+ return this.callIsConnected("ME_INFO_URL");
17
+ },
18
+
19
+ /**
20
+ * Changer le mot de passe : Permet de changer le mot de passe d'un utilisateur.
21
+ * Constant : CHANGE_PASSWORD
22
+ * @param {Object} data - Les données à envoyer.
23
+ * @param {string} data.oldPassword - Ancien mot de passe
24
+ * @param {string} data.newPassword - Nouveau mot de passe
25
+ * @param {string} data.newPassword2 - Confirmation du nouveau mot de passe
26
+ * @returns {Promise<Object>} - Les données de réponse.
27
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
28
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
29
+ * @throws {Error} - En cas d'erreur inattendue.
30
+ */
31
+ async _changePassword(data = {}) {
32
+ if(data.userId) {
33
+ delete data.userId;
34
+ }
35
+ if(data.mode) {
36
+ delete data.mode;
37
+ }
38
+ return this.callIsConnected("CHANGE_PASSWORD", data);
39
+ },
40
+
41
+ /**
42
+ * Supprimer un compte : Permet de supprimer un compte utilisateur.
43
+ * Constant : DELETE_ACCOUNT
44
+ * @param {Object} data - Les données à envoyer.
45
+ * @param {string} data.reason - Raison de la suppression (default: "")
46
+ * @returns {Promise<Object>} - Les données de réponse.
47
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
48
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
49
+ * @throws {Error} - En cas d'erreur inattendue.
50
+ */
51
+ async _deleteAccount(data = {}) {
52
+ if (data.pathParams) {
53
+ delete data.pathParams;
54
+ }
55
+ return this.callIsConnected("DELETE_ACCOUNT", data);
56
+ }
57
+
58
+ };
59
+
@@ -0,0 +1,82 @@
1
+ import { fileTypeFromBuffer } from "file-type";
2
+
3
+ import { ApiAuthenticationError, ApiValidationError } from "../error.js";
4
+
5
+ // UtilMixin.js
6
+ export const UtilMixin = {
7
+
8
+ async call(constant, data = {}) {
9
+ return this.apiClient.safeCall(async () => {
10
+ const response = await this.apiClient.callEndpoint(constant, data);
11
+ this.apiClient.checkAndThrowApiResponseError(response);
12
+ return response.data;
13
+ });
14
+ },
15
+
16
+ async callNoConnected(constant, data = {}) {
17
+ if(this.isConnected) {
18
+ throw new ApiAuthenticationError("Vous devez ne devez pas être connecté pour faire cette action.");
19
+ }
20
+ return this.call(constant, data);
21
+ },
22
+
23
+ async callIsConnected(param, data = {}) {
24
+ if(!this.isConnected) {
25
+ throw new ApiAuthenticationError("Vous devez être connecté pour faire cette action.");
26
+ }
27
+ // Si le premier paramètre est une fonction, on l'exécute en tant que callback
28
+ if (typeof param === "function") {
29
+ return await param();
30
+ }
31
+ return this.call(param, data);
32
+ },
33
+
34
+ async callIsMe(param, data = {}) {
35
+ if (!this.isMe) {
36
+ throw new ApiAuthenticationError("Vous devez être vous-même pour faire cette action.");
37
+ }
38
+ // Si le premier paramètre est une fonction, on l'exécute en tant que callback
39
+ if (typeof param === "function") {
40
+ return await param();
41
+ }
42
+ // Sinon, on considère qu'il s'agit d'un constant et on appelle la méthode par défaut
43
+ return await this.callIsConnected(param, data);
44
+ },
45
+
46
+ async validateImage(image) {
47
+ if (!image) {
48
+ throw new ApiValidationError("Le fichier est requis.");
49
+ }
50
+ let mimeType = "";
51
+
52
+ // Vérification en navigateur : File et Blob
53
+ if (typeof File !== "undefined" && image instanceof File) {
54
+ mimeType = image.type;
55
+ if (!mimeType || !mimeType.startsWith("image/") || !["image/jpg", "image/jpeg", "image/png"].includes(mimeType)) {
56
+ throw new ApiValidationError("Le fichier doit être une image valide.");
57
+ }
58
+ } else if (typeof Blob !== "undefined" && image instanceof Blob) {
59
+ mimeType = image.type;
60
+ // rajouter un name au blob avce timestamp et la bonne extension
61
+ const fileName = `${Date.now()}.${mimeType.split("/")[1]}`;
62
+ image = new File([image], fileName, { type: mimeType });
63
+ console.log(fileName);
64
+
65
+ if (!mimeType || !mimeType.startsWith("image/") || !["image/jpg", "image/jpeg", "image/png"].includes(mimeType)) {
66
+ throw new ApiValidationError("Le fichier doit être une image valide (jpg ou png).");
67
+ }
68
+ }
69
+ // Vérification en Node : image peut être un Buffer
70
+ else if (typeof Buffer !== "undefined" && Buffer.isBuffer(image)) {
71
+ const fileTypeResult = await fileTypeFromBuffer(image);
72
+ if (!fileTypeResult || !fileTypeResult.mime.startsWith("image/") || !["image/jpg", "image/jpeg", "image/png"].includes(fileTypeResult.mime)) {
73
+ throw new ApiValidationError("Le fichier doit être une image valide.");
74
+ }
75
+ mimeType = fileTypeResult.mime;
76
+ } else {
77
+ throw new ApiValidationError("Le fichier doit être de type File (navigateur) ou Buffer (Node).");
78
+ }
79
+ return image;
80
+ }
81
+ };
82
+