diff options
Diffstat (limited to 'src/api/structures/Database.js')
| -rw-r--r-- | src/api/structures/Database.js | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/api/structures/Database.js b/src/api/structures/Database.js new file mode 100644 index 0000000..dc26afe --- /dev/null +++ b/src/api/structures/Database.js @@ -0,0 +1,110 @@ +const log = require('../utils/Log'); +const { server } = require('../../../config'); +const db = require('knex')(server.database); +const bcrypt = require('bcrypt'); +const moment = require('moment'); +const randomstring = require('randomstring'); + +class Database { + constructor() { + this.createTables(); + } + + async createTables() { + if (!await db.schema.hasTable('users')) { + await db.schema.createTable('users', table => { + table.increments(); + table.string('username'); + table.string('password'); + table.boolean('enabled').defaultTo(true); + table.boolean('isAdmin').defaultTo(false); + table.string('apiKey'); + table.timestamp('passwordEditedAt'); + table.timestamp('apiKeyEditedAt'); + table.timestamp('createdAt'); + table.timestamp('editedAt'); + }); + } + + if (!await db.schema.hasTable('albums')) { + await db.schema.createTable('albums', table => { + table.increments(); + table.integer('userId'); + table.string('name'); + // table.string('identifier'); + // table.boolean('enabled'); + // table.boolean('enableDownload').defaultTo(true); + table.timestamp('createdAt'); + table.timestamp('editedAt'); + }); + } + + if (!await db.schema.hasTable('files')) { + await db.schema.createTable('files', table => { + table.increments(); + table.integer('userId'); + table.string('name'); + table.string('original'); + table.string('type'); + table.integer('size'); + table.string('hash'); + table.string('ip'); + table.timestamp('createdAt'); + table.timestamp('editedAt'); + }); + } + + if (!await db.schema.hasTable('links')) { + await db.schema.createTable('links', table => { + table.increments(); + table.integer('albumId'); + table.string('identifier'); + table.integer('views').defaultTo(0); + table.boolean('enabled').defaultTo(true); + table.boolean('enableDownload').defaultTo(true); + table.timestamp('expiresAt'); + table.timestamp('createdAt'); + table.timestamp('editedAt'); + }); + } + + if (!await db.schema.hasTable('albumsFiles')) { + await db.schema.createTable('albumsFiles', table => { + table.increments(); + table.integer('albumId'); + table.integer('fileId'); + }); + } + + if (!await db.schema.hasTable('albumsLinks')) { + await db.schema.createTable('albumsLinks', table => { + table.increments(); + table.integer('albumId'); + table.integer('linkId'); + }); + } + + const now = moment.utc().toDate(); + const user = await db.table('users').where({ username: 'root' }).first(); + if (user) return; + try { + const hash = await bcrypt.hash('root', 10); + await db.table('users').insert({ + username: 'root', + password: hash, + apiKey: randomstring.generate(64), + passwordEditedAt: now, + apiKeyEditedAt: now, + createdAt: now, + editedAt: now, + isAdmin: true + }); + log.success('Successfully created the root user with password "root". Make sure to log in and change it!'); + } catch (error) { + log.error(error); + if (error) log.error('Error generating password hash for root'); + } + } +} + +module.exports = Database; |