cnpmcore
Version:
365 lines • 36.2 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _PackageRepository_instances, _PackageRepository_convertPackageModelToEntity;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PackageRepository = void 0;
const tegg_1 = require("@eggjs/tegg");
const SingletonORM_1 = require("@eggjs/tegg-orm-plugin/lib/SingletonORM");
const Package_1 = require("./model/Package");
const Package_2 = require("../core/entity/Package");
const ModelConvertor_1 = require("./util/ModelConvertor");
const PackageVersion_1 = require("../core/entity/PackageVersion");
const PackageVersion_2 = require("./model/PackageVersion");
const Dist_1 = require("../core/entity/Dist");
const PackageTag_1 = require("../core/entity/PackageTag");
const User_1 = require("../core/entity/User");
const AbstractRepository_1 = require("./AbstractRepository");
let PackageRepository = class PackageRepository extends AbstractRepository_1.AbstractRepository {
constructor() {
super(...arguments);
_PackageRepository_instances.add(this);
}
async findPackage(scope, name) {
const model = await this.Package.findOne({ scope, name });
if (!model)
return null;
return await __classPrivateFieldGet(this, _PackageRepository_instances, "m", _PackageRepository_convertPackageModelToEntity).call(this, model);
}
async findPackageByPackageId(packageId) {
const model = await this.Package.findOne({ packageId });
if (!model)
return null;
return await __classPrivateFieldGet(this, _PackageRepository_instances, "m", _PackageRepository_convertPackageModelToEntity).call(this, model);
}
async findPackageId(scope, name) {
const model = await this.Package.findOne({ scope, name }).select('packageId');
if (!model)
return null;
return model.packageId;
}
async savePackage(pkgEntity) {
if (pkgEntity.id) {
const model = await this.Package.findOne({ id: pkgEntity.id });
if (!model)
return;
await ModelConvertor_1.ModelConvertor.saveEntityToModel(pkgEntity, model);
}
else {
const model = await ModelConvertor_1.ModelConvertor.convertEntityToModel(pkgEntity, this.Package);
this.logger.info('[PackageRepository:savePackage:new] id: %s, packageId: %s', model.id, model.packageId);
}
}
async savePackageDist(pkgEntity, isFullManifests) {
const dist = isFullManifests ? pkgEntity.manifestsDist : pkgEntity.abbreviatedsDist;
if (!dist)
return;
if (dist.id) {
const model = await this.Dist.findOne({ id: dist.id });
if (!model)
return;
await ModelConvertor_1.ModelConvertor.saveEntityToModel(dist, model);
}
else {
const model = await ModelConvertor_1.ModelConvertor.convertEntityToModel(dist, this.Dist);
this.logger.info('[PackageRepository:savePackageDist:new] id: %s, distId: %s, packageId: %s', model.id, model.distId, pkgEntity.packageId);
}
await this.savePackage(pkgEntity);
}
async removePackageDist(pkgEntity, isFullManifests) {
const dist = isFullManifests ? pkgEntity.manifestsDist : pkgEntity.abbreviatedsDist;
if (!dist)
return;
const model = await this.Dist.findOne({ id: dist.id });
if (!model)
return;
await model.remove();
this.logger.info('[PackageRepository:removePackageDist:remove] id: %s, distId: %s, packageId: %s', model.id, model.distId, pkgEntity.packageId);
Reflect.set(dist, 'distId', null);
await this.savePackage(pkgEntity);
}
// Package Maintainers
// return true meaning create new record
async savePackageMaintainer(packageId, userId) {
let model = await this.Maintainer.findOne({ packageId, userId });
if (!model) {
model = await this.Maintainer.create({ packageId, userId });
this.logger.info('[PackageRepository:addPackageMaintainer:new] id: %s, packageId: %s, userId: %s', model.id, model.packageId, model.userId);
return true;
}
}
async listPackageMaintainers(packageId) {
const models = await this.Maintainer.find({ packageId });
const userModels = await this.User.find({ userId: models.map(m => m.userId) });
return userModels.map(user => ModelConvertor_1.ModelConvertor.convertModelToEntity(user, User_1.User));
}
async replacePackageMaintainers(packageId, userIds) {
await this.Maintainer.transaction(async ({ connection }) => {
// delete exists
// const removeCount = await this.Maintainer.remove({ packageId }, true, { transaction });
const removeCount = await this.Maintainer.remove({ packageId }, true, { connection });
this.logger.info('[PackageRepository:replacePackageMaintainers:remove] %d rows, packageId: %s', removeCount, packageId);
// add news
for (const userId of userIds) {
// const model = await this.Maintainer.create({ packageId, userId }, transaction);
const model = await this.Maintainer.create({ packageId, userId }, { connection });
this.logger.info('[PackageRepository:replacePackageMaintainers:new] id: %s, packageId: %s, userId: %s', model.id, model.packageId, model.userId);
}
});
}
async removePackageMaintainer(packageId, userId) {
const model = await this.Maintainer.findOne({ packageId, userId });
if (model) {
await model.remove();
this.logger.info('[PackageRepository:removePackageMaintainer:remove] id: %s, packageId: %s, userId: %s', model.id, model.packageId, model.userId);
return true;
}
return false;
}
// TODO: support paging
async listPackagesByUserId(userId) {
const models = await this.Maintainer.find({ userId });
const packageModels = await this.Package.find({ packageId: models.map(m => m.packageId) });
return packageModels.map(pkg => ModelConvertor_1.ModelConvertor.convertModelToEntity(pkg, Package_2.Package));
}
async createPackageVersion(pkgVersionEntity) {
await this.PackageVersion.transaction(async (transaction) => {
await Promise.all([
// FIXME: transaction is not the options
ModelConvertor_1.ModelConvertor.convertEntityToModel(pkgVersionEntity, this.PackageVersion, transaction),
ModelConvertor_1.ModelConvertor.convertEntityToModel(pkgVersionEntity.manifestDist, this.Dist, transaction),
ModelConvertor_1.ModelConvertor.convertEntityToModel(pkgVersionEntity.tarDist, this.Dist, transaction),
ModelConvertor_1.ModelConvertor.convertEntityToModel(pkgVersionEntity.readmeDist, this.Dist, transaction),
ModelConvertor_1.ModelConvertor.convertEntityToModel(pkgVersionEntity.abbreviatedDist, this.Dist, transaction),
]);
});
}
async savePackageVersion(pkgVersionEntity) {
// only abbreviatedDist and manifestDist allow to change, like `deprecated` message
let model = await this.Dist.findOne({ id: pkgVersionEntity.manifestDist.id });
if (model) {
await ModelConvertor_1.ModelConvertor.saveEntityToModel(pkgVersionEntity.manifestDist, model);
}
model = await this.Dist.findOne({ id: pkgVersionEntity.abbreviatedDist.id });
if (model) {
await ModelConvertor_1.ModelConvertor.saveEntityToModel(pkgVersionEntity.abbreviatedDist, model);
}
if (pkgVersionEntity.id) {
const model = await this.PackageVersion.findOne({ id: pkgVersionEntity.id });
if (model) {
await ModelConvertor_1.ModelConvertor.saveEntityToModel(pkgVersionEntity, model);
}
}
}
async findPackageVersion(packageId, version) {
const pkgVersionModel = await this.PackageVersion.findOne({ packageId, version });
if (!pkgVersionModel)
return null;
return await this.fillPackageVersionEntityData(pkgVersionModel);
}
async listPackageVersions(packageId) {
// FIXME: read all versions will hit the memory limit
const models = await this.PackageVersion.find({ packageId }).order('id desc');
const entities = [];
for (const model of models) {
entities.push(await this.fillPackageVersionEntityData(model));
}
return entities;
}
async listPackageVersionNames(packageId) {
const rows = await this.PackageVersion.find({ packageId }).select('version').order('id desc');
return rows.map(row => row.version);
}
// only for unittest now
async removePackageVersions(packageId) {
const removeCount = await this.PackageVersion.remove({ packageId });
this.logger.info('[PackageRepository:removePackageVersions:remove] %d rows, packageId: %s', removeCount, packageId);
}
async removePackageVersion(pkgVersion) {
const distRemoveCount = await this.Dist.remove({
distId: [
pkgVersion.abbreviatedDist.distId,
pkgVersion.manifestDist.distId,
pkgVersion.readmeDist.distId,
pkgVersion.tarDist.distId,
],
});
const removeCount = await this.PackageVersion.remove({ packageVersionId: pkgVersion.packageVersionId });
this.logger.info('[PackageRepository:removePackageVersion:remove] %d dist rows, %d rows, packageVersionId: %s', distRemoveCount, removeCount, pkgVersion.packageVersionId);
}
async savePackageVersionManifest(manifestEntity) {
let model = await this.PackageVersionManifest.findOne({ packageVersionId: manifestEntity.packageVersionId });
if (model) {
model.manifest = manifestEntity.manifest;
await model.save();
}
else {
model = await ModelConvertor_1.ModelConvertor.convertEntityToModel(manifestEntity, this.PackageVersionManifest);
this.logger.info('[PackageRepository:savePackageVersionManifest:new] id: %s, packageVersionId: %s', model.id, model.packageVersionId);
}
}
async findPackageVersionManifest(packageVersionId) {
const model = await this.PackageVersionManifest.findOne({ packageVersionId });
if (!model)
return null;
return ModelConvertor_1.ModelConvertor.convertModelToEntity(model, this.PackageVersionManifest);
}
getCountSql(model) {
const { database } = this.config.orm;
const sql = `
SELECT
TABLE_ROWS
FROM
information_schema.tables
WHERE
table_schema = '${database}'
AND table_name = '${model.table}'
`;
return sql;
}
async queryTotal() {
const lastPkg = await this.Package.findOne().order('id', 'desc');
const lastVersion = await this.PackageVersion.findOne().order('id', 'desc');
let packageCount = 0;
let packageVersionCount = 0;
let lastPackage = '';
let lastPackageVersion = '';
if (lastPkg) {
lastPackage = lastPkg.scope ? `${lastPkg.scope}/${lastPkg.name}` : lastPkg.name;
// FIXME: id will be out of range number
// 可能存在 id 增长不连续的情况,通过 count 查询
const queryRes = await this.orm.client.query(this.getCountSql(Package_1.Package));
packageCount = queryRes.rows?.[0].TABLE_ROWS;
}
if (lastVersion) {
const pkg = await this.Package.findOne({ packageId: lastVersion.packageId });
if (pkg) {
const fullname = pkg.scope ? `${pkg.scope}/${pkg.name}` : pkg.name;
lastPackageVersion = `${fullname}@${lastVersion.version}`;
}
const queryRes = await this.orm.client.query(this.getCountSql(PackageVersion_2.PackageVersion));
packageVersionCount = queryRes.rows?.[0].TABLE_ROWS;
}
return {
packageCount,
packageVersionCount,
lastPackage,
lastPackageVersion,
};
}
async fillPackageVersionEntityData(model) {
const [tarDistModel, readmeDistModel, manifestDistModel, abbreviatedDistModel,] = await Promise.all([
this.Dist.findOne({ distId: model.tarDistId }),
this.Dist.findOne({ distId: model.readmeDistId }),
this.Dist.findOne({ distId: model.manifestDistId }),
this.Dist.findOne({ distId: model.abbreviatedDistId }),
]);
const data = {
tarDist: tarDistModel && ModelConvertor_1.ModelConvertor.convertModelToEntity(tarDistModel, Dist_1.Dist),
readmeDist: readmeDistModel && ModelConvertor_1.ModelConvertor.convertModelToEntity(readmeDistModel, Dist_1.Dist),
manifestDist: manifestDistModel && ModelConvertor_1.ModelConvertor.convertModelToEntity(manifestDistModel, Dist_1.Dist),
abbreviatedDist: abbreviatedDistModel && ModelConvertor_1.ModelConvertor.convertModelToEntity(abbreviatedDistModel, Dist_1.Dist),
};
return ModelConvertor_1.ModelConvertor.convertModelToEntity(model, PackageVersion_1.PackageVersion, data);
}
async findPackageTag(packageId, tag) {
const model = await this.PackageTag.findOne({ packageId, tag });
if (!model)
return null;
const entity = ModelConvertor_1.ModelConvertor.convertModelToEntity(model, PackageTag_1.PackageTag);
return entity;
}
async savePackageTag(packageTagEntity) {
if (packageTagEntity.id) {
const model = await this.PackageTag.findOne({ id: packageTagEntity.id });
if (!model)
return;
await ModelConvertor_1.ModelConvertor.saveEntityToModel(packageTagEntity, model);
}
else {
const model = await ModelConvertor_1.ModelConvertor.convertEntityToModel(packageTagEntity, this.PackageTag);
this.logger.info('[PackageRepository:savePackageTag:new] id: %s, packageTagId: %s, tags: %s => %s', model.id, model.packageTagId, model.tag, model.version);
}
}
async removePackageTag(packageTagEntity) {
const model = await this.PackageTag.findOne({ id: packageTagEntity.id });
if (!model)
return;
await model.remove();
this.logger.info('[PackageRepository:removePackageTag:remove] id: %s, packageTagId: %s, packageId: %s', model.id, model.packageTagId, model.packageId);
}
async listPackageTags(packageId) {
const models = await this.PackageTag.find({ packageId });
const entities = [];
for (const model of models) {
entities.push(ModelConvertor_1.ModelConvertor.convertModelToEntity(model, PackageTag_1.PackageTag));
}
return entities;
}
};
exports.PackageRepository = PackageRepository;
_PackageRepository_instances = new WeakSet();
_PackageRepository_convertPackageModelToEntity = async function _PackageRepository_convertPackageModelToEntity(model) {
const manifestsDistModel = model.manifestsDistId ? await this.Dist.findOne({ distId: model.manifestsDistId }) : null;
const abbreviatedsDistModel = model.abbreviatedsDistId ? await this.Dist.findOne({ distId: model.abbreviatedsDistId }) : null;
const data = {
manifestsDist: manifestsDistModel && ModelConvertor_1.ModelConvertor.convertModelToEntity(manifestsDistModel, Dist_1.Dist),
abbreviatedsDist: abbreviatedsDistModel && ModelConvertor_1.ModelConvertor.convertModelToEntity(abbreviatedsDistModel, Dist_1.Dist),
};
const entity = ModelConvertor_1.ModelConvertor.convertModelToEntity(model, Package_2.Package, data);
return entity;
};
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "Package", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "Dist", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "PackageVersion", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "PackageVersionManifest", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "PackageTag", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "Maintainer", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "User", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], PackageRepository.prototype, "config", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", SingletonORM_1.Orm)
], PackageRepository.prototype, "orm", void 0);
exports.PackageRepository = PackageRepository = __decorate([
(0, tegg_1.SingletonProto)({
accessLevel: tegg_1.AccessLevel.PUBLIC,
})
], PackageRepository);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZVJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcHAvcmVwb3NpdG9yeS9QYWNrYWdlUmVwb3NpdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBa0U7QUFDbEUsMEVBQThEO0FBRzlELDZDQUEwRDtBQUMxRCxvREFBa0U7QUFDbEUsMERBQXVEO0FBQ3ZELGtFQUF1RjtBQUN2RiwyREFBK0U7QUFJL0UsOENBQXlEO0FBQ3pELDBEQUEyRTtBQUkzRSw4Q0FBeUQ7QUFDekQsNkRBQTBEO0FBdUpuRCxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLHVDQUFrQjtJQUFsRDs7O0lBdVZQLENBQUM7SUFoVEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBWTtRQUMzQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixPQUFPLE1BQU0sdUJBQUEsSUFBSSxvRkFBNkIsTUFBakMsSUFBSSxFQUE4QixLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQWlCO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsT0FBTyxNQUFNLHVCQUFBLElBQUksb0ZBQTZCLE1BQWpDLElBQUksRUFBOEIsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDN0MsTUFB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