memo/lib/data/mongodb.js

181 lines
3.4 KiB
JavaScript

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