const { Db } = require('mongodb') Server = require('mongodb').Server, BSON = require('mongodb').BSONNative, conf = require('../../config.js').database const db = function(callback) { this.rooms = false const t = this const db = new Db(conf.database, new Server(conf.hostname, conf.port), { native_parser: true }) db.open((err, db) => { db.collection('rooms', (err, collection) => { // make sure we have an index on name collection.ensureIndex([['name', 1]], false, () => {}) t.rooms = collection }) callback() }) } db.prototype = { clearRoom(room, callback) { this.rooms.remove({ name: room }, callback) }, // theme commands setTheme(room, theme) { this.rooms.update( { name: room }, { $set: { theme } } ) }, getTheme(room, callback) { this.rooms.findOne( { name: room }, { theme: true }, (err, room) => { if (room) { callback(room.theme) } else { callback() } } ) }, // revision commands setRevisions(room, revisions) { this.rooms.update( { name: room }, { $set: { revisions } } ) }, getRevisions(room, callback) { this.rooms.findOne( { name: room }, { revisions: true }, (err, room) => { if (room) { callback(room.revisions) } else { callback() } } ) }, // Column commands createColumn(room, name, callback) { this.rooms.update( { name: room }, { $push: { columns: name } }, { upsert: true }, callback ) }, getAllColumns(room, callback) { this.rooms.findOne({ name: room }, { columns: true }, (err, room) => { if (room) { callback(room.columns) } else { callback() } }) }, deleteColumn(room) { this.rooms.update( { name: room }, { $pop: { columns: 1 } } ) }, setColumns(room, columns) { this.rooms.update( { name: room }, { $set: { columns } }, { upsert: true } ) }, // Card commands createCard(room, id, card) { const doc = {} doc[`cards.${id}`] = card this.rooms.update( { name: room }, { $set: doc }, { upsert: true } ) }, getAllCards(room, callback) { this.rooms.findOne({ name: room }, { cards: true }, (err, room) => { if (room) { callback(room.cards) } else { callback() } }) }, cardEdit(room, id, text) { const doc = {} doc[`cards.${id}.text`] = text this.rooms.update( { name: room }, { $set: doc } ) }, cardSetXY(room, id, x, y) { const doc = {} doc[`cards.${id}.x`] = x doc[`cards.${id}.y`] = y this.rooms.update( { name: room }, { $set: doc } ) }, deleteCard(room, id) { const doc = {} doc[`cards.${id}`] = true this.rooms.update( { name: room }, { $unset: doc } ) }, addSticker(room, cardId, stickerId) { const doc = {} doc[`cards.${cardId}.sticker`] = stickerId this.rooms.update( { name: room }, { $set: doc } ) }, getBoardSize(room, callback) { this.rooms.findOne( { name: room }, (err, room) => { if (room) { callback(room.size) } else { callback() } } ) }, setBoardSize(room, size) { this.rooms.update( { name: room }, { $set: { size } } ) } } exports.db = db