]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/initializers/database.ts
Fix tests
[github/Chocobozzz/PeerTube.git] / server / initializers / database.ts
index 78ca5ab84879fb0361552fb1b5a5de6b372f9868..2260938b1dcc9bceddf0edf8b7560decc2ed6230 100644 (file)
@@ -1,67 +1,48 @@
-import * as fs from 'fs'
-import { join } from 'path'
-import * as Sequelize from 'sequelize'
+import { Sequelize as SequelizeTypescript } from 'sequelize-typescript'
+import { isTestInstance } from '../helpers/core-utils'
+import { logger } from '../helpers/logger'
 
+import { AccountModel } from '../models/account/account'
+import { AccountFollowModel } from '../models/account/account-follow'
+import { AccountVideoRateModel } from '../models/account/account-video-rate'
+import { UserModel } from '../models/account/user'
+import { ApplicationModel } from '../models/application/application'
+import { AvatarModel } from '../models/avatar/avatar'
+import { JobModel } from '../models/job/job'
+import { OAuthClientModel } from '../models/oauth/oauth-client'
+import { OAuthTokenModel } from '../models/oauth/oauth-token'
+import { ServerModel } from '../models/server/server'
+import { TagModel } from '../models/video/tag'
+import { VideoModel } from '../models/video/video'
+import { VideoAbuseModel } from '../models/video/video-abuse'
+import { VideoBlacklistModel } from '../models/video/video-blacklist'
+import { VideoChannelModel } from '../models/video/video-channel'
+import { VideoChannelShareModel } from '../models/video/video-channel-share'
+import { VideoFileModel } from '../models/video/video-file'
+import { VideoShareModel } from '../models/video/video-share'
+import { VideoTagModel } from '../models/video/video-tag'
 import { CONFIG } from './constants'
-// Do not use barrel, we need to load database first
-import { logger } from '../helpers/logger'
-import { isTestInstance } from '../helpers/utils'
-import {
-  ApplicationModel,
-  AuthorModel,
-  JobModel,
-  OAuthClientModel,
-  OAuthTokenModel,
-  PodModel,
-  RequestModel,
-  RequestToPodModel,
-  RequestVideoEventModel,
-  RequestVideoQaduModel,
-  TagModel,
-  UserModel,
-  UserVideoRateModel,
-  VideoAbuseModel,
-  BlacklistedVideoModel,
-  VideoTagModel,
-  VideoModel
-} from '../models'
+
+require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string
 
 const dbname = CONFIG.DATABASE.DBNAME
 const username = CONFIG.DATABASE.USERNAME
 const password = CONFIG.DATABASE.PASSWORD
 
-const database: {
-  sequelize?: Sequelize.Sequelize,
-  init?: (silent: any, callback: any) => void,
-
-  Application?: ApplicationModel,
-  Author?: AuthorModel,
-  Job?: JobModel,
-  OAuthClient?: OAuthClientModel,
-  OAuthToken?: OAuthTokenModel,
-  Pod?: PodModel,
-  RequestToPod?: RequestToPodModel,
-  RequestVideoEvent?: RequestVideoEventModel,
-  RequestVideoQadu?: RequestVideoQaduModel,
-  Request?: RequestModel,
-  Tag?: TagModel,
-  UserVideoRate?: UserVideoRateModel,
-  User?: UserModel,
-  VideoAbuse?: VideoAbuseModel,
-  BlacklistedVideo?: BlacklistedVideoModel,
-  VideoTag?: VideoTagModel,
-  Video?: VideoModel
-} = {}
-
-const sequelize = new Sequelize(dbname, username, password, {
+const sequelizeTypescript = new SequelizeTypescript({
+  database: dbname,
   dialect: 'postgres',
-  host: CONFIG.DATABASE.HOSTNAME,
-  port: CONFIG.DATABASE.PORT,
+  username,
+  password,
+  modelPaths: [__dirname + '/models'],
   benchmark: isTestInstance(),
+  isolationLevel: SequelizeTypescript.Transaction.ISOLATION_LEVELS.SERIALIZABLE,
+  operatorsAliases: false,
+  logging: (message: string, benchmark: number) => {
+    if (process.env.NODE_DB_LOG === 'false') return
 
-  logging: function (message: string, benchmark: number) {
     let newMessage = message
-    if (benchmark !== undefined) {
+    if (isTestInstance() === true && benchmark !== undefined) {
       newMessage += ' | ' + benchmark + 'ms'
     }
 
@@ -69,45 +50,37 @@ const sequelize = new Sequelize(dbname, username, password, {
   }
 })
 
-database.sequelize = sequelize
-
-database.init = function (silent: boolean, callback: (err: Error) => void) {
-
-  const modelDirectory = join(__dirname, '..', 'models')
-  fs.readdir(modelDirectory, function (err, files) {
-    if (err) throw err
-
-    files.filter(function (file) {
-      // For all models but not utils.js
-      if (
-        file === 'index.js' ||
-        file === 'utils.js' ||
-        file.endsWith('-interface.js') ||
-        file.endsWith('.js.map')
-      ) return false
-
-      return true
-    })
-    .forEach(function (file) {
-      const model = sequelize.import(join(modelDirectory, file))
-
-      database[model['name']] = model
-    })
-
-    Object.keys(database).forEach(function (modelName) {
-      if ('associate' in database[modelName]) {
-        database[modelName].associate(database)
-      }
-    })
-
-    if (!silent) logger.info('Database %s is ready.', dbname)
-
-    return callback(null)
-  })
+async function initDatabaseModels (silent: boolean) {
+  sequelizeTypescript.addModels([
+    ApplicationModel,
+    AvatarModel,
+    AccountModel,
+    JobModel,
+    OAuthClientModel,
+    OAuthTokenModel,
+    ServerModel,
+    TagModel,
+    AccountVideoRateModel,
+    AccountFollowModel,
+    UserModel,
+    VideoAbuseModel,
+    VideoChannelModel,
+    VideoChannelShareModel,
+    VideoShareModel,
+    VideoFileModel,
+    VideoBlacklistModel,
+    VideoTagModel,
+    VideoModel
+  ])
+
+  if (!silent) logger.info('Database %s is ready.', dbname)
+
+  return
 }
 
 // ---------------------------------------------------------------------------
 
 export {
-  database
+  initDatabaseModels,
+  sequelizeTypescript
 }