blob: 7e7fbe6e3f38aae5f71c5de640bc7948b8ec9a14 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the 'License'); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
module.exports = function () {
const nano = require('nano')('http://localhost:5984')
const users = nano.use('users')
const VIEWS = { by_twitter_id:
{ 'map': 'function(doc) { emit(doc.twitter.screen_name, doc); }' } }
/*****************************************************************************
* user.get()
****************************************************************************/
function userGet (id, callback) {
return users.get(id, callback)
}
/*****************************************************************************
* user.new()
****************************************************************************/
function userNew (id, body, callback) {
return users.insert(body, id, callback)
}
/*****************************************************************************
* user.create()
****************************************************************************/
function createUsersDatabase (emailAddress, secret, name, retries) {
nano.db.create('users', function (e, b, h) {
userCreate(emailAddress, secret, name, retries + 1)
})
}
function userCreate (emailAddress, secret, name, retries) {
if (!retries) {
retries = 0
}
users.insert({ emailAddress: emailAddress, secret: secret, name: name }, secret,
function (e, b, h) {
if (e && e.message === 'no_db_file' && retries < 1) {
return createUsersDatabase(emailAddress, secret, name, retries)
}
(function () { })(e, b, h)
})
}
/*****************************************************************************
* user.find()
****************************************************************************/
//
// some more logic needed
// what if design document exists but view doesnt, we cant just overwrite it
//
// we need a way to fectch and build on
// and thats the reason why im not doing this at 5am
function userFind (view, id, opts, tried, callback) {
if (typeof tried === 'function') {
callback = tried
tried = { tried: 0, max_retries: 2 }
}
users.view('users', view, opts, function (e, b, h) {
if (e) {
var currentView = VIEWS[view]
if (!currentView) {
e.message = 'View is not available'
return callback(e, b, h)
}
if (tried.tried < tried.max_retries) {
if (e.message === 'missing' || e.message === 'deleted') { // create design document
var designDoc = { views: {} }
designDoc.views[view] = currentView
return users.insert(designDoc, '_design/users', function () {
tried.tried += 1
userFind(view, id, opts, tried, callback)
})
}
if (e.message === 'missing_named_view') {
users.get('_design/users', function (e, b, h) { // create view
tried.tried += 1
if (e) { return userFind(view, id, opts, tried, callback) }
b.views[view] = currentView
users.insert(b, '_design/users', function (e, b, h) {
return userFind(view, id, opts, tried, callback)
})
})
return
}
} else { return callback(e, b, h) }
}
return callback(null, b, h)
})
}
function userFirst (view, id, callback) {
return userFind(view, id, { startkey: ('"' + id + '"'), limit: 1 }, callback)
}
return {
new: userNew,
get: userGet,
create: userCreate,
first: userFirst
}
}