Files
cnpmjs.org/proxy/module.js

147 lines
3.7 KiB
JavaScript

/**!
* 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';
/**
* Module dependencies.
*/
var utility = require('utility');
var config = require('../config');
var mysql = require('../common/mysql');
var MODULE_COLUMNS = 'id, gmt_create, gmt_modified, author, name, version, package, dist_tarball, dist_shasum, dist_size';
var INSERT_MODULE_SQL = 'INSERT INTO module(gmt_create, gmt_modified, author, name, version, package, dist_tarball, dist_shasum, dist_size) \
VALUES(now(), now(), ?, ?, ?, ?, ?, ?, ?);';
exports.add = function (mod, callback) {
var pkg;
try {
pkg = JSON.stringify(mod.package);
} catch (e) {
return callback(e);
}
var dist = mod.package.dist || {};
dist.tarball = '';
dist.shasum = '';
dist.size = 0;
var values = [mod.author, mod.name, mod.version, pkg, dist.tarball, dist.shasum, dist.size];
mysql.query(INSERT_MODULE_SQL, values, function (err, result) {
if (err) {
return callback(err);
}
callback(null, {id: result.insertId, gmt_modified: new Date()});
});
};
var UPDATE_DIST_SQL = 'UPDATE module SET version=?, package=?, dist_tarball=?, dist_shasum=?, dist_size=? WHERE id=?;';
exports.update = function (mod, callback) {
var pkg;
try {
pkg = JSON.stringify(mod.package);
} catch (e) {
return callback(e);
}
var dist = mod.package.dist;
mysql.query(UPDATE_DIST_SQL, [mod.version, pkg, dist.tarball, dist.shasum, dist.size, mod.id],
function (err, result) {
if (err) {
return callback(err);
}
callback(null, {id: mod.id, gmt_modified: new Date()});
});
};
function parseRow(row) {
row.package = JSON.parse(row.package);
}
var SELECT_MODULE_BY_ID_SQL = 'SELECT ' + MODULE_COLUMNS + ' 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 = 'SELECT ' + MODULE_COLUMNS + ' 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_LATEST_MODULE_SQL = 'SELECT ' + MODULE_COLUMNS + ' FROM module WHERE name=? AND version <> "next" ORDER BY id DESC LIMIT 1;';
exports.getLatest = function (name, callback) {
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 = 'SELECT ' + MODULE_COLUMNS + ' 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 DELETE_MODULE_BY_NAME_SQL = 'DELETE FROM module WHERE name=?;';
exports.removeByName = function (name, callback) {
mysql.query(DELETE_MODULE_BY_NAME_SQL, [name], callback);
};