diff --git a/src/groupdb.js b/src/groupdb.js new file mode 100644 index 000000000..7317b496d --- /dev/null +++ b/src/groupdb.js @@ -0,0 +1,75 @@ +'use strict'; + +exports = module.exports = { + get: get, + add: add, + del: del, + count: count, + + _clear: clear +}; + +var assert = require('assert'), + database = require('./database.js'), + debug = require('debug')('box:groupdb'), + DatabaseError = require('./databaseerror'); + +var GROUPS_FIELDS = [ 'id', 'name' ].join(','); + +function get(groupId, callback) { + assert.strictEqual(typeof groupId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT ' + GROUPS_FIELDS + ' FROM groups WHERE id = ?', [ groupId ], function (error, result) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + if (result.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); + + callback(null, result[0]); + }); +} + +function add(id, name, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof name, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var data = [ id, name ]; + database.query('INSERT INTO groupd (id, name) VALUES (?, ?)', + data, function (error, result) { + if (error && error.code === 'ER_DUP_ENTRY') return callback(new DatabaseError(DatabaseError.ALREADY_EXISTS, error)); + if (error || result.affectedRows !== 1) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + +function del(id, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + database.query('DELETE FROM groups WHERE id = ?', [ id ], function (error, result) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + if (result.affectedRows !== 1) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); + + callback(error); + }); +} + +function count(callback) { + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT COUNT(*) AS total FROM groups', function (error, result) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + return callback(null, result[0].total); + }); +} + +function clear(callback) { + database.query('DELETE FROM groups', function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(error); + }); +} + diff --git a/src/groups.js b/src/groups.js new file mode 100644 index 000000000..7b25925a7 --- /dev/null +++ b/src/groups.js @@ -0,0 +1,91 @@ +/* jshint node:true */ + +'use strict'; + +exports = module.exports = { + GroupError: GroupError, + + create: create, + remove: remove, + get: get +}; + +var assert = require('assert'), + DatabaseError = require('./databaseerror.js'), + uuid = require('node-uuid'), + _ = require('underscore'); + +// http://dustinsenos.com/articles/customErrorsInNode +// http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi +function GroupError(reason, errorOrMessage) { + assert.strictEqual(typeof reason, 'string'); + assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined'); + + Error.call(this); + Error.captureStackTrace(this, this.constructor); + + this.name = this.constructor.name; + this.reason = reason; + if (typeof errorOrMessage === 'undefined') { + this.message = reason; + } else if (typeof errorOrMessage === 'string') { + this.message = errorOrMessage; + } else { + this.message = 'Internal error'; + this.nestedError = errorOrMessage; + } +} +util.inherits(GroupError, Error); +GroupError.INTERNAL_ERROR = 'Internal Error'; +GroupError.ALREADY_EXISTS = 'Already Exists'; +GroupError.NOT_FOUND = 'Not Found'; +GroupError.BAD_NAME = 'Bad name'; + +function validateGroupname(name) { + assert.strictEqual(typeof name, 'string'); + + if (name.length <= 2) return new GroupError(GroupError.BAD_NAME, 'name must be atleast 3 chars'); + if (name.length > 256) return new GroupError(GroupError.BAD_NAME, 'name too long'); + + return null; +} + +function create(name, callback) { + assert.strictEqual(typeof name, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var error = validateGroupname(name); + if (error) return callback(error); + + groupdb.add(uuid.v4(), name, function (error) { + if (error && error.reason === DatabaseError.ALREADY_EXISTS) return callback(new GroupError(UserError.ALREADY_EXISTS)); + if (error) return callback(new UserError(GroupError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + +function remove(id, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + groupdb.del(id, function (error) { + if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new UserError(UserError.NOT_FOUND)); + if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + +function get(id, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + groupdb.get(id, function (error, result) { + if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new UserError(UserError.NOT_FOUND)); + if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); + + return callback(null, result); + }); +} +