1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-24 15:49:46 +02:00
planka/client/src/sagas/core/services/board-memberships.js

190 lines
4.8 KiB
JavaScript
Raw Normal View History

import { call, put, select } from 'redux-saga/effects';
2022-08-04 13:31:14 +02:00
import { goToProject } from './router';
import request from '../request';
2022-08-04 13:31:14 +02:00
import requests from '../requests';
import selectors from '../../../selectors';
import actions from '../../../actions';
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) {
const localId = yield call(createLocalId);
yield put(
2022-08-04 13:31:14 +02:00
actions.createBoardMembership({
...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));
return;
}
2022-08-04 13:31:14 +02:00
yield put(actions.createBoardMembership.success(localId, boardMembership));
}
2022-08-04 13:31:14 +02:00
export function* createMembershipInCurrentBoard(data) {
const { boardId } = yield select(selectors.selectPath);
2022-08-04 13:31:14 +02:00
yield call(createBoardMembership, boardId, data);
}
2022-08-04 13:31:14 +02:00
export function* handleBoardMembershipCreate(boardMembership) {
const currentUserId = yield select(selectors.selectCurrentUserId);
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;
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);
2022-08-04 13:31:14 +02:00
yield put(
actions.handleBoardMembershipCreate.fetchProject(board2.projectId, currentUserId, boardId),
);
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);
} 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);
}
}
} 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(
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,
),
);
}
2022-08-04 13:31:14 +02:00
export function* deleteBoardMembership(id) {
let boardMembership = yield select(selectors.selectBoardMembershipById, id);
2022-08-04 13:31:14 +02:00
const currentUserId = yield select(selectors.selectCurrentUserId);
const { boardId, projectId } = yield select(selectors.selectPath);
if (boardMembership.userId === currentUserId && boardMembership.boardId === boardId) {
2022-08-04 13:31:14 +02:00
const isCurrentUserManager = yield select(
selectors.selectIsCurrentUserManagerForCurrentProject,
);
if (!isCurrentUserManager) {
2022-08-04 13:31:14 +02:00
yield call(goToProject, projectId);
}
}
2022-08-04 13:31:14 +02:00
yield put(actions.deleteBoardMembership(id));
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));
return;
}
2022-08-04 13:31:14 +02:00
yield put(actions.deleteBoardMembership.success(boardMembership));
}
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);
if (boardMembership.userId === currentUserId && boardMembership.boardId === boardId) {
2022-08-04 13:31:14 +02:00
const isCurrentUserManager = yield select(
selectors.selectIsCurrentUserManagerForCurrentProject,
);
if (!isCurrentUserManager) {
2022-08-04 13:31:14 +02:00
yield call(goToProject, projectId);
}
}
2022-08-04 13:31:14 +02:00
yield put(actions.handleBoardMembershipDelete(boardMembership));
}
2022-08-04 13:31:14 +02:00
export default {
createBoardMembership,
createMembershipInCurrentBoard,
handleBoardMembershipCreate,
deleteBoardMembership,
handleBoardMembershipDelete,
};