mv proxy/module.js into services/package.js

This commit is contained in:
fengmk2
2014-10-16 00:01:55 +08:00
parent d30260f301
commit aa135d2a30
28 changed files with 1576 additions and 1029 deletions

View File

@@ -24,7 +24,7 @@
// "single" : require single quotes
// "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : false, // true: Require all defined variables be used
"unused" : true, // true: Require all defined variables be used
"strict" : true, // true: Requires all functions run in ES5 Strict Mode
"trailing" : false, // true: Prohibit trailing whitespaces
"maxparams" : false, // {int} Max number of formal params allowed per function

View File

@@ -156,7 +156,7 @@ var config = {
// the storage engine for 'sqlite'
storage: path.join(root, 'database.sqlite'),
logging: false,
// logging: false,
},
// forward Compat with old style

View File

@@ -14,20 +14,20 @@
* Module dependencies.
*/
var Module = require('../../proxy/module');
var Package = require('../../services/package');
module.exports = deprecateVersions;
/**
* @see https://github.com/cnpm/cnpmjs.org/issues/415
*/
function* deprecateVersions(next) {
function* deprecateVersions() {
var body = this.request.body;
var name = this.params.name || this.params[0];
var tasks = [];
for (var version in body.versions) {
tasks.push(Module.get(name, version));
tasks.push(Package.getModule(name, version));
}
var rs = yield tasks;
@@ -46,12 +46,12 @@ function* deprecateVersions(next) {
var data = body.versions[row.package.version];
if (typeof data.deprecated === 'string') {
row.package.deprecated = data.deprecated;
updateTasks.push(Module.updatePackage(row.id, row.package));
updateTasks.push(Package.updateModulePackage(row.id, row.package));
}
}
yield updateTasks;
// update last modified
yield* Module.updateLastModified(name);
yield* Package.updateModuleLastModified(name);
this.status = 201;
this.body = {

View File

@@ -16,19 +16,13 @@
*/
var debug = require('debug')('cnpmjs.org:controllers:registry:module');
var path = require('path');
var fs = require('fs');
var util = require('util');
var crypto = require('crypto');
var utility = require('utility');
var coRead = require('co-read');
var coWrite = require('co-write');
var urlparse = require('url').parse;
var mime = require('mime');
var semver = require('semver');
var ms = require('ms');
var config = require('../../config');
var Module = require('../../proxy/module');
var Total = require('../../services/total');
var nfs = require('../../common/nfs');
var common = require('../../lib/common');
@@ -325,7 +319,7 @@ exports.get = function* (next) {
this.body = {
error: 'not exist',
reason: 'version not found: ' + version
}
};
return;
}
@@ -338,7 +332,7 @@ exports.download = function *(next) {
var name = this.params.name || this.params[0];
var filename = this.params.filename || this.params[1];
var version = filename.slice(name.length + 1, -4);
var row = yield Module.get(name, version);
var row = yield* Package.getModule(name, version);
// can not get dist
var url = null;
@@ -374,7 +368,7 @@ exports.download = function *(next) {
_downloads[name] = (_downloads[name] || 0) + 1;
if (typeof dist.size === 'number') {
if (typeof dist.size === 'number' && dist.size > 0) {
this.length = dist.size;
}
this.type = mime.lookup(dist.key);
@@ -551,7 +545,7 @@ exports.addPackageAndDist = function *(next) {
debug('%s addPackageAndDist %s:%s, attachment size: %s, maintainers: %j, distTags: %j',
username, name, version, attachment.length, versionPackage.maintainers, distTags);
var exists = yield Module.get(name, version);
var exists = yield* Module.getModule(name, version);
var shasum;
if (exists) {
this.status = 403;
@@ -620,7 +614,7 @@ exports.addPackageAndDist = function *(next) {
mod.package.dist = dist;
_addDepsRelations(mod.package);
var addResult = yield Module.add(mod);
var addResult = yield* Package.addModule(mod);
debug('%s module: save file to %s, size: %d, sha1: %s, dist: %j, version: %s',
addResult.id, dist.tarball, dist.size, shasum, dist, version);
@@ -818,7 +812,7 @@ exports.removeWithVersions = function* (next) {
debug('no tag need to be remove');
}
// step 7: update last modified, make sure etag change
yield* Module.updateLastModified(name);
yield* Module.updateModuleLastModified(name);
this.status = 201;
this.body = { ok: true };
@@ -857,7 +851,7 @@ exports.removeTar = function* (next) {
var rs = yield [
Module.getById(id),
Module.get(name, version),
Package.getModule(name, version),
];
var revertTo = rs[0];
var mod = rs[1]; // module need to delete
@@ -1034,7 +1028,7 @@ exports.updateTag = function* () {
return;
}
var mod = yield Module.get(name, version);
var mod = yield* Package.getModule(name, version);
if (!mod) {
this.status = 403;
var reason = util.format('setting tag %s to unknown version: %s: %s/%s',

View File

@@ -39,7 +39,7 @@ exports.list = function* () {
var r = yield [
NpmModuleMaintainer.listByUsers(users),
// get the first user module by author field
Module.listNamesByAuthor(firstUser),
Package.listPublicModuleNamesByUser(firstUser),
];
var rows = r[0];
var firstUserModuleNames = r[1];

View File

@@ -177,7 +177,7 @@ CREATE TABLE IF NOT EXISTS `dist_dir` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(200) NOT NULL COMMENT 'user name',
`name` varchar(200) NOT NULL COMMENT 'dir name',
`parent` varchar(200) NOT NULL COMMENT 'parent dir' DEFAULT '/',
`date` varchar(20) COMMENT '02-May-2014 01:06',
PRIMARY KEY (`id`),
@@ -189,7 +189,7 @@ CREATE TABLE IF NOT EXISTS `dist_file` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(100) NOT NULL COMMENT 'user name',
`name` varchar(100) NOT NULL COMMENT 'file name',
`parent` varchar(200) NOT NULL COMMENT 'parent dir' DEFAULT '/',
`date` varchar(20) COMMENT '02-May-2014 01:06',
`size` int(10) unsigned NOT NULL COMMENT 'file size' DEFAULT '0',

64
models/dist_dir.js Normal file
View File

@@ -0,0 +1,64 @@
/**!
* cnpmjs.org - models/dist_dir.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `dist_dir` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(200) NOT NULL COMMENT 'dir name',
`parent` varchar(200) NOT NULL COMMENT 'parent dir' DEFAULT '/',
`date` varchar(20) COMMENT '02-May-2014 01:06',
PRIMARY KEY (`id`),
UNIQUE KEY `dist_dir_parent_name` (`parent`, `name`),
KEY `dist_dir_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='dist dir info';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('DistDir', {
name: {
type: DataTypes.STRING(200),
allowNull: false,
comment: 'dir name',
},
parent: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: '/',
comment: 'parent dir',
},
date: {
type: DataTypes.STRING(20),
allowNull: false,
comment: '02-May-2014 01:06'
}
}, {
tableName: 'dist_dir',
comment: 'dist dir info',
indexes: [
{
unique: true,
fields: ['parent', 'name']
},
{
fields: ['gmt_modified']
}
],
classMethods: {
}
});
};

82
models/dist_file.js Normal file
View File

@@ -0,0 +1,82 @@
/**!
* cnpmjs.org - models/dist_file.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `dist_file` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(100) NOT NULL COMMENT 'file name',
`parent` varchar(200) NOT NULL COMMENT 'parent dir' DEFAULT '/',
`date` varchar(20) COMMENT '02-May-2014 01:06',
`size` int(10) unsigned NOT NULL COMMENT 'file size' DEFAULT '0',
`sha1` varchar(40) COMMENT 'sha1 hex value',
`url` varchar(2048),
PRIMARY KEY (`id`),
UNIQUE KEY `dist_file_parent_name` (`parent`, `name`),
KEY `dist_file_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='dist file info';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('DistFile', {
name: {
type: DataTypes.STRING(200),
allowNull: false,
comment: 'dir name',
},
parent: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: '/',
comment: 'parent dir',
},
date: {
type: DataTypes.STRING(20),
allowNull: false,
comment: '02-May-2014 01:06'
},
size: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
defaultValue: 0,
comment: 'file size'
},
sha1: {
type: DataTypes.STRING(40),
allowNull: false,
comment: 'sha1 hex value'
},
url: {
type: DataTypes.STRING(2048),
allowNull: false
}
}, {
tableName: 'dist_file',
comment: 'dist file info',
indexes: [
{
unique: true,
fields: ['parent', 'name']
},
{
fields: ['gmt_modified']
}
],
classMethods: {
}
});
};

View File

@@ -21,9 +21,12 @@ function load(name) {
return sequelize.import(path.join(__dirname, name));
}
var models = module.exports = {
module.exports = {
sequelize: sequelize,
Module: load('module'),
ModuleKeyword: load('module_keyword'),
NpmModuleMaintainer: load('npm_module_maintainer'),
Tag: load('tag'),
User: load('user'),
Total: load('total'),
Download: load('download_total'),

View File

@@ -14,8 +14,6 @@
* Module dependencies.
*/
var utility = require('utility');
/*
CREATE TABLE IF NOT EXISTS `module` (
`id` INTEGER NOT NULL auto_increment ,
@@ -100,7 +98,11 @@ module.exports = function (sequelize, DataTypes) {
}
],
classMethods: {
findByNameAndVersion: function* (name, version) {
return yield this.find({
where: { name: name, version: version }
});
}
}
});
};

55
models/module_deps.js Normal file
View File

@@ -0,0 +1,55 @@
/**!
* cnpmjs.org - models/module_deps.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `module_deps` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
`deps` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'which module depend on this module',
PRIMARY KEY (`id`),
UNIQUE KEY `module_deps_name_deps` (`name`,`deps`),
KEY `name` (`module_deps_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='module deps';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('ModuleDeps', {
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
},
deps: {
type: DataTypes.STRING(100),
comment: 'which module depend on this module'
}
}, {
tableName: 'module_deps',
comment: 'module deps',
indexes: [
{
unique: true,
fields: ['name', 'deps']
},
{
fields: ['name']
}
],
classMethods: {
}
});
};

68
models/module_keyword.js Normal file
View File

@@ -0,0 +1,68 @@
/**!
* cnpmjs.org - models/module_keyword.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `module_keyword` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`keyword` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'keyword',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
`description` longtext,
PRIMARY KEY (`id`),
UNIQUE KEY `keyword_module_name` (`keyword`,`name`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='module keyword';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('ModuleKeyword', {
keyword: {
type: DataTypes.STRING(100),
allowNull: false,
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
},
description: {
type: DataTypes.LONGTEXT,
allowNull: true,
}
}, {
tableName: 'module_keyword',
comment: 'module keyword',
indexes: [
{
unique: true,
fields: ['keyword', 'name']
},
{
fields: ['name']
}
],
classMethods: {
findByKeywordAndName: function* (keyword, name) {
return yield this.find({
where: {
keyword: keyword,
name: name
}
});
}
}
});
};

56
models/module_log.js Normal file
View File

@@ -0,0 +1,56 @@
/**!
* cnpmjs.org - models/module_log.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `module_log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`username` varchar(100) NOT NULL,
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
`log` longtext,
PRIMARY KEY (`id`),
KEY `module_log_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='module sync log';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('ModuleLog', {
username: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'user name'
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
},
log: {
type: DataTypes.LONGTEXT
}
}, {
tableName: 'module_log',
comment: 'module sync log',
indexes: [
{
fields: ['name']
}
],
classMethods: {
}
});
};

View File

@@ -0,0 +1,56 @@
/**!
* cnpmjs.org - models/module_maintainer.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `module_maintainer` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`user` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'user name',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
PRIMARY KEY (`id`),
UNIQUE KEY `module_maintainer_user_name` (`user`,`name`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='private module maintainers';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('ModuleMaintainer', {
user: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'user name'
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
}
}, {
tableName: 'module_maintainer',
comment: 'private module maintainers',
indexes: [
{
unique: true,
fields: ['user', 'name']
},
{
fields: ['name']
}
],
classMethods: {
}
});
};

56
models/module_star.js Normal file
View File

@@ -0,0 +1,56 @@
/**!
* cnpmjs.org - models/module_star.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `module_star` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`user` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'user name',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
PRIMARY KEY (`id`),
UNIQUE KEY `user_module_name` (`user`,`name`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='module star';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('ModuleStar', {
user: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'user name'
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
}
}, {
tableName: 'module_star',
comment: 'module star',
indexes: [
{
unique: true,
fields: ['user', 'name']
},
{
fields: ['name']
}
],
classMethods: {
}
});
};

View File

@@ -0,0 +1,56 @@
/**!
* cnpmjs.org - models/module_unpublished.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `module_unpublished` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
`package` longtext CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'base info: tags, time, maintainers, description, versions',
PRIMARY KEY (`id`),
UNIQUE KEY `module_unpublished_name` (`name`),
KEY `module_unpublished_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='module unpublished info';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('ModuleUnpublished', {
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
},
package: {
type: DataTypes.LONGTEXT,
comment: 'base info: tags, time, maintainers, description, versions'
}
}, {
tableName: 'module_unpublished',
comment: 'module unpublished info',
indexes: [
{
unique: true,
fields: ['name']
},
{
fields: ['gmt_modified']
}
],
classMethods: {
}
});
};

View File

@@ -0,0 +1,63 @@
/**!
* cnpmjs.org - models/npm_module_maintainer.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `npm_module_maintainer` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`user` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'user name',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
PRIMARY KEY (`id`),
UNIQUE KEY `npm_module_maintainer_user_name` (`user`,`name`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='npm original module maintainers';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('NpmModuleMaintainer', {
user: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'user name'
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
}
}, {
tableName: 'npm_module_maintainer',
comment: 'npm original module maintainers',
indexes: [
{
unique: true,
fields: ['user', 'name']
},
{
fields: ['name']
}
],
classMethods: {
listByUser: function* (user) {
return yield this.findAll({
where: {
user: user
}
});
},
}
});
};

72
models/tag.js Normal file
View File

@@ -0,0 +1,72 @@
/**!
* cnpmjs.org - models/tag.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
/*
CREATE TABLE IF NOT EXISTS `tag` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'module name',
`tag` varchar(30) NOT NULL COMMENT 'tag name',
`version` varchar(30) NOT NULL COMMENT 'module version',
`module_id` bigint(20) unsigned NOT NULL COMMENT 'module id',
PRIMARY KEY (`id`),
UNIQUE KEY `tag_name_tag` (`name`, `tag`),
KEY `tag_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='module tag';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('Tag', {
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: 'module name',
},
tag: {
type: DataTypes.STRING(30),
allowNull: false,
comment: 'tag name',
},
version: {
type: DataTypes.STRING(30),
allowNull: false,
comment: 'module version',
},
module_id: {
type: DataTypes.BIGINT(20).UNSIGNED,
allowNull: false,
comment: 'module id'
}
}, {
tableName: 'tag',
comment: 'module tag',
indexes: [
{
unique: true,
fields: ['name', 'tag']
},
{
fields: ['gmt_modified']
}
],
classMethods: {
findByNameAndTag: function* (name, tag) {
return yield this.find({ where: { name: name, tag: tag } });
}
}
});
};

View File

@@ -14,8 +14,6 @@
* Module dependencies.
*/
var utility = require('utility');
// CREATE TABLE IF NOT EXISTS `total` (
// `name` varchar(100) NOT NULL COMMENT 'total name',
// `gmt_modified` datetime NOT NULL COMMENT 'modified time',

View File

@@ -16,6 +16,29 @@
var utility = require('utility');
/*
CREATE TABLE IF NOT EXISTS `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`gmt_create` datetime NOT NULL COMMENT 'create time',
`gmt_modified` datetime NOT NULL COMMENT 'modified time',
`name` varchar(100) NOT NULL COMMENT 'user name',
`salt` varchar(100) NOT NULL,
`password_sha` varchar(100) NOT NULL COMMENT 'user password hash',
`ip` varchar(64) NOT NULL COMMENT 'user last request ip',
`roles` varchar(200) NOT NULL DEFAULT '[]',
`rev` varchar(40) NOT NULL,
`email` varchar(400) NOT NULL,
`json` longtext CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'json details',
`npm_user` tinyint(1) DEFAULT '0' COMMENT 'user sync from npm or not, 1: true, other: false',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='user base info';
-- ALTER TABLE `user`
-- ADD `json` longtext CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'json details',
-- ADD `npm_user` tinyint(1) DEFAULT '0' COMMENT 'user sync from npm or not, 1: true, other: false';
*/
module.exports = function (sequelize, DataTypes) {
return sequelize.define('User', {
name: {

View File

@@ -1,778 +0,0 @@
/**!
* cnpmjs.org - proxy/module.js
*
* Copyright(c) cnpmjs.org and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/* jshint -W032 */
/**
* Module dependencies.
*/
var thunkify = require('thunkify-wrap');
var utility = require('utility');
var eventproxy = require('eventproxy');
var config = require('../config');
var mysql = require('../common/mysql');
var multiline = require('multiline');
var INSERT_MODULE_SQL = multiline(function () {;/*
INSERT INTO
module(gmt_create, gmt_modified, publish_time, author, name, version,
package, dist_tarball, dist_shasum, dist_size, description)
VALUES
(now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
gmt_modified=now(),
publish_time=VALUES(publish_time),
description=VALUES(description),
author=VALUES(author),
name=VALUES(name),
version=VALUES(version),
package=VALUES(package),
dist_tarball=VALUES(dist_tarball),
dist_shasum=VALUES(dist_shasum),
dist_size=VALUES(dist_size);
*/});
exports.add = function (mod, callback) {
var keywords = mod.package.keywords;
var pkg;
try {
pkg = stringifyPackage(mod.package);
} catch (e) {
return callback(e);
}
var description = mod.package && mod.package.description || '';
var dist = mod.package.dist || {};
dist.tarball = '';
dist.shasum = '';
dist.size = 0;
var publish_time = mod.publish_time || Date.now();
var values = [
publish_time,
mod.author, // meaning first maintainer, more maintainers please check module_maintainer table
mod.name, mod.version, pkg,
dist.tarball, dist.shasum, dist.size, description
];
mysql.query(INSERT_MODULE_SQL, values, function (err, result) {
if (err) {
return callback(err);
}
callback(null, {id: result.insertId, gmt_modified: new Date()});
if (typeof keywords === 'string') {
keywords = [keywords];
}
if (!Array.isArray(keywords)) {
return;
}
var words = [];
for (var i = 0; i < keywords.length; i++) {
var w = keywords[i];
if (typeof w === 'string') {
w = w.trim();
if (w) {
words.push(w);
}
}
}
if (words.length === 0) {
return;
}
// add keywords
exports.addKeywords(mod, description, words, utility.noop);
});
};
var GET_KEYWORD_SQL = multiline(function () {;/*
SELECT
keyword
FROM
module_keyword
WHERE
name = ?
ORDER BY
keyword;
*/});
exports.getKeywords = function (name, callback) {
mysql.query(GET_KEYWORD_SQL, [name], function (err, rows) {
var keywords = [];
if (rows && rows.length) {
keywords = rows.map(function (r) {
return r.keyword;
});
}
callback(err, keywords);
});
};
var ADD_KEYWORD_SQL = multiline(function () {;/*
INSERT INTO
module_keyword(gmt_create, keyword, name, description)
VALUES
(now(), ?, ?, ?)
ON DUPLICATE KEY UPDATE
description=VALUES(description);
*/});
exports.addKeywords = function (name, description, keywords, callback) {
var sql = '';
var values = [];
for (var i = 0; i < keywords.length; i++) {
sql += ADD_KEYWORD_SQL;
values.push(keywords[i]);
values.push(name);
values.push(description);
}
mysql.query(sql, values, function (err, results) {
if (err) {
return callback(err);
}
var ids = [];
for (var i = 0; i < results.length; i++) {
var r = results[i];
if (r.insertId) {
ids.push(r.insertId);
}
}
callback(null, ids);
});
};
var UPDATE_DESC_SQL = multiline(function () {;/*
UPDATE
module
SET
description=?
WHERE
id=?;
*/});
exports.updateDescription = function (id, description, callback) {
mysql.query(UPDATE_DESC_SQL, [description, id], callback);
};
var UPDATE_DIST_SQL = 'UPDATE module SET ? WHERE id=?';
exports.update = function (mod, callback) {
var pkg;
try {
pkg = stringifyPackage(mod.package);
} catch (e) {
return callback(e);
}
var dist = mod.package.dist;
var arg = {
publish_time: mod.publish_time,
version: mod.version,
package: pkg,
dist_tarball: dist.tarball,
dist_shasum: dist.shasum,
dist_size: dist.size
};
mysql.query(UPDATE_DIST_SQL,
[arg, mod.id],
function (err, result) {
if (err) {
return callback(err);
}
callback(null, {id: mod.id, gmt_modified: new Date()});
});
};
function parseRow(row) {
if (row && row.package) {
try {
if (row.package.indexOf('%7B%22') === 0) {
// now store package will encodeURIComponent() after JSON.stringify
row.package = decodeURIComponent(row.package);
}
row.package = JSON.parse(row.package);
} catch (e) {
console.warn('parse package error: %s, id: %s version: %s, error: %s', row.name, row.id, row.version, e);
}
}
}
exports.parseRow = parseRow;
function stringifyPackage(pkg) {
return encodeURIComponent(JSON.stringify(pkg));
}
var SELECT_MODULE_BY_ID_SQL = multiline(function () {;/*
SELECT
id, publish_time, gmt_create, gmt_modified, author, name,
version, description, package, dist_tarball, dist_shasum, dist_size
FROM
module
WHERE
id=?;
*/});
exports.getById = function (id, callback) {
id = Number(id);
mysql.queryOne(SELECT_MODULE_BY_ID_SQL, [id], function (err, row) {
if (err || !row) {
return callback(err, row);
}
try {
parseRow(row);
} catch (e) {
e.data = row;
return callback(e);
}
callback(null, row);
});
};
var SELECT_MODULE_SQL = multiline(function () {;/*
SELECT
id, publish_time, gmt_create, gmt_modified, author, name,
version, description, package, dist_tarball, dist_shasum, dist_size
FROM
module
WHERE
name=? AND version=?;
*/});
exports.get = function (name, version, callback) {
mysql.queryOne(SELECT_MODULE_SQL, [name, version], function (err, row) {
if (err || !row) {
return callback(err, row);
}
try {
parseRow(row);
} catch (e) {
e.data = row;
return callback(e);
}
callback(null, row);
});
};
var SELECT_MODULE_ID_SQL = multiline(function () {;/*
SELECT
id
FROM
module
WHERE
name=? AND version=?;
*/});
var INSERT_TAG_SQL = multiline(function () {;/*
INSERT INTO
tag(gmt_create, gmt_modified, name, tag, version, module_id)
VALUES
(now(), now(), ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
gmt_modified=now(),
module_id=VALUES(module_id),
name=VALUES(name),
tag=VALUES(tag),
version=VALUES(version);
*/});
exports.addTag = function (name, tag, version, callback) {
mysql.queryOne(SELECT_MODULE_ID_SQL, [name, version], function (err, row) {
if (err) {
return callback(err);
}
var module_id = row && row.id || 0;
mysql.query(INSERT_TAG_SQL, [name, tag, version, module_id], function (err, result) {
if (err) {
return callback(err);
}
callback(null, {id: result.insertId, gmt_modified: new Date(), module_id: module_id});
});
});
};
var SELECT_TAG_SQL = multiline(function () {;/*
SELECT
tag, version, gmt_modified, module_id
FROM
tag
WHERE
name=? AND tag=?;
*/});
exports.getByTag = function (name, tag, callback) {
mysql.queryOne(SELECT_TAG_SQL, [name, tag], function (err, row) {
if (err || !row) {
return callback(err, row);
}
exports.get(name, row.version, callback);
});
};
var DELETE_TAGS_SQL = multiline(function () {;/*
DELETE FROM
tag
WHERE
name=?;
*/});
exports.removeTags = function (name, callback) {
mysql.query(DELETE_TAGS_SQL, [name], callback);
};
var DELETE_TAGS_BY_IDS_SQL = multiline(function () {;/*
DELETE FROM
tag
WHERE
id IN (?);
*/});
exports.removeTagsByIds = function (ids, callback) {
mysql.query(DELETE_TAGS_BY_IDS_SQL, [ids], callback);
};
var SELECT_ALL_TAGS_SQL = multiline(function () {;/*
SELECT
id, tag, version, gmt_modified, module_id
FROM
tag
WHERE
name=?;
*/});
exports.listTags = function (name, callback) {
mysql.query(SELECT_ALL_TAGS_SQL, [name], callback);
};
var SELECT_LATEST_MODULE_SQL = multiline(function () {;/*
SELECT
id, publish_time, gmt_create, gmt_modified, author, name,
version, description, package, dist_tarball, dist_shasum, dist_size
FROM
module
WHERE
name=? AND version <> "next"
ORDER BY
publish_time DESC
LIMIT
1;
*/});
exports.getLatest = function (name, callback) {
exports.getByTag(name, 'latest', function (err, row) {
if (err || row) {
return callback(err, row);
}
// get latest order by id
mysql.queryOne(SELECT_LATEST_MODULE_SQL, [name], function (err, row) {
if (err || !row) {
return callback(err, row);
}
try {
parseRow(row);
} catch (e) {
e.data = row;
return callback(e);
}
callback(null, row);
});
});
};
var LIST_MODULE_SQL = multiline(function () {;/*
SELECT
id, publish_time, gmt_create, gmt_modified, author, name,
version, description, package, dist_tarball, dist_shasum, dist_size
FROM
module
WHERE
name=?
ORDER BY
id DESC;
*/});
exports.listByName = function (name, callback) {
mysql.query(LIST_MODULE_SQL, [name], function (err, rows) {
if (err) {
return callback(err);
}
rows = rows || [];
try {
for (var i = 0; i < rows.length; i++) {
parseRow(rows[i]);
}
} catch (e) {
err = e;
err.data = rows;
}
callback(err, rows);
});
};
var LIST_SINCE_SQL = multiline(function () {;/*
SELECT
distinct(name)
FROM
tag
WHERE
gmt_modified > ?;
*/});
exports.listSince = function (start, callback) {
mysql.query(LIST_SINCE_SQL, [new Date(start)], callback);
};
var LIST_ALL_NAME_SQL = multiline(function () {;/*
SELECT
distinct(name)
FROM
module;
*/});
exports.listAllNames = function (callback) {
mysql.query(LIST_ALL_NAME_SQL, [], callback);
};
var LIST_SHORT_SQL = multiline(function () {;/*
SELECT
distinct(name)
FROM
tag
ORDER BY
name;
*/});
exports.listShort = function (callback) {
mysql.query(LIST_SHORT_SQL, callback);
};
var LIST_ALL_MODULE_NAMES_SQL = multiline(function () {;/*
SELECT
distinct(name)
FROM
module
ORDER BY
name;
*/});
exports.listAllModuleNames = function (callback) {
mysql.query(LIST_ALL_MODULE_NAMES_SQL, callback);
};
var DELETE_MODULE_BY_NAME_SQL = multiline(function () {;/*
DELETE FROM
module
WHERE
name=?;
*/});
exports.removeByName = function (name, callback) {
mysql.query(DELETE_MODULE_BY_NAME_SQL, [name], callback);
};
var DELETE_MODULE_BY_NAME_AND_VERSIONS_SQL = multiline(function () {;/*
DELETE FROM
module
WHERE
name=? AND version in(?);
*/});
exports.removeByNameAndVersions = function (name, versions, callback) {
mysql.query(DELETE_MODULE_BY_NAME_AND_VERSIONS_SQL, [name, versions], callback);
};
var SEARCH_MODULES_SQL = multiline(function () {;/*
SELECT
module_id
FROM
tag
WHERE
LOWER(name) LIKE LOWER(?) AND tag="latest"
ORDER BY
name
LIMIT
?;
*/});
var SEARCH_MODULES_BY_KEYWORD_SQL = multiline(function () {;/*
SELECT
name, description
FROM
module_keyword
WHERE
keyword=?
ORDER BY
id DESC
LIMIT
?;
*/});
var QUERY_MODULES_BY_ID_SQL = multiline(function () {;/*
SELECT
name, description
FROM
module
WHERE
id IN (?)
ORDER BY
name;
*/});
exports.search = function (word, options, callback) {
if (typeof options === 'function') {
callback = options;
options = null;
}
options = options || {};
var limit = options.limit || 100;
word = word.replace(/^%/, ''); //ignore prefix %
var ep = eventproxy.create();
ep.fail(callback);
// search flows:
// 1. prefix search by name
// 2. like search by name
// 3. keyword equal search
var ids = {};
mysql.query(SEARCH_MODULES_SQL, [word + '%', limit ], ep.done(function (rows) {
rows = rows || [];
if (rows.length > 0) {
for (var i = 0; i < rows.length; i++) {
ids[rows[i].module_id] = 1;
}
}
if (rows.length >= 20) {
return ep.emit('ids', Object.keys(ids));
}
mysql.query(SEARCH_MODULES_SQL, [ '%' + word + '%', limit ], ep.done('likeSearch'));
}));
mysql.query(SEARCH_MODULES_BY_KEYWORD_SQL, [ word, limit ], ep.done('keywordRows'));
ep.on('likeSearch', function (rows) {
rows = rows || [];
if (rows.length > 0) {
for (var i = 0; i < rows.length; i++) {
ids[rows[i].module_id] = 1;
}
}
ep.emit('ids', Object.keys(ids));
});
ep.all('ids', 'keywordRows', function (ids, keywordRows) {
keywordRows = keywordRows || [];
var data = {
keywordMatchs: keywordRows,
searchMatchs: []
};
if (ids.length === 0) {
return callback(null, data);
}
mysql.query(QUERY_MODULES_BY_ID_SQL, [ids], ep.done(function (modules) {
data.searchMatchs = modules;
callback(null, data);
}));
});
};
thunkify(exports);
var GET_LAST_MODIFIED_MODULE_SQL = multiline(function () {;/*
SELECT
id, gmt_modified
FROM
module
WHERE
name=?
ORDER BY
gmt_modified DESC
LIMIT 1;
*/});
exports.getLastModified = function* (name) {
var row = yield mysql.queryOne(GET_LAST_MODIFIED_MODULE_SQL, [name]);
return row && row.gmt_modified;
};
var UPDATE_LAST_MODIFIED_SQL = 'UPDATE module SET gmt_modified=now() WHERE id=?;';
exports.updateLastModified = function* (name) {
var row = yield mysql.queryOne(GET_LAST_MODIFIED_MODULE_SQL, [name]);
if (row) {
yield mysql.query(UPDATE_LAST_MODIFIED_SQL, [row.id]);
}
};
var DELETE_TAGS_BY_NAMES_SQL = 'DELETE FROM tag WHERE name=? AND tag IN (?);';
exports.removeTagsByNames = function* (moduleName, tagNames) {
return yield mysql.query(DELETE_TAGS_BY_NAMES_SQL, [moduleName, tagNames]);
};
/**
* forward compatbility for update from lower version cnpmjs.org
* redirect @scope/name => name
*/
exports.getAdaptName = function* (name) {
if (!config.scopes
|| !config.scopes.length
|| !config.adaptScope) {
return;
}
var tmp = name.split('/');
var scope = tmp[0];
name = tmp[1];
if (config.scopes.indexOf(scope) === -1) {
return;
}
var pkg = yield exports.getByTag(name, 'latest');
// only private module can adapt
if (pkg && pkg.package._publish_on_cnpm) {
return name;
}
return;
};
exports.listPrivates = function* () {
var scopes = config.scopes;
if (!scopes || !scopes.length) {
return [];
}
var privatePackages = config.privatePackages || [];
var args = [];
var sql = 'SELECT module_id AS id FROM tag WHERE tag="latest" AND (';
var wheres = [];
scopes.forEach(function (scope) {
wheres.push('name LIKE ?');
args.push(scope + '%');
});
if (privatePackages.length) {
wheres.push('name in (?)');
args.push(privatePackages);
}
sql = sql + wheres.join(' OR ') + ')';
var ids = yield mysql.query(sql, args);
ids = ids.map(function (row) {
return row.id;
});
if (!ids.length) {
return [];
}
return yield mysql.query(QUERY_MODULES_BY_ID_SQL, [ids]);
};
var LIST_BY_AUTH_SQLS = [];
LIST_BY_AUTH_SQLS.push(multiline(function () {;/*
SELECT
distinct(name) AS name
FROM
module
WHERE
author=?
ORDER BY
publish_time DESC
LIMIT
100;
*/}));
LIST_BY_AUTH_SQLS.push(multiline(function () {;/*
SELECT
name
FROM
module_maintainer
WHERE
user = ?
*/}));
LIST_BY_AUTH_SQLS.push(multiline(function () {;/*
SELECT
module_id
FROM
tag
WHERE
tag="latest" AND name IN (?);
*/}));
LIST_BY_AUTH_SQLS.push(multiline(function () {;/*
SELECT
name, description
FROM
module
WHERE
id IN (?)
ORDER BY
publish_time DESC;
*/}));
exports.listByAuthor = function* (author) {
var names = yield [
mysql.query(LIST_BY_AUTH_SQLS[0], [author]),
mysql.query(LIST_BY_AUTH_SQLS[1], [author])
];
names = names[0].concat(names[1]).map(function (n) {
return n.name;
}).sort();
if (!names.length) {
return [];
}
var ids = yield mysql.query(LIST_BY_AUTH_SQLS[2], [names]);
if (!ids.length) {
return [];
}
ids = ids.map(function (i) {
return i.module_id;
});
return yield mysql.query(LIST_BY_AUTH_SQLS[3], [ids]);
};
exports.listNamesByAuthor = function* (author) {
var sql = 'SELECT distinct(name) AS name FROM module WHERE author=?;';
var names = yield mysql.query(sql, [author]);
return names.map(function (item) {
return item.name;
});
};
var UPDATE_PACKAGE_SQL = multiline(function () {;/*
UPDATE
module
SET
package=?
WHERE
id=?;
*/});
exports.updatePackage = function* (id, pkg) {
pkg = stringifyPackage(pkg);
return yield mysql.query(UPDATE_PACKAGE_SQL, [pkg, id]);
};
exports.updatePackageFields = function* (id, fields) {
var data = yield exports.getById(id);
if (!data) {
throw new Error('module#' + id + ' not exists');
}
data.package = data.package || {};
for (var k in fields) {
data.package[k] = fields[k];
}
return yield* exports.updatePackage(id, data.package);
};
exports.updateReadme = function* (id, readme) {
var data = yield exports.getById(id);
if (!data) {
throw new Error('module#' + id + ' not exists');
}
data.package = data.package || {};
data.package.readme = readme;
return yield* exports.updatePackage(id, data.package);
};
exports.getTag = function* (name, tag) {
return yield mysql.queryOne(SELECT_TAG_SQL, [name, tag]);
};

View File

@@ -28,7 +28,6 @@ var crypto = require('crypto');
var sleep = require('co-sleep');
var urllib = require('../common/urllib');
var utility = require('utility');
var ms = require('ms');
var urlparse = require('url').parse;
var nfs = require('../common/nfs');
var npm = require('./npm');
@@ -522,7 +521,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
},
};
try {
var result = yield Module.add(nextMod);
var result = yield* Package.addModule(nextMod);
that.log(' [%s] save next module, %j', name, result);
} catch (err) {
that.log(' [%s] save next module error %s', err.message);
@@ -1002,7 +1001,7 @@ SyncModuleWorker.prototype._syncOneVersion = function *(versionIndex, sourcePack
}
mod.package.dist = dist;
var r = yield Module.add(mod);
var r = yield* Package.addModule(mod);
that.log(' [%s:%s] done, insertId: %s, author: %s, version: %s, '
+ 'size: %d, publish_time: %j, publish on cnpm: %s',

View File

@@ -56,6 +56,7 @@ routes(app);
app.on('error', function (err, ctx) {
console.log(err);
console.log(err.stack);
err.url = err.url || ctx.request.url;
logger.error(err);
});

View File

@@ -14,9 +14,368 @@
* Module dependencies.
*/
var Module = require('../proxy/module');
var ModuleMaintainer = require('../proxy/module_maintainer');
var User = require('../proxy/user');
var models = require('../models');
var Module = models.Module;
var ModuleKeyword = models.ModuleKeyword;
var NpmModuleMaintainer = models.NpmModuleMaintainer;
var ModuleMaintainer = models.ModuleMaintainer;
var Tag = models.Tag;
// module
// module:read
function parseRow(row) {
if (row && row.package) {
try {
if (row.package.indexOf('%7B%22') === 0) {
// now store package will encodeURIComponent() after JSON.stringify
row.package = decodeURIComponent(row.package);
}
row.package = JSON.parse(row.package);
} catch (e) {
console.warn('parse package error: %s, id: %s version: %s, error: %s', row.name, row.id, row.version, e);
}
}
}
exports.parseRow = parseRow;
function stringifyPackage(pkg) {
return encodeURIComponent(JSON.stringify(pkg));
}
exports.getModuleById = function* (id) {
var row = yield Module.find(Number(id));
parseRow(row);
return row;
};
exports.getModule = function* (name, version) {
var row = yield* Module.findByNameAndVersion(name, version);
parseRow(row);
return row;
};
exports.getModuleByTag = function* (name, tag) {
var tag = yield* Tag.findByNameAndTag(name, tag);
if (!tag) {
return null;
}
return yield* exports.getModule(tag.name, tag.version);
};
// module:list
exports.listPrivateModulesByScope = function* (scope) {
var tags = yield Tag.findAll({
where: {
tag: 'latest',
name: {
like: scope + '%'
}
}
});
if (tags.length === 0) {
return [];
}
var ids = tags.map(function (tag) {
return tag.module_id;
});
return yield Module.findAll({
where: {
id: ids
}
});
};
exports.listPublicModulesByUser = function* (username) {
var names = yield* exports.listPublicModuleNamesByUser(username);
if (names.length === 0) {
return [];
}
// fetch latest module tags
var tags = yield Tag.findAll({
where: {
name: names,
tag: 'latest'
}
});
if (tags.length === 0) {
return [];
}
var ids = tags.map(function (tag) {
return tag.module_id;
});
return yield Module.findAll({
where: {
id: ids
},
attributes: [
'name', 'description'
]
});
};
// return user all public package names
exports.listPublicModuleNamesByUser = function* (username) {
var sql = 'SELECT distinct(name) AS name FROM module WHERE author=?;';
var rows = yield* models.query(sql, [username]);
var map = {};
var names = rows.map(function (r) {
return r.name;
}).filter(function (name) {
var matched = name[0] !== '@';
if (matched) {
map[name] = 1;
}
return matched;
});
// find from npm module maintainer table
var items = yield* NpmModuleMaintainer.listByUser(username);
items.forEach(function (item) {
if (!map[item.name]) {
names.push(item.name);
}
});
return names;
};
// start must be a date or timestamp
exports.listPublicModuleNamesSince = function* (start) {
if (!(start instanceof Date)) {
start = new Date(Number(start));
}
var rows = yield Tag.findAll({
attributes: ['name'],
where: {
gmt_modified: {
gt: start
}
},
});
var names = {};
for (var i = 0; i < rows.length; i++) {
names[rows[i].name] = 1;
}
return Object.keys(names);
};
exports.listAllPublicModuleNames = function* () {
var sql = 'SELECT DISTINCT(name) AS name FROM tag ORDER BY name';
var rows = yield models.query(sql);
return rows.filter(function (row) {
return row.name[0] !== '@';
}).map(function (row) {
return row.name;
});
};
exports.listModulesByName = function* (moduleName) {
var mods = yield Module.findAll({
where: {
name: moduleName
},
order: [ ['id', 'DESC'] ]
});
return mods.map(function (mod) {
parseRow(mod);
return mod;
});
};
exports.getModuleLastModified = function* (name) {
var sql = 'SELECT gmt_modified FROM module WHERE name = ? ORDER BY gmt_modified DESC LIMIT 1';
var row = yield models.queryOne(sql, [name]);
return row && row.gmt_modified || null;
};
// module:update
exports.saveModule = function* (mod) {
var keywords = mod.package.keywords;
if (typeof keywords === 'string') {
keywords = [keywords];
}
var pkg = stringifyPackage(mod.package);
var description = mod.package && mod.package.description || '';
var dist = mod.package.dist || {};
// dist.tarball = '';
// dist.shasum = '';
// dist.size = 0;
var publish_time = mod.publish_time || Date.now();
var item = yield* Module.findByNameAndVersion(mod.name, mod.version);
if (!item) {
item = Module.build({
name: mod.name,
version: mod.version
});
}
item.publish_time = publish_time;
// meaning first maintainer, more maintainers please check module_maintainer table
item.author = mod.author;
item.package = pkg;
item.dist_tarball = dist.tarball;
item.dist_shasum = dist.shasum;
item.dist_size = dist.size;
item.description = description;
var newItem = yield item.save();
var result = {
id: newItem.id,
gmt_modified: newItem.gmt_modified
};
if (!Array.isArray(keywords)) {
return result;
}
var words = [];
for (var i = 0; i < keywords.length; i++) {
var w = keywords[i];
if (typeof w === 'string') {
w = w.trim();
if (w) {
words.push(w);
}
}
}
if (words.length > 0) {
// add keywords
yield* exports.addKeywords(mod.name, description, words);
}
return result;
};
exports.updateModulePackage = function* (id, pkg) {
var mod = yield Module.find(Number(id));
if (!mod) {
// not exists
return null;
}
mod.package = stringifyPackage(pkg);
return yield mod.save(['package']);
};
exports.updateModulePackageFields = function* (id, fields) {
var mod = yield* exports.getModuleById(id);
if (!mod) {
return null;
}
var pkg = mod.package || {};
for (var k in fields) {
pkg[k] = fields[k];
}
return yield* exports.updateModulePackage(id, pkg);
};
exports.updateModuleReadme = function* (id, readme) {
var mod = yield* exports.getModuleById(id);
if (!mod) {
return null;
}
var pkg = mod.package || {};
pkg.readme = readme;
return yield* exports.updateModulePackage(id, pkg);
};
exports.updateModuleDescription = function* (id, description) {
var mod = yield* exports.getModuleById(id);
if (!mod) {
return null;
}
mod.description = description;
// also need to update package.description
var pkg = mod.package || {};
pkg.description = description;
mod.package = stringifyPackage(pkg);
return yield mod.save(['description', 'package']);
};
exports.updateModuleLastModified = function* (name) {
var row = yield Module.find({
where: { name: name },
order: [ [ 'gmt_modified', 'DESC' ] ],
});
if (!row) {
return null;
}
row.gmt_modified = new Date();
return yield row.save(['gmt_modified']);
};
exports.removeModulesByName = function* (name) {
yield Module.destroy({
where: {
name: name
}
});
};
exports.removeModulesByNameAndVersions = function* (name, versions) {
yield Module.destroy({
where: {
name: name,
version: versions
}
});
};
// tags
exports.addModuleTag = function* (name, tag, version) {
var mod = yield* exports.getModule(name, version);
if (!mod) {
return null;
}
var row = yield* Tag.findByNameAndTag(name, tag);
if (!row) {
row = Tag.build({
name: name,
tag: tag
});
}
row.module_id = mod.id;
row.version = version;
yield row.save();
return {id: row.id, gmt_modified: row.gmt_modified, module_id: row.module_id};
};
exports.getModuleTag = function* (name, tag) {
return yield Tag.findByNameAndTag(name, tag);
};
exports.removeModuleTagsByName = function* (name) {
return yield Tag.destroy({where: {name: name}});
};
exports.removeModuleTagsByIds = function* (ids) {
return yield Tag.destroy({where: {id: ids}});
};
exports.removeModuleTagsByNames = function* (moduleName, tagNames) {
return yield Tag.destroy({
where: {
name: moduleName,
tag: tagNames
}
});
};
exports.listModuleTags = function* (name) {
return yield Tag.findAll({ where: { name: name } });
};
// maintainers
exports.listMaintainers = function* (name) {
var names = yield* ModuleMaintainer.get(name);
@@ -43,7 +402,7 @@ exports.addMaintainers = function* (name, usernames) {
exports.updateMaintainers = function* (name, usernames) {
var rs = yield [
ModuleMaintainer.update(name, usernames),
Module.updateLastModified(name),
exports.updateModuleLastModified(name),
];
return rs[0];
};
@@ -92,3 +451,81 @@ exports.isMaintainer = function* (name, username) {
var result = yield* exports.authMaintainer(name, username);
return result.isMaintainer;
};
// module keywords
exports.addKeyword = function* (data) {
var item = yield ModuleKeyword.findByKeywordAndName(data.keyword, data.name);
if (!item) {
item = ModuleKeyword.build(data);
}
item.description = data.description;
return yield item.save();
};
exports.addKeywords = function* (name, description, keywords) {
var tasks = [];
keywords.forEach(function (keyword) {
tasks.push(exports.addKeyword({
name: name,
keyword: keyword,
description: description
}));
});
return yield tasks;
};
// search
exports.search = function* (word, options) {
options = options || {};
var limit = options.limit || 100;
word = word.replace(/^%/, ''); //ignore prefix %
// search flows:
// 1. prefix search by name
// 2. like search by name
// 3. keyword equal search
var ids = {};
var sql = 'SELECT module_id FROM tag WHERE LOWER(name) LIKE LOWER(?) AND tag="latest" \
ORDER BY name LIMIT ?;';
var rows = yield* models.query(sql, [word + '%', limit ]);
for (var i = 0; i < rows.length; i++) {
ids[rows[i].module_id] = 1;
}
if (rows.length < 20) {
rows = yield* models.query(sql, [ '%' + word + '%', limit ]);
for (var i = 0; i < rows.length; i++) {
ids[rows[i].module_id] = 1;
}
}
var keywordRows = yield ModuleKeyword.findAll({
attributes: [ 'name', 'description' ],
where: {
keyword: word
},
limit: limit,
order: [ [ 'id', 'DESC' ] ]
});
var data = {
keywordMatchs: keywordRows,
searchMatchs: []
};
ids = Object.keys(ids);
if (ids.length > 0) {
data.searchMatchs = yield Module.findAll({
attributes: [ 'name', 'description' ],
where: {
id: ids
},
order: 'name'
});
}
return data;
};

View File

@@ -14,8 +14,6 @@
* Module dependencies.
*/
var fs = require('fs');
var path = require('path');
var should = require('should');
var request = require('supertest');
var mm = require('mm');
@@ -23,9 +21,7 @@ var pedding = require('pedding');
var app = require('../../../servers/registry');
var utils = require('../../utils');
var fixtures = path.join(path.dirname(path.dirname(__dirname)), 'fixtures');
describe('controllers/registry/deprecate.test.js', function () {
describe.only('controllers/registry/deprecate.test.js', function () {
var pkgname = 'testmodule-deprecate';
before(function (done) {
done = pedding(2, done);

View File

@@ -1,209 +0,0 @@
/**!
* cnpmjs.org - test/proxy/module.test.js
*
* Copyright(c) cnpmjs.org and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
var should = require('should');
var mm = require('mm');
var fs = require('fs');
var path = require('path');
var request = require('supertest');
var mysql = require('../../common/mysql');
var Module = require('../../proxy/module');
var config = require('../../config');
var utils = require('../utils');
var app = require('../../servers/registry');
var fixtures = path.join(path.dirname(__dirname), 'fixtures');
var id;
var pkgname = 'module-proxy-test-pkg';
var pkgversion = '1.0.0';
describe('proxy/module.test.js', function () {
before(function (done) {
var pkg = utils.getPackage(pkgname, pkgversion, utils.admin);
request(app.listen())
.put('/' + pkgname)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, done);
});
afterEach(mm.restore);
describe('addTag()', function () {
it('should add tag auto add module id', function (done) {
Module.addTag('mocha', 'test', '1.15.1', function (err, result) {
should.not.exist(err);
result.should.have.keys('id', 'gmt_modified', 'module_id');
done();
});
});
});
describe('search()', function () {
before(function (done) {
Module.addKeywords('aaaa', 'mock aaaaaa', ['aa', 'bb', 'cc'], function (err, results) {
should.not.exist(err);
results.should.be.an.Array;
results.should.length(3);
done();
});
});
it.skip('should search modules', function (done) {
Module.search('mock', function (err, data) {
should.not.exist(err);
data.should.have.keys('keywordMatchs', 'searchMatchs');
data.searchMatchs.length.should.above(0);
data.searchMatchs.forEach(function (row) {
row.should.have.keys('name', 'description');
});
done();
});
});
it('should search match keywords modules', function (done) {
Module.search('aa', function (err, data) {
should.not.exist(err);
data.should.have.keys('keywordMatchs', 'searchMatchs');
data.keywordMatchs.length.should.above(0);
data.keywordMatchs.forEach(function (row) {
row.should.have.keys('name', 'description');
});
done();
});
});
it('should search return empty', function (done) {
Module.search('emptyemptyemptyempty', function (err, data) {
should.not.exist(err);
data.should.eql({
keywordMatchs: [],
searchMatchs: []
});
done();
});
});
});
var mockName = 'aa' + Date.now();
describe('addKeywords()', function () {
it('should add diff keywords to module', function (done) {
Module.addKeywords(mockName, mockName, ['aa', 'bb', 'cc'], function (err, results) {
should.not.exist(err);
results.should.be.an.Array;
results.should.length(3);
done();
});
});
it('should add same keywords to module', function (done) {
Module.addKeywords(mockName, 'desc aa', ['aa', 'bb', 'cc'], function (err, results) {
should.not.exist(err);
results.should.be.an.Array;
results.should.length(3);
// results.should.length(0);
done();
});
});
});
describe('getKeywords()', function () {
it('should get aa module keywords', function (done) {
Module.getKeywords(mockName, function (err, keywords) {
should.not.exist(err);
keywords.should.eql(['aa', 'bb', 'cc']);
done();
});
});
});
describe('add()', function () {
it('should success ad he@0.3.6', function (done) {
var sourcePackage = require('../fixtures/0.3.6.json');
var mod = {
version: sourcePackage.version,
name: sourcePackage.name,
package: sourcePackage,
author: 'unittest',
publish_time: sourcePackage.publish_time || Date.now(),
};
var dist = {
tarball: 'http://registry.npmjs.org/he/-/he-0.3.6.tgz',
shasum: '9d7bc446e77963933301dd602d5731cb861135e0',
size: 100,
};
mod.package.dist = dist;
Module.add(mod, function (err, result) {
id = result.id;
should.not.exist(err);
Module.getById(result.id, function (err, row) {
should.not.exist(err);
row.package.readme.should.equal(sourcePackage.readme);
done();
});
});
});
});
describe('listByAuthor()', function () {
it('should return author recent modules', function* () {
var rows = yield Module.listByAuthor('fengmk2');
rows.forEach(function (r) {
r.should.have.keys('name', 'description');
});
});
});
describe('updateReadme()', function () {
it('should update ok', function* () {
var row = yield Module.get(pkgname, pkgversion);
should.exist(row);
yield* Module.updateReadme(row.id, 'test');
var data = yield Module.getById(row.id);
data.package.readme.should.equal('test');
});
});
describe('removeTagsByNames()', function () {
it('should work', function* () {
yield* Module.removeTagsByNames('foo', ['latest', '1.0']);
});
});
describe('listPrivates()', function () {
it('should response [] if scopes not present', function* () {
mm(config, 'scopes', []);
var modules = yield Module.listPrivates();
modules.should.eql([]);
});
it('should response [] if private modules not present', function* () {
mm(config, 'privatePackages', []);
mm(config, 'scopes', ['@not-exist']);
var modules = yield Module.listPrivates();
modules.should.eql([]);
});
it('should work', function* () {
var modules = yield Module.listPrivates();
modules.forEach(function (m) {
m.should.have.keys(['name', 'description']);
});
});
});
});

View File

@@ -0,0 +1,453 @@
/**!
* cnpmjs.org - test/services/package.test.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
var should = require('should');
var sleep = require('co-sleep');
var Package = require('../../services/package');
describe('services/package.test.js', function () {
function* createModule(name, version, user, tag) {
var sourcePackage = {
version: version,
name: name,
publish_time: Date.now(),
};
var mod = {
version: sourcePackage.version,
name: sourcePackage.name,
package: sourcePackage,
author: user || 'unittest',
publish_time: sourcePackage.publish_time,
};
var dist = {
tarball: 'http://registry.npmjs.org/' + name + '/-/' + name + '-' + version + '.tgz',
shasum: '9d7bc446e77963933301dd602d5731cb861135e0',
size: 100,
};
mod.package.dist = dist;
yield* Package.saveModule(mod);
// add tag
yield* Package.addModuleTag(name, tag || 'latest', version);
return yield* Package.getModule(mod.name, mod.version);
}
describe('addModuleTag()', function () {
it('should add latest tag to 1.0.0', function* () {
var r = yield* createModule('test-addModuleTag-module-name', '1.0.0');
var tag = yield* Package.addModuleTag(r.name, 'latest', r.version);
should.exist(tag);
tag.should.have.keys('id', 'module_id', 'gmt_modified');
tag.id.should.above(0);
r = yield* createModule('test-addModuleTag-module-name', '1.1.0');
var tag2 = yield* Package.addModuleTag(r.name, 'latest', r.version);
should.exist(tag2);
tag2.should.have.keys('id', 'module_id', 'gmt_modified');
tag.id.should.equal(tag2.id);
var tag3 = yield* Package.getModuleTag(r.name, 'latest');
tag3.id.should.equal(tag2.id);
});
it('should return null when module not exists', function* () {
var tag = yield* Package.addModuleTag('not-exists', 'latest', '1.0.0');
should.not.exist(tag);
});
});
describe('getModuleByTag()', function () {
it('should get latest module', function* () {
var r = yield* createModule('test-getModuleByTag-module-name', '1.0.0');
var tag = yield* Package.addModuleTag(r.name, 'latest', r.version);
should.exist(tag);
var mod = yield* Package.getModuleByTag(r.name, 'latest');
should.exist(mod);
mod.name.should.equal(r.name);
mod.version.should.equal(r.version);
mod.package.should.eql(r.package);
});
it('should return null when tag not exists', function* () {
var r = yield* Package.getModuleByTag('some', 'not-exists');
should.not.exist(r);
});
});
describe('listPublicModuleNamesByUser(), listPublicModulesByUser()', function () {
before(function* () {
yield* createModule('listPublicModuleNamesByUser-module0', '1.0.0', 'listPublicModuleNamesByUser-user');
yield* createModule('listPublicModuleNamesByUser-module1', '1.0.0', 'listPublicModuleNamesByUser-user');
yield* createModule('listPublicModuleNamesByUser-module2', '1.0.0', 'listPublicModuleNamesByUser-user');
});
it('should got all public module names', function* () {
var names = yield* Package.listPublicModuleNamesByUser('listPublicModuleNamesByUser-user');
names.should.length(3);
names.should.eql([
'listPublicModuleNamesByUser-module0',
'listPublicModuleNamesByUser-module1',
'listPublicModuleNamesByUser-module2'
]);
});
it('should got all public modules', function* () {
var mods = yield* Package.listPublicModulesByUser('listPublicModuleNamesByUser-user');
mods.should.length(3);
mods.forEach(function (mod) {
mod.toJSON().should.have.keys('name', 'description');
mod.name.should.containEql('listPublicModuleNamesByUser-module');
});
});
it('should return [] when user not exists', function* () {
var mods = yield* Package.listPublicModulesByUser('listPublicModuleNamesByUser-user-not-exists');
mods.should.length(0);
});
});
describe('listModulesByName()', function () {
it('should return [] when module name not exists', function* () {
var mods = yield* Package.listModulesByName('not-exists-module');
mods.should.length(0);
});
it('should return all version modules', function* () {
yield* createModule('test-listModulesByName-module-1', '1.0.0');
yield* createModule('test-listModulesByName-module-1', '2.0.0');
var modules = yield* Package.listModulesByName('test-listModulesByName-module-1');
modules.should.length(2);
modules.forEach(function (mod) {
mod.package.name.should.equal(mod.name);
mod.name.should.containEql('test-listModulesByName-module-');
});
});
});
describe('listPrivateModulesByScope()', function () {
it('should return [] when scope not exists', function* () {
var modules = yield* Package.listPrivateModulesByScope('@not-exists');
modules.should.eql([]);
});
it('should work', function* () {
yield* createModule('@cnpm-test-scope1/test-listPrivateModules-module-1', '1.0.0');
yield* createModule('@cnpm-test-scope1/test-listPrivateModules-module-2', '1.0.0');
var modules = yield* Package.listPrivateModulesByScope('@cnpm-test-scope1');
// console.log(modules[0].toJSON())
modules.should.length(2);
modules[0].name.should.containEql('@cnpm-test-scope1/test-listPrivateModules-module-');
});
});
describe('listPublicModuleNamesSince(), listAllPublicModuleNames()', function () {
it('should got those module names', function* () {
var start = Date.now();
yield* createModule('test-listPublicModuleNamesSince-module-0', '1.0.0');
yield sleep(1100);
yield* createModule('test-listPublicModuleNamesSince-module-1', '1.0.0');
yield* createModule('test-listPublicModuleNamesSince-module-1', '1.0.1', null, 'beta');
yield* createModule('test-listPublicModuleNamesSince-module-2', '1.0.0');
var names = yield* Package.listPublicModuleNamesSince(start);
names.should.length(2);
names.should.eql(['test-listPublicModuleNamesSince-module-1', 'test-listPublicModuleNamesSince-module-2']);
var alls = yield* Package.listAllPublicModuleNames();
alls.length.should.above(0);
alls.forEach(function (name) {
name.should.not.containEql('@');
});
});
});
describe('getModuleLastModified()', function () {
it('should get a datetime', function* () {
yield* createModule('test-getModuleLastModified-module-0', '1.0.0');
var t = yield* Package.getModuleLastModified('test-getModuleLastModified-module-0');
t.should.be.a.Date;
});
it('should get null when module not exists', function* () {
var t = yield* Package.getModuleLastModified('test-getModuleLastModified-module-not-exists');
should.ok(t === null);
});
});
describe('removeModulesByName()', function () {
it('should remove all', function* () {
yield* createModule('test-removeModulesByName-module-1', '1.0.0');
yield* createModule('test-removeModulesByName-module-1', '1.0.1', null, 'beta');
yield* createModule('test-removeModulesByName-module-1', '2.0.0');
var mods = yield* Package.listModulesByName('test-removeModulesByName-module-1');
mods.should.length(3);
yield* Package.removeModulesByName('test-removeModulesByName-module-1');
mods = yield* Package.listModulesByName('test-removeModulesByName-module-1');
mods.should.length(0);
});
});
describe('removeModulesByNameAndVersions()', function () {
it('should remove some versions', function* () {
yield* createModule('test-removeModulesByNameAndVersions-module-1', '0.0.0');
yield* createModule('test-removeModulesByNameAndVersions-module-1', '1.0.0');
yield* createModule('test-removeModulesByNameAndVersions-module-1', '1.0.1', null, 'beta');
yield* createModule('test-removeModulesByNameAndVersions-module-1', '2.0.0');
var mods = yield* Package.listModulesByName('test-removeModulesByNameAndVersions-module-1');
mods.should.length(4);
yield* Package.removeModulesByNameAndVersions('test-removeModulesByNameAndVersions-module-1', ['1.0.0']);
mods = yield* Package.listModulesByName('test-removeModulesByNameAndVersions-module-1');
mods.should.length(3);
yield* Package.removeModulesByNameAndVersions('test-removeModulesByNameAndVersions-module-1',
['0.0.0', '1.0.0', '1.0.1', '2.0.0']);
mods = yield* Package.listModulesByName('test-removeModulesByNameAndVersions-module-1');
mods.should.length(0);
});
});
describe('removeModuleTagsByName()', function () {
it('should remove all tags by name', function* () {
var r2 = yield* createModule('test-removeModuleTagsByName2-module-name', '1.0.0');
var tag = yield* Package.addModuleTag(r2.name, 'latest', r2.version);
should.exist(tag);
var r = yield* createModule('test-removeModuleTagsByName-module-name', '1.0.0');
var tag = yield* Package.addModuleTag(r.name, 'latest', r.version);
should.exist(tag);
var tag = yield* Package.addModuleTag(r.name, 'beta', r.version);
should.exist(tag);
var tags = yield* Package.listModuleTags(r.name);
tags.should.length(2);
yield* Package.removeModuleTagsByName(r.name);
var tags = yield* Package.listModuleTags(r.name);
tags.should.eql([]);
var tags2 = yield* Package.listModuleTags(r2.name);
tags2.should.length(1);
});
});
describe('removeModuleTagsByIds()', function () {
it('should remove tags by ids', function* () {
var r = yield* createModule('test-removeModuleTagsByIds-module-name', '1.0.0');
var tag1 = yield* Package.addModuleTag(r.name, 'latest', r.version);
should.exist(tag1);
var tag2 = yield* Package.addModuleTag(r.name, 'beta', r.version);
should.exist(tag2);
var tag3 = yield* Package.addModuleTag(r.name, 'beta2', r.version);
should.exist(tag3);
var tags = yield* Package.listModuleTags(r.name);
tags.should.length(3);
yield* Package.removeModuleTagsByIds([tag1.id, tag3.id]);
var tags = yield* Package.listModuleTags(r.name);
tags.should.length(1);
tags[0].id.should.equal(tag2.id);
yield* Package.removeModuleTagsByIds([tag2.id]);
tags = yield* Package.listModuleTags(r.name);
tags.should.length(0);
});
});
describe('removeModuleTagsByNames()', function () {
it('should remove some tags', function* () {
var r = yield* createModule('test-removeModuleTagsByNames-module-name', '1.0.0');
var tag1 = yield* Package.addModuleTag(r.name, 'latest', r.version);
should.exist(tag1);
var tag2 = yield* Package.addModuleTag(r.name, 'beta', r.version);
should.exist(tag2);
var tag3 = yield* Package.addModuleTag(r.name, 'beta2', r.version);
should.exist(tag3);
yield* Package.removeModuleTagsByNames(r.name, ['beta', 'beta2']);
var tags = yield* Package.listModuleTags(r.name);
tags.should.length(1);
yield* Package.removeModuleTagsByNames(r.name, ['beta', 'beta2', 'latest']);
var tags = yield* Package.listModuleTags(r.name);
tags.should.length(0);
});
});
describe('addModule()', function () {
it('should success ad he@0.3.6', function* () {
var sourcePackage = require('../fixtures/0.3.6.json');
var mod = {
version: sourcePackage.version,
name: sourcePackage.name,
package: sourcePackage,
author: 'unittest',
publish_time: sourcePackage.publish_time || Date.now(),
};
var dist = {
tarball: 'http://registry.npmjs.org/he/-/he-0.3.6.tgz',
shasum: '9d7bc446e77963933301dd602d5731cb861135e0',
size: 100,
};
mod.package.dist = dist;
var result = yield* Package.saveModule(mod);
result.id.should.be.a.Number;
var item = yield* Package.getModuleById(result.id);
item.dist_size.should.equal(dist.size);
item.dist_shasum.should.equal(dist.shasum);
item.package.readme.should.equal(sourcePackage.readme);
// get by name and version
var r = yield* Package.getModule(mod.name, mod.version);
r.package.readme.should.equal(sourcePackage.readme);
});
});
describe('updateModulePackage()', function () {
it('should update not exists package return null', function* () {
var r = yield* Package.updateModulePackage(101010101, {});
should.not.exist(r);
});
it('should update exists package', function* () {
var sourcePackage = {
version: '1.0.0',
name: 'test-update-module-package-name',
publish_time: Date.now(),
};
var mod = {
version: sourcePackage.version,
name: sourcePackage.name,
package: sourcePackage,
author: 'unittest',
publish_time: sourcePackage.publish_time,
};
var dist = {
tarball: 'http://registry.npmjs.org/he/-/he-0.3.6.tgz',
shasum: '9d7bc446e77963933301dd602d5731cb861135e0',
size: 100,
};
mod.package.dist = dist;
yield* Package.saveModule(mod);
var result = yield* Package.getModule(mod.name, mod.version);
result.package.should.eql(sourcePackage);
var newPackage = {foo: 'bar'};
yield* Package.updateModulePackage(result.id, newPackage);
var r = yield* Package.getModule(mod.name, mod.version);
r.package.should.eql(newPackage);
});
});
describe('updateModulePackageFields()', function () {
it('should return null when update not exists module', function* () {
var r = yield* Package.updateModulePackageFields(123123123, {foo: 'bar'});
should.not.exist(r);
});
it('should return updated module instance', function* () {
var r = yield* createModule('test-updateModulePackageFields-name', '1.0.0');
should.exist(r);
var r1 = yield* Package.updateModulePackageFields(r.id, {foo: 'update for field'});
r1.id.should.equal(r.id);
var r2 = yield* Package.getModuleById(r1.id);
r2.package.should.have.property('foo', 'update for field');
});
});
describe('updateModuleReadme()', function () {
it('should return null when update not exists module', function* () {
var r = yield* Package.updateModuleReadme(123123123, 'test updateModuleReadme');
should.not.exist(r);
});
it('should return updated module instance', function* () {
var r = yield* createModule('test-updateModuleReadme-name', '1.0.0');
should.exist(r);
var r1 = yield* Package.updateModuleReadme(r.id, 'test updateModuleReadme');
r1.id.should.equal(r.id);
var r2 = yield* Package.getModuleById(r1.id);
r2.package.readme.should.equal('test updateModuleReadme');
});
});
describe('updateModuleDescription()', function () {
it('should return null when update not exists module', function* () {
var r = yield* Package.updateModuleDescription(123123123, 'test updateModuleDescription');
should.not.exist(r);
});
it('should return updated module instance', function* () {
var r = yield* createModule('test-updateModuleDescription-name', '1.0.0');
should.exist(r);
var r1 = yield* Package.updateModuleDescription(r.id, 'test updateModuleDescription');
r1.id.should.equal(r.id);
var r2 = yield* Package.getModuleById(r1.id);
r2.description.should.equal('test updateModuleDescription');
r2.package.description.should.equal('test updateModuleDescription');
});
});
describe('updateModuleLastModified()', function () {
it('should return null when module not exists', function* () {
var r = yield* Package.updateModuleLastModified('not-exists-module-name');
should.not.exist(r);
});
it('should return the update module when update lastTime exists', function* () {
var r1 = yield* createModule('test-update-module-last-modified-package-name', '1.0.0');
yield sleep(1100);
yield* Package.updateModuleLastModified(r1.name);
var r2 = yield* Package.getModule(r1.name, r1.version);
r2.gmt_modified.getTime().should.above(r1.gmt_modified.getTime());
});
});
describe('search()', function () {
before(function* () {
yield* Package.addKeywords('aaaa', 'mock aaaaaa', ['aa', 'bb', 'cc']);
});
it('should search modules', function* () {
var data = yield* Package.search('test');
data.should.have.keys('keywordMatchs', 'searchMatchs');
data.searchMatchs.length.should.above(0);
data.searchMatchs.forEach(function (row) {
row.name.should.be.a.String;
row.name.indexOf('test').should.above(-1);
row.description.should.be.a.String;
});
});
it('should search match keywords modules', function* () {
var data = yield* Package.search('aa');
data.keywordMatchs.length.should.above(0);
data.keywordMatchs.forEach(function (row) {
row.name.should.be.a.String;
row.description.should.be.a.String;
});
});
it('should search return empty', function* () {
var data = yield* Package.search('emptyemptyemptyempty');
data.should.eql({
keywordMatchs: [],
searchMatchs: []
});
});
});
});

View File

@@ -16,7 +16,7 @@
var Total = require('../../services/total');
describe.only('services/total.test.js', function () {
describe('services/total.test.js', function () {
describe('plusDeleteModule()', function () {
it('should plus delete module count', function* () {
var info = yield* Total.getTotalInfo();