2019-06-23 21:27:52 +00:00
/ *
* This file is part of the authRxbn eco - system .
*
* ( c ) Ruben Meyer < contact @ rxbn . de >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
* /
// init
var mongoose = require ( 'mongoose' ) ;
2020-02-29 20:16:48 +00:00
var sanitize = require ( 'mongo-sanitize' ) ;
2019-06-23 21:27:52 +00:00
var crypto = require ( 'crypto' ) ;
var methods = { } ;
2020-08-14 11:20:19 +00:00
var log = require ( global [ '__dirname' ] + '/bin/logs/module' ) ;
var cfg = require ( global [ '__dirname' ] + '/bin/config' ) ;
2019-06-23 21:27:52 +00:00
2020-08-14 11:20:19 +00:00
var db ;
2019-06-23 21:27:52 +00:00
var mdls = require ( './models.js' ) ;
2020-08-14 11:20:19 +00:00
var models ;
2019-06-23 21:27:52 +00:00
2020-08-14 11:20:19 +00:00
/ * *
* connects to db
* @ author Ruben Meyer
* @ async
* /
methods . connect = async ( ) => {
if ( typeof db !== "undefined" ) return ;
// connect
mongoose . connect ( cfg . mongoose . uri , {
useNewUrlParser : true ,
useUnifiedTopology : true ,
2020-10-30 22:19:48 +00:00
useFindAndModify : false ,
useCreateIndex : true
2020-08-14 11:20:19 +00:00
} ) ;
2019-06-23 21:27:52 +00:00
2020-08-14 11:20:19 +00:00
db = mongoose . connection ;
db = await db . useDb ( cfg . mongoose . db ) ;
models = mdls ( db ) ;
// connection error handling
db . on ( 'error' , ( data ) => {
log . error ( 'MongoDB connection error:\n' , data ) ;
process . exit ( ) ; // exit on connection error
} ) ;
}
2019-06-23 21:27:52 +00:00
2020-08-17 11:57:10 +00:00
/ * *
* returns db instance
* @ author Ruben Meyer
* @ return { Object } mongoose
* /
methods . getConnection = ( ) => {
return db ;
}
2019-06-23 21:27:52 +00:00
// // // //////// //////// ///////
// // // // // // //
// // // ////// ////// //////
// // // // // // //
// //////// ////// //////// // //
//
/////////////////////////////////////////////
/ * *
* Adds User to Database
2020-08-14 11:20:19 +00:00
* @ author Ruben Meyer
* @ async
* @ param { String } nick nickname
* @ param { String } email email
* @ param { String } passhash hashed password
2020-08-31 07:49:24 +00:00
* @ param { Number } group Group ObjectId
* @ return { Object } async ( reply , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . addUser = async ( nick , email , passhash , group ) => {
if ( typeof nick !== 'string' ) return { err : new TypeError ( 'nick is not a string::database.addUser(' + nick + ',' + email + ',' + passhash + ',' + group + ')' , module . filename ) } ;
if ( typeof email !== 'string' ) return { err : new TypeError ( 'email is not a string::database.addUser(' + nick + ',' + email + ',' + passhash + ',' + group + ')' , module . filename ) } ;
if ( typeof passhash !== 'string' ) return { err : new TypeError ( 'passhash is not a string::database.addUser(' + nick + ',' + email + ',' + passhash + ',' + group + ')' , module . filename ) } ;
if ( isNaN ( group ) ) return { err : new TypeError ( 'group is not a number::database.addUser(' + nick + ',' + email + ',' + passhash + ',' + group + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
2019-09-01 19:29:36 +00:00
let userModel = models . user ;
2019-06-23 21:27:52 +00:00
2019-09-01 19:29:36 +00:00
let user = new userModel ( ) ;
2020-02-29 20:16:48 +00:00
user . nickname = sanitize ( nick ) ;
user . email = sanitize ( email ) ;
user . passhash = sanitize ( passhash ) ;
user . group = sanitize ( group ) ;
2019-06-23 21:27:52 +00:00
2020-08-14 11:20:19 +00:00
try {
reply = await user . save ( ) ;
return { reply : 1 } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
2020-08-14 11:20:19 +00:00
* deletes user identified by haystack from database
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2019-06-23 21:27:52 +00:00
* @ param { String } haystack email or nick
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( reply , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . delUser = async ( haystack ) => {
if ( typeof haystack !== 'string' ) return { err : new TypeError ( 'haystack is not a string::database.delUser(' + haystack + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
2019-09-01 19:29:36 +00:00
let userModel = models . user ;
2019-06-23 21:27:52 +00:00
2020-02-29 20:16:48 +00:00
// sanitize input
haystack = sanitize ( haystack ) ;
2020-08-14 11:20:19 +00:00
try {
reply = await userModel . findOneAndDelete ( ) . or ( [ { nickname : haystack } , { email : haystack } ] ) . exec ( ) ;
log . debug ( 'deleted user: ' + haystack ) ;
return { reply : 1 } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
2019-09-01 19:29:36 +00:00
* get all users
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( reply , err )
2019-09-01 19:29:36 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . getUsers = async ( ) => {
2019-09-01 19:29:36 +00:00
let userModel = models . user ;
2020-08-14 11:20:19 +00:00
try {
users = await userModel . find ( { } ) . exec ( ) ;
2019-09-01 19:29:36 +00:00
if ( users . length > 0 )
2020-08-14 11:20:19 +00:00
return { reply : users } ;
2019-09-01 19:29:36 +00:00
else
2020-08-14 11:20:19 +00:00
return { reply : false } ;
} catch ( err ) {
return { err : err } ;
}
2019-09-01 19:29:36 +00:00
} ;
/ * *
2020-08-14 11:20:19 +00:00
* query users by UUID , email , nickname or rememberme token
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2019-06-23 21:27:52 +00:00
* @ param { String | String [ ] } haystack email or nick
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( reply , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . getUser = async ( haystack ) => {
2020-08-31 10:10:56 +00:00
if ( typeof haystack !== 'string' && typeof haystack !== 'object' ) return { err : new TypeError ( 'haystack is not a string|object::database.getUser(' + haystack + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
2019-09-01 19:29:36 +00:00
let userModel = models . user ;
2019-06-23 21:27:52 +00:00
2020-02-29 20:16:48 +00:00
// sanitize input
haystack = sanitize ( haystack ) ;
2019-06-23 21:27:52 +00:00
let or = [ ] ;
2020-08-31 07:49:24 +00:00
if ( haystack instanceof mongoose . Types . ObjectId ) {
or . push ( { _id : haystack } ) ;
}
else if ( typeof haystack === 'string' ) {
2019-06-23 21:27:52 +00:00
or = [ { nickname : haystack } , { email : haystack } , { token : haystack } ] ;
2020-08-31 07:49:24 +00:00
if ( haystack . match ( /^[0-9a-fA-F]{24}$/ ) ) or . push ( { _id : mongoose . Types . ObjectId ( haystack ) } ) ;
2019-06-23 21:27:52 +00:00
}
else {
or = [ ] ;
for ( let i = 0 ; i < haystack . length ; i ++ ) {
2020-08-31 07:49:24 +00:00
if ( haystack [ i ] . match ( /^[0-9a-fA-F]{24}$/ ) ) or . push ( { _id : mongoose . Types . ObjectId ( haystack [ i ] ) } ) ;
2019-06-23 21:27:52 +00:00
or . push ( { nickname : haystack [ i ] } ) ;
or . push ( { email : haystack [ i ] } ) ;
or . push ( { token : haystack [ i ] } ) ;
}
}
2020-08-14 11:20:19 +00:00
try {
users = await userModel . find ( ) . or ( or ) . exec ( ) ;
2020-08-31 07:49:24 +00:00
if ( users . length == 1 )
return { reply : users [ 0 ] } ;
2019-06-23 21:27:52 +00:00
else
2020-08-14 11:20:19 +00:00
return { reply : false } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
* updates obj keys in user entry
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2019-06-23 21:27:52 +00:00
* @ param { Number } id User ID
* @ param { Object } obj data
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( reply , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . updateUser = async ( id , obj ) => {
2020-08-31 10:10:56 +00:00
if ( ! ( typeof id === 'string' || id instanceof mongoose . Types . ObjectId ) ) return { err : new TypeError ( 'id is not a string::database.updateUser(' + id + ',' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
2020-08-14 11:20:19 +00:00
if ( typeof obj !== 'object' ) return { err : new TypeError ( 'obj is not an object::database.updateUser(' + id + ',' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
2019-09-01 19:29:36 +00:00
let userModel = models . user ;
2020-08-14 11:20:19 +00:00
try {
data = await userModel . findByIdAndUpdate ( id , obj ) . exec ( ) ;
2020-08-31 10:10:56 +00:00
return { reply : data } ;
2020-08-14 11:20:19 +00:00
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
2020-09-25 18:05:16 +00:00
* updates data based on user activity
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2019-09-01 19:29:36 +00:00
* @ TODO UPDATE METHOD ; PROBABLY OUTDATED
2019-06-23 21:27:52 +00:00
* @ param { Number } id User ID
2020-09-25 18:05:16 +00:00
* @ param { Object } data data
* @ return { Object } async ( { date => 'ISO Date' , timestamp => 'Timestamp' } , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . addActivity = async ( id , data ) => {
2020-09-25 18:05:16 +00:00
if ( ! ( typeof id === 'string' || id instanceof mongoose . Types . ObjectId ) ) return { err : new TypeError ( 'id is not a string::database.addActivity(' + id + ',' + JSON . stringify ( options ) + ')' , module . filename ) } ;
if ( typeof options !== 'object' && options !== null ) return { err : new TypeError ( 'obj is not an object::database.addActivity(' + id + ',' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
let date = new Date ( ) . toISOString ( ) ;
let timestamp = new Date ( date ) . getTime ( ) ;
2020-08-14 11:20:19 +00:00
try {
reply = await methods . updateUser ( id , {
last _action : date
} ) ;
2020-09-25 18:05:16 +00:00
return { reply : {
date : date ,
timestamp : timestamp
} } ;
2020-08-14 11:20:19 +00:00
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
2020-08-31 07:49:24 +00:00
// //////// /////// //////// // // /////// //////
// // // // // // // // // // //
// //////// /////// // // // // /////// //////
// // // // // // // // // // //
// //////// // // //////// //////// // //////
//
/////////////////////////////////////////////////////////////////
/ * *
* get all groups
* @ author Ruben Meyer
* @ async
* @ return { Object } async ( reply , err )
* /
methods . getGroups = async ( ) => {
let groupModel = models . group ;
try {
groups = await groupModel . find ( { } ) . exec ( ) ;
if ( groups . length > 0 )
return { reply : groups } ;
else
return { reply : false } ;
} catch ( err ) {
return { err : err } ;
}
} ;
/ * *
* query groups by UUID or name
* @ author Ruben Meyer
* @ async
* @ param { String | String [ ] } haystack UUID or name
* @ return { Object } async ( reply , err )
* /
methods . getGroup = async ( haystack ) => {
if ( typeof haystack !== 'string' && typeof haystack !== 'object' ) return { err : new TypeError ( 'haystack is not a string|object::database.getGroup(' + haystack + ')' , module . filename ) } ;
let groupModel = models . group ;
// sanitize input
haystack = sanitize ( haystack ) ;
let or = [ ] ;
if ( haystack instanceof mongoose . Types . ObjectId ) {
or . push ( { _id : haystack } ) ;
}
else if ( typeof haystack === 'string' ) {
or = [ { name : haystack } ] ;
if ( haystack . match ( /^[0-9a-fA-F]{24}$/ ) ) or . push ( { _id : mongoose . Types . ObjectId ( haystack ) } ) ;
}
else {
or = [ ] ;
for ( let i = 0 ; i < haystack . length ; i ++ ) {
if ( haystack [ i ] . match ( /^[0-9a-fA-F]{24}$/ ) ) or . push ( { _id : mongoose . Types . ObjectId ( haystack [ i ] ) } ) ;
or . push ( { name : haystack [ i ] } ) ;
}
}
try {
groups = await groupModel . find ( ) . or ( or ) . exec ( ) ;
if ( groups . length == 1 )
return { reply : groups [ 0 ] } ;
else
return { reply : false } ;
} catch ( err ) {
return { err : err } ;
}
} ;
/ * *
* Adds Group to Database
* @ author Ruben Meyer
* @ async
* @ param { String } name name
* @ param { String } roles roles
* @ return { Object } async ( reply , err )
* /
methods . addGroup = async ( name , roles ) => {
if ( typeof name !== 'string' ) return { err : new TypeError ( 'name is not a string::database.addGroup(' + name + ',' + roles + ')' , module . filename ) } ;
2020-08-31 10:10:56 +00:00
if ( typeof roles !== 'string' ) return { err : new TypeError ( 'roles is not a string::database.addGroup(' + name + ',' + roles + ')' , module . filename ) } ;
2020-08-31 07:49:24 +00:00
let groupModel = models . group ;
let group = new groupModel ( ) ;
2020-08-31 10:10:56 +00:00
2020-08-31 07:49:24 +00:00
// sanitize input
group . name = sanitize ( nick ) ;
group . roles = sanitize ( email ) ;
try {
reply = await group . save ( ) ;
return { reply : 1 } ;
} catch ( err ) {
return { err : err } ;
}
} ;
/ * *
* updates obj keys in group entry
* @ author Ruben Meyer
* @ async
* @ param { Number } id Group ID
* @ param { Object } obj data
* @ return { Object } async ( reply , err )
* /
methods . updateGroup = async ( id , obj ) => {
2020-08-31 10:10:56 +00:00
if ( ! ( typeof id === 'string' || id instanceof mongoose . Types . ObjectId ) ) return { err : new TypeError ( 'id is not a string::database.updateGroup(' + id + ',' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
2020-08-31 07:49:24 +00:00
if ( typeof obj !== 'object' ) return { err : new TypeError ( 'obj is not an object::database.updateGroup(' + id + ',' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
let groupModel = models . group ;
try {
data = await groupModel . findByIdAndUpdate ( id , obj ) . exec ( ) ;
2020-08-31 10:10:56 +00:00
return { reply : data } ;
2020-08-31 07:49:24 +00:00
} catch ( err ) {
return { err : err } ;
}
} ;
/ * *
* delete group and set fallback group for users
* @ author Ruben Meyer
* @ async
* @ param { String } id group id
* @ param { String } fallbackId fallback group id
* @ return { Boolean }
* /
methods . delGroup = async ( id , fallbackId ) => {
if ( typeof id !== 'string' ) return { err : new TypeError ( 'id is not a string::database.delGroup(' + id + ',' + fallbackId + ')' , module . filename ) } ;
if ( typeof fallbackId !== 'string' ) return { err : new TypeError ( 'fallbackId is not a string::database.delGroup(' + id + ',' + fallbackId + ')' , module . filename ) } ;
let groupModel = models . group ;
let userModel = models . user ;
let pathModel = models . pathRules ;
// sanitize input
id = sanitize ( id ) ;
fallbackId = sanitize ( fallbackId ) ;
try {
try {
// find users
users = await userModel . find ( { group : id } ) . exec ( ) ;
// set fallback group for each user
users . forEach ( async ( user ) => {
await userModel . findByIdAndUpdate ( user . _id , { group : fallbackId } ) . exec ( ) ;
} ) ;
// find rules
rules = await pathModel . find ( { group : id } ) . exec ( ) ;
// set fallback group for each rule
rules . forEach ( async ( rule ) => {
await pathModel . findByIdAndUpdate ( rule . _id , { group : fallbackId } ) . exec ( ) ;
} ) ;
// remove group
reply = await groupModel . findByIdAndRemove ( id ) . exec ( ) ;
return { reply : 1 } ;
} catch ( e ) {
return { err : e } ;
}
} catch ( err ) {
return { err : err } ;
}
} ;
2020-08-31 07:42:38 +00:00
// //////// //////// ////////// // // ////////
// // // // // // // // //
// //////// // // // // // //
// // //////// // //////// ////////
// // // // // // // //
// // // // // // // ////////
//
////////////////////////////////////////////////////////////
/ * *
* get pathrules
* @ author Ruben Meyer
* @ async
* @ return { Object } async ( rules , err )
* /
methods . getPathRules = async ( ) => {
var PathRules = models . pathRules ;
try {
rules = await PathRules . find ( { } ) . exec ( ) ;
return { reply : rules } ;
} catch ( err ) {
return { err : err } ;
}
} ;
2019-06-23 21:27:52 +00:00
// //////// //////// //////// //////
// // // // // // // //
// //////// /////// //////// //////
// // // // // //
// // // // // //////
//
//////////////////////////////////////////////
2020-08-31 07:49:24 +00:00
2019-06-23 21:27:52 +00:00
/ * *
* get Applications
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( apps , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . getApps = async ( ) => {
2019-06-23 21:27:52 +00:00
var Application = models . application ;
2020-08-14 11:20:19 +00:00
try {
apps = await Application . find ( { } ) . exec ( ) ;
return { reply : apps } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
2020-09-25 18:05:16 +00:00
* set authentication token for app , user combination
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2019-06-23 21:27:52 +00:00
* @ param { Object } obj data obj ( aId , uId )
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( { timestamp , token } , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . setAuthCode = async ( obj ) => {
if ( typeof obj !== 'object' ) return { err : new TypeError ( 'obj is not an object::database.setAuthCode(' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
var AuthCode = models . authCode ;
let query = {
applicationId : obj . aId ,
userId : obj . uId
} ;
let change = {
token : ( [ 1e7 ] + - 1e3 + - 4e3 + - 8e3 + - 1e11 ) . replace ( /[018]/g , ( c ) => ( c ^ crypto . randomBytes ( new Uint8Array ( 1 ) . length ) [ 0 ] & 15 >> c / 4 ) . toString ( 16 ) ) ,
timestamp : Date . now ( )
} ;
2020-08-14 11:20:19 +00:00
try {
data = await AuthCode . findOneAndUpdate ( query , change , { upsert : true } ) . exec ( ) ;
return { reply : {
2019-06-23 21:27:52 +00:00
timestamp : change . timestamp ,
token : change . token
2020-08-14 11:20:19 +00:00
} } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
2020-09-25 18:05:16 +00:00
* verify authentication token for app , user combination
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2019-06-23 21:27:52 +00:00
* @ param { Object } obj data obj ( aId , aSecret , uId , token )
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( bool , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . getAuth = async ( obj ) => {
2020-09-25 18:05:16 +00:00
if ( typeof obj !== 'object' ) return { err : new TypeError ( 'obj is not an object::database.getAuth(' + JSON . stringify ( obj ) + ')' , module . filename ) } ;
2019-06-23 21:27:52 +00:00
var AuthCode = models . authCode ;
2020-08-14 11:20:19 +00:00
try {
data = await AuthCode . findOne ( {
$and : [
{ applicationId : mongoose . Types . ObjectId ( obj . aId ) } ,
{ userId : mongoose . Types . ObjectId ( obj . uId ) } ,
{ token : obj . token }
]
} ) . exec ( ) ;
if ( typeof data === "object" ) {
if ( data === null || data === [ ] ) return { reply : false } ;
var Application = models . application ;
try {
2020-08-31 07:49:24 +00:00
if ( ! ( obj . aId instanceof mongoose . Types . ObjectId ) ) obj . aId = mongoose . Types . ObjectId ( obj . aId ) ;
2020-08-14 11:20:19 +00:00
data1 = await Application . findOne ( {
2019-06-23 21:27:52 +00:00
$and : [
2020-08-31 07:49:24 +00:00
{ _id : obj . aId } ,
2019-06-23 21:27:52 +00:00
{ secret : obj . aSecret }
]
2020-08-14 11:20:19 +00:00
} ) . exec ( ) ;
if ( obj . token == data . token
&& obj . aId == String ( data . applicationId )
&& obj . uId == String ( data . userId )
&& obj . aSecret == data1 . secret ) {
return { reply : true } ;
}
else return { reply : false } ;
} catch ( err ) {
return { err : err } ;
}
} else return { reply : false } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
/ * *
2020-09-25 18:05:16 +00:00
* verify if the application exists and the redirectUrl is correct
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2020-08-31 07:49:24 +00:00
* @ TODO
2019-06-23 21:27:52 +00:00
* @ param { Object } obj data obj ( aId , redirectUrl )
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( bool , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . verifyAppCall = async ( obj ) => {
return { } ;
2019-06-23 21:27:52 +00:00
} ;
// //////// //////// //////// //////// ////////
// // // // // // //
// //////// // // // // ////////
// // // //////// // //
// //////// // // // // ////////
//
////////////////////////////////////////////////////////
/ * *
2020-08-14 11:20:19 +00:00
* returns user count
2019-06-23 21:27:52 +00:00
* @ author Ruben Meyer
2020-08-14 11:20:19 +00:00
* @ async
2020-08-31 07:49:24 +00:00
* @ return { Object } async ( int , err )
2019-06-23 21:27:52 +00:00
* /
2020-08-14 11:20:19 +00:00
methods . userCount = async ( ) => {
2019-09-01 19:29:36 +00:00
let userModel = models . user ;
2020-08-14 11:20:19 +00:00
try {
count = await userModel . countDocuments ( { } ) . exec ( ) ;
return { reply : count } ;
} catch ( err ) {
return { err : err } ;
}
2019-06-23 21:27:52 +00:00
} ;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module . exports = methods ;