feat: implement initial values and saving to db logic

This commit is contained in:
Pitu 2021-03-25 02:03:57 +09:00
parent abd7a1ca2e
commit 3f223a9dbf
8 changed files with 93 additions and 3 deletions

View File

@ -7,6 +7,7 @@ services:
SECRET: "wowfcgMHqZHwOIMLadWrKu3liyqPOOILpDLSDvuxq3YGhJmiZXJCVpnF96l11WfR"
ADMIN_ACCOUNT: "admin"
ADMIN_PASSWORD: "admin"
# OVERWRITE_SETTINGS: 'false'
# ROUTE_PREFIX: /api
# RATE_LIMIT_WINDOW: 2
# RATE_LIMIT_MAX: 5

View File

@ -26,6 +26,7 @@ services:
- "5001"
restart: unless-stopped
environment:
OVERWRITE_SETTINGS: "false"
CHUNK_SIZE: 90
ROUTE_PREFIX: /api
RATE_LIMIT_WINDOW: 2

View File

@ -18,6 +18,7 @@
"api": "node src/api/structures/Server",
"update": "git pull && npm install && npm run migrate && npm run build && npm run restart",
"restart": "pm2 restart lolisafe",
"overwrite-config": "cross-env OVERWRITE_SETTINGS=true",
"test:vue": "jest --testPathPattern=src/site",
"test:api": "jest --testPathPattern=src/tests/api",
"test:e2e": "jest --testPathPattern=src/tests/e2e",

View File

@ -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');
});
};

View File

@ -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 {

View File

@ -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();

View File

@ -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 => {

View File

@ -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();
}