From fb82353b71cabb1523785837fe98120aa025bef5 Mon Sep 17 00:00:00 2001 From: elrrrrrrr Date: Tue, 25 Jun 2024 17:55:28 +0800 Subject: [PATCH 1/2] fix: sync pkg --- app/core/event/SyncESPackage.ts | 50 +++--------------------- app/core/service/PackageSearchService.ts | 10 +++++ 2 files changed, 16 insertions(+), 44 deletions(-) diff --git a/app/core/event/SyncESPackage.ts b/app/core/event/SyncESPackage.ts index 80df5f1b..dd83175d 100644 --- a/app/core/event/SyncESPackage.ts +++ b/app/core/event/SyncESPackage.ts @@ -12,6 +12,8 @@ import { PACKAGE_MAINTAINER_CHANGED, PACKAGE_MAINTAINER_REMOVED, PACKAGE_META_CHANGED, + PACKAGE_BLOCKED, + PACKAGE_UNBLOCKED, } from './index'; import { PackageSearchService } from '../service/PackageSearchService'; @@ -30,6 +32,7 @@ class SyncESPackage { } @Event(PACKAGE_UNPUBLISHED) +@Event(PACKAGE_BLOCKED) export class PackageUnpublished extends SyncESPackage { async handle(fullname: string) { if (!this.config.cnpmcore.enableElasticsearch) return; @@ -38,56 +41,15 @@ export class PackageUnpublished extends SyncESPackage { } @Event(PACKAGE_VERSION_ADDED) -export class PackageVersionAdded extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - +@Event(PACKAGE_META_CHANGED) @Event(PACKAGE_VERSION_REMOVED) -export class PackageVersionRemoved extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - @Event(PACKAGE_TAG_ADDED) -export class PackageTagAdded extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - @Event(PACKAGE_TAG_CHANGED) -export class PackageTagChanged extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - @Event(PACKAGE_TAG_REMOVED) -export class PackageTagRemoved extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - @Event(PACKAGE_MAINTAINER_CHANGED) -export class PackageMaintainerChanged extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - @Event(PACKAGE_MAINTAINER_REMOVED) -export class PackageMaintainerRemoved extends SyncESPackage { - async handle(fullname: string) { - await this.syncPackage(fullname); - } -} - -@Event(PACKAGE_META_CHANGED) -export class PackageMetaChanged extends SyncESPackage { +@Event(PACKAGE_UNBLOCKED) +export class PackageVersionAdded extends SyncESPackage { async handle(fullname: string) { await this.syncPackage(fullname); } diff --git a/app/core/service/PackageSearchService.ts b/app/core/service/PackageSearchService.ts index 04000d96..4ef75858 100644 --- a/app/core/service/PackageSearchService.ts +++ b/app/core/service/PackageSearchService.ts @@ -8,6 +8,7 @@ import { PackageManagerService } from './PackageManagerService'; import { SearchManifestType, SearchMappingType, SearchRepository } from '../../repository/SearchRepository'; import { PackageVersionDownloadRepository } from '../../repository/PackageVersionDownloadRepository'; import { PackageRepository } from '../../repository/PackageRepository'; +import { PackageVersionBlockRepository } from '../../repository/PackageVersionBlockRepository'; @SingletonProto({ @@ -22,6 +23,8 @@ export class PackageSearchService extends AbstractService { private packageVersionDownloadRepository: PackageVersionDownloadRepository; @Inject() protected packageRepository: PackageRepository; + @Inject() + protected packageVersionBlockRepository: PackageVersionBlockRepository; async syncPackage(fullname: string, isSync = true) { const [ scope, name ] = getScopeAndName(fullname); @@ -38,6 +41,13 @@ export class PackageSearchService extends AbstractService { return; } + const block = await this.packageVersionBlockRepository.findPackageBlock(pkg.packageId); + if (block) { + this.logger.warn('[PackageSearchService.syncPackage] package:%s is blocked, try to remove es', fullname); + await this.removePackage(fullname); + return; + } + // get last year download data const startDate = dayjs().subtract(1, 'year'); const endDate = dayjs(); From 69f800ae8b41cc2e14012ff19ebf8e822a8b5268 Mon Sep 17 00:00:00 2001 From: elrrrrrrr Date: Tue, 25 Jun 2024 19:35:20 +0800 Subject: [PATCH 2/2] fix: sync pkg --- test/repository/SearchRepository.test.ts | 71 ++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/test/repository/SearchRepository.test.ts b/test/repository/SearchRepository.test.ts index 1275fc1f..5e84c32e 100644 --- a/test/repository/SearchRepository.test.ts +++ b/test/repository/SearchRepository.test.ts @@ -2,14 +2,19 @@ import { strict as assert } from 'node:assert'; import { app, mock } from 'egg-mock/bootstrap'; import { SearchManifestType, SearchRepository } from '../../app/repository/SearchRepository'; import { mockES } from '../../config/config.unittest'; +import { PackageManagerService } from '../../app/core/service/PackageManagerService'; +import { TestUtil } from '../TestUtil'; +import { PackageSearchService } from '../../app/core/service/PackageSearchService'; describe('test/repository/SearchRepository.test.ts', () => { let searchRepository: SearchRepository; + let packageManagerService: PackageManagerService; beforeEach(async () => { mock(app.config.cnpmcore, 'enableElasticsearch', true); mock(app.config.cnpmcore, 'elasticsearchIndex', 'cnpmcore_packages'); searchRepository = await app.getEggObject(SearchRepository); + packageManagerService = await app.getEggObject(PackageManagerService); }); afterEach(async () => { @@ -107,5 +112,71 @@ describe('test/repository/SearchRepository.test.ts', () => { const id = await searchRepository.removePackage(mockedPackageName); assert.equal(id, mockedPackageName); }); + + it('should clear blocked pkg', async () => { + + await TestUtil.createPackage({ + name: '@cnpm/example', + }); + + const _source = { + downloads: { + all: 0, + }, + package: { + name: '@cnpm/example', + description: 'example package', + }, + }; + + mockES.add({ + method: 'POST', + path: `/${app.config.cnpmcore.elasticsearchIndex}/_search`, + }, () => { + return { + hits: { + total: { value: 1, relation: 'eq' }, + hits: [{ + _source, + }], + }, + }; + }); + + + let res = await searchRepository.searchPackage({ + body: { + query: { + match: { + 'package.name': '@cnpm/example', + }, + }, + }, + }); + + assert.deepEqual(res.hits.length, 1); + + res = await searchRepository.searchPackage({ + body: { + query: { + match: { + 'package.name': '@cnpm/example', + }, + }, + }, + }); + + let called = false; + + mock(PackageSearchService.prototype, 'removePackage', async (fullname: string) => { + if (fullname === '@cnpm/example') { + called = true; + } + }); + + await packageManagerService.blockPackageByFullname('@cnpm/example', 'test'); + assert(called); + + }); }); });