1+ import _ from 'lodash'
2+ import Sequelize from 'sequelize'
13import JWT from 'jsonwebtoken'
24import Passport from 'passport'
35import HttpBearerStrategy from 'passport-http-bearer'
6+ import { filters , pageCount , orderBy , parseEncodedQuery } from '../helpers/ActiveRecord'
47import DB from '../models'
58import * as Users from './Users'
69
10+ const Op = Sequelize . Op
11+ const FILTER_OPTIONS = {
12+ dateFrom : { col : 'createdAt' , type : 'minDate' } ,
13+ dateTo : { col : 'createdAt' , type : 'maxDate' } ,
14+ regexp : [ 'userAgent' ]
15+ }
16+
717Passport . use ( new HttpBearerStrategy (
818 function ( token , done ) {
919 const { userId } = verifyToken ( null , { token, returnData : true } )
@@ -22,6 +32,58 @@ Passport.use(new HttpBearerStrategy(
2232 }
2333) )
2434
35+ export function list ( options ) {
36+ const { res, query, returnData, jsonData } = options
37+ const { filtered, sorted, limit, page } = query
38+ const orderOptions = {
39+ sorted : true ,
40+ replace : {
41+ user : Sequelize . literal ( '\"User\".\"firstName\"' ) ,
42+ updatedAt : Sequelize . literal ( [
43+ '\"Session\".\"signedOut\" DESC' ,
44+ '\"Session\".\"updatedAt\"'
45+ ] . join ( ',' ) ) ,
46+ }
47+ }
48+
49+ return DB . Session
50+ . findAll ( {
51+ where : filters ( setQuery ( filtered ) , FILTER_OPTIONS ) ,
52+ include : [ setIncludeUser ( filtered ) ] ,
53+ offset : ( page - 1 ) * limit ,
54+ order : orderBy (
55+ setQuery ( sorted , true ) ,
56+ [ 'sessionId' , 'desc' ] ,
57+ orderOptions
58+ ) ,
59+ limit
60+ } )
61+ . then ( Sessions => {
62+ const data = jsonData ? jsonSessions ( Sessions ) : Sessions
63+
64+ if ( returnData ) return data
65+
66+ return res . status ( data ? 200 : 404 ) . send ( data )
67+ } )
68+ . catch ( error => {
69+ console . log ( error )
70+
71+ return returnData ? error : res . status ( 400 ) . send ( error )
72+ } )
73+ }
74+
75+ export function pages ( { query } ) {
76+ return DB . Session
77+ . count ( {
78+ col : 'sessionId' ,
79+ where : filters ( setQuery ( query . filtered ) , FILTER_OPTIONS ) ,
80+ include : [ setIncludeUser ( query . filtered ) ]
81+ } )
82+ . then ( count => {
83+ return pageCount ( query , count )
84+ } )
85+ }
86+
2587export function find ( res , options ) {
2688 const { where, returnData } = options
2789
@@ -31,7 +93,7 @@ export function find(res, options) {
3193 include : [ {
3294 model : DB . User ,
3395 as : 'User' ,
34- attributes : [ 'userId' , 'firstName' , 'lastName' , 'email' , 'role' , 'status' , 'redirect' ]
96+ attributes : [ 'userId' ]
3597 } ]
3698 } )
3799 . then ( Session => {
@@ -122,3 +184,70 @@ function getIpAddress(req) {
122184 req . connection . socket . remoteAddress
123185 ) . split ( ',' ) [ 0 ]
124186}
187+
188+ function jsonSessions ( Sessions ) {
189+ return _ . map ( Sessions , Session => {
190+ return {
191+ sessionId : Session . sessionId ,
192+ user : {
193+ userId : Session . User . userId ,
194+ name : Session . User . fullName ( )
195+ } ,
196+ userAgent : Session . userAgent ,
197+ ipAddress : Session . ipAddress ,
198+ createdAt : Session . createdAt ,
199+ signedOutAt : Session . signedOutAt ( )
200+ }
201+ } )
202+ }
203+
204+ function setQuery ( query , sorted = false ) {
205+ const parsed = query ? parseEncodedQuery ( query ) : [ ]
206+ const newQuery = _ . compact (
207+ _ . map ( parsed , p => {
208+ if ( p [ 0 ] === 'signedOutAt' ) return [ 'updatedAt' , p [ 1 ] ] . join ( ':' )
209+ if ( p [ 0 ] !== 'user' || ( p [ 0 ] === 'user' && sorted ) ) return p . join ( ':' )
210+ } )
211+ ) . join ( ',' )
212+
213+ return newQuery
214+ }
215+
216+ function setIncludeUser ( filtered ) {
217+ const parsed = filtered ? parseEncodedQuery ( filtered ) : [ ]
218+
219+ let includeUser = {
220+ model : DB . User ,
221+ as : 'User' ,
222+ attributes : [ 'userId' , 'firstName' , 'lastName' ]
223+ }
224+
225+ _ . map ( parsed , p => {
226+ if ( p [ 0 ] === 'user' )
227+ return includeUser [ 'where' ] = whereUser ( p [ 1 ] )
228+ } )
229+
230+ return includeUser
231+ }
232+
233+ function whereUser ( values ) {
234+ const decodedValues = decodeURIComponent ( decodeURIComponent ( values ) )
235+ const userSQLFnArray = _ . map ( decodedValues . split ( ' ' ) , value => {
236+ return { [ Op . or ] : [
237+ userSQLFn ( 'firstName' , value ) ,
238+ userSQLFn ( 'lastName' , value )
239+ ] }
240+ } )
241+
242+ return { [ Op . and ] : userSQLFnArray }
243+ }
244+
245+ function userSQLFn ( column , value ) {
246+ return Sequelize . where (
247+ Sequelize . fn (
248+ 'lower' ,
249+ Sequelize . col ( column )
250+ ) ,
251+ { [ Op . regexp ] : [ '\\y' , value . toLowerCase ( ) , '\\y' ] . join ( '' ) }
252+ )
253+ }
0 commit comments