mirror of
https://github.com/plankanban/planka.git
synced 2025-07-19 13:19:44 +02:00
175 lines
4.2 KiB
JavaScript
175 lines
4.2 KiB
JavaScript
|
import { call, put, select } from 'redux-saga/effects';
|
||
|
|
||
|
import request from '../request';
|
||
|
import { fetchBoardByCurrentPathRequest } from '../requests';
|
||
|
import {
|
||
|
currentUserIdSelector,
|
||
|
notificationsByCardIdSelector,
|
||
|
pathSelector,
|
||
|
projectManagerByIdSelector,
|
||
|
} from '../../../selectors';
|
||
|
import {
|
||
|
createProjectManager,
|
||
|
deleteProjectManager,
|
||
|
handleProjectManagerCreate,
|
||
|
handleProjectManagerDelete,
|
||
|
} from '../../../actions';
|
||
|
import api from '../../../api';
|
||
|
import { createLocalId } from '../../../utils/local-id';
|
||
|
import mergeRecords from '../../../utils/merge-records';
|
||
|
|
||
|
export function* createProjectManagerService(projectId, data) {
|
||
|
const localId = yield call(createLocalId);
|
||
|
|
||
|
yield put(
|
||
|
createProjectManager({
|
||
|
...data,
|
||
|
projectId,
|
||
|
id: localId,
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
let projectManager;
|
||
|
try {
|
||
|
({ item: projectManager } = yield call(request, api.createProjectManager, projectId, data));
|
||
|
} catch (error) {
|
||
|
yield put(createProjectManager.failure(localId, error));
|
||
|
}
|
||
|
|
||
|
yield put(createProjectManager.success(localId, projectManager));
|
||
|
}
|
||
|
|
||
|
export function* createManagerInCurrentProjectService(data) {
|
||
|
const { projectId } = yield select(pathSelector);
|
||
|
|
||
|
yield call(createProjectManagerService, projectId, data);
|
||
|
}
|
||
|
|
||
|
export function* handleProjectManagerCreateService(projectManager) {
|
||
|
const currentUserId = yield select(currentUserIdSelector);
|
||
|
const isCurrentUser = projectManager.userId === currentUserId;
|
||
|
|
||
|
let user;
|
||
|
let project;
|
||
|
let board;
|
||
|
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;
|
||
|
let notifications;
|
||
|
|
||
|
if (isCurrentUser) {
|
||
|
const { boardId } = yield select(pathSelector);
|
||
|
|
||
|
yield put(
|
||
|
handleProjectManagerCreate.fetchProject(projectManager.projectId, currentUserId, boardId),
|
||
|
);
|
||
|
|
||
|
try {
|
||
|
({
|
||
|
item: project,
|
||
|
included: { users: users1, projectManagers, boards, boardMemberships: boardMemberships1 },
|
||
|
} = yield call(request, api.getProject, projectManager.projectId));
|
||
|
} catch {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let body;
|
||
|
try {
|
||
|
body = yield call(fetchBoardByCurrentPathRequest);
|
||
|
} catch {} // eslint-disable-line no-empty
|
||
|
|
||
|
if (body && body.project && body.project.id === projectManager.projectId) {
|
||
|
({
|
||
|
project,
|
||
|
board,
|
||
|
users: users2,
|
||
|
boardMemberships: boardMemberships2,
|
||
|
labels,
|
||
|
lists,
|
||
|
cards,
|
||
|
cardMemberships,
|
||
|
cardLabels,
|
||
|
tasks,
|
||
|
attachments,
|
||
|
} = body);
|
||
|
|
||
|
if (body.card) {
|
||
|
notifications = yield select(notificationsByCardIdSelector, body.card.id);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
try {
|
||
|
({ item: user } = yield call(request, api.getUser, projectManager.userId));
|
||
|
} catch {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
yield put(
|
||
|
handleProjectManagerCreate(
|
||
|
projectManager,
|
||
|
project,
|
||
|
board,
|
||
|
isCurrentUser ? mergeRecords(users1, users2) : [user],
|
||
|
projectManagers,
|
||
|
boards,
|
||
|
mergeRecords(boardMemberships1, boardMemberships2),
|
||
|
labels,
|
||
|
lists,
|
||
|
cards,
|
||
|
cardMemberships,
|
||
|
cardLabels,
|
||
|
tasks,
|
||
|
attachments,
|
||
|
notifications,
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
export function* deleteProjectManagerService(id) {
|
||
|
let projectManager = yield select(projectManagerByIdSelector, id);
|
||
|
|
||
|
const currentUserId = yield select(currentUserIdSelector);
|
||
|
const { projectId } = yield select(pathSelector);
|
||
|
|
||
|
yield put(
|
||
|
deleteProjectManager(
|
||
|
id,
|
||
|
projectManager.userId === currentUserId,
|
||
|
projectManager.projectId === projectId,
|
||
|
),
|
||
|
);
|
||
|
|
||
|
try {
|
||
|
({ item: projectManager } = yield call(request, api.deleteProjectManager, id));
|
||
|
} catch (error) {
|
||
|
yield put(deleteProjectManager.failure(id, error));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
yield put(deleteProjectManager.success(projectManager));
|
||
|
}
|
||
|
|
||
|
export function* handleProjectManagerDeleteService(projectManager) {
|
||
|
const currentUserId = yield select(currentUserIdSelector);
|
||
|
const { projectId } = yield select(pathSelector);
|
||
|
|
||
|
yield put(
|
||
|
handleProjectManagerDelete(
|
||
|
projectManager,
|
||
|
projectManager.userId === currentUserId,
|
||
|
projectManager.projectId === projectId,
|
||
|
),
|
||
|
);
|
||
|
}
|