diff --git a/app/port/controller/AbstractController.ts b/app/port/controller/AbstractController.ts index 9b5f8326..30c41f2e 100644 --- a/app/port/controller/AbstractController.ts +++ b/app/port/controller/AbstractController.ts @@ -146,25 +146,25 @@ export abstract class AbstractController extends MiddlewareController { return new UnavailableForLegalReasonsError(`${message}, reason: ${reason}`); } - protected async getPackageEntityByFullname(fullname: string): Promise { + protected async getPackageEntityByFullname(fullname: string, allowSync?: boolean): Promise { const [ scope, name ] = getScopeAndName(fullname); - return await this.getPackageEntity(scope, name); + return await this.getPackageEntity(scope, name, allowSync); } // try to get package entity, throw NotFoundError when package not exists - protected async getPackageEntity(scope: string, name: string): Promise { + protected async getPackageEntity(scope: string, name: string, allowSync?:boolean): Promise { const packageEntity = await this.packageRepository.findPackage(scope, name); if (!packageEntity) { const fullname = getFullname(scope, name); - throw this.createPackageNotFoundErrorWithRedirect(fullname); + throw this.createPackageNotFoundErrorWithRedirect(fullname, undefined, allowSync); } return packageEntity; } - protected async getPackageVersionEntity(pkg: PackageEntity, version: string): Promise { + protected async getPackageVersionEntity(pkg: PackageEntity, version: string, allowSync?: boolean): Promise { const packageVersion = await this.packageRepository.findPackageVersion(pkg.packageId, version); if (!packageVersion) { - throw this.createPackageNotFoundErrorWithRedirect(pkg.fullname, version); + throw this.createPackageNotFoundErrorWithRedirect(pkg.fullname, version, allowSync); } return packageVersion; } diff --git a/app/port/controller/package/DownloadPackageVersionTar.ts b/app/port/controller/package/DownloadPackageVersionTar.ts index 4a4fd3b5..d53812da 100644 --- a/app/port/controller/package/DownloadPackageVersionTar.ts +++ b/app/port/controller/package/DownloadPackageVersionTar.ts @@ -41,8 +41,9 @@ export class DownloadPackageVersionTarController extends AbstractController { } // check package version in database - const pkg = await this.getPackageEntityByFullname(fullname); - const packageVersion = await this.getPackageVersionEntity(pkg, version); + const allowSync = this.getAllowSync(ctx); + const pkg = await this.getPackageEntityByFullname(fullname, allowSync); + const packageVersion = await this.getPackageVersionEntity(pkg, version, allowSync); // read by nfs url if (downloadUrl) { diff --git a/test/port/controller/package/DownloadPackageVersionTarController.test.ts b/test/port/controller/package/DownloadPackageVersionTarController.test.ts index 7bb823fe..21dd720c 100644 --- a/test/port/controller/package/DownloadPackageVersionTarController.test.ts +++ b/test/port/controller/package/DownloadPackageVersionTarController.test.ts @@ -257,6 +257,31 @@ describe('test/port/controller/package/DownloadPackageVersionTarController.test. error: '[NOT_FOUND] @cnpm/testmodule-download-version-tar@1.0.404404 not found', }); }); + + it('should not create sync task when package version tgz not exists and syncNotFound=false', async () => { + mock(app.config.cnpmcore, 'syncMode', 'exist'); + mock(app.config.cnpmcore, 'syncNotFound', false); + mock(app.config.cnpmcore, 'redirectNotFound', false); + const res = await app.httpRequest() + .get('/lodash/-/lodash-1.404.404.tgz') + .set('user-agent', publisher.ua + ' node/16.0.0') + .set('Accept', 'application/vnd.npm.install-v1+json'); + assert(res.status === 404); + app.notExpectLog('[middleware:ErrorHandler][syncPackage] create sync package'); + }); + + it('should create sync task when package version tgz not exists and syncNotFound=true', async () => { + mock(app.config.cnpmcore, 'syncMode', 'exist'); + mock(app.config.cnpmcore, 'syncNotFound', true); + mock(app.config.cnpmcore, 'redirectNotFound', false); + const res = await app.httpRequest() + .get('/lodash/-/lodash-1.404.404.tgz') + .set('user-agent', publisher.ua + ' node/16.0.0') + .set('Accept', 'application/vnd.npm.install-v1+json'); + assert(res.status === 404); + app.expectLog('[middleware:ErrorHandler][syncPackage] create sync package'); + }); + }); describe('[GET /:fullname/download/:fullname-:version.tgz] deprecatedDownload()', () => {