mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-23 00:37:47 +00:00
uberf-6224: restore missing task types (#5094)
This commit is contained in:
parent
a7914674d7
commit
16204edaac
@ -203,7 +203,7 @@ async function migrateProjectTypes (client: MigrationClient): Promise<void> {
|
|||||||
modifiedOn: pt.modifiedOn,
|
modifiedOn: pt.modifiedOn,
|
||||||
createdBy: pt.createdBy,
|
createdBy: pt.createdBy,
|
||||||
createdOn: pt.createdOn,
|
createdOn: pt.createdOn,
|
||||||
modifiedBy: pt.modifiedBy
|
modifiedBy: pt.modifiedBy !== core.account.System ? pt.modifiedBy : core.account.ConfigUser
|
||||||
}
|
}
|
||||||
await client.create(DOMAIN_TX, tx)
|
await client.create(DOMAIN_TX, tx)
|
||||||
|
|
||||||
@ -241,7 +241,7 @@ async function migrateTaskTypes (client: MigrationClient): Promise<void> {
|
|||||||
modifiedOn: tt.modifiedOn,
|
modifiedOn: tt.modifiedOn,
|
||||||
createdBy: tt.createdBy,
|
createdBy: tt.createdBy,
|
||||||
createdOn: tt.createdOn,
|
createdOn: tt.createdOn,
|
||||||
modifiedBy: tt.modifiedBy
|
modifiedBy: tt.modifiedBy !== core.account.System ? tt.modifiedBy : core.account.ConfigUser
|
||||||
}
|
}
|
||||||
await client.create(DOMAIN_TX, tx)
|
await client.create(DOMAIN_TX, tx)
|
||||||
|
|
||||||
|
@ -24,7 +24,9 @@ import core, {
|
|||||||
type Ref,
|
type Ref,
|
||||||
type Status,
|
type Status,
|
||||||
type Tx,
|
type Tx,
|
||||||
type TxCreateDoc
|
type TxCreateDoc,
|
||||||
|
type StatusCategory,
|
||||||
|
type TxMixin
|
||||||
} from '@hcengineering/core'
|
} from '@hcengineering/core'
|
||||||
import {
|
import {
|
||||||
createOrUpdate,
|
createOrUpdate,
|
||||||
@ -365,6 +367,133 @@ async function migrateIdentifiers (client: MigrationClient): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function restoreTaskTypes (client: MigrationClient): Promise<void> {
|
||||||
|
// Query all tracker project types creations (in Model)
|
||||||
|
// We only update new project types in model here and not old ones in spaces
|
||||||
|
const projectTypes = (await client.find(DOMAIN_TX, {
|
||||||
|
_class: core.class.TxCreateDoc,
|
||||||
|
objectClass: task.class.ProjectType,
|
||||||
|
objectSpace: core.space.Model,
|
||||||
|
'attributes.descriptor': tracker.descriptors.ProjectType
|
||||||
|
})) as TxCreateDoc<ProjectType>[]
|
||||||
|
|
||||||
|
if (projectTypes.length === 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const descr = client.model.getObject(tracker.descriptors.ProjectType)
|
||||||
|
const knownCategories = classicIssueTaskStatuses.map((c) => c.category)
|
||||||
|
|
||||||
|
function compareCategories (a: Ref<StatusCategory>, b: Ref<StatusCategory>): number {
|
||||||
|
const indexOfA = knownCategories.indexOf(a)
|
||||||
|
const indexOfB = knownCategories.indexOf(b)
|
||||||
|
|
||||||
|
return indexOfA - indexOfB
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const projType of projectTypes) {
|
||||||
|
for (const taskTypeId of projType.attributes.tasks) {
|
||||||
|
// Check if task type create TX exists
|
||||||
|
const createTx = (
|
||||||
|
(await client.find(DOMAIN_TX, {
|
||||||
|
_class: core.class.TxCreateDoc,
|
||||||
|
objectClass: task.class.TaskType,
|
||||||
|
objectSpace: core.space.Model,
|
||||||
|
objectId: taskTypeId
|
||||||
|
})) as TxCreateDoc<TaskType>[]
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
if (createTx !== undefined) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore create task type tx
|
||||||
|
|
||||||
|
// Get target class mixin
|
||||||
|
|
||||||
|
const typeMixin = (
|
||||||
|
await client.find(DOMAIN_TX, {
|
||||||
|
mixin: task.mixin.TaskTypeClass,
|
||||||
|
'attributes.projectType': projType.objectId,
|
||||||
|
'attributes.taskType': taskTypeId
|
||||||
|
})
|
||||||
|
)[0] as TxMixin<any, any>
|
||||||
|
|
||||||
|
if (typeMixin === undefined) {
|
||||||
|
throw new Error('No type mixin found for the task type being restored')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get statuses and categories
|
||||||
|
const statusesIds = projType.attributes.statuses.filter((s) => s.taskType === taskTypeId).map((s) => s._id)
|
||||||
|
if (statusesIds.length === 0) {
|
||||||
|
throw new Error('No statuses defined for the task type being restored')
|
||||||
|
}
|
||||||
|
const statuses = await client.find<Status>(DOMAIN_STATUS, {
|
||||||
|
_id: { $in: statusesIds }
|
||||||
|
})
|
||||||
|
const categoriesIds = new Set<Ref<StatusCategory>>()
|
||||||
|
|
||||||
|
statuses.forEach((st) => {
|
||||||
|
if (st.category !== undefined) {
|
||||||
|
categoriesIds.add(st.category)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (categoriesIds.size === 0) {
|
||||||
|
throw new Error('No categories found for the task type being restored')
|
||||||
|
}
|
||||||
|
|
||||||
|
const statusCategories = Array.from(categoriesIds)
|
||||||
|
|
||||||
|
statusCategories.sort(compareCategories)
|
||||||
|
|
||||||
|
const createTxNew: TxCreateDoc<TaskType> = {
|
||||||
|
_id: generateId(),
|
||||||
|
_class: core.class.TxCreateDoc,
|
||||||
|
space: core.space.Tx,
|
||||||
|
objectId: taskTypeId,
|
||||||
|
objectClass: task.class.TaskType,
|
||||||
|
objectSpace: core.space.Model,
|
||||||
|
modifiedBy: core.account.ConfigUser, // So it's not removed during the next migration
|
||||||
|
modifiedOn: projType.modifiedOn,
|
||||||
|
createdOn: projType.createdOn,
|
||||||
|
attributes: {
|
||||||
|
name: 'Issue',
|
||||||
|
descriptor: tracker.descriptors.Issue,
|
||||||
|
ofClass: tracker.class.Issue,
|
||||||
|
targetClass: typeMixin.objectId,
|
||||||
|
statusClass: tracker.class.IssueStatus,
|
||||||
|
allowedAsChildOf: [taskTypeId],
|
||||||
|
statuses: statusesIds,
|
||||||
|
statusCategories,
|
||||||
|
parent: projType.objectId,
|
||||||
|
kind: 'both',
|
||||||
|
icon: descr.icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await client.create(DOMAIN_TX, createTxNew)
|
||||||
|
|
||||||
|
// If there were updates to the task type - move them to the model
|
||||||
|
// Check if task type create TX exists
|
||||||
|
const updateTxes = await client.find(DOMAIN_TX, {
|
||||||
|
_class: { $in: [core.class.TxUpdateDoc, core.class.TxRemoveDoc] },
|
||||||
|
objectClass: task.class.TaskType,
|
||||||
|
objectSpace: projType.objectId,
|
||||||
|
objectId: taskTypeId
|
||||||
|
})
|
||||||
|
|
||||||
|
for (const updTx of updateTxes) {
|
||||||
|
await client.create<Tx>(DOMAIN_TX, {
|
||||||
|
...updTx,
|
||||||
|
_id: generateId(),
|
||||||
|
objectSpace: core.space.Model
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const trackerOperation: MigrateOperation = {
|
export const trackerOperation: MigrateOperation = {
|
||||||
async migrate (client: MigrationClient): Promise<void> {
|
async migrate (client: MigrationClient): Promise<void> {
|
||||||
await tryMigrate(client, 'tracker', [
|
await tryMigrate(client, 'tracker', [
|
||||||
@ -504,6 +633,10 @@ export const trackerOperation: MigrateOperation = {
|
|||||||
{
|
{
|
||||||
state: 'passIdentifierToParentInfo',
|
state: 'passIdentifierToParentInfo',
|
||||||
func: passIdentifierToParentInfo
|
func: passIdentifierToParentInfo
|
||||||
|
},
|
||||||
|
{
|
||||||
|
state: 'restoreTaskTypes',
|
||||||
|
func: restoreTaskTypes
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user