UBERF-5986: Upgrade fixes (#4957)

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
This commit is contained in:
Andrey Sobolev
2024-03-14 11:24:25 +06:00
committed by GitHub
parent 768d57348b
commit 27e46ef3ae
7 changed files with 167 additions and 27 deletions
+39 -11
View File
@@ -25,6 +25,7 @@ import core, {
type Class,
type Doc,
type Ref,
type Tx,
type TxCUD,
type TxCollectionCUD,
type TxCreateDoc
@@ -55,15 +56,18 @@ async function generateDocUpdateMessageByTx (
tx: TxCUD<Doc>,
control: ActivityControl,
client: MigrationClient,
objectCache?: DocObjectCache
objectCache?: DocObjectCache,
existsMap?: Set<Ref<Tx>>
): Promise<void> {
const existsMessages = await client.find<DocUpdateMessage>(
DOMAIN_ACTIVITY,
{ _class: activity.class.DocUpdateMessage, txId: tx._id },
{ projection: { _id: 1 } }
)
const existsMessages =
existsMap?.has(tx._id) ??
(await client.find<DocUpdateMessage>(
DOMAIN_ACTIVITY,
{ _class: activity.class.DocUpdateMessage, txId: tx._id },
{ projection: { _id: 1 } }
))
if (existsMessages.length > 0) {
if (existsMessages === true || (Array.isArray(existsMessages) && existsMessages.length > 0)) {
return
}
@@ -172,6 +176,33 @@ async function createDocUpdateMessages (client: MigrationClient): Promise<void>
}
}
const docCache = {
docs: docIds,
transactions: allTransactions
}
const txIds = new Set<Ref<Tx>>()
for (const d of docs) {
processed += 1
if (processed % 1000 === 0) {
console.log('processed', processed)
}
const transactions = allTransactions.get(d._id) ?? []
for (const tx of transactions) {
const innerTx = TxProcessor.extractTx(tx) as TxCUD<Doc>
txIds.add(innerTx._id)
}
}
const ids = (
await client.find<DocUpdateMessage>(
DOMAIN_ACTIVITY,
{ _class: activity.class.DocUpdateMessage, txId: { $in: Array.from(txIds) as Ref<TxCUD<Doc>>[] } },
{ projection: { _id: 1, txId: 1 } }
)
).map((p) => p.txId as Ref<Tx>)
const existsMessages = new Set(ids)
for (const d of docs) {
processed += 1
if (processed % 1000 === 0) {
@@ -192,10 +223,7 @@ async function createDocUpdateMessages (client: MigrationClient): Promise<void>
}
try {
await generateDocUpdateMessageByTx(tx, notificationControl, client, {
docs: docIds,
transactions: allTransactions
})
await generateDocUpdateMessageByTx(tx, notificationControl, client, docCache, existsMessages)
} catch (e: any) {
console.error('error processing:', d._id, e.stack)
}
+64 -3
View File
@@ -13,7 +13,7 @@
// limitations under the License.
//
import { TxOperations, type Class, type Doc, type Ref, toIdMap } from '@hcengineering/core'
import { ClassifierKind, TxOperations, toIdMap, type Class, type Doc, type Ref } from '@hcengineering/core'
import {
createOrUpdate,
tryMigrate,
@@ -24,9 +24,10 @@ import {
} from '@hcengineering/model'
import core, { DOMAIN_SPACE } from '@hcengineering/model-core'
import tags from '@hcengineering/model-tags'
import { type TaskType, taskId } from '@hcengineering/task'
import task from './plugin'
import { getEmbeddedLabel } from '@hcengineering/platform'
import { taskId, type TaskType } from '@hcengineering/task'
import { DOMAIN_TASK } from '.'
import task from './plugin'
/**
* @public
@@ -110,6 +111,62 @@ async function createDefaults (tx: TxOperations): Promise<void> {
await createDefaultStatesSpace(tx)
}
async function fixProjectTypeMissingClass (client: MigrationUpgradeClient): Promise<void> {
const projectTypes = await client.findAll(task.class.ProjectType, {})
const ops = new TxOperations(client, core.account.ConfigUser)
const h = ops.getHierarchy()
for (const pt of projectTypes) {
console.log('Checking:', pt.name)
try {
if (!h.hasClass(pt.targetClass)) {
const categoryObj = ops.getModel().findObject(pt.descriptor)
if (categoryObj === undefined) {
throw new Error('category is not found in model')
}
const baseClassClass = h.getClass(categoryObj.baseClass)
await ops.createDoc(
core.class.Class,
core.space.Model,
{
extends: categoryObj.baseClass,
kind: ClassifierKind.MIXIN,
label: baseClassClass.label,
icon: baseClassClass.icon
},
pt.targetClass,
Date.now(),
core.account.ConfigUser
)
}
const taskTypes = await ops.findAll(task.class.TaskType, { parent: pt._id })
for (const tt of taskTypes) {
if (!h.hasClass(tt.targetClass)) {
const ofClassClass = h.getClass(tt.ofClass)
await ops.createDoc(
core.class.Class,
core.space.Model,
{
extends: tt.ofClass,
kind: ClassifierKind.MIXIN,
label: getEmbeddedLabel(tt.name),
icon: ofClassClass.icon
},
pt.targetClass,
Date.now(),
core.account.ConfigUser
)
}
}
} catch (err: any) {
//
console.error(err)
}
}
}
export const taskOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {
await tryMigrate(client, taskId, [
@@ -167,6 +224,10 @@ export const taskOperation: MigrateOperation = {
{
state: 'reorderStates',
func: reorderStates
},
{
state: 'fix-project-type-missing-class',
func: fixProjectTypeMissingClass
}
])
}