diff --git a/.vscode/launch.json b/.vscode/launch.json index 0b384337e5..46bcee306d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -55,7 +55,7 @@ "MODEL_JSON": "${workspaceRoot}/models/all/bundle/model.json", // "SERVER_PROVIDER":"uweb" "SERVER_PROVIDER":"ws", - "MODEL_VERSION": "0.6.427", + "MODEL_VERSION": "0.6.431", // "VERSION": "0.6.289", "ELASTIC_INDEX_NAME": "local_storage_index", "UPLOAD_URL": "/files", @@ -167,7 +167,7 @@ "MINIO_ACCESS_KEY": "minioadmin", "MINIO_SECRET_KEY": "minioadmin", "MINIO_ENDPOINT": "localhost", - "MODEL_VERSION": "v0.6.427", + "MODEL_VERSION": "v0.6.431", "WS_OPERATION": "all+backup", "BACKUP_STORAGE": "minio|minio?accessKey=minioadmin&secretKey=minioadmin", "BACKUP_BUCKET": "dev-backups", @@ -200,7 +200,7 @@ "MINIO_ACCESS_KEY": "minioadmin", "MINIO_SECRET_KEY": "minioadmin", "MINIO_ENDPOINT": "localhost", - "MODEL_VERSION": "0.6.427", + "MODEL_VERSION": "0.6.431", "WS_OPERATION": "all+backup", "BACKUP_STORAGE": "minio|minio?accessKey=minioadmin&secretKey=minioadmin", "BACKUP_BUCKET": "dev-backups", @@ -332,7 +332,7 @@ "ACCOUNT_DB_URL": "mongodb://localhost:27017", "TELEGRAM_DATABASE": "telegram-service", "REKONI_URL": "http://localhost:4004", - "MODEL_VERSION": "0.6.427" + "MODEL_VERSION": "0.6.431" }, "runtimeVersion": "20", "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], @@ -359,7 +359,7 @@ "MONGO_URL": "mongodb://localhost:27017", "TELEGRAM_DATABASE": "telegram-service", "REKONI_URL": "http://localhost:4004", - "MODEL_VERSION": "0.6.427" + "MODEL_VERSION": "0.6.431" }, "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "sourceMaps": true, diff --git a/common/scripts/version.txt b/common/scripts/version.txt index f866297f77..0be6b2d195 100644 --- a/common/scripts/version.txt +++ b/common/scripts/version.txt @@ -1 +1 @@ -"0.6.427" +"0.6.431" diff --git a/dev/tool/src/index.ts b/dev/tool/src/index.ts index dd9d1e5219..48a6b63d5b 100644 --- a/dev/tool/src/index.ts +++ b/dev/tool/src/index.ts @@ -16,45 +16,18 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import accountPlugin, { assignWorkspace, - confirmEmail, - getAccount, - getWorkspaceById, - updateArchiveInfo, - signUpByEmail, createWorkspaceRecord, - updateWorkspaceInfo, + flattenStatus, getAccountDB, getWorkspaceInfoWithStatusById, - flattenStatus, - type WorkspaceInfoWithStatus, - type AccountDB, - type Workspace, - getEmailSocialId + signUpByEmail, + updateWorkspaceInfo, + type AccountDB } from '@hcengineering/account' -import { backupWorkspace } from '@hcengineering/backup-service' import { setMetadata } from '@hcengineering/platform' +import { createFileBackupStorage, createStorageBackupStorage, restore } from '@hcengineering/server-backup' +import serverClientPlugin, { getAccountClient } from '@hcengineering/server-client' import { - backup, - backupFind, - backupList, - backupRemoveLast, - backupSize, - checkBackupIntegrity, - compactBackup, - createFileBackupStorage, - createStorageBackupStorage, - restore -} from '@hcengineering/server-backup' -import serverClientPlugin, { - BlobClient, - createClient, - getTransactorEndpoint, - getAccountClient -} from '@hcengineering/server-client' -import { - createBackupPipeline, - getConfig, - getWorkspaceDestroyAdapter, registerAdapterFactory, registerDestroyFactory, registerServerPlugins, @@ -62,45 +35,31 @@ import { registerTxAdapterFactory, sharedPipelineContextVars } from '@hcengineering/server-pipeline' -import serverToken, { decodeToken, generateToken } from '@hcengineering/server-token' -import { buildModel, FileModelLogger } from '@hcengineering/server-tool' +import serverToken from '@hcengineering/server-token' import { createWorkspace, upgradeWorkspace } from '@hcengineering/workspace-service' -import path from 'path' import { buildStorageFromConfig, createStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage' import { program, type Command } from 'commander' -import { addControlledDocumentRank } from './qms' -import { clearTelegramHistory } from './telegram' -import { diffWorkspace, updateField } from './workspace' +import { updateField } from './workspace' -import core, { +import { AccountRole, - generateId, - isActiveMode, - isArchivingMode, MeasureMetricsContext, metricsToString, - RateLimiter, - versionToString, type Data, - type Doc, - type Ref, type Tx, - type Version + type Version, + type WorkspaceDataId } from '@hcengineering/core' import { consoleModelLogger, type MigrateOperation } from '@hcengineering/model' -import contact from '@hcengineering/model-contact' import { createMongoAdapter, createMongoDestroyAdapter, createMongoTxAdapter, - getMongoClient, - getWorkspaceMongoDB, shutdownMongo } from '@hcengineering/mongo' import { backupDownload } from '@hcengineering/server-backup/src/backup' -import { createDatalakeClient, CONFIG_KIND as DATALAKE_CONFIG_KIND, type DatalakeConfig } from '@hcengineering/datalake' import { getModelVersion } from '@hcengineering/model-all' import { createPostgreeDestroyAdapter, @@ -108,45 +67,12 @@ import { createPostgresTxAdapter, shutdownPostgres } from '@hcengineering/postgres' -import { CONFIG_KIND as S3_CONFIG_KIND, S3Service, type S3Config } from '@hcengineering/s3' -import type { PipelineFactory, StorageAdapter, StorageAdapterEx } from '@hcengineering/server-core' -import { deepEqual } from 'fast-equals' -import { createWriteStream, readFileSync } from 'fs' -import { getAccountDBUrl, getMongoDBUrl } from './__start' +import type { StorageAdapter } from '@hcengineering/server-core' +import { getAccountDBUrl } from './__start' // import { fillGithubUsers, fixAccountEmails, renameAccount } from './account' -import { - benchmark, - benchmarkWorker, - generateWorkspaceData, - stressBenchmark, - testFindAll, - type StressBenchmarkMode -} from './benchmark' -import { - cleanArchivedSpaces, - cleanRemovedTransactions, - cleanWorkspace, - fixCommentDoubleIdCreate, - fixMinioBW, - fixSkills, - optimizeModel, - removeDuplicateIds, - restoreHrTaskTypesFromUpdates, - restoreRecruitingTaskTypes -} from './clean' import { changeConfiguration } from './configuration' -import { - generateUuidMissingWorkspaces, - moveAccountDbFromMongoToPG, - moveFromMongoToPG, - moveWorkspaceFromMongoToPG, - updateDataWorkspaceIdToUuid -} from './db' import { reindexWorkspace } from './fulltext' -import { restoreControlledDocContentMongo, restoreMarkupRefsMongo, restoreWikiContentMongo } from './markup' -import { fixMixinForeignAttributes, showMixinForeignAttributes } from './mixin' -import { copyToDatalake, moveFiles, showLostFiles } from './storage' import { getToolToken, getWorkspace, getWorkspaceTransactorEndpoint } from './utils' const colorConstants = { @@ -1212,20 +1138,25 @@ export function devTool ( // await storageAdapter.close() // }) - // program - // .command('backup-s3-download ') - // .description('Download a full backup from s3 to local dir') - // .action(async (bucketName: string, dirName: string, storeIn: string, cmd) => { - // const backupStorageConfig = storageConfigFromEnv(process.env.STORAGE) - // const storageAdapter = createStorageFromConfig(backupStorageConfig.storages[0]) - // try { - // const storage = await createStorageBackupStorage(toolCtx, storageAdapter, getWorkspaceId(bucketName), dirName) - // await backupDownload(storage, storeIn) - // } catch (err: any) { - // toolCtx.error('failed to size backup', { err }) - // } - // await storageAdapter.close() - // }) + program + .command('backup-s3-download ') + .description('Download a full backup from s3 to local dir') + .action(async (bucketName: string, dirName: string, storeIn: string, cmd) => { + const backupStorageConfig = storageConfigFromEnv(process.env.STORAGE) + const storageAdapter = createStorageFromConfig(backupStorageConfig.storages[0]) + try { + const storage = await createStorageBackupStorage( + toolCtx, + storageAdapter, + bucketName as WorkspaceDataId, + dirName + ) + await backupDownload(storage, storeIn) + } catch (err: any) { + toolCtx.error('failed to size backup', { err }) + } + await storageAdapter.close() + }) // program // .command('copy-s3-datalake') diff --git a/models/core/src/migration.ts b/models/core/src/migration.ts index e66374e4ef..6d1d84558d 100644 --- a/models/core/src/migration.ts +++ b/models/core/src/migration.ts @@ -665,7 +665,7 @@ export const coreOperation: MigrateOperation = { func: migrateCollaborativeContentToStorage }, { - state: 'fix-backups-hash-timestamp', + state: 'fix-backups-hash-timestamp-v2', func: async (client: MigrationClient): Promise => { const now = Date.now().toString(16) for (const d of client.hierarchy.domains()) { diff --git a/models/server-tracker/src/index.ts b/models/server-tracker/src/index.ts index c78e8c693d..7758af3fdd 100644 --- a/models/server-tracker/src/index.ts +++ b/models/server-tracker/src/index.ts @@ -74,6 +74,14 @@ export function createModel (builder: Builder): void { } }) + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverTracker.trigger.OnProjectRemove, + txMatch: { + _class: core.class.TxRemoveDoc, + objectClass: tracker.class.Project + } + }) + builder.mixin( tracker.ids.AssigneeNotification, notification.class.NotificationType, diff --git a/plugins/chunter-resources/src/navigation.ts b/plugins/chunter-resources/src/navigation.ts index 8e13ecae37..1e2d760414 100644 --- a/plugins/chunter-resources/src/navigation.ts +++ b/plugins/chunter-resources/src/navigation.ts @@ -7,7 +7,7 @@ import { navigate, languageStore } from '@hcengineering/ui' -import { type Ref, type Doc, type Class, generateId } from '@hcengineering/core' +import { type Ref, type Doc, type Class, generateId, concatLink } from '@hcengineering/core' import activity, { type ActivityMessage } from '@hcengineering/activity' import { type Channel, @@ -19,10 +19,10 @@ import { import { type DocNotifyContext, notificationId } from '@hcengineering/notification' import workbench, { type Widget, workbenchId, type LocationData } from '@hcengineering/workbench' import { classIcon, getObjectLinkId, parseLinkId } from '@hcengineering/view-resources' -import { getClient } from '@hcengineering/presentation' +import presentation, { getClient } from '@hcengineering/presentation' import view, { encodeObjectURI, decodeObjectURI } from '@hcengineering/view' import { createWidgetTab, isElementFromSidebar, sidebarStore } from '@hcengineering/workbench-resources' -import { type Asset, type IntlString, translate } from '@hcengineering/platform' +import { type Asset, getMetadata, type IntlString, translate } from '@hcengineering/platform' import contact from '@hcengineering/contact' import { get } from 'svelte/store' @@ -113,8 +113,10 @@ export async function getMessageLink (message: ActivityMessage): Promise } const id = encodeURIComponent(encodeObjectURI(_id, _class)) - - return `${window.location.protocol}//${window.location.host}/${workbenchId}/${location.path[1]}/${chunterId}/${id}${threadParent}?message=${message._id}` + const frontUrl = getMetadata(presentation.metadata.FrontUrl) + const protocolAndHost = frontUrl ?? `${window.location.protocol}//${window.location.host}` + const path = `${workbenchId}/${location.path[1]}/${chunterId}/${id}${threadParent}?message=${message._id}` + return concatLink(protocolAndHost, path) } export async function chunterSpaceLinkFragmentProvider (doc: ChunterSpace): Promise { diff --git a/plugins/document/package.json b/plugins/document/package.json index 285188befd..e708df5836 100644 --- a/plugins/document/package.json +++ b/plugins/document/package.json @@ -44,5 +44,9 @@ "@hcengineering/notification": "^0.6.23", "@hcengineering/attachment": "^0.6.14", "@hcengineering/preference": "^0.6.13" + }, + "repository": "https://github.com/hcengineering/platform", + "publishConfig": { + "registry": "https://npm.pkg.github.com" } } diff --git a/plugins/tracker-resources/src/components/issues/ParentNamesPresenter.svelte b/plugins/tracker-resources/src/components/issues/ParentNamesPresenter.svelte index d65eb64302..b894381643 100644 --- a/plugins/tracker-resources/src/components/issues/ParentNamesPresenter.svelte +++ b/plugins/tracker-resources/src/components/issues/ParentNamesPresenter.svelte @@ -13,7 +13,9 @@ // limitations under the License. --> diff --git a/plugins/tracker-resources/src/index.ts b/plugins/tracker-resources/src/index.ts index e22a6e368e..f85d92f51d 100644 --- a/plugins/tracker-resources/src/index.ts +++ b/plugins/tracker-resources/src/index.ts @@ -14,17 +14,13 @@ // import { Analytics } from '@hcengineering/analytics' -import core, { - type AttachedDoc, +import { type Attribute, type Class, - ClassifierKind, type Client, type Doc, type DocManager, type DocumentQuery, - DOMAIN_CONFIGURATION, - DOMAIN_MODEL, getCurrentAccount, type Ref, type RelatedDocument, @@ -275,52 +271,7 @@ async function deleteProject (project: Project | undefined): Promise { labelProps: { name: project.name }, message: tracker.string.DeleteProjectConfirm, action: async () => { - // void client.update(project, { archived: true }) const client = getClient() - const classes = await client.findAll(core.class.Class, {}) - const h = client.getHierarchy() - for (const c of classes) { - if (c.kind !== ClassifierKind.CLASS) { - continue - } - const d = h.findDomain(c._id) - if (d !== undefined && d !== DOMAIN_MODEL && d !== DOMAIN_CONFIGURATION) { - try { - while (true) { - const docs = await client.findAll(c._id, { space: project._id }, { limit: 50 }) - if (docs.length === 0) { - break - } - const ops = client.apply(undefined, 'delete-project') - for (const object of docs) { - if (client.getHierarchy().isDerived(object._class, core.class.AttachedDoc)) { - const adoc = object as AttachedDoc - await ops - .removeCollection( - object._class, - object.space, - adoc._id, - adoc.attachedTo, - adoc.attachedToClass, - adoc.collection - ) - .catch((err) => { - console.error(err) - }) - } else { - await ops.removeDoc(object._class, object.space, object._id).catch((err) => { - console.error(err) - }) - } - } - await ops.commit() - } - } catch (err: any) { - console.error(err) - Analytics.handleError(err) - } - } - } await client.remove(project) } }) diff --git a/plugins/training-resources/src/components/DocumentPresenter.svelte b/plugins/training-resources/src/components/DocumentPresenter.svelte index 1a30e6b4aa..bb0b532cda 100644 --- a/plugins/training-resources/src/components/DocumentPresenter.svelte +++ b/plugins/training-resources/src/components/DocumentPresenter.svelte @@ -16,16 +16,20 @@ --> diff --git a/plugins/view-resources/src/components/DocNavLink.svelte b/plugins/view-resources/src/components/DocNavLink.svelte index 0aef777229..9d42360aa5 100644 --- a/plugins/view-resources/src/components/DocNavLink.svelte +++ b/plugins/view-resources/src/components/DocNavLink.svelte @@ -13,11 +13,12 @@ // limitations under the License. -->