diff --git a/client/src/api/attachments.js b/client/src/api/attachments.js index 7b5fc25c..f3edba43 100755 --- a/client/src/api/attachments.js +++ b/client/src/api/attachments.js @@ -10,8 +10,8 @@ export const transformAttachment = (attachment) => ({ /* Actions */ -const createAttachment = (cardId, data, headers) => - http.post(`/cards/${cardId}/attachments`, data, headers).then((body) => ({ +const createAttachment = (cardId, data, requestId, headers) => + http.post(`/cards/${cardId}/attachments?requestId=${requestId}`, data, headers).then((body) => ({ ...body, item: transformAttachment(body.item), })); diff --git a/client/src/sagas/app/requests/attachment.js b/client/src/sagas/app/requests/attachment.js index 579eca9b..00efa6de 100644 --- a/client/src/sagas/app/requests/attachment.js +++ b/client/src/sagas/app/requests/attachment.js @@ -23,7 +23,7 @@ export function* createAttachmentRequest(cardId, localId, data) { ); try { - const { item } = yield call(request, api.createAttachment, cardId, data); + const { item } = yield call(request, api.createAttachment, cardId, data, localId); const action = createAttachmentSucceeded(localId, item); yield put(action); diff --git a/client/src/sagas/app/services/socket.js b/client/src/sagas/app/services/socket.js index 539ac722..b770d966 100644 --- a/client/src/sagas/app/services/socket.js +++ b/client/src/sagas/app/services/socket.js @@ -5,6 +5,7 @@ import { logoutService } from './login'; import { closeModalService } from './modal'; import { deleteNotificationsRequest, fetchUsersRequest } from '../requests'; import { + attachmentWithIdExistsSelector, currentModalSelector, currentUserIdSelector, currentUserSelector, @@ -208,8 +209,12 @@ export function* deleteTaskReceivedService(task) { yield put(deleteTaskReceived(task)); } -export function* createAttachmentReceivedService(attachment) { - yield put(createAttachmentReceived(attachment)); +export function* createAttachmentReceivedService(attachment, requestId) { + const exists = yield select(attachmentWithIdExistsSelector, requestId); + + if (!exists) { + yield put(createAttachmentReceived(attachment)); + } } export function* updateAttachmentReceivedService(attachment) { diff --git a/client/src/sagas/app/watchers/socket.js b/client/src/sagas/app/watchers/socket.js index a2ff2712..70e43cb6 100644 --- a/client/src/sagas/app/watchers/socket.js +++ b/client/src/sagas/app/watchers/socket.js @@ -156,8 +156,8 @@ const createSocketEventsChannel = () => emit([deleteTaskReceivedService, item]); }; - const handleAttachmentCreate = api.makeHandleAttachmentCreate(({ item }) => { - emit([createAttachmentReceivedService, item]); + const handleAttachmentCreate = api.makeHandleAttachmentCreate(({ item, requestId }) => { + emit([createAttachmentReceivedService, item, requestId]); }); const handleAttachmentUpdate = api.makeHandleAttachmentUpdate(({ item }) => { diff --git a/client/src/selectors/boolean.js b/client/src/selectors/boolean.js new file mode 100644 index 00000000..469a545a --- /dev/null +++ b/client/src/selectors/boolean.js @@ -0,0 +1,11 @@ +import { createSelector } from 'redux-orm'; + +import orm from '../orm'; + +// eslint-disable-next-line import/prefer-default-export +export const attachmentWithIdExistsSelector = () => + createSelector( + orm, + (_, id) => id, + ({ Attachment }, id) => Attachment.idExists(id), + ); diff --git a/client/src/selectors/index.js b/client/src/selectors/index.js index 437ae90e..0de296b2 100755 --- a/client/src/selectors/index.js +++ b/client/src/selectors/index.js @@ -3,4 +3,5 @@ export * from './all'; export * from './path'; export * from './current'; export * from './by-id'; +export * from './boolean'; export * from './next-position'; diff --git a/server/api/controllers/attachments/create.js b/server/api/controllers/attachments/create.js index 90895841..6ab255a0 100644 --- a/server/api/controllers/attachments/create.js +++ b/server/api/controllers/attachments/create.js @@ -11,6 +11,10 @@ module.exports = { regex: /^[0-9]+$/, required: true, }, + requestId: { + type: 'string', + isNotEmptyString: true, + }, }, exits: { @@ -58,6 +62,7 @@ module.exports = { isImage: file.extra.isImage, name: file.filename, }, + inputs.requestId, this.req, ); diff --git a/server/api/helpers/create-attachment.js b/server/api/helpers/create-attachment.js index 1ed9b2ba..515f3496 100644 --- a/server/api/helpers/create-attachment.js +++ b/server/api/helpers/create-attachment.js @@ -12,6 +12,12 @@ module.exports = { type: 'json', required: true, }, + requestId: { + type: 'string', + isNotEmptyString: true, + allowNull: true, + defaultsTo: null, + }, request: { type: 'ref', }, @@ -29,6 +35,7 @@ module.exports = { 'attachmentCreate', { item: attachment, + requestId: inputs.requestId, }, inputs.request, );