diff --git a/Tomoe/build/core/config.js b/Tomoe/build/core/config.js index 4c83953..d90b9de 100644 --- a/Tomoe/build/core/config.js +++ b/Tomoe/build/core/config.js @@ -1,12 +1,12 @@ import crypto from 'crypto'; import fs from 'fs'; - +import packageDetail from '../../package.json'; import { Definitions } from '../templates'; const TOMOE_CONFIG_PATH = `./${Definitions.configName}` -export class Config{ +export class Config { constructor(params = {}){ this.hackathon = params.hackathon || ''; this.beta = params.beta || false; @@ -17,10 +17,11 @@ export class Config{ this.server = params.server || this.database; this.apiVersion = params.apiVersion || Definitions.apiVersion; this.userTypes = params.userTypes || Definitions.userTypes; - this.hackerStatuses = params.hackerStatuses || Definitions.defaultHackerStatuses; - this.volunteerStatuses = params.hackerStatuses || Definitions.defaultVolunteerStatuses; + this.hackerStatuses = params.hackerStatuses || Definitions.hackerStatuses; + this.volunteerStatuses = params.hackerStatuses || Definitions.volunteerStatuses; this.build = params.build || ((fs.existsSync('../.hackmerced')) ? Definitions.build.default : Definitions.build.import) - this.adminPermissions = params.adminPermissions || Definitions.defaultAdminPermissions; + this.adminPermissions = params.adminPermissions || Definitions.adminPermissions; + this.version = packageDetail.version; } get(){ @@ -36,7 +37,9 @@ export class Config{ userTypes: this.userTypes, hackerStatuses: this.hackerStatuses, volunteerStatuses: this.volunteerStatuses, - adminPermissions: this.adminPermissions + adminPermissions: this.adminPermissions, + build: this.build, + version: this.version, } } @@ -55,6 +58,11 @@ export class Config{ }) } + + static current(){ + return require(`../.${TOMOE_CONFIG_PATH}`).Tomoe; + } + delete(){ fs.unlink(TOMOE_CONFIG_PATH); } diff --git a/Tomoe/build/core/generator.js b/Tomoe/build/core/generator.js index 58b7537..f313201 100644 --- a/Tomoe/build/core/generator.js +++ b/Tomoe/build/core/generator.js @@ -89,7 +89,7 @@ const stage = { term('\nLearn how to create local ENV files at: https://github.com/HackMerced/HackMerced/tree/master/Tomoe#local-environmnet-variables-in-development'.red); term('\n'); - process.exit(); + process.exit(1); } stage.next(); diff --git a/Tomoe/build/templates/tomoe.template.js b/Tomoe/build/templates/tomoe.template.js index 10d42c6..af05375 100644 --- a/Tomoe/build/templates/tomoe.template.js +++ b/Tomoe/build/templates/tomoe.template.js @@ -15,7 +15,7 @@ const standardDBCollections = [ 'hacker', // hacker users 'volunteer', // volunteer users 'oauth', // oauth keys information - 'meta' // meta Tomoe information + 'meta', // meta Tomoe information ] const dbCollections = { @@ -32,7 +32,7 @@ export const Definitions = { server: serverNames[process.env.NODE_ENV], userTypes:['admin', 'hacker', 'volunteer'], apiVersion: '2.0', - defaultHackerStatuses:[ + hackerStatuses:[ 'registered', 'applied', 'accepted', @@ -41,12 +41,12 @@ export const Definitions = { 'attending', 'inactive' ], - defaultVolunteerStatuses: [ + volunteerStatuses: [ "applied", "denied", "approved", ], - defaultAdminPermissions: [ + adminPermissions: [ 'read', 'read+write', // read + write 'admin' // super admin (controls group settings) diff --git a/Tomoe/build/update/index.js b/Tomoe/build/update/index.js new file mode 100644 index 0000000..d930b6f --- /dev/null +++ b/Tomoe/build/update/index.js @@ -0,0 +1,11 @@ +const fs = require('fs'), + ENV_PATH = '.env'; + +// support for local .env files + +if(fs.existsSync(ENV_PATH)){ + require('dotenv').config({path: ENV_PATH}) +} + +require('babel-core/register'); +require('./updater.js') diff --git a/Tomoe/build/update/updater.js b/Tomoe/build/update/updater.js new file mode 100644 index 0000000..2a56ca1 --- /dev/null +++ b/Tomoe/build/update/updater.js @@ -0,0 +1,48 @@ +/* + This code will upgrade the Tomoe.config.js and Arangodb without destroying the database/your updates +*/ +import packageDetail from '../../package.json'; +import { Config } from '../core/config'; +import { Definitions } from '../templates/tomoe.template'; +import { Database } from 'arangojs'; +import { createCollections } from '../util' + + +const term = console.log; // easier to type + +export function updateConfig() { + term(`Updating tomoe.config.js`); + + let config = new Config(Config.current()); + + for(let option in Definitions) { + if(!config[option]) { + config[option] = Definitions[option]; + } + } + + config.save(); +} + +export function updateCollections() { + global.db = new Database({ + url: process.env.DB_URI, + }); + + db.useDatabase(Definitions.server); + + createCollections().then(() => { + + }).catch(err => { + term(err); + }) +} + +export function TomoeUpdate() { + term(`Upgrading Tomoe to version ${packageDetail.version}`); + + updateConfig(); + updateCollections(); +} + +TomoeUpdate(); diff --git a/Tomoe/build/util/check-version.js b/Tomoe/build/util/check-version.js new file mode 100644 index 0000000..dfc304a --- /dev/null +++ b/Tomoe/build/util/check-version.js @@ -0,0 +1,19 @@ +const packageDetail = require('../../package.json'); +const colors = require('colors'); +const LATEST_MAJOR_RELEASE = 20.2; + +function checkVersion(resolve) { + if(parseFloat(packageDetail.version.replace('.', '')) < LATEST_MAJOR_RELEASE) { + console.log(colors.red('\n\You are running a deprecated version of Tomoe!\nPlease delete your "tomoe.config.js" file and run the following:\n\n'),colors.green(' yarn setup')) + process.exit(1); + } + + if(TOMOE_CONFIG.version === packageDetail.version) { + return resolve(); + } + + console.log(colors.red('\n\Version mismatch in Tomoe instances, please run:\n'),colors.green(' yarn renew')) + process.exit(1); +} + +module.exports = checkVersion; diff --git a/Tomoe/package.json b/Tomoe/package.json index c7026e8..c73440f 100755 --- a/Tomoe/package.json +++ b/Tomoe/package.json @@ -1,6 +1,6 @@ { "name": "Tomoe", - "version": "2.0.0", + "version": "2.0.2", "description": "Centralized API user platform for Hackathons", "main": "production.js", "scripts": { @@ -8,6 +8,7 @@ "compile": "node ./src/app/build/scripts/compile", "setup": "npm run generate", "generate": "node ./build/core", + "renew": "node ./build/update", "build": "npm run clean && cross-env NODE_ENV=production npm run compile", "start": "node ./build/imports && cross-env NODE_ENV=development node ./src/app/build/scripts/start", "api": "node ./src/server/index.js", diff --git a/Tomoe/readme.md b/Tomoe/readme.md index b274595..f5badc6 100755 --- a/Tomoe/readme.md +++ b/Tomoe/readme.md @@ -51,7 +51,7 @@ Access the server and gui locally at: http://localhost:4925 ``` -### Local environmnet variables in development +### Local environment variables in development If you do not want to setup environmental variables globally, Tomoe allows you to locally set environmental variables by creating file called `.env` in the root directory of Tomoe ```terminal @@ -68,6 +68,14 @@ NODE_ENV={Either DEVELOPMENT or PRODUCTIOn} [⬆ back to top](#table-of-contents) +### Updating +In the case of updating to a newer version of Tomoe, please run the following commands after pulling a new repo: + +``` +yarn # installs all new pacakges +yarn renew # updates your tomoe.config.js and databases +``` + # Documentation ## Shortcuts [**Hacker Object**](#the-hacker-object)
diff --git a/Tomoe/src/server/index.js b/Tomoe/src/server/index.js index 96cd5f0..1f6b5fd 100644 --- a/Tomoe/src/server/index.js +++ b/Tomoe/src/server/index.js @@ -1,6 +1,7 @@ const fs = require('fs'), ENV_PATH = './.env'; const colors = require('colors'); +const checkVersion = require('../../build/util/check-version.js'); // support for local .env files if(!fs.existsSync(ENV_PATH)){ @@ -11,10 +12,11 @@ if(!fs.existsSync(ENV_PATH)){ if(fs.existsSync('./tomoe.config.js')){ global.TOMOE_CONFIG = require('../../tomoe.config.js').Tomoe; - require( 'babel-core/register' ); - require('./src/database.js') - require('./src/server.js'); - + checkVersion(function(){ + require( 'babel-core/register' ); + require('./src/database.js') + require('./src/server.js'); + }) } else { console.log(colors.red('\n\nWe cannot find your tomoe.config.js file!')); console.log(colors.grey('Please install Tomoe before turning on the server by entering the following command:'));