2021-06-24 01:05:22 +05:00
|
|
|
import { call, put, select } from 'redux-saga/effects';
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
import { goToProject } from './router';
|
2021-06-24 01:05:22 +05:00
|
|
|
import request from '../request';
|
2022-08-04 13:31:14 +02:00
|
|
|
import requests from '../requests';
|
|
|
|
import selectors from '../../../selectors';
|
|
|
|
import actions from '../../../actions';
|
2021-06-24 01:05:22 +05:00
|
|
|
import api from '../../../api';
|
|
|
|
import { createLocalId } from '../../../utils/local-id';
|
|
|
|
import mergeRecords from '../../../utils/merge-records';
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
export function* createBoardMembership(boardId, data) {
|
2021-06-24 01:05:22 +05:00
|
|
|
const localId = yield call(createLocalId);
|
|
|
|
|
|
|
|
yield put(
|
2022-08-04 13:31:14 +02:00
|
|
|
actions.createBoardMembership({
|
2021-06-24 01:05:22 +05:00
|
|
|
...data,
|
|
|
|
boardId,
|
|
|
|
id: localId,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
|
|
|
let boardMembership;
|
|
|
|
try {
|
|
|
|
({ item: boardMembership } = yield call(request, api.createBoardMembership, boardId, data));
|
|
|
|
} catch (error) {
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.createBoardMembership.failure(localId, error));
|
2021-06-24 01:05:22 +05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.createBoardMembership.success(localId, boardMembership));
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
export function* createMembershipInCurrentBoard(data) {
|
|
|
|
const { boardId } = yield select(selectors.selectPath);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
yield call(createBoardMembership, boardId, data);
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
export function* handleBoardMembershipCreate(boardMembership) {
|
|
|
|
const currentUserId = yield select(selectors.selectCurrentUserId);
|
2021-06-24 01:05:22 +05:00
|
|
|
const isCurrentUser = boardMembership.userId === currentUserId;
|
|
|
|
|
|
|
|
let user;
|
|
|
|
let project;
|
|
|
|
let board1;
|
|
|
|
let users1;
|
|
|
|
let users2;
|
|
|
|
let projectManagers;
|
|
|
|
let boards;
|
|
|
|
let boardMemberships1;
|
|
|
|
let boardMemberships2;
|
|
|
|
let labels;
|
|
|
|
let lists;
|
|
|
|
let cards;
|
|
|
|
let cardMemberships;
|
|
|
|
let cardLabels;
|
|
|
|
let tasks;
|
|
|
|
let attachments;
|
2022-08-04 13:31:14 +02:00
|
|
|
let deletedNotifications;
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
if (isCurrentUser) {
|
|
|
|
let board2;
|
|
|
|
try {
|
|
|
|
({ item: board2 } = yield call(request, api.getBoard, boardMembership.boardId));
|
|
|
|
} catch {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
const { boardId } = yield select(selectors.selectPath);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(
|
|
|
|
actions.handleBoardMembershipCreate.fetchProject(board2.projectId, currentUserId, boardId),
|
|
|
|
);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
try {
|
|
|
|
({
|
|
|
|
item: project,
|
|
|
|
included: { users: users1, projectManagers, boards, boardMemberships: boardMemberships1 },
|
|
|
|
} = yield call(request, api.getProject, board2.projectId));
|
|
|
|
} catch {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let body;
|
|
|
|
try {
|
2022-08-04 13:31:14 +02:00
|
|
|
body = yield call(requests.fetchBoardByCurrentPathRequest);
|
2021-06-24 01:05:22 +05:00
|
|
|
} catch {} // eslint-disable-line no-empty
|
|
|
|
|
|
|
|
if (body && body.project && body.project.id === board2.projectId) {
|
|
|
|
({
|
|
|
|
project,
|
|
|
|
board: board1,
|
|
|
|
users: users2,
|
|
|
|
boardMemberships: boardMemberships2,
|
|
|
|
labels,
|
|
|
|
lists,
|
|
|
|
cards,
|
|
|
|
cardMemberships,
|
|
|
|
cardLabels,
|
|
|
|
tasks,
|
|
|
|
attachments,
|
|
|
|
} = body);
|
|
|
|
|
|
|
|
if (body.card) {
|
2022-08-04 13:31:14 +02:00
|
|
|
deletedNotifications = yield select(selectors.selectNotificationsByCardId, body.card.id);
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
({ item: user } = yield call(request, api.getUser, boardMembership.userId));
|
|
|
|
} catch {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
yield put(
|
2022-08-04 13:31:14 +02:00
|
|
|
actions.handleBoardMembershipCreate(
|
2021-06-24 01:05:22 +05:00
|
|
|
boardMembership,
|
|
|
|
project,
|
|
|
|
board1,
|
|
|
|
isCurrentUser ? mergeRecords(users1, users2) : [user],
|
|
|
|
projectManagers,
|
|
|
|
boards,
|
|
|
|
mergeRecords(boardMemberships1, boardMemberships2),
|
|
|
|
labels,
|
|
|
|
lists,
|
|
|
|
cards,
|
|
|
|
cardMemberships,
|
|
|
|
cardLabels,
|
|
|
|
tasks,
|
|
|
|
attachments,
|
2022-08-04 13:31:14 +02:00
|
|
|
deletedNotifications,
|
2021-06-24 01:05:22 +05:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
export function* deleteBoardMembership(id) {
|
|
|
|
let boardMembership = yield select(selectors.selectBoardMembershipById, id);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
const currentUserId = yield select(selectors.selectCurrentUserId);
|
|
|
|
const { boardId, projectId } = yield select(selectors.selectPath);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
if (boardMembership.userId === currentUserId && boardMembership.boardId === boardId) {
|
2022-08-04 13:31:14 +02:00
|
|
|
const isCurrentUserManager = yield select(
|
|
|
|
selectors.selectIsCurrentUserManagerForCurrentProject,
|
|
|
|
);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
if (!isCurrentUserManager) {
|
2022-08-04 13:31:14 +02:00
|
|
|
yield call(goToProject, projectId);
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.deleteBoardMembership(id));
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
try {
|
|
|
|
({ item: boardMembership } = yield call(request, api.deleteBoardMembership, id));
|
|
|
|
} catch (error) {
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.deleteBoardMembership.failure(id, error));
|
2021-06-24 01:05:22 +05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.deleteBoardMembership.success(boardMembership));
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
export function* handleBoardMembershipDelete(boardMembership) {
|
|
|
|
const currentUserId = yield select(selectors.selectCurrentUserId);
|
|
|
|
const { boardId, projectId } = yield select(selectors.selectPath);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
if (boardMembership.userId === currentUserId && boardMembership.boardId === boardId) {
|
2022-08-04 13:31:14 +02:00
|
|
|
const isCurrentUserManager = yield select(
|
|
|
|
selectors.selectIsCurrentUserManagerForCurrentProject,
|
|
|
|
);
|
2021-06-24 01:05:22 +05:00
|
|
|
|
|
|
|
if (!isCurrentUserManager) {
|
2022-08-04 13:31:14 +02:00
|
|
|
yield call(goToProject, projectId);
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-04 13:31:14 +02:00
|
|
|
yield put(actions.handleBoardMembershipDelete(boardMembership));
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
2022-08-04 13:31:14 +02:00
|
|
|
|
|
|
|
export default {
|
|
|
|
createBoardMembership,
|
|
|
|
createMembershipInCurrentBoard,
|
|
|
|
handleBoardMembershipCreate,
|
|
|
|
deleteBoardMembership,
|
|
|
|
handleBoardMembershipDelete,
|
|
|
|
};
|