Existing SSO accounts have no local password, so the migration deactivates them before dropping is_sso_user and the identity_provider_user table.
265 lines
6.8 KiB
JavaScript
265 lines
6.8 KiB
JavaScript
/*!
|
|
* Copyright (c) 2024 PLANKA Software GmbH
|
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
|
*/
|
|
|
|
import { call, put, select, take } from 'redux-saga/effects';
|
|
import { push } from '../../../lib/redux-router';
|
|
|
|
import { logout } from './core';
|
|
import request from '../request';
|
|
import selectors from '../../../selectors';
|
|
import actions from '../../../actions';
|
|
import api from '../../../api';
|
|
import { getAccessToken } from '../../../utils/access-token-storage';
|
|
import mergeRecords from '../../../utils/merge-records';
|
|
import ActionTypes from '../../../constants/ActionTypes';
|
|
import Paths from '../../../constants/Paths';
|
|
|
|
export function* goTo(pathname) {
|
|
yield put(push(pathname));
|
|
}
|
|
|
|
export function* goToRoot() {
|
|
yield call(goTo, Paths.ROOT);
|
|
}
|
|
|
|
export function* goToProject(projectId) {
|
|
yield call(goTo, Paths.PROJECTS.replace(':id', projectId));
|
|
}
|
|
|
|
export function* goToBoard(boardId) {
|
|
yield call(goTo, Paths.BOARDS.replace(':id', boardId));
|
|
}
|
|
|
|
export function* goToCard(cardId) {
|
|
yield call(goTo, Paths.CARDS.replace(':id', cardId));
|
|
}
|
|
|
|
export function* handleLocationChange() {
|
|
const accessToken = yield call(getAccessToken);
|
|
|
|
if (!accessToken) {
|
|
yield call(logout, false);
|
|
return;
|
|
}
|
|
|
|
const pathsMatch = yield select(selectors.selectPathsMatch);
|
|
|
|
if (!pathsMatch) {
|
|
yield put(actions.handleLocationChange());
|
|
return;
|
|
}
|
|
|
|
switch (pathsMatch.pattern.path) {
|
|
case Paths.LOGIN:
|
|
yield call(goToRoot);
|
|
|
|
break;
|
|
default:
|
|
}
|
|
|
|
const isInitializing = yield select(selectors.selectIsInitializing);
|
|
|
|
if (isInitializing) {
|
|
yield take(ActionTypes.CORE_INITIALIZE);
|
|
}
|
|
|
|
let currentBoard = yield select(selectors.selectCurrentBoard);
|
|
|
|
let currentBoardId = null;
|
|
let currentCardId = null;
|
|
let isEditModeEnabled;
|
|
let board;
|
|
let card;
|
|
let users1;
|
|
let users2;
|
|
let projects;
|
|
let boardMemberships;
|
|
let labels;
|
|
let lists;
|
|
let cards;
|
|
let cardMemberships1;
|
|
let cardMemberships2;
|
|
let cardLabels1;
|
|
let cardLabels2;
|
|
let taskLists1;
|
|
let taskLists2;
|
|
let tasks1;
|
|
let tasks2;
|
|
let attachments1;
|
|
let attachments2;
|
|
let customFieldGroups1;
|
|
let customFieldGroups2;
|
|
let customFields1;
|
|
let customFields2;
|
|
let customFieldValues1;
|
|
let customFieldValues2;
|
|
let notificationsToDelete;
|
|
|
|
switch (pathsMatch.pattern.path) {
|
|
case Paths.ROOT:
|
|
isEditModeEnabled = false;
|
|
|
|
break;
|
|
case Paths.PROJECTS: {
|
|
const boardIds = yield select(selectors.selectBoardIdsForCurrentProject);
|
|
|
|
if (boardIds && boardIds.length === 0) {
|
|
isEditModeEnabled = true;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case Paths.BOARDS:
|
|
if (currentBoard) {
|
|
({ id: currentBoardId } = currentBoard);
|
|
|
|
if (currentBoard.isFetching === null) {
|
|
yield put(actions.handleLocationChange.fetchBoard(currentBoard.id));
|
|
|
|
try {
|
|
({
|
|
item: board,
|
|
included: {
|
|
projects,
|
|
boardMemberships,
|
|
labels,
|
|
lists,
|
|
cards,
|
|
users: users1,
|
|
cardMemberships: cardMemberships1,
|
|
cardLabels: cardLabels1,
|
|
taskLists: taskLists1,
|
|
tasks: tasks1,
|
|
attachments: attachments1,
|
|
customFieldGroups: customFieldGroups1,
|
|
customFields: customFields1,
|
|
customFieldValues: customFieldValues1,
|
|
},
|
|
} = yield call(request, api.getBoard, currentBoard.id, true));
|
|
} catch {
|
|
/* empty */
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
case Paths.CARDS:
|
|
({ cardId: currentCardId, boardId: currentBoardId } = yield select(selectors.selectPath));
|
|
|
|
if (!currentCardId) {
|
|
yield put(actions.handleLocationChange.fetchContent());
|
|
|
|
try {
|
|
({
|
|
item: card,
|
|
included: {
|
|
users: users1,
|
|
cardMemberships: cardMemberships1,
|
|
cardLabels: cardLabels1,
|
|
taskLists: taskLists1,
|
|
tasks: tasks1,
|
|
attachments: attachments1,
|
|
customFieldGroups: customFieldGroups1,
|
|
customFields: customFields1,
|
|
customFieldValues: customFieldValues1,
|
|
},
|
|
} = yield call(request, api.getCard, pathsMatch.params.id));
|
|
} catch {
|
|
/* empty */
|
|
}
|
|
|
|
if (card) {
|
|
({ id: currentCardId } = card);
|
|
|
|
currentBoard = yield select(selectors.selectBoardById, card.boardId);
|
|
|
|
if (currentBoard) {
|
|
({ id: currentBoardId } = currentBoard);
|
|
|
|
if (currentBoard.isFetching === null) {
|
|
try {
|
|
({
|
|
item: board,
|
|
included: {
|
|
projects,
|
|
boardMemberships,
|
|
labels,
|
|
lists,
|
|
cards,
|
|
users: users2,
|
|
cardMemberships: cardMemberships2,
|
|
cardLabels: cardLabels2,
|
|
taskLists: taskLists2,
|
|
tasks: tasks2,
|
|
attachments: attachments2,
|
|
customFieldGroups: customFieldGroups2,
|
|
customFields: customFields2,
|
|
customFieldValues: customFieldValues2,
|
|
},
|
|
} = yield call(request, api.getBoard, card.boardId, true));
|
|
} catch {
|
|
/* empty */
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (currentCardId) {
|
|
const notificationIds = yield select(
|
|
selectors.selectNotificationIdsByCardId,
|
|
currentCardId,
|
|
);
|
|
|
|
if (notificationIds.length > 0) {
|
|
try {
|
|
({
|
|
included: { notifications: notificationsToDelete },
|
|
} = yield call(request, api.readCardNotifications, currentCardId));
|
|
} catch {
|
|
/* empty */
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
default:
|
|
}
|
|
|
|
yield put(
|
|
actions.handleLocationChange(
|
|
pathsMatch.pathname,
|
|
currentBoardId,
|
|
currentCardId,
|
|
isEditModeEnabled,
|
|
board,
|
|
mergeRecords(users1, users2),
|
|
projects,
|
|
boardMemberships,
|
|
labels,
|
|
lists,
|
|
mergeRecords(card && [card], cards),
|
|
mergeRecords(cardMemberships1, cardMemberships2),
|
|
mergeRecords(cardLabels1, cardLabels2),
|
|
mergeRecords(taskLists1, taskLists2),
|
|
mergeRecords(tasks1, tasks2),
|
|
mergeRecords(attachments1, attachments2),
|
|
mergeRecords(customFieldGroups1, customFieldGroups2),
|
|
mergeRecords(customFields1, customFields2),
|
|
mergeRecords(customFieldValues1, customFieldValues2),
|
|
notificationsToDelete,
|
|
),
|
|
);
|
|
}
|
|
|
|
export default {
|
|
goTo,
|
|
goToRoot,
|
|
goToProject,
|
|
goToBoard,
|
|
goToCard,
|
|
handleLocationChange,
|
|
};
|