cnpmjs.org
Version:
Private npm registry and web for Enterprise, base on MySQL and Simple Store Service
141 lines (127 loc) • 3.18 kB
JavaScript
/**!
* cnpmjs.org - services/default_user_service.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
;
/**
* Module dependencies.
*/
var gravatar = require('gravatar');
// var User = require('../proxy/user');
var User = require('../models').User;
var isAdmin = require('../lib/common').isAdmin;
var config = require('../config');
// User: https://github.com/cnpm/cnpmjs.org/wiki/Use-Your-Own-User-Authorization#user-data-structure
// {
// "login": "fengmk2",
// "email": "fengmk2@gmail.com",
// "name": "Yuan Feng",
// "html_url": "http://fengmk2.github.com",
// "avatar_url": "https://avatars3.githubusercontent.com/u/156269?s=460",
// "im_url": "",
// "site_admin": false,
// "scopes": ["@org1", "@org2"]
// }
module.exports = DefaultUserService;
function convertToUser(row) {
var user = {
login: row.name,
email: row.email,
name: row.name,
html_url: 'http://cnpmjs.org/~' + row.name,
avatar_url: '',
im_url: '',
site_admin: isAdmin(row.name),
scopes: config.scopes,
};
if (row.json) {
var data = row.json;
if (data.login) {
// custom user
user = data;
} else {
// npm user
if (data.avatar) {
user.avatar_url = data.avatar;
}
if (data.fullname) {
user.name = data.fullname;
}
if (data.homepage) {
user.html_url = data.homepage;
}
if (data.twitter) {
user.im_url = 'https://twitter.com/' + data.twitter;
}
}
}
if (!user.avatar_url) {
user.avatar_url = gravatar.url(user.email, {s: '50', d: 'retro'}, true);
}
return user;
}
function DefaultUserService() {}
var proto = DefaultUserService.prototype;
/**
* Auth user with login name and password
* @param {String} login login name
* @param {String} password login password
* @return {User}
*/
proto.auth = function* (login, password) {
var row = yield* User.auth(login, password);
if (!row) {
return null;
}
return convertToUser(row);
};
/**
* Get user by login name
* @param {String} login login name
* @return {User}
*/
proto.get = function* (login) {
var row = yield User.findByName(login);
if (!row) {
return null;
}
return convertToUser(row);
};
/**
* List users
* @param {Array<String>} logins login names
* @return {Array<User>}
*/
proto.list = function* (logins) {
var rows = yield* User.listByNames(logins);
var users = [];
rows.forEach(function (row) {
users.push(convertToUser(row));
});
return users;
};
/**
* Search users
* @param {String} query query keyword
* @param {Object} [options] optional query params
* - {Number} limit match users count, default is `20`
* @return {Array<User>}
*/
proto.search = function* (query, options) {
options = options || {};
options.limit = parseInt(options.limit);
if (!options.limit || options.limit < 0) {
options.limit = 20;
}
var rows = yield* User.search(query, options);
var users = [];
rows.forEach(function (row) {
users.push(convertToUser(row));
});
return users;
};