diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/api/database/migrations/20210112011802_addSettingsTable.js | 24 | ||||
| -rw-r--r-- | src/api/database/seeds/initial.js | 13 | ||||
| -rw-r--r-- | src/api/scripts/overwriteConfig.js | 15 | ||||
| -rw-r--r-- | src/api/structures/Database.js | 2 | ||||
| -rw-r--r-- | src/api/utils/Util.js | 39 |
5 files changed, 90 insertions, 3 deletions
diff --git a/src/api/database/migrations/20210112011802_addSettingsTable.js b/src/api/database/migrations/20210112011802_addSettingsTable.js index 2708352..3acd845 100644 --- a/src/api/database/migrations/20210112011802_addSettingsTable.js +++ b/src/api/database/migrations/20210112011802_addSettingsTable.js @@ -1,7 +1,27 @@ exports.up = async knex => { await knex.schema.createTable('settings', table => { - table.string('key').unique(); - table.json('value').notNullable(); + table.string('routePrefix'); + table.integer('rateLimitWindow'); + table.integer('rateLimitMax'); + table.string('secret'); + table.string('serviceName'); + table.string('domain'); + table.integer('chunkSize'); + table.integer('maxSize'); + table.boolean('generateZips'); + table.integer('generatedFilenameLength'); + table.integer('generatedAlbumLength'); + table.integer('maxLinksPerAlbum'); + table.string('uploadFolder'); + table.json('blockedExtensions'); + table.boolean('publicMode'); + table.boolean('userAccounts'); + table.string('adminAccount'); + table.string('adminPassword'); + table.string('metaThemeColor'); + table.string('metaDescription'); + table.string('metaKeywords'); + table.string('metaTwitterHandle'); }); }; diff --git a/src/api/database/seeds/initial.js b/src/api/database/seeds/initial.js index edc1949..bb60b2c 100644 --- a/src/api/database/seeds/initial.js +++ b/src/api/database/seeds/initial.js @@ -1,9 +1,22 @@ /* eslint-disable no-console */ const bcrypt = require('bcrypt'); const moment = require('moment'); +const Util = require('../../utils/Util'); exports.seed = async db => { const now = moment.utc().toDate(); + + // Save environment variables to the database + try { + const settings = await db.table('settings').first(); + if (!settings) { + await Util.writeConfigToDb(Util.getEnvironmentDefaults(), false); + } + } catch (error) { + console.error(error); + } + + // Create admin user if it doesnt exist const user = await db.table('users').where({ username: process.env.ADMIN_ACCOUNT }).first(); if (user) return; try { diff --git a/src/api/scripts/overwriteConfig.js b/src/api/scripts/overwriteConfig.js new file mode 100644 index 0000000..0355ea6 --- /dev/null +++ b/src/api/scripts/overwriteConfig.js @@ -0,0 +1,15 @@ +require('dotenv').config(); + +const Util = require('../utils/Util'); + +const start = async () => { + try { + await Util.writeConfigToDb(Util.getEnvironmentDefaults()); + console.log('Configuration overwriten, you can now start chibisafe'); + process.exit(0); + } catch (error) { + console.error(error); + } +}; + +start(); diff --git a/src/api/structures/Database.js b/src/api/structures/Database.js index 39632a1..ed30c50 100644 --- a/src/api/structures/Database.js +++ b/src/api/structures/Database.js @@ -23,7 +23,7 @@ const db = Knex({ some things like different data types for booleans need to be considered like in the implementation below where sqlite returns 1 and 0 instead of true and false. */ - const booleanFields = ['enabled', 'enableDownload', 'isAdmin', 'nsfw']; + const booleanFields = ['enabled', 'enableDownload', 'isAdmin', 'nsfw', 'generateZips', 'publicMode', 'userAccounts']; const processResponse = row => { Object.keys(row).forEach(key => { diff --git a/src/api/utils/Util.js b/src/api/utils/Util.js index b60fca3..e760679 100644 --- a/src/api/utils/Util.js +++ b/src/api/utils/Util.js @@ -40,6 +40,45 @@ class Util { this._config = null; } + static getEnvironmentDefaults() { + return { + routePrefix: process.env.ROUTE_PREFIX || '/api', + rateLimitWindow: process.env.RATE_LIMIT_WINDOW || 2, + rateLimitMax: process.env.RATE_LIMIT_MAX || 5, + secret: process.env.SECRET || randomstring.generate(64), + serviceName: process.env.SERVICE_NAME || 'change-me', + domain: process.env.DOMAIN || `http://localhost:${process.env.SERVER_PORT}`, + chunkSize: process.env.CHUNK_SIZE || 90, + maxSize: process.env.MAX_SIZE || 5000, + generateZips: process.env.GENERATE_ZIPS == undefined ? true : false, + generatedFilenameLength: process.env.GENERATED_FILENAME_LENGTH || 12, + generatedAlbumLength: process.env.GENERATED_ALBUM_LENGTH || 6, + maxLinksPerAlbum: process.env.MAX_LINKS_PER_ALBUM || 5, + uploadFolder: process.env.UPLOAD_FOLDER || 'uploads', + blockedExtensions: process.env.BLOCKED_EXTENSIONS || ['.jar', '.exe', '.msi', '.com', '.bat', '.cmd', '.scr', '.ps1', '.sh'], + publicMode: process.env.PUBLIC_MODE == undefined ? true : false, + userAccounts: process.env.USER_ACCOUNTS == undefined ? true : false, + adminAccount: process.env.ADMIN_ACCOUNT || 'admin', + adminPassword: process.env.ADMIN_PASSWORD || 'admin', + metaThemeColor: process.env.META_THEME_COLOR || '#20222b', + metaDescription: process.env.META_DESCRIPTION || 'Blazing fast file uploader and bunker written in node! 🚀', + metaKeywords: process.env.META_KEYWORDS || 'chibisafe,lolisafe,upload,uploader,file,vue,images,ssr,file uploader,free', + metaTwitterHandle: process.env.META_TWITTER_HANDLE || '@your-handle' + }; + } + + static async writeConfigToDb(config, overwrite = true) { + try { + if (overwrite) { + await db.table('settings').first().update(config); + } else { + await db.table('settings').insert(config); + } + } catch (error) { + console.error(error); + } + } + static uuid() { return uuidv4(); } |