Skip to content

Commit f208a04

Browse files
Merge pull request #564 from ansforge/feature/refused-ack-error-message
feat(lrm): envoi d'un message d'erreur associé à l'acquittement refused
2 parents b63724a + 2de7f5d commit f208a04

3 files changed

Lines changed: 104 additions & 43 deletions

File tree

web/lrm/client/components/ReceivedMessage.vue

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ import { useMainStore } from '~/store';
132132
import { useAuthStore } from '@/store/auth';
133133
import {
134134
buildAck,
135+
buildError,
135136
sendMessage,
136137
INTERNAL_HUB_USER,
137138
getMessageType,
@@ -213,13 +214,32 @@ const sendAck = (refused = false) => {
213214
const distributionID = props.body.distributionID;
214215
const senderID = props.body.senderID;
215216
216-
if (getMessageType({ body: props.body }) !== 'message') return;
217-
217+
if (getMessageType({ body: props.body }) !== 'message') {
218+
return;
219+
}
218220
if (senderID.includes(INTERNAL_HUB_USER)) {
219221
consola.warn(`Ack not sent: ${INTERNAL_HUB_USER} is not a valid client`);
220222
return;
221223
}
222-
const msg = buildAck({ distributionID, senderID, refused });
224+
225+
let errorDistributionID = null;
226+
227+
if (refused) {
228+
const errorMsg = buildError({
229+
distributionID,
230+
senderID,
231+
sourceMessage: props.body,
232+
});
233+
sendMessage(errorMsg, props.vhost);
234+
errorDistributionID = errorMsg.distributionID;
235+
}
236+
237+
const msg = buildAck({
238+
distributionID,
239+
senderID,
240+
refused,
241+
errorDistributionID,
242+
});
223243
sendMessage(msg, props.vhost);
224244
isAcked.value = true;
225245
} catch (error) {
@@ -252,6 +272,7 @@ export default {
252272
},
253273
};
254274
</script>
275+
255276
<style lang="scss">
256277
// Ref.: https://github.com/chenfengjw163/vue-json-viewer/tree/master#theming
257278
// values are default one from jv-light template

web/lrm/client/composables/messageUtils.js

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import moment from 'moment/moment';
22
import { v4 as uuidv4 } from 'uuid';
33
import { consola } from 'consola';
44
import { clientInfos } from './userUtils';
5-
import { EDXL_ENVELOPE, DIRECTIONS } from '@/constants';
5+
import { EDXL_ENVELOPE, DIRECTIONS, RC_DE } from '@/constants';
66
import { useMainStore } from '~/store';
77
import { useAuthStore } from '~/store/auth';
88

@@ -126,18 +126,46 @@ export function setCaseId(message, caseId, localCaseId) {
126126
}
127127
}
128128

129-
export function buildAck({ distributionID, senderID, refused = false }) {
129+
export function buildAck({
130+
distributionID,
131+
senderID,
132+
refused = false,
133+
errorDistributionID = null,
134+
}) {
130135
return buildMessage(
131-
{ reference: { distributionID, ...(refused && { refused }) } },
136+
{
137+
reference: {
138+
distributionID,
139+
...(refused && { refused }),
140+
...(errorDistributionID && {
141+
errorDistributionID,
142+
}),
143+
},
144+
},
132145
{ distributionKind: 'Ack', recipientId: senderID }
133146
);
134147
}
135148

149+
export function buildError({ distributionID, senderID, sourceMessage }) {
150+
return buildMessage(
151+
{
152+
error: {
153+
errorCode: { statusCode: 501, statusString: 'UNROUTABLE_MESSAGE' },
154+
errorCause: 'This message was rejected by the recipient.',
155+
sourceMessage,
156+
referencedDistributionID: distributionID,
157+
},
158+
},
159+
{ distributionKind: 'Error', recipientId: senderID, includeRCDE: false }
160+
);
161+
}
162+
136163
export function buildMessage(
137164
innerMessage,
138-
{ distributionKind, recipientId } = {
165+
{ distributionKind, recipientId, includeRCDE = true } = {
139166
distributionKind: 'Report',
140167
recipientId: null,
168+
includeRCDE: true,
141169
}
142170
) {
143171
// InnerMessage should only have one key, as we do not support multiple use cases in the same message.
@@ -154,34 +182,43 @@ export function buildMessage(
154182
} else {
155183
message.descriptor.keyword[0].value = useCase;
156184
}
185+
157186
const formattedInnerMessage = formatIdsInMessage(innerMessage);
158-
message.content[0].jsonContent.embeddedJsonContent.message = {
159-
...message.content[0].jsonContent.embeddedJsonContent.message,
160-
...formattedInnerMessage,
161-
};
162-
const name = clientInfos().name;
163187
const targetId = recipientId ?? authStore.user.targetId;
164188
const sentAt = moment().format();
165189
message.distributionID = `${authStore.user.clientId}_${uuidv4()}`;
166190
message.distributionKind = distributionKind;
167191
message.senderID = authStore.user.clientId;
168192
message.dateTimeSent = sentAt;
169193
message.descriptor.explicitAddress.explicitAddressValue = targetId;
170-
message.content[0].jsonContent.embeddedJsonContent.message.messageId =
171-
message.distributionID;
172-
message.content[0].jsonContent.embeddedJsonContent.message.kind =
173-
message.distributionKind;
174-
message.content[0].jsonContent.embeddedJsonContent.message.sender = {
175-
name,
176-
URI: `hubex:${authStore.user.clientId}`,
177-
};
178-
message.content[0].jsonContent.embeddedJsonContent.message.sentAt = sentAt;
179-
message.content[0].jsonContent.embeddedJsonContent.message.recipient = [
180-
{
181-
name: clientInfos(targetId).name,
182-
URI: `hubex:${targetId}`,
183-
},
184-
];
194+
195+
if (includeRCDE) {
196+
const name = clientInfos().name;
197+
message.content[0].jsonContent.embeddedJsonContent.message = {
198+
...message.content[0].jsonContent.embeddedJsonContent.message,
199+
...RC_DE,
200+
...formattedInnerMessage,
201+
messageId: message.distributionID,
202+
kind: message.distributionKind,
203+
sender: {
204+
name,
205+
URI: `hubex:${authStore.user.clientId}`,
206+
},
207+
sentAt,
208+
recipient: [
209+
{
210+
name: clientInfos(targetId).name,
211+
URI: `hubex:${targetId}`,
212+
},
213+
],
214+
};
215+
} else {
216+
message.content[0].jsonContent.embeddedJsonContent.message = {
217+
...message.content[0].jsonContent.embeddedJsonContent.message,
218+
...formattedInnerMessage,
219+
};
220+
}
221+
185222
return trimEmptyValues(message);
186223
}
187224

web/lrm/client/constants.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,29 @@ export const EDXL_ENVELOPE = {
2727
{
2828
jsonContent: {
2929
embeddedJsonContent: {
30-
message: {
31-
messageId: '{{ 2608323d-507d-4cbf-bf74-52007f8124ea }}',
32-
sender: {
33-
name: '{{ samuA }}',
34-
URI: '{{ hubsante:fr.health.test.samuA }}',
35-
},
36-
sentAt: '{{ 2022-09-27T08:23:34+02:00 }}',
37-
status: 'Actual',
38-
kind: '{{ Report }}',
39-
recipient: [
40-
{
41-
name: '{{ samuB }}',
42-
URI: '{{ hubsante:fr.health.test.samuB }}',
43-
},
44-
],
45-
},
30+
message: {},
4631
},
4732
},
4833
},
4934
],
5035
};
36+
37+
export const RC_DE = {
38+
messageId: '{{ 2608323d-507d-4cbf-bf74-52007f8124ea }}',
39+
sender: {
40+
name: '{{ samuA }}',
41+
URI: '{{ hubsante:fr.health.test.samuA }}',
42+
},
43+
sentAt: '{{ 2022-09-27T08:23:34+02:00 }}',
44+
status: 'Actual',
45+
kind: '{{ Report }}',
46+
recipient: [
47+
{
48+
name: '{{ samuB }}',
49+
URI: '{{ hubsante:fr.health.test.samuB }}',
50+
},
51+
],
52+
};
53+
5154
export const REPOSITORY_URL =
5255
'https://raw.githubusercontent.com/ansforge/SAMU-Hub-Modeles/';

0 commit comments

Comments
 (0)