2025-06-11 14:17:12 +03:00
|
|
|
module.exports = {
|
|
|
|
inputs: {
|
|
|
|
list: {
|
|
|
|
type: 'ref',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
targetBoard: {
|
|
|
|
type: 'ref',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
actorUser: {
|
|
|
|
type: 'ref',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
request: {
|
|
|
|
type: 'ref',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
async fn(inputs) {
|
|
|
|
const updatedList = await List.updateOne(
|
|
|
|
{ id: inputs.list.id },
|
|
|
|
{ boardId: inputs.targetBoard.id },
|
|
|
|
);
|
|
|
|
|
|
|
|
const updatedCards = await Card.update(
|
|
|
|
{ listId: inputs.list.id },
|
|
|
|
{ boardId: inputs.targetBoard.id },
|
|
|
|
).fetch();
|
|
|
|
|
|
|
|
const migrateLabelsPromises = updatedCards.map(async (card) => {
|
|
|
|
const cardLabels = await CardLabel.find({ cardId: card.id });
|
|
|
|
return Promise.all(
|
|
|
|
cardLabels.map(async (cardLabel) => {
|
|
|
|
const oldLabel = await Label.findOne({ id: cardLabel.labelId });
|
|
|
|
if (!oldLabel) return;
|
|
|
|
let newLabel = await Label.findOne({
|
|
|
|
boardId: inputs.targetBoard.id,
|
|
|
|
name: oldLabel.name,
|
|
|
|
color: oldLabel.color,
|
|
|
|
});
|
|
|
|
if (!newLabel) {
|
|
|
|
const maxPosArr = await Label.find({ boardId: inputs.targetBoard.id })
|
|
|
|
.sort('position DESC')
|
|
|
|
.limit(1);
|
|
|
|
const maxPos = maxPosArr.length > 0 ? maxPosArr[0].position : 0;
|
|
|
|
newLabel = await Label.create({
|
|
|
|
boardId: inputs.targetBoard.id,
|
|
|
|
name: oldLabel.name,
|
|
|
|
color: oldLabel.color,
|
|
|
|
position: maxPos + 65536,
|
|
|
|
}).fetch();
|
|
|
|
}
|
|
|
|
await CardLabel.destroy({ cardId: card.id, labelId: cardLabel.labelId });
|
|
|
|
await CardLabel.create({ cardId: card.id, labelId: newLabel.id });
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
await Promise.all(migrateLabelsPromises);
|
|
|
|
|
2025-07-04 00:30:07 +03:00
|
|
|
await Promise.all(
|
|
|
|
updatedCards.map(async (card) => {
|
|
|
|
const cardMemberships = await CardMembership.find({ cardId: card.id });
|
|
|
|
await Promise.all(
|
|
|
|
cardMemberships.map(async (membership) => {
|
|
|
|
const userMembership = await BoardMembership.findOne({
|
|
|
|
boardId: inputs.targetBoard.id,
|
|
|
|
userId: membership.userId,
|
|
|
|
});
|
|
|
|
if (!userMembership) {
|
|
|
|
await CardMembership.destroy({ id: membership.id });
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
|
|
|
await Promise.all(
|
|
|
|
updatedCards.map(async (card) => {
|
|
|
|
const customFieldValues = await CustomFieldValue.find({ cardId: card.id });
|
|
|
|
await Promise.all(
|
|
|
|
customFieldValues.map(async (value) => {
|
|
|
|
const group = await CustomFieldGroup.findOne({ id: value.customFieldGroupId });
|
|
|
|
if (group && group.boardId && group.boardId !== inputs.targetBoard.id) {
|
|
|
|
const newGroup = await CustomFieldGroup.create({
|
|
|
|
name: group.name,
|
|
|
|
position: group.position,
|
|
|
|
cardId: card.id,
|
|
|
|
baseCustomFieldGroupId: group.baseCustomFieldGroupId,
|
|
|
|
}).fetch();
|
|
|
|
const field = await CustomField.findOne({ id: value.customFieldId });
|
|
|
|
const newField = await CustomField.create({
|
|
|
|
name: field.name,
|
|
|
|
position: field.position,
|
|
|
|
showOnFrontOfCard: field.showOnFrontOfCard,
|
|
|
|
customFieldGroupId: newGroup.id,
|
|
|
|
baseCustomFieldGroupId: field.baseCustomFieldGroupId,
|
|
|
|
}).fetch();
|
|
|
|
await CustomFieldValue.updateOne(
|
|
|
|
{ id: value.id },
|
|
|
|
{
|
|
|
|
customFieldGroupId: newGroup.id,
|
|
|
|
customFieldId: newField.id,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
2025-06-11 14:17:12 +03:00
|
|
|
return {
|
|
|
|
updatedList,
|
|
|
|
updatedCards,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
};
|