2017-06-19 18:37:35 +02:00
const fs = require ( 'fs' ) ;
const path = require ( 'path' ) ;
const Sequelize = require ( 'sequelize' ) ;
const basename = path . basename ( module . filename ) ;
const config = require ( 'config' ) ;
const db = { } ;
2017-06-19 22:22:06 +02:00
const logger = require ( 'winston' ) ;
2017-06-15 20:15:13 +02:00
2017-06-19 18:37:35 +02:00
const connectionUri = config . get ( 'Database.MySqlConnectionUri' ) ;
2017-06-19 22:22:06 +02:00
const sequelize = new Sequelize ( connectionUri , {
logging : false ,
2017-08-26 13:31:16 +02:00
pool : {
max : 5 ,
min : 0 ,
idle : 20000 ,
acquire : 20000 ,
} ,
2017-06-19 22:22:06 +02:00
} ) ;
2017-06-15 20:15:13 +02:00
sequelize
. authenticate ( )
. then ( ( ) => {
2017-06-22 01:36:08 +02:00
logger . info ( 'Sequelize has established mysql connection successfully.' ) ;
2017-06-15 20:15:13 +02:00
} )
. catch ( err => {
2017-06-22 01:36:08 +02:00
logger . error ( 'Sequelize was unable to connect to the database:' , err ) ;
2017-06-19 18:37:35 +02:00
} ) ;
2017-06-15 20:15:13 +02:00
2017-07-13 00:30:31 +02:00
fs
. readdirSync ( _ _dirname )
. filter ( file => {
return ( file . indexOf ( '.' ) !== 0 && file !== basename && file . slice ( - 3 ) === '.js' ) ;
} )
. forEach ( file => {
const model = sequelize [ 'import' ] ( path . join ( _ _dirname , file ) ) ;
db [ model . name ] = model ;
} ) ;
2017-06-17 22:51:30 +02:00
Object . keys ( db ) . forEach ( modelName => {
2017-06-15 20:15:13 +02:00
if ( db [ modelName ] . associate ) {
2017-07-13 01:57:12 +02:00
logger . info ( 'Associating model:' , modelName ) ;
2017-06-19 18:37:35 +02:00
db [ modelName ] . associate ( db ) ;
2017-06-15 20:15:13 +02:00
}
2017-06-19 18:37:35 +02:00
} ) ;
2017-06-15 20:15:13 +02:00
2017-09-07 21:24:40 +02:00
db . sequelize = sequelize ;
db . Sequelize = Sequelize ;
2017-08-16 20:00:17 +02:00
db [ 'upsert' ] = ( Model , values , condition , tableName ) => {
2017-08-04 20:32:21 +02:00
return Model
. findOne ( { where : condition } )
. then ( function ( obj ) {
if ( obj ) { // update
2017-08-16 20:00:17 +02:00
logger . debug ( ` updating " ${ values . name } " " ${ values . claimId } " in db. ${ tableName } ` ) ;
2017-08-04 20:32:21 +02:00
return obj . update ( values ) ;
} else { // insert
2017-08-16 20:00:17 +02:00
logger . debug ( ` creating " ${ values . name } " " ${ values . claimId } " in db. ${ tableName } ` ) ;
2017-08-04 20:32:21 +02:00
return Model . create ( values ) ;
}
} ) . catch ( function ( error ) {
logger . error ( 'Sequelize findOne error' , error ) ;
} ) ;
} ;
2017-09-07 21:24:40 +02:00
db [ 'getTrendingClaims' ] = ( startDate ) => {
return db . sequelize . query ( ` SELECT COUNT(*), File.* FROM Request LEFT JOIN File ON Request.FileId = File.id WHERE FileId IS NOT NULL AND nsfw != 1 AND trendingEligible = 1 AND Request.createdAt > " ${ startDate } " GROUP BY FileId ORDER BY COUNT(*) DESC LIMIT 25; ` , { type : db . sequelize . QueryTypes . SELECT } ) ;
} ;
db [ 'getRecentClaims' ] = ( ) => {
return db . sequelize . query ( ` SELECT * FROM File WHERE nsfw != 1 AND trendingEligible = 1 ORDER BY createdAt DESC LIMIT 25; ` , { type : db . sequelize . QueryTypes . SELECT } ) ;
} ;
2017-06-15 20:15:13 +02:00
2017-06-19 18:37:35 +02:00
module . exports = db ;