-import { join } from 'path'
-import * as config from 'config'
import * as passwordGenerator from 'password-generator'
-import * as Promise from 'bluebird'
-
-import { database as db } from './database'
-import { USER_ROLES, CONFIG, LAST_MIGRATION_VERSION } from './constants'
-import { clientsExist, usersExist } from './checker'
-import { logger, createCertsIfNotExist, root, mkdirpPromise } from '../helpers'
-
-function installApplication () {
- return db.sequelize.sync()
- .then(() => createDirectoriesIfNotExist())
- .then(() => createCertsIfNotExist())
- .then(() => createOAuthClientIfNotExist())
- .then(() => createOAuthAdminIfNotExist())
+import { UserRole } from '../../shared'
+import { mkdirpPromise, rimrafPromise } from '../helpers/core-utils'
+import { logger } from '../helpers/logger'
+import { createApplicationActor, createUserAccountAndChannel } from '../lib/user'
+import { UserModel } from '../models/account/user'
+import { ApplicationModel } from '../models/application/application'
+import { OAuthClientModel } from '../models/oauth/oauth-client'
+import { applicationExist, clientsExist, usersExist } from './checker'
+import { CACHE, CONFIG, LAST_MIGRATION_VERSION } from './constants'
+import { sequelizeTypescript } from './database'
+
+async function installApplication () {
+ try {
+ await sequelizeTypescript.sync()
+ await removeCacheDirectories()
+ await createDirectoriesIfNotExist()
+ await createApplicationIfNotExist()
+ await createOAuthClientIfNotExist()
+ await createOAuthAdminIfNotExist()
+ } catch (err) {
+ logger.error('Cannot install application.', { err })
+ process.exit(-1)
+ }
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
-function createDirectoriesIfNotExist () {
- const storages = config.get('storage')
+function removeCacheDirectories () {
+ const cacheDirectories = Object.keys(CACHE)
+ .map(k => CACHE[k].DIRECTORY)
- const tasks = []
- Object.keys(storages).forEach(key => {
- const dir = storages[key]
- tasks.push(mkdirpPromise(join(root(), dir)))
- })
+ const tasks: Promise<any>[] = []
+
+ // Cache directories
+ for (const key of Object.keys(cacheDirectories)) {
+ const dir = cacheDirectories[key]
+ tasks.push(rimrafPromise(dir))
+ }
return Promise.all(tasks)
}
-function createOAuthClientIfNotExist () {
- return clientsExist().then(exist => {
- // Nothing to do, clients already exist
- if (exist === true) return undefined
+function createDirectoriesIfNotExist () {
+ const storage = CONFIG.STORAGE
+ const cacheDirectories = Object.keys(CACHE)
+ .map(k => CACHE[k].DIRECTORY)
+
+ const tasks: Promise<string>[] = []
+ for (const key of Object.keys(storage)) {
+ const dir = storage[key]
+ tasks.push(mkdirpPromise(dir))
+ }
+
+ // Cache directories
+ for (const key of Object.keys(cacheDirectories)) {
+ const dir = cacheDirectories[key]
+ tasks.push(mkdirpPromise(dir))
+ }
- logger.info('Creating a default OAuth Client.')
+ return Promise.all(tasks)
+}
- const id = passwordGenerator(32, false, /[a-z0-9]/)
- const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/)
- const client = db.OAuthClient.build({
- clientId: id,
- clientSecret: secret,
- grants: [ 'password', 'refresh_token' ],
- redirectUris: null
- })
+async function createOAuthClientIfNotExist () {
+ const exist = await clientsExist()
+ // Nothing to do, clients already exist
+ if (exist === true) return undefined
- return client.save().then(createdClient => {
- logger.info('Client id: ' + createdClient.clientId)
- logger.info('Client secret: ' + createdClient.clientSecret)
+ logger.info('Creating a default OAuth Client.')
- return undefined
- })
+ const id = passwordGenerator(32, false, /[a-z0-9]/)
+ const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/)
+ const client = new OAuthClientModel({
+ clientId: id,
+ clientSecret: secret,
+ grants: [ 'password', 'refresh_token' ],
+ redirectUris: null
})
-}
-function createOAuthAdminIfNotExist () {
- return usersExist().then(exist => {
- // Nothing to do, users already exist
- if (exist === true) return undefined
+ const createdClient = await client.save()
+ logger.info('Client id: ' + createdClient.clientId)
+ logger.info('Client secret: ' + createdClient.clientSecret)
- logger.info('Creating the administrator.')
+ return undefined
+}
- const username = 'root'
- const role = USER_ROLES.ADMIN
- const email = CONFIG.ADMIN.EMAIL
- const createOptions: { validate?: boolean } = {}
- let password = ''
+async function createOAuthAdminIfNotExist () {
+ const exist = await usersExist()
+ // Nothing to do, users already exist
+ if (exist === true) return undefined
- // Do not generate a random password for tests
- if (process.env.NODE_ENV === 'test') {
- password = 'test'
+ logger.info('Creating the administrator.')
- if (process.env.NODE_APP_INSTANCE) {
- password += process.env.NODE_APP_INSTANCE
- }
+ const username = 'root'
+ const role = UserRole.ADMINISTRATOR
+ const email = CONFIG.ADMIN.EMAIL
+ let validatePassword = true
+ let password = ''
- // Our password is weak so do not validate it
- createOptions.validate = false
- } else {
- password = passwordGenerator(8, true)
- }
+ // Do not generate a random password for tests
+ if (process.env.NODE_ENV === 'test') {
+ password = 'test'
- const userData = {
- username,
- email,
- password,
- role
+ if (process.env.NODE_APP_INSTANCE) {
+ password += process.env.NODE_APP_INSTANCE
}
- return db.User.create(userData, createOptions).then(createdUser => {
- logger.info('Username: ' + username)
- logger.info('User password: ' + password)
+ // Our password is weak so do not validate it
+ validatePassword = false
+ } else {
+ password = passwordGenerator(16, true)
+ }
+
+ const userData = {
+ username,
+ email,
+ password,
+ role,
+ nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
+ videoQuota: -1
+ }
+ const user = new UserModel(userData)
+
+ await createUserAccountAndChannel(user, validatePassword)
+ logger.info('Username: ' + username)
+ logger.info('User password: ' + password)
+}
+
+async function createApplicationIfNotExist () {
+ const exist = await applicationExist()
+ // Nothing to do, application already exist
+ if (exist === true) return undefined
+
+ logger.info('Creating application account.')
- logger.info('Creating Application table.')
- return db.Application.create({ migrationVersion: LAST_MIGRATION_VERSION })
- })
+ const application = await ApplicationModel.create({
+ migrationVersion: LAST_MIGRATION_VERSION
})
+
+ return createApplicationActor(application.id)
}