mirror of
https://github.com/hcengineering/platform.git
synced 2026-09-08 02:37:44 +02:00
UBERF-11206: Few fixes related to Github sync (#9102)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
This commit is contained in:
@@ -674,7 +674,7 @@ export class PlatformWorker {
|
||||
}
|
||||
|
||||
async getAccountByRef (workspace: WorkspaceUuid, ref: PersonId): Promise<GithubUserRecord | undefined> {
|
||||
return await this.userManager.getAccountByRef(workspace, ref)
|
||||
return await this.userManager.getAccountByRef(this.ctx, workspace, ref)
|
||||
}
|
||||
|
||||
private async updateInstallation (installationId: number): Promise<void> {
|
||||
|
||||
@@ -438,7 +438,7 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS
|
||||
pullRequestExternal.body
|
||||
)
|
||||
|
||||
const op = this.client.apply()
|
||||
let op = this.client.apply()
|
||||
let createdPullRequest: GithubPullRequest | undefined
|
||||
|
||||
await this.ctx.withLog(
|
||||
@@ -464,17 +464,22 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS
|
||||
{ url: pullRequestExternal.url }
|
||||
)
|
||||
|
||||
await op.commit()
|
||||
const pullRequestObj =
|
||||
createdPullRequest ??
|
||||
(await this.client.findOne(github.class.GithubPullRequest, {
|
||||
_id: info._id as unknown as Ref<GithubPullRequest>
|
||||
}))
|
||||
if (pullRequestObj !== undefined) {
|
||||
await this.todoSync(op, pullRequestObj, pullRequestExternal, info, account)
|
||||
op = this.client.apply()
|
||||
try {
|
||||
await this.todoSync(op, pullRequestObj, pullRequestExternal, info, account)
|
||||
} catch (err: any) {
|
||||
this.ctx.error('failed to sync todos', { err, url: pullRequestExternal.url, id: pullRequestObj._id })
|
||||
}
|
||||
await op.commit()
|
||||
}
|
||||
|
||||
await op.commit()
|
||||
|
||||
// To sync reviews/review threads in case they are created before us.
|
||||
await syncChilds(info, this.client, derivedClient)
|
||||
|
||||
@@ -555,7 +560,11 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS
|
||||
|
||||
async afterSync (existing: Issue, account: PersonId, issueExternal: any, info: DocSyncInfo): Promise<void> {
|
||||
const pullRequest = existing as GithubPullRequest
|
||||
await this.todoSync(this.client, pullRequest, issueExternal as PullRequestExternalData, info, account)
|
||||
try {
|
||||
await this.todoSync(this.client, pullRequest, issueExternal as PullRequestExternalData, info, account)
|
||||
} catch (err: any) {
|
||||
this.ctx.error('failed to sync todos', { err, url: issueExternal.url, id: pullRequest._id })
|
||||
}
|
||||
}
|
||||
|
||||
async todoSync (
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { AccountClient, IntegrationSecret } from '@hcengineering/account-client'
|
||||
import core, { systemAccountUuid, type PersonId, type WorkspaceUuid } from '@hcengineering/core'
|
||||
import core, { systemAccountUuid, type MeasureContext, type PersonId, type WorkspaceUuid } from '@hcengineering/core'
|
||||
import { getAccountClient } from '@hcengineering/server-client'
|
||||
import { generateToken } from '@hcengineering/server-token'
|
||||
import type { GithubUserRecord } from './types'
|
||||
@@ -43,7 +43,12 @@ export class UserManager {
|
||||
}
|
||||
}
|
||||
|
||||
async getAccountByRef (workspace: WorkspaceUuid, ref: PersonId): Promise<GithubUserRecord | undefined> {
|
||||
failedRefs = new Set<string>()
|
||||
async getAccountByRef (
|
||||
ctx: MeasureContext,
|
||||
workspace: WorkspaceUuid,
|
||||
ref: PersonId
|
||||
): Promise<GithubUserRecord | undefined> {
|
||||
const key = `${workspace}.${ref}`
|
||||
let rec = this.refUserCache.get(key)
|
||||
if (rec !== undefined) {
|
||||
@@ -53,17 +58,26 @@ export class UserManager {
|
||||
return undefined
|
||||
}
|
||||
|
||||
const secrets = await this.accountClient.listIntegrationsSecrets({ kind: 'github-user', socialId: ref })
|
||||
if (secrets.length === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
rec = this.secretToUserRecord(secrets[0], secrets[0].key)
|
||||
if (rec !== undefined) {
|
||||
if (this.refUserCache.size > 1000) {
|
||||
this.refUserCache.clear()
|
||||
try {
|
||||
if (this.failedRefs.has(ref)) {
|
||||
// Ignore failed refs
|
||||
return
|
||||
}
|
||||
this.refUserCache.set(key, rec)
|
||||
const secrets = await this.accountClient.listIntegrationsSecrets({ kind: 'github-user', socialId: ref })
|
||||
if (secrets.length === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
rec = this.secretToUserRecord(secrets[0], secrets[0].key)
|
||||
if (rec !== undefined) {
|
||||
if (this.refUserCache.size > 1000) {
|
||||
this.refUserCache.clear()
|
||||
}
|
||||
this.refUserCache.set(key, rec)
|
||||
}
|
||||
} catch (err: any) {
|
||||
this.failedRefs.add(ref)
|
||||
ctx.warn('failed to get user by ref', { workspace, ref, err })
|
||||
}
|
||||
return rec
|
||||
}
|
||||
|
||||
@@ -1476,7 +1476,7 @@ export class GithubWorker implements IntegrationManager {
|
||||
'sync doc',
|
||||
{},
|
||||
(ctx) => mapper.sync(existing, info, parent, derivedClient),
|
||||
{ url: info.url.toLowerCase(), workspace: this.workspace.uuid }
|
||||
{ url: info.url.toLowerCase(), workspace: this.workspace.uuid, existing: existing !== undefined }
|
||||
)
|
||||
if (docUpdate !== undefined) {
|
||||
await derivedClient.update(info, docUpdate)
|
||||
|
||||
Reference in New Issue
Block a user