2018-02-21 13:33:08 -08:00
// const fs = require('fs');
// const path = require('path');
2017-06-19 18:37:35 +02:00
const Sequelize = require ( 'sequelize' ) ;
2018-02-21 13:33:08 -08:00
// const basename = path.basename(module.filename);
2017-06-19 13:22:06 -07:00
const logger = require ( 'winston' ) ;
2017-11-08 07:25:21 -08:00
const config = require ( '../config/speechConfig.js' ) ;
2017-12-16 09:55:29 -08:00
const { database , username , password } = config . sql ;
2017-11-08 07:25:21 -08:00
const db = { } ;
2017-10-31 16:00:12 -07:00
2017-11-08 07:25:21 -08:00
// set sequelize options
2017-09-12 17:59:55 -07:00
const sequelize = new Sequelize ( database , username , password , {
2017-11-08 07:25:21 -08:00
host : 'localhost' ,
dialect : 'mysql' ,
dialectOptions : { decimalNumbers : true } , // fix to ensure DECIMAL will not be stored as a string
logging : false ,
pool : {
2017-08-26 04:31:16 -07:00
max : 5 ,
min : 0 ,
2017-09-12 17:59:55 -07:00
idle : 10000 ,
acquire : 10000 ,
2017-08-26 04:31:16 -07:00
} ,
2017-06-19 13:22:06 -07:00
} ) ;
2017-06-15 11:15:13 -07:00
sequelize
. authenticate ( )
. then ( ( ) => {
2017-06-21 16:36:08 -07:00
logger . info ( 'Sequelize has established mysql connection successfully.' ) ;
2017-06-15 11:15:13 -07:00
} )
. catch ( err => {
2017-06-21 16:36:08 -07:00
logger . error ( 'Sequelize was unable to connect to the database:' , err ) ;
2017-06-19 18:37:35 +02:00
} ) ;
2017-06-15 11:15:13 -07:00
2018-02-21 13:33:08 -08:00
// manually add each model to the db
const Certificate = require ( './certificate.js' ) ;
const Channel = require ( './channel.js' ) ;
const Claim = require ( './claim.js' ) ;
const File = require ( './file.js' ) ;
const Request = require ( './request.js' ) ;
const User = require ( './user.js' ) ;
db [ 'Certificate' ] = sequelize . import ( 'Certificate' , Certificate ) ;
db [ 'Channel' ] = sequelize . import ( 'Channel' , Channel ) ;
db [ 'Claim' ] = sequelize . import ( 'Claim' , Claim ) ;
db [ 'File' ] = sequelize . import ( 'File' , File ) ;
db [ 'Request' ] = sequelize . import ( 'Request' , Request ) ;
db [ 'User' ] = sequelize . import ( 'User' , User ) ;
2017-06-17 22:51:30 +02:00
2017-10-31 16:44:32 -07:00
// run model.association for each model in the db object that has an association
2017-06-17 22:51:30 +02:00
Object . keys ( db ) . forEach ( modelName => {
2017-06-15 11:15:13 -07:00
if ( db [ modelName ] . associate ) {
2017-07-12 16:57:12 -07:00
logger . info ( 'Associating model:' , modelName ) ;
2017-06-19 18:37:35 +02:00
db [ modelName ] . associate ( db ) ;
2017-06-15 11:15:13 -07:00
}
2017-06-19 18:37:35 +02:00
} ) ;
2017-06-15 11:15:13 -07:00
2017-09-07 12:24:40 -07:00
db . sequelize = sequelize ;
db . Sequelize = Sequelize ;
2017-11-08 07:25:21 -08:00
// add an 'upsert' method to the db object
2017-10-31 16:44:32 -07:00
db . upsert = ( Model , values , condition , tableName ) => {
2017-08-04 11:32:21 -07:00
return Model
. findOne ( { where : condition } )
2017-10-31 16:44:32 -07:00
. then ( obj => {
2017-08-04 11:32:21 -07:00
if ( obj ) { // update
2017-10-31 16:44:32 -07:00
logger . debug ( ` updating record in db. ${ tableName } ` ) ;
2017-08-04 11:32:21 -07:00
return obj . update ( values ) ;
} else { // insert
2017-10-31 16:44:32 -07:00
logger . debug ( ` creating record in db. ${ tableName } ` ) ;
2017-08-04 11:32:21 -07:00
return Model . create ( values ) ;
}
2017-09-07 17:08:06 -07:00
} )
. catch ( function ( error ) {
2017-11-06 14:15:47 -08:00
logger . error ( ` ${ tableName } .upsert error ` , error ) ;
2017-11-29 15:36:23 -08:00
throw error ;
2017-08-04 11:32:21 -07:00
} ) ;
} ;
2017-12-07 10:45:19 -08:00
// add a 'getTrendingFiles' method to the db object. note: change this to get claims directly. might need new association between Request and Claim
db . getTrendingFiles = ( startDate ) => {
2017-09-07 12:24:40 -07:00
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 } ) ;
} ;
2017-06-19 18:37:35 +02:00
module . exports = db ;