mirror of
https://github.com/openmhz/trunk-server.git
synced 2026-11-15 10:17:33 -05:00
mostly seems to be working!
This commit is contained in:
37
.env.test
Normal file
37
.env.test
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
MEDIA=/Users/luke/Testing/media
|
||||||
|
DATA=/Users/luke/Testing/data
|
||||||
|
MAILJET_KEY="4d2a0f6deb20a7890afee2daf595c22d"
|
||||||
|
MAILJET_SECRET="fb74f682d68bf6b05ab626c0ac93a6da"
|
||||||
|
STAGE=test
|
||||||
|
TAG=1.7
|
||||||
|
DOMAIN_NAME="openmhz.test"
|
||||||
|
PROTOCOL="http://"
|
||||||
|
|
||||||
|
|
||||||
|
REACT_APP_BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}"
|
||||||
|
REACT_APP_FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}"
|
||||||
|
REACT_APP_SOCKET_SERVER=wss://socket.${DOMAIN_NAME}
|
||||||
|
REACT_APP_ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}"
|
||||||
|
REACT_APP_ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}"
|
||||||
|
REACT_APP_COOKIE_DOMAIN=".${DOMAIN_NAME}"
|
||||||
|
REACT_APP_ADMIN_EMAIL=luke@robotastic.com
|
||||||
|
REACT_APP_SITE_NAME=OpenMHz
|
||||||
|
REACT_APP_ARCHIVE_DAYS=30
|
||||||
|
STRIPE_PUBLISHABLE_KEY=""
|
||||||
|
STRIPE_SECRET_KEY="sk_test_S5kfQwdyRDgKtu9FQYpPh3B3"
|
||||||
|
BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}"
|
||||||
|
FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}"
|
||||||
|
ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}"
|
||||||
|
SOCKET_SERVER="wss://socket.${DOMAIN_NAME}"
|
||||||
|
ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}"
|
||||||
|
COOKIE_DOMAIN=".${DOMAIN_NAME}"
|
||||||
|
SITE_NAME="OpenMHz"
|
||||||
|
ADMIN_EMAIL="luke@robotastic.com"
|
||||||
|
S3_PROFILE='wasabi-account'
|
||||||
|
S3_ENPOINT='s3.us-west-1.wasabisys.com'
|
||||||
|
FREE_PLAN=0
|
||||||
|
PRO_PLAN=10
|
||||||
|
FREE_PLAN_PRICE=0
|
||||||
|
PRO_PLAN_PRICE=15
|
||||||
|
FREE_PLAN_ARCHIVE=7
|
||||||
|
PRO_PLAN_ARCHIVE=30
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
prod.env
|
prod.env
|
||||||
test.env
|
test.env
|
||||||
account/.eslintcache
|
account/.eslintcache
|
||||||
|
account/.eslintcache
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
/node_modules
|
/node_modules
|
||||||
|
/build
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,12 +0,0 @@
|
|||||||
REACT_APP_BACKEND_SERVER=https://api.openmhz.com
|
|
||||||
REACT_APP_FRONTEND_SERVER=https://openmhz.com
|
|
||||||
REACT_APP_SOCKET_SERVER=wss://api.openmhz.com
|
|
||||||
REACT_APP_ACCOUNT_SERVER=https://account.openmhz.com
|
|
||||||
REACT_APP_ADMIN_SERVER=localhost:3000
|
|
||||||
REACT_APP_ADMIN_EMAIL=luke@robotastic.com
|
|
||||||
REACT_APP_SITE_NAME=OpenMHz
|
|
||||||
REACT_APP_ARCHIVE_DAYS=30
|
|
||||||
REACT_APP_PRO_PLAN=1
|
|
||||||
REACT_APP_FREE_PLAN=0
|
|
||||||
REACT_APP_PRO_PLAN_ARCHIVE=30
|
|
||||||
REACT_APP_FREE_PLAN_ARCHIVE=7
|
|
||||||
@@ -2,11 +2,19 @@
|
|||||||
FROM node:13.12.0-alpine as build
|
FROM node:13.12.0-alpine as build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV PATH /app/node_modules/.bin:$PATH
|
ENV PATH /app/node_modules/.bin:$PATH
|
||||||
|
ARG REACT_APP_BACKEND_SERVER
|
||||||
|
ARG REACT_APP_ADMIN_SERVER
|
||||||
|
ARG REACT_APP_ACCOUNT_SERVER
|
||||||
|
ARG REACT_APP_FRONTEND_SERVER
|
||||||
|
ARG REACT_APP_SITE_NAME
|
||||||
|
ARG REACT_APP_ADMIN_EMAIL
|
||||||
|
ARG NODE_ENV
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
RUN npm install react-scripts@3.4.1 -g --silent
|
RUN npm install react-scripts@3.4.1 -g --silent
|
||||||
COPY . ./
|
COPY . ./
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
RUN env
|
||||||
|
|
||||||
# production environment
|
# production environment
|
||||||
FROM node:13.12.0-alpine
|
FROM node:13.12.0-alpine
|
||||||
@@ -14,6 +22,7 @@ RUN mkdir -p /app/public
|
|||||||
COPY ./package.json /tmp
|
COPY ./package.json /tmp
|
||||||
RUN cd /tmp && npm install
|
RUN cd /tmp && npm install
|
||||||
RUN cp -a /tmp/node_modules /app
|
RUN cp -a /tmp/node_modules /app
|
||||||
|
RUN env
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY server /app
|
COPY server /app
|
||||||
COPY --from=build /app/build /app/public
|
COPY --from=build /app/build /app/public
|
||||||
|
|||||||
@@ -6,8 +6,12 @@ const connectMongo = require("connect-mongo");
|
|||||||
const secrets = require("./secrets");
|
const secrets = require("./secrets");
|
||||||
|
|
||||||
const MongoStore = connectMongo(session)
|
const MongoStore = connectMongo(session)
|
||||||
var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
|
var backend_server = process.env['REACT_APP_BACKEND_SERVER'] != null ? process.env['REACT_APP_BACKEND_SERVER'] : 'https://api.openmhz.com';
|
||||||
|
var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
|
||||||
|
var socket_server = process.env['REACT_APP_SOCKET_SERVER'] != null ? process.env['REACT_APP_SOCKET_SERVER'] : 'wss://socket.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
|
var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
|
var dev_server = frontend_server + ":3000"
|
||||||
|
|
||||||
module.exports = function(app, passport) {
|
module.exports = function(app, passport) {
|
||||||
app.set("port", 3009)
|
app.set("port", 3009)
|
||||||
@@ -22,7 +26,6 @@ module.exports = function(app, passport) {
|
|||||||
app.use(express.static(path.join(process.cwd(), 'public')));
|
app.use(express.static(path.join(process.cwd(), 'public')));
|
||||||
|
|
||||||
const sess = {
|
const sess = {
|
||||||
secret: 'secret',
|
|
||||||
/*saveUninitialized: false,
|
/*saveUninitialized: false,
|
||||||
resave: false,*/
|
resave: false,*/
|
||||||
resave: true,
|
resave: true,
|
||||||
@@ -57,4 +60,33 @@ module.exports = function(app, passport) {
|
|||||||
app.use(passport.initialize())
|
app.use(passport.initialize())
|
||||||
app.use(passport.session())
|
app.use(passport.session())
|
||||||
|
|
||||||
|
app.use('/*', function(req, res, next) {
|
||||||
|
var allowedOrigins = [ account_server];
|
||||||
|
allowedOrigins.push(frontend_server);
|
||||||
|
allowedOrigins.push(backend_server);
|
||||||
|
allowedOrigins.push(socket_server);
|
||||||
|
allowedOrigins.push(dev_server);
|
||||||
|
var origin = req.headers.origin;
|
||||||
|
|
||||||
|
|
||||||
|
if (allowedOrigins.indexOf(origin) > -1) {
|
||||||
|
res.setHeader('Access-Control-Allow-Origin', origin);
|
||||||
|
} else if (req.headers["user-agent"] == 'TrunkRecorder1.0') {
|
||||||
|
res.setHeader('Access-Control-Allow-Origin', "*");
|
||||||
|
} else {
|
||||||
|
res.setHeader('Access-Control-Allow-Origin', "*");
|
||||||
|
if (origin) {
|
||||||
|
console.warn("forcing CORS for: " + origin + " referer: " + req.headers.referer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.header("Access-Control-Allow-Headers", "X-Requested-With");
|
||||||
|
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS,WEBSOCKET');
|
||||||
|
res.header('Access-Control-Allow-Credentials', 'true');
|
||||||
|
res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Access-Control-Allow-Credentials, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Max-Age");
|
||||||
|
res.header('Access-Control-Max-Age', '600');
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,11 +21,15 @@ const local = new LocalStrategy({
|
|||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}, (err, user) => {
|
}, (err, user) => {
|
||||||
if(!user) return done(null, false, { message: `Email ${email} not found` })
|
if(!user) {
|
||||||
|
console.error("Auth Error - user not found: " + email);
|
||||||
|
return done(null, false, { message: `Invalid email or password` })
|
||||||
|
}
|
||||||
user.comparePassword(password, (err, isMatch) => {
|
user.comparePassword(password, (err, isMatch) => {
|
||||||
if (isMatch) {
|
if (isMatch) {
|
||||||
return done(null, user)
|
return done(null, user)
|
||||||
} else {
|
} else {
|
||||||
|
console.error("Auth Error - password mismatch: " + email);
|
||||||
return done(null, false, { message: "Invalid email or password" })
|
return done(null, false, { message: "Invalid email or password" })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ const stripeKeySecret = process.env.STRIPE_SECRET_KEY;
|
|||||||
|
|
||||||
const stripe = require("stripe")(stripeKeySecret);
|
const stripe = require("stripe")(stripeKeySecret);
|
||||||
|
|
||||||
var admin_email = process.env['ADMIN_EMAIL'] != null ? process.env['ADMIN_EMAIL'] : "luke@openmhz.com";
|
var admin_email = process.env['REACT_APP_ADMIN_EMAIL'] != null ? process.env['REACT_ADMIN_ADMIN_EMAIL'] : "luke@openmhz.com";
|
||||||
var site_name = process.env['SITE_NAME'] != null ? process.env['SITE_NAME'] : "OpenMHz";
|
var site_name = process.env['REACT_APP_SITE_NAME'] != null ? process.env['REACT_APP_SITE_NAME'] : "OpenMHz";
|
||||||
var account_server = process.env['ACCOUNT_SERVER'] != null ? process.env['ACCOUNT_SERVER'] : "https://account.openmhz.com";
|
var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : "https://account.openmhz.com";
|
||||||
var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
|
|
||||||
exports.isLoggedIn = function (req, res, next) {
|
exports.isLoggedIn = function (req, res, next) {
|
||||||
if (req.isAuthenticated()) return next();
|
if (req.isAuthenticated()) return next();
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ process.env['MAILJET_KEY'],
|
|||||||
);
|
);
|
||||||
const crypto = require("crypto");
|
const crypto = require("crypto");
|
||||||
|
|
||||||
var admin_email = process.env['ADMIN_EMAIL'] != null ? process.env['ADMIN_EMAIL'] : "luke@openmhz.com";
|
var admin_email = process.env['REACT_APP_ADMIN_EMAIL'] != null ? process.env['REACT_APP_ADMIN_EMAIL'] : "luke@openmhz.com";
|
||||||
var site_name = process.env['SITE_NAME'] != null ? process.env['SITE_NAME'] : "OpenMHz";
|
var site_name = process.env['REACT_APP_SITE_NAME'] != null ? process.env['REACT_APP_SITE_NAME'] : "OpenMHz";
|
||||||
var account_server = process.env['ACCOUNT_SERVER'] != null ? process.env['ACCOUNT_SERVER'] : "https://account.openmhz.com";
|
var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : "https://account.openmhz.com";
|
||||||
var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
|
|
||||||
exports.isLoggedIn = function(req, res, next) {
|
exports.isLoggedIn = function(req, res, next) {
|
||||||
if (req.isAuthenticated()) return next();
|
if (req.isAuthenticated()) return next();
|
||||||
@@ -21,8 +21,7 @@ exports.isLoggedIn = function(req, res, next) {
|
|||||||
|
|
||||||
exports.authenticated = function(req, res, next) {
|
exports.authenticated = function(req, res, next) {
|
||||||
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
|
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
|
||||||
console.log("auth: " + req.isAuthenticated());
|
console.log("account/server/controllers/users.js - exports.authenticated() Auth check for user: " + req.user + " is: " + req.isAuthenticated());
|
||||||
console.log("req.user: " + req.user);
|
|
||||||
if (req.isAuthenticated()) {
|
if (req.isAuthenticated()) {
|
||||||
var clientUser = (({
|
var clientUser = (({
|
||||||
firstName,
|
firstName,
|
||||||
@@ -42,11 +41,7 @@ exports.authenticated = function(req, res, next) {
|
|||||||
req.user
|
req.user
|
||||||
);
|
);
|
||||||
clientUser.userId = req.user.id
|
clientUser.userId = req.user.id
|
||||||
if (req.user.customerId) {
|
|
||||||
clientUser.billing = true;
|
|
||||||
} else {
|
|
||||||
clientUser.billing = false;
|
|
||||||
}
|
|
||||||
return res.json({
|
return res.json({
|
||||||
success: true,
|
success: true,
|
||||||
user: clientUser
|
user: clientUser
|
||||||
@@ -93,7 +88,7 @@ exports.login = function(req, res, next) {
|
|||||||
userId: user.id
|
userId: user.id
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
console.log(user);
|
console.log("account/server/controllers/users.js - req.login() Authenicated: " + user.email);
|
||||||
// go ahead and create the new user
|
// go ahead and create the new user
|
||||||
var clientUser = (({
|
var clientUser = (({
|
||||||
firstName,
|
firstName,
|
||||||
@@ -454,6 +449,7 @@ exports.terms = function(req, res, next) {
|
|||||||
|
|
||||||
|
|
||||||
exports.validateProfile = function(req, res, next) {
|
exports.validateProfile = function(req, res, next) {
|
||||||
|
console.log("Validating user profile: "+ req.body.email);
|
||||||
if (!req.body.firstName || (req.body.firstName.length < 2)) {
|
if (!req.body.firstName || (req.body.firstName.length < 2)) {
|
||||||
console.error("ERROR: Validate System - req.body.firstName");
|
console.error("ERROR: Validate System - req.body.firstName");
|
||||||
res.json({
|
res.json({
|
||||||
@@ -549,6 +545,8 @@ exports.updateProfile = function(req, res, next) {
|
|||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
exports.register = function(req, res, next) {
|
exports.register = function(req, res, next) {
|
||||||
|
console.log("Registration request for: " + req.body.email);
|
||||||
|
|
||||||
User.findOne({
|
User.findOne({
|
||||||
$or: [{
|
$or: [{
|
||||||
email: req.body.email
|
email: req.body.email
|
||||||
@@ -587,14 +585,14 @@ exports.register = function(req, res, next) {
|
|||||||
user.email = req.body.email;
|
user.email = req.body.email;
|
||||||
|
|
||||||
User.create(user).then(function(dbUser) {
|
User.create(user).then(function(dbUser) {
|
||||||
console.log(dbUser);
|
console.log("Successfully registered: " + dbUser.email + ", now sending confirmation email.");
|
||||||
// Since regiestration worked, send a confirmation email.
|
// Since regiestration worked, send a confirmation email.
|
||||||
return handleSendConfirmEmail(dbUser);
|
return handleSendConfirmEmail(dbUser);
|
||||||
}).then(function(result) {
|
}).then(function(result) {
|
||||||
res.json(result);
|
res.json(result);
|
||||||
return;
|
return;
|
||||||
}).catch(function(err) {
|
}).catch(function(err) {
|
||||||
console.error(err);
|
console.error("Error creating user: " + user.email + " Error: " +err);
|
||||||
res.json({
|
res.json({
|
||||||
success: false,
|
success: false,
|
||||||
message: err
|
message: err
|
||||||
|
|||||||
@@ -15,19 +15,44 @@ const app = express()
|
|||||||
|
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
const connect = () => {
|
async function connect() {
|
||||||
mongoose.connect(secrets.db, (err, res) => {
|
|
||||||
|
// Demonstrate the readyState and on event emitters
|
||||||
|
console.log(mongoose.connection.readyState); //logs 0
|
||||||
|
mongoose.connection.on('connecting', () => {
|
||||||
|
console.log('Mongoose is connecting')
|
||||||
|
console.log(mongoose.connection.readyState); //logs 2
|
||||||
|
});
|
||||||
|
mongoose.connection.on('connected', () => {
|
||||||
|
console.log('Mongoose is connected');
|
||||||
|
console.log(mongoose.connection.readyState); //logs 1
|
||||||
|
});
|
||||||
|
mongoose.connection.on('disconnecting', () => {
|
||||||
|
console.log('Mongoose is disconnecting');
|
||||||
|
console.log(mongoose.connection.readyState); // logs 3
|
||||||
|
});
|
||||||
|
|
||||||
|
// Connect to a MongoDB server running on 'localhost:27017' and use the
|
||||||
|
// 'test' database.
|
||||||
|
await mongoose.connect(secrets.db, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }, (err, res) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(`Error connecting to ${secrets.db}. ${err}`)
|
console.log(`Mongoose - Error connecting to ${secrets.db}. ${err}`)
|
||||||
} else {
|
} else {
|
||||||
console.log(`Successfully connected to ${secrets.db}.`)
|
console.log(`Mongoose Successfully connected to ${secrets.db}.`)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
console.log("All Done");
|
||||||
}
|
}
|
||||||
connect()
|
connect();
|
||||||
|
mongoose.connection.on('error', err => {
|
||||||
mongoose.connection.on("error", console.error)
|
console.error("Mongoose Error!")
|
||||||
mongoose.connection.on("disconnected", connect)
|
console.error(err);
|
||||||
|
});
|
||||||
|
mongoose.connection.on('disconnected', () => {
|
||||||
|
console.log('Mongoose disconnected');
|
||||||
|
console.log(mongoose.connection.readyState); //logs 0
|
||||||
|
connect();
|
||||||
|
});
|
||||||
|
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ const UserSchema = new mongoose.Schema({
|
|||||||
/**
|
/**
|
||||||
* Password hash middleware.
|
* Password hash middleware.
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
UserSchema.pre("save", function(next) {
|
UserSchema.pre("save", function(next) {
|
||||||
var user = this
|
var user = this
|
||||||
if (!user.isModified("password")) return next()
|
if (!user.isModified("password")) return next()
|
||||||
@@ -70,11 +71,23 @@ UserSchema.pre("save", function(next) {
|
|||||||
next()
|
next()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})*/
|
||||||
|
|
||||||
|
UserSchema.pre("save", function(next) {
|
||||||
|
if(!this.isModified("password")) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
hashed = bcrypt.hashSync(this.password, 8);
|
||||||
|
this.password = hashed;
|
||||||
|
this.local.password = hashed;
|
||||||
|
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Defining our own custom document instance method
|
Defining our own custom document instance method
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
UserSchema.methods = {
|
UserSchema.methods = {
|
||||||
comparePassword: function(candidatePassword, cb) {
|
comparePassword: function(candidatePassword, cb) {
|
||||||
bcrypt.compare(candidatePassword, this.local.password, (err, isMatch) => {
|
bcrypt.compare(candidatePassword, this.local.password, (err, isMatch) => {
|
||||||
@@ -82,7 +95,12 @@ UserSchema.pre("save", function(next) {
|
|||||||
cb(null, isMatch)
|
cb(null, isMatch)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
UserSchema.methods.comparePassword = function(plaintext, callback) {
|
||||||
|
return callback(null, bcrypt.compareSync(plaintext, this.local.password));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Statics
|
* Statics
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class Navigation extends Component {
|
|||||||
{this.props.user.authenticated ? (
|
{this.props.user.authenticated ? (
|
||||||
<Menu style={navStyle}>
|
<Menu style={navStyle}>
|
||||||
<Menu.Item name="systems" header>
|
<Menu.Item name="systems" header>
|
||||||
OpenMHz
|
{process.env.REACT_APP_SITE_NAME}
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Menu position="right">
|
<Menu.Menu position="right">
|
||||||
{/* <Link to="/update-plans">
|
{/* <Link to="/update-plans">
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ export function manualLogin(
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginLogin());
|
dispatch(beginLogin());
|
||||||
|
|
||||||
return makeUserRequest("post", data, "/login", { withCredentials: true })
|
return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/login", { withCredentials: true })
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
const user = response.data.user
|
const user = response.data.user
|
||||||
@@ -252,7 +252,7 @@ export function manualLogout() {
|
|||||||
export function confirmEmail(userId, token) {
|
export function confirmEmail(userId, token) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginConfirm());
|
dispatch(beginConfirm());
|
||||||
return makeUserRequest("post", {}, "/users/" + userId + "/confirm/" + token).then(
|
return makeUserRequest("post", {}, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + userId + "/confirm/" + token).then(
|
||||||
response => {
|
response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(confirmSuccess());
|
dispatch(confirmSuccess());
|
||||||
@@ -271,7 +271,7 @@ export function confirmEmail(userId, token) {
|
|||||||
export function resetPassword(userId, token, password) {
|
export function resetPassword(userId, token, password) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginResetPassword());
|
dispatch(beginResetPassword());
|
||||||
return makeUserRequest("post", { password: password }, "/users/" + userId + "/reset-password/" + token).then(
|
return makeUserRequest("post", { password: password }, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + userId + "/reset-password/" + token).then(
|
||||||
response => {
|
response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(resetPasswordSuccess());
|
dispatch(resetPasswordSuccess());
|
||||||
@@ -289,7 +289,7 @@ export function resetPassword(userId, token, password) {
|
|||||||
export function sendResetPassword(data) {
|
export function sendResetPassword(data) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginSendResetPassword());
|
dispatch(beginSendResetPassword());
|
||||||
return makeUserRequest("post", data, "/api/send-reset-password").then(
|
return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/api/send-reset-password").then(
|
||||||
response => {
|
response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(sendResetPasswordSuccess());
|
dispatch(sendResetPasswordSuccess());
|
||||||
@@ -307,7 +307,7 @@ export function sendResetPassword(data) {
|
|||||||
export function sendConfirmEmail(data) {
|
export function sendConfirmEmail(data) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginSendConfirm());
|
dispatch(beginSendConfirm());
|
||||||
return makeUserRequest("post", data, "/users/" + data + "/send-confirm").then(
|
return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + data + "/send-confirm").then(
|
||||||
response => {
|
response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(sendConfirmSuccess());
|
dispatch(sendConfirmSuccess());
|
||||||
@@ -325,7 +325,7 @@ export function sendConfirmEmail(data) {
|
|||||||
export function acceptTerms(data) {
|
export function acceptTerms(data) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginAgreeTerms());
|
dispatch(beginAgreeTerms());
|
||||||
return makeUserRequest("post", data, "/users/" + data + "/terms").then(
|
return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + data + "/terms").then(
|
||||||
response => {
|
response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(agreeTermsSuccess());
|
dispatch(agreeTermsSuccess());
|
||||||
@@ -343,7 +343,7 @@ export function updateProfile(data) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginUpdateProfile());
|
dispatch(beginUpdateProfile());
|
||||||
|
|
||||||
return makeUserRequest("post", data, "/users/" + data.userId)
|
return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/users/" + data.userId)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
const user = response.data.user
|
const user = response.data.user
|
||||||
@@ -367,8 +367,8 @@ export function updateProfile(data) {
|
|||||||
export function manualRegister(data) {
|
export function manualRegister(data) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginRegister());
|
dispatch(beginRegister());
|
||||||
|
console.log("It is: " + process.env.REACT_APP_ACCOUNT_SERVER );
|
||||||
return makeUserRequest("post", data, "/register")
|
return makeUserRequest("post", data, process.env.REACT_APP_ACCOUNT_SERVER + "/register")
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
data.userId = response.data.userId;
|
data.userId = response.data.userId;
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import TermsContainer from "./User/TermsContainer"
|
|||||||
|
|
||||||
const store = configureStore(/* provide initial state if any */)
|
const store = configureStore(/* provide initial state if any */)
|
||||||
|
|
||||||
|
console.log(process.env);
|
||||||
|
//This thssi
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<ConnectedRouter history={history}> { /* place ConnectedRouter under Provider */ }
|
<ConnectedRouter history={history}> { /* place ConnectedRouter under Provider */ }
|
||||||
|
|||||||
2
admin/.dockerignore
Normal file
2
admin/.dockerignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/node_modules
|
||||||
|
/build
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,10 +0,0 @@
|
|||||||
REACT_APP_BACKEND_SERVER=https://api.openmhz.com
|
|
||||||
REACT_APP_FRONTEND_SERVER=https://openmhz.com
|
|
||||||
REACT_APP_SOCKET_SERVER=wss://api.openmhz.com
|
|
||||||
REACT_APP_ACCOUNT_SERVER=https://account.openmhz.com
|
|
||||||
REACT_APP_ADMIN_SERVER=localhost:3000
|
|
||||||
REACT_APP_COOKIE_DOMAIN=.openmhz.com
|
|
||||||
REACT_APP_ADMIN_EMAIL=luke@robotastic.com
|
|
||||||
REACT_APP_SITE_NAME=OpenMHz
|
|
||||||
REACT_APP_ARCHIVE_DAYS=30
|
|
||||||
|
|
||||||
@@ -2,6 +2,13 @@
|
|||||||
FROM node:13.12.0-alpine as build
|
FROM node:13.12.0-alpine as build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV PATH /app/node_modules/.bin:$PATH
|
ENV PATH /app/node_modules/.bin:$PATH
|
||||||
|
ARG REACT_APP_BACKEND_SERVER
|
||||||
|
ARG REACT_APP_ADMIN_SERVER
|
||||||
|
ARG REACT_APP_ACCOUNT_SERVER
|
||||||
|
ARG REACT_APP_FRONTEND_SERVER
|
||||||
|
ARG REACT_APP_SITE_NAME
|
||||||
|
ARG REACT_APP_ADMIN_EMAIL
|
||||||
|
ARG NODE_ENV
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
RUN npm install react-scripts@3.4.1 -g --silent
|
RUN npm install react-scripts@3.4.1 -g --silent
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
REACT_APP_BACKEND_SERVER=https://api.openmhz.com
|
|
||||||
REACT_APP_FRONTEND_SERVER=https://openmhz.com
|
|
||||||
REACT_APP_SOCKET_SERVER=wss://api.openmhz.com
|
|
||||||
REACT_ACCOUNT_SERVER=https://account.openmhz.com
|
|
||||||
REACT_ADMIN_SERVER=https://admin.openmhz.com
|
|
||||||
REACT_ADMIN_EMAIL=luke@robotastic.com
|
|
||||||
REACT_APP_SITE_NAME=OpenMHz
|
|
||||||
REACT_APP_ARCHIVE_DAYS=30
|
|
||||||
REACT_APP_PRO_PLAN=1
|
|
||||||
REACT_APP_FREE_PLAN=0
|
|
||||||
REACT_APP_PRO_PLAN_ARCHIVE=30
|
|
||||||
REACT_APP_FREE_PLAN_ARCHIVE=7
|
|
||||||
@@ -3,10 +3,19 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@visx/axis": "1.4.0",
|
||||||
|
"@visx/curve": "1.0.0",
|
||||||
|
"@visx/glyph": "1.0.0",
|
||||||
|
"@visx/group": "1.0.0",
|
||||||
|
"@visx/legend": "1.4.0",
|
||||||
|
"@visx/responsive": "1.3.0",
|
||||||
|
"@visx/scale": "1.4.0",
|
||||||
|
"@visx/shape": "1.4.0",
|
||||||
"bcrypt": "5.0.0",
|
"bcrypt": "5.0.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"connect-mongo": "3.2.0",
|
"connect-mongo": "3.2.0",
|
||||||
"csv-parse": "4.14.2",
|
"csv-parse": "4.14.2",
|
||||||
|
"d3-time-format": "3.0.0",
|
||||||
"express": "4.17.1",
|
"express": "4.17.1",
|
||||||
"express-session": "1.17.1",
|
"express-session": "1.17.1",
|
||||||
"mongoose": "5.11.11",
|
"mongoose": "5.11.11",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ var backend_server = process.env['REACT_APP_BACKEND_SERVER'] != null ? process.e
|
|||||||
var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
|
var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
|
||||||
var socket_server = process.env['REACT_APP_SOCKET_SERVER'] != null ? process.env['REACT_APP_SOCKET_SERVER'] : 'wss://socket.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var socket_server = process.env['REACT_APP_SOCKET_SERVER'] != null ? process.env['REACT_APP_SOCKET_SERVER'] : 'wss://socket.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
|
var dev_server = frontend_server + ":3000"
|
||||||
|
|
||||||
module.exports = function(app, passport) {
|
module.exports = function(app, passport) {
|
||||||
app.set("port", 3008)
|
app.set("port", 3008)
|
||||||
@@ -19,7 +20,7 @@ module.exports = function(app, passport) {
|
|||||||
// Keeping it makes it easier for an attacker to build the site's profile
|
// Keeping it makes it easier for an attacker to build the site's profile
|
||||||
// It can be removed safely
|
// It can be removed safely
|
||||||
app.disable("x-powered-by")
|
app.disable("x-powered-by")
|
||||||
|
app.enable('trust proxy')
|
||||||
app.use(bodyParser.json())
|
app.use(bodyParser.json())
|
||||||
app.use(bodyParser.urlencoded({ extended: true }))
|
app.use(bodyParser.urlencoded({ extended: true }))
|
||||||
app.use(express.static(path.join(process.cwd(), 'public')));
|
app.use(express.static(path.join(process.cwd(), 'public')));
|
||||||
@@ -62,10 +63,10 @@ module.exports = function(app, passport) {
|
|||||||
allowedOrigins.push(frontend_server);
|
allowedOrigins.push(frontend_server);
|
||||||
allowedOrigins.push(backend_server);
|
allowedOrigins.push(backend_server);
|
||||||
allowedOrigins.push(socket_server);
|
allowedOrigins.push(socket_server);
|
||||||
|
allowedOrigins.push(dev_server);
|
||||||
|
|
||||||
var origin = req.headers.origin;
|
var origin = req.headers.origin;
|
||||||
|
|
||||||
|
|
||||||
if (allowedOrigins.indexOf(origin) > -1) {
|
if (allowedOrigins.indexOf(origin) > -1) {
|
||||||
res.setHeader('Access-Control-Allow-Origin', origin);
|
res.setHeader('Access-Control-Allow-Origin', origin);
|
||||||
} else if (req.headers["user-agent"] == 'TrunkRecorder1.0') {
|
} else if (req.headers["user-agent"] == 'TrunkRecorder1.0') {
|
||||||
|
|||||||
@@ -16,10 +16,11 @@ module.exports = function (app, passport) {
|
|||||||
|
|
||||||
passport.deserializeUser((id, done) => {
|
passport.deserializeUser((id, done) => {
|
||||||
User.findById(id, (err, user) => {
|
User.findById(id, (err, user) => {
|
||||||
done(err, user)
|
done(err, user)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
// use the following strategies
|
// use the following strategies
|
||||||
passport.use(local)
|
passport.use(local)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ exports.ownSystem = async function (req, res, next) {
|
|||||||
next();
|
next();
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("ERROR: Unique ShortName - caught: " + err);
|
console.error("ERROR: ownSystem - caught: " + err);
|
||||||
res.json({
|
res.json({
|
||||||
success: false,
|
success: false,
|
||||||
message: err
|
message: err
|
||||||
@@ -225,10 +225,24 @@ exports.ownSystem = async function (req, res, next) {
|
|||||||
|
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
exports.uniqueShortName = async function (req, res, next) {
|
exports.uniqueShortName = async function (req, res, next) {
|
||||||
console.error("locals: " + res.locals.shortName + " body: " + req.body.shortName )
|
|
||||||
|
var shortName = res.locals.shortName;
|
||||||
|
if (typeof shortName == 'undefined') {
|
||||||
|
console.error("locals: " + res.locals.shortName + " body: " + req.body.shortName )
|
||||||
|
console.error("ShortName is not in res.local, pulling from req.body instead")
|
||||||
|
shortName = req.body.shortName;
|
||||||
|
}
|
||||||
|
if (typeof shortName == 'undefined') {
|
||||||
|
console.error("ShortName is not in req.body instead")
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
message: "Short Name not provided in form"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var system = await System.findOne({
|
var system = await System.findOne({
|
||||||
shortName: res.locals.shortName.toLowerCase()
|
shortName: shortName.toLowerCase()
|
||||||
});
|
});
|
||||||
|
|
||||||
if (system) {
|
if (system) {
|
||||||
@@ -434,12 +448,7 @@ exports.validateSystem = async function (req, res, next) {
|
|||||||
|
|
||||||
exports.createSystem = async function (req, res, next) {
|
exports.createSystem = async function (req, res, next) {
|
||||||
|
|
||||||
var key = uuid.v4();
|
var key = crypto.randomBytes(16).toString("hex");
|
||||||
key = crypto
|
|
||||||
.createHash("sha256")
|
|
||||||
.update(key)
|
|
||||||
.update("salt")
|
|
||||||
.digest("hex");
|
|
||||||
const system = (({
|
const system = (({
|
||||||
name,
|
name,
|
||||||
shortName,
|
shortName,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ require("./models/user");
|
|||||||
const multer = require('multer');
|
const multer = require('multer');
|
||||||
|
|
||||||
var upload = multer({
|
var upload = multer({
|
||||||
dest: 'uploads/'
|
dest: 'uploads/'
|
||||||
});
|
});
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
@@ -21,20 +21,46 @@ const app = express()
|
|||||||
|
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
const connect = () => {
|
// -------------------------------------------
|
||||||
mongoose.connect(secrets.db, (err, res) => {
|
|
||||||
if (err) {
|
async function connect() {
|
||||||
console.log(`Error connecting to ${secrets.db}. ${err}`)
|
|
||||||
} else {
|
// Demonstrate the readyState and on event emitters
|
||||||
console.log(`Successfully connected to ${secrets.db}.`)
|
console.log(mongoose.connection.readyState); //logs 0
|
||||||
}
|
mongoose.connection.on('connecting', () => {
|
||||||
})
|
console.log('Mongoose is connecting')
|
||||||
|
console.log(mongoose.connection.readyState); //logs 2
|
||||||
|
});
|
||||||
|
mongoose.connection.on('connected', () => {
|
||||||
|
console.log('Mongoose is connected');
|
||||||
|
console.log(mongoose.connection.readyState); //logs 1
|
||||||
|
});
|
||||||
|
mongoose.connection.on('disconnecting', () => {
|
||||||
|
console.log('Mongoose is disconnecting');
|
||||||
|
console.log(mongoose.connection.readyState); // logs 3
|
||||||
|
});
|
||||||
|
|
||||||
|
// Connect to a MongoDB server running on 'localhost:27017' and use the
|
||||||
|
// 'test' database.
|
||||||
|
await mongoose.connect(secrets.db, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }, (err, res) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(`Mongoose - Error connecting to ${secrets.db}. ${err}`)
|
||||||
|
} else {
|
||||||
|
console.log(`Mongoose Successfully connected to ${secrets.db}.`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
console.log("All Done");
|
||||||
}
|
}
|
||||||
connect()
|
connect();
|
||||||
|
mongoose.connection.on('error', err => {
|
||||||
mongoose.connection.on("error", console.error)
|
console.error("Mongoose Error!")
|
||||||
mongoose.connection.on("disconnected", connect)
|
console.error(err);
|
||||||
|
});
|
||||||
|
mongoose.connection.on('disconnected', () => {
|
||||||
|
console.log('Mongoose disconnected');
|
||||||
|
console.log(mongoose.connection.readyState); //logs 0
|
||||||
|
connect();
|
||||||
|
});
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
const isDev = process.env.NODE_ENV === "development"
|
const isDev = process.env.NODE_ENV === "development"
|
||||||
@@ -67,12 +93,12 @@ function isOwner(req, res, next) {
|
|||||||
if (req.params.shortName && req.user) {
|
if (req.params.shortName && req.user) {
|
||||||
var short_name = req.params.shortName.toLowerCase();
|
var short_name = req.params.shortName.toLowerCase();
|
||||||
var userId = req.user._id;
|
var userId = req.user._id;
|
||||||
Permission.findOne({'userId': userId, 'shortName': short_name}, function(err, permission) {
|
Permission.findOne({ 'userId': userId, 'shortName': short_name }, function (err, permission) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error('Error - getRole userId: ' + userId + ' shortName: ' + short_name + ' error: ' + err);
|
console.error('Error - getRole userId: ' + userId + ' shortName: ' + short_name + ' error: ' + err);
|
||||||
}
|
}
|
||||||
console.log('Found - getRole userId: ' + userId + ' shortName: ' + short_name + ' role: ' + permission.role);
|
console.log('Found - getRole userId: ' + userId + ' shortName: ' + short_name + ' role: ' + permission.role);
|
||||||
if ( permission.role >= 15) {
|
if (permission.role >= 15) {
|
||||||
return next();
|
return next();
|
||||||
} else {
|
} else {
|
||||||
res.status(401).send({
|
res.status(401).send({
|
||||||
@@ -90,12 +116,12 @@ function isAdmin(req, res, next) {
|
|||||||
if (req.params.shortName && req.user) {
|
if (req.params.shortName && req.user) {
|
||||||
var short_name = req.params.shortName.toLowerCase();
|
var short_name = req.params.shortName.toLowerCase();
|
||||||
var userId = req.user._id;
|
var userId = req.user._id;
|
||||||
Permission.findOne({'userId': userId, 'shortName': short_name}, function(err, permission) {
|
Permission.findOne({ 'userId': userId, 'shortName': short_name }, function (err, permission) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error('Error - getRole userId: ' + userId + ' shortName: ' + short_name + ' error: ' + err);
|
console.error('Error - getRole userId: ' + userId + ' shortName: ' + short_name + ' error: ' + err);
|
||||||
}
|
}
|
||||||
console.log('Found - getRole userId: ' + userId + ' shortName: ' + short_name + ' role: ' + permission.role);
|
console.log('Found - getRole userId: ' + userId + ' shortName: ' + short_name + ' role: ' + permission.role);
|
||||||
if (permission.role >= 10) {
|
if (permission.role >= 10) {
|
||||||
return next();
|
return next();
|
||||||
} else {
|
} else {
|
||||||
res.status(401).send({
|
res.status(401).send({
|
||||||
@@ -129,27 +155,27 @@ app.get("")
|
|||||||
app.delete("/permissions/:shortName/:permissionId", isAdmin, permissions.deletePermission);
|
app.delete("/permissions/:shortName/:permissionId", isAdmin, permissions.deletePermission);
|
||||||
app.post("/permissions/:shortName/:permissionId", isAdmin, permissions.updatePermission);
|
app.post("/permissions/:shortName/:permissionId", isAdmin, permissions.updatePermission);
|
||||||
app.post("/permissions/:shortName", isAdmin, permissions.addPermission);*/
|
app.post("/permissions/:shortName", isAdmin, permissions.addPermission);*/
|
||||||
app.get("/talkgroups/:shortName", isLoggedIn, talkgroups.fetchTalkgroups)
|
app.get("/talkgroups/:shortName", isLoggedIn, talkgroups.fetchTalkgroups)
|
||||||
app.post("/talkgroups/:shortName/import", isLoggedIn, upload.single('file'), talkgroups.importTalkgroups)
|
app.post("/talkgroups/:shortName/import", isLoggedIn, upload.single('file'), talkgroups.importTalkgroups)
|
||||||
app.get("/talkgroups/:shortName/export", isLoggedIn, talkgroups.exportTalkgroups)
|
app.get("/talkgroups/:shortName/export", isLoggedIn, talkgroups.exportTalkgroups)
|
||||||
app.post("/groups/:shortName/reorder", isLoggedIn, groups.reorderGroups);
|
app.post("/groups/:shortName/reorder", isLoggedIn, groups.reorderGroups);
|
||||||
app.post("/groups/:shortName/:groupId?", isLoggedIn, groups.upsertGroup);
|
app.post("/groups/:shortName/:groupId?", isLoggedIn, groups.upsertGroup);
|
||||||
app.get("/groups/:shortName/:groupId?", isLoggedIn, groups.getGroups);
|
app.get("/groups/:shortName/:groupId?", isLoggedIn, groups.getGroups);
|
||||||
app.delete("/groups/:shortName/:groupId", isLoggedIn, groups.deleteGroup);
|
app.delete("/groups/:shortName/:groupId", isLoggedIn, groups.deleteGroup);
|
||||||
app.get("/systems", isLoggedIn, systems.listSystems)
|
app.get("/systems", isLoggedIn, systems.listSystems)
|
||||||
app.delete("/systems/:shortName", isLoggedIn, systems.deleteSystem)
|
app.delete("/systems/:shortName", isLoggedIn, systems.deleteSystem)
|
||||||
app.post("/systems/:shortName", [isLoggedIn, systems.ownSystem, systems.validateSystem, systems.updateSystem])
|
app.post("/systems/:shortName", [isLoggedIn, systems.ownSystem, systems.validateSystem, systems.updateSystem])
|
||||||
app.post("/systems", [isLoggedIn, systems.uniqueShortName, systems.validateSystem, systems.createSystem])
|
app.post("/systems", [isLoggedIn, systems.uniqueShortName, systems.validateSystem, systems.createSystem])
|
||||||
|
|
||||||
app.get("*", (req, res, next) => {
|
app.get("*", (req, res, next) => {
|
||||||
res.sendFile(__dirname + '/public/index.html');
|
res.sendFile(__dirname + '/public/index.html');
|
||||||
});
|
});
|
||||||
|
|
||||||
// start listening to incoming requests
|
// start listening to incoming requests
|
||||||
app.listen(app.get("port"), app.get("host"), (err) => {
|
app.listen(app.get("port"), app.get("host"), (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.err(err.stack)
|
console.err(err.stack)
|
||||||
} else {
|
} else {
|
||||||
console.log(`App listening on port ${app.get("port")} [${process.env.NODE_ENV} mode]`)
|
console.log(`App listening on port ${app.get("port")} [${process.env.NODE_ENV} mode]`)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class Navigation extends Component {
|
|||||||
{this.props.user.authenticated ? (
|
{this.props.user.authenticated ? (
|
||||||
<Menu style={navStyle}>
|
<Menu style={navStyle}>
|
||||||
<Menu.Item name="systems" header>
|
<Menu.Item name="systems" header>
|
||||||
{ process.env.REACT_APP_SITE_NAME}
|
{process.env.REACT_APP_SITE_NAME}
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Menu position="right">
|
<Menu.Menu position="right">
|
||||||
<Link to="/list-systems">
|
<Link to="/list-systems">
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ const restricted = (BaseComponent, store) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkAuthentication(params) {
|
checkAuthentication(params) {
|
||||||
const { history } = params;
|
|
||||||
const authenticated = store.getState().user.authenticated;
|
const authenticated = store.getState().user.authenticated;
|
||||||
if (!authenticated) {
|
if (!authenticated) {
|
||||||
axios
|
axios
|
||||||
|
|||||||
31
admin/src/Components/Message.js
Normal file
31
admin/src/Components/Message.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import React, { Component } from "react";
|
||||||
|
import { Modal, Icon, Button, Header } from "semantic-ui-react";
|
||||||
|
|
||||||
|
class Message extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
_logout = event => {
|
||||||
|
event.preventDefault();
|
||||||
|
this.props.manualLogout();
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Modal open={this.props.open} onClose={this.props.onClose} basic size="small">
|
||||||
|
<Header icon="info" content={this.props.title} />
|
||||||
|
<Modal.Content>
|
||||||
|
<p>{this.props.message}</p>
|
||||||
|
</Modal.Content>
|
||||||
|
<Modal.Actions>
|
||||||
|
<Button color='green' onClick={this.props.onClose} inverted>
|
||||||
|
<Icon name='checkmark' /> Got it
|
||||||
|
</Button>
|
||||||
|
</Modal.Actions>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Message;
|
||||||
@@ -79,7 +79,8 @@ function makeUserRequest(method, data, api = "/login") {
|
|||||||
return axios({
|
return axios({
|
||||||
method: method,
|
method: method,
|
||||||
url: api,
|
url: api,
|
||||||
data: data
|
data: data,
|
||||||
|
config: {withCredentials: true}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +97,7 @@ export function updateGroup(data) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginUpdateGroup());
|
dispatch(beginUpdateGroup());
|
||||||
|
|
||||||
return makeUserRequest("post", data, "/groups/" + data.shortName + "/" + data._id)
|
return makeUserRequest("post", data, process.env.REACT_APP_ADMIN_SERVER + "/groups/" + data.shortName + "/" + data._id)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(updateGroupSuccess(response.data.group));
|
dispatch(updateGroupSuccess(response.data.group));
|
||||||
@@ -144,7 +145,7 @@ export function fetchGroups(shortName) {
|
|||||||
if (shouldFetchGroups(getState(), shortName)) {
|
if (shouldFetchGroups(getState(), shortName)) {
|
||||||
dispatch(beginFetchGroup());
|
dispatch(beginFetchGroup());
|
||||||
return axios
|
return axios
|
||||||
.get("/groups/" + shortName)
|
.get(process.env.REACT_APP_ADMIN_SERVER + "/groups/" + shortName, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
const data = { shortName: shortName, groups: response.data.groups };
|
const data = { shortName: shortName, groups: response.data.groups };
|
||||||
@@ -175,7 +176,7 @@ export function saveGroupOrder(shortName, data) {
|
|||||||
return makeUserRequest(
|
return makeUserRequest(
|
||||||
"post",
|
"post",
|
||||||
data,
|
data,
|
||||||
"/groups/" + shortName + "/reorder"
|
process.env.REACT_APP_ADMIN_SERVER + "/groups/" + shortName + "/reorder"
|
||||||
)
|
)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
@@ -199,7 +200,7 @@ export function deleteGroup(shortName, groupId) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginDeleteGroup());
|
dispatch(beginDeleteGroup());
|
||||||
|
|
||||||
return makeUserRequest("delete", null, "/groups/" + shortName + "/" + groupId)
|
return makeUserRequest("delete", null, process.env.REACT_APP_ADMIN_SERVER + "/groups/" + shortName + "/" + groupId)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
const data = {shortName: shortName, groupId: groupId}
|
const data = {shortName: shortName, groupId: groupId}
|
||||||
@@ -224,7 +225,7 @@ export function createGroup(data) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginCreateGroup());
|
dispatch(beginCreateGroup());
|
||||||
|
|
||||||
return makeUserRequest("post", data, "/groups/" + data.shortName)
|
return makeUserRequest("post", data, process.env.REACT_APP_ADMIN_SERVER + "/groups/" + data.shortName)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(createGroupSuccess(response.data.group));
|
dispatch(createGroupSuccess(response.data.group));
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ export function fetch(shortName) {
|
|||||||
dispatch(beginFetchPermission());
|
dispatch(beginFetchPermission());
|
||||||
|
|
||||||
return axios
|
return axios
|
||||||
.get("/permissions/"+shortName)
|
.get(process.env.REACT_APP_ADMIN_SERVER + "/permissions/"+shortName, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(fetchPermissionSuccess(response.data.permissions));
|
dispatch(fetchPermissionSuccess(response.data.permissions));
|
||||||
@@ -94,8 +94,8 @@ export function update(data) {
|
|||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
|
||||||
dispatch(beginUpdateRole());
|
dispatch(beginUpdateRole());
|
||||||
var url = "/permissions/" + data.shortName + "/" + data.permissionId;
|
var url = process.env.REACT_APP_ADMIN_SERVER + "/permissions/" + data.shortName + "/" + data.permissionId;
|
||||||
return axios.post( url, data)
|
return axios.post( url, data, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(updateRoleSuccess(response.data.permission));
|
dispatch(updateRoleSuccess(response.data.permission));
|
||||||
@@ -118,8 +118,8 @@ export function update(data) {
|
|||||||
export function addPermission(data) {
|
export function addPermission(data) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
dispatch(beginAddPermission());
|
dispatch(beginAddPermission());
|
||||||
var url = "/permissions/" + data.shortName;
|
var url = process.env.REACT_APP_ADMIN_SERVER + "/permissions/" + data.shortName;
|
||||||
return axios.post( url, data)
|
return axios.post( url, data, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(addPermissionSuccess(response.data.permission));
|
dispatch(addPermissionSuccess(response.data.permission));
|
||||||
@@ -144,8 +144,8 @@ export function deletePermission(data) {
|
|||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
|
||||||
dispatch(beginDeletePermission());
|
dispatch(beginDeletePermission());
|
||||||
var url = "/permissions/" + data.shortName + "/" + data.permissionId;
|
var url = process.env.REACT_APP_ADMIN_SERVER + "/permissions/" + data.shortName + "/" + data.permissionId;
|
||||||
return axios.delete( url)
|
return axios.delete( url, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(deletePermissionSuccess(data.permissionId));
|
dispatch(deletePermissionSuccess(data.permissionId));
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import React, { Component } from "react";
|
import React, { Component } from "react";
|
||||||
import { Group } from '@vx/group';
|
import { Group } from '@visx/group';
|
||||||
import { curveStep} from '@vx/curve';
|
import { curveStep} from '@visx/curve';
|
||||||
import { LinePath } from '@vx/shape';
|
import { LinePath } from '@visx/shape';
|
||||||
import { scaleLinear, scaleBand, scaleTime } from '@vx/scale';
|
import { scaleLinear, scaleBand, scaleTime } from '@visx/scale';
|
||||||
import { timeParse, timeFormat } from 'd3-time-format';
|
import { timeParse, timeFormat } from 'd3-time-format';
|
||||||
import { AxisBottom, AxisLeft } from '@vx/axis';
|
import { AxisBottom, AxisLeft } from '@visx/axis';
|
||||||
import { Dimmer, Loader } from "semantic-ui-react";
|
import { Dimmer, Loader } from "semantic-ui-react";
|
||||||
|
|
||||||
|
|
||||||
@@ -29,6 +29,9 @@ constructor(props) {
|
|||||||
const width = this.props.width;
|
const width = this.props.width;
|
||||||
const height = 500;
|
const height = 500;
|
||||||
const margin = { top: 20, bottom: 40, left: 40, right: 20 };
|
const margin = { top: 20, bottom: 40, left: 40, right: 20 };
|
||||||
|
const parseDate = timeParse("%Y%m%d");
|
||||||
|
const format = timeFormat("%b %d");
|
||||||
|
const formatDate = (date) => format(parseDate(date));
|
||||||
|
|
||||||
// Then we'll create some bounds
|
// Then we'll create some bounds
|
||||||
const xMax = width - margin.left - margin.right;
|
const xMax = width - margin.left - margin.right;
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
import React, { Component } from "react";
|
import React, { Component } from "react";
|
||||||
import { Group } from '@vx/group';
|
import { Group } from '@visx/group';
|
||||||
import { GlyphCircle } from '@vx/glyph';
|
import { GlyphCircle } from '@visx/glyph';
|
||||||
import { scaleLinear, scaleBand, scaleTime, scaleOrdinal } from '@vx/scale';
|
import { scaleLinear, scaleTime, scaleOrdinal } from '@visx/scale';
|
||||||
import { timeParse, timeFormat } from 'd3-time-format';
|
import { timeParse, timeFormat } from 'd3-time-format';
|
||||||
import { AxisBottom, AxisLeft } from '@vx/axis';
|
import { AxisBottom, AxisLeft } from '@visx/axis';
|
||||||
import { Dimmer, Loader } from "semantic-ui-react";
|
import { Loader } from "semantic-ui-react";
|
||||||
import {
|
import { LegendOrdinal} from '@visx/legend';
|
||||||
LegendOrdinal
|
|
||||||
|
|
||||||
} from '@vx/legend';
|
|
||||||
class ErrorChart extends Component {
|
class ErrorChart extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
var errorData = this.props.data;
|
var errorData = this.props.data;
|
||||||
@@ -54,58 +51,58 @@ constructor(props) {
|
|||||||
});
|
});
|
||||||
var xScale, yScale, xPoint, yPoint;
|
var xScale, yScale, xPoint, yPoint;
|
||||||
if (errorData) {
|
if (errorData) {
|
||||||
// We'll use some mock data from `@vx/mock-data` for this.
|
// We'll use some mock data from `@vx/mock-data` for this.
|
||||||
data = errorData.data;
|
data = errorData.data;
|
||||||
// scales
|
// scales
|
||||||
xScale = scaleTime({
|
xScale = scaleTime({
|
||||||
range: [0, xMax],
|
range: [0, xMax],
|
||||||
domain: [errorData.minDate, errorData.maxDate],
|
domain: [errorData.minDate, errorData.maxDate],
|
||||||
tickFormat: () => (val) => formatDate(val)
|
tickFormat: () => (val) => formatDate(val)
|
||||||
});
|
});
|
||||||
yScale = scaleLinear({
|
yScale = scaleLinear({
|
||||||
range: [yMax, 0],
|
range: [yMax, 0],
|
||||||
domain: [0, errorData.maxValue],
|
domain: [0, errorData.maxValue],
|
||||||
});
|
});
|
||||||
zScale = scaleOrdinal({
|
zScale = scaleOrdinal({
|
||||||
domain: errorData.legend,
|
domain: errorData.legend,
|
||||||
range: ["#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707", "#651067", "#329262", "#5574a6", "#3b3eac"]
|
range: ["#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707", "#651067", "#329262", "#5574a6", "#3b3eac"]
|
||||||
});
|
});
|
||||||
xPoint = compose(xScale, x);
|
xPoint = compose(xScale, x);
|
||||||
yPoint = compose(yScale, y);
|
yPoint = compose(yScale, y);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{
|
<div style={{
|
||||||
width: 900
|
width: 900
|
||||||
}}>
|
}}>
|
||||||
<svg width={width} height={height} style={{
|
<svg width={width} height={height} style={{
|
||||||
float: "left"
|
float: "left"
|
||||||
}}>
|
}}>
|
||||||
<Group left={margin.left} top={margin.top} >
|
<Group left={margin.left} top={margin.top} >
|
||||||
<AxisBottom top={yMax} scale={xScale} numTicks={width > 520 ? 10 : 5} />
|
<AxisBottom top={yMax} scale={xScale} numTicks={width > 520 ? 10 : 5} />
|
||||||
<AxisLeft scale={yScale} />
|
<AxisLeft scale={yScale} />
|
||||||
{data.map((band, i) => {
|
{data.map((band, i) => {
|
||||||
return (
|
return (
|
||||||
<Group key={`band-${i}`}>
|
<Group key={`band-${i}`}>
|
||||||
{band.data.map((point, j) => {
|
{band.data.map((point, j) => {
|
||||||
return (
|
return (
|
||||||
<GlyphCircle
|
<GlyphCircle
|
||||||
className="dot"
|
className="dot"
|
||||||
key={`point-${point.x}-${j}`}
|
key={`point-${point.x}-${j}`}
|
||||||
fill={dotColor(i)}
|
fill={dotColor(i)}
|
||||||
left={xScale(x(point))}
|
left={xScale(x(point))}
|
||||||
top={yScale(y(point))}
|
top={yScale(y(point))}
|
||||||
size={6.0}
|
size={6.0}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Group>
|
</Group>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Group>
|
</Group>
|
||||||
</svg>
|
</svg>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
float: "right"
|
float: "right"
|
||||||
}}
|
}}
|
||||||
@@ -114,19 +111,19 @@ return (
|
|||||||
scale={zScale}
|
scale={zScale}
|
||||||
labelMargin="0 15px 0 0"
|
labelMargin="0 15px 0 0"
|
||||||
onMouseOver={data => event => {
|
onMouseOver={data => event => {
|
||||||
console.log(
|
console.log(
|
||||||
`mouse over: ${data.text}`,
|
`mouse over: ${data.text}`,
|
||||||
`index: ${data.index}`,
|
`index: ${data.index}`,
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { Component } from "react"
|
import React, { Component } from "react"
|
||||||
import CallChart from "./CallChart"
|
import CallChart from "./CallChart"
|
||||||
import { ParentSize } from "@vx/responsive";
|
import { ParentSize } from "@visx/responsive";
|
||||||
|
|
||||||
class ResponsiveCallChart extends Component {
|
class ResponsiveCallChart extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { Component } from "react"
|
import React, { Component } from "react"
|
||||||
import ErrorChart from "./ErrorChart"
|
import ErrorChart from "./ErrorChart"
|
||||||
import { ParentSize } from "@vx/responsive";
|
import { ParentSize } from "@visx/responsive";
|
||||||
|
|
||||||
class ResponsiveErrorChart extends Component {
|
class ResponsiveErrorChart extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {Link} from "react-router-dom";
|
import {Link} from "react-router-dom";
|
||||||
import ListTalkgroups from "../Talkgroups/ListTalkgroups.js";
|
import ListTalkgroups from "../Talkgroups/ListTalkgroups.js";
|
||||||
import MessageBox from "../components/pure/Message.js";
|
import MessageBox from "../Components/Message.js";
|
||||||
import ListGroups from "../Group/ListGroups.js";
|
import ListGroups from "../Group/ListGroups.js";
|
||||||
import GroupModal from "../Group/GroupModalContainer.js";
|
import GroupModal from "../Group/GroupModalContainer.js";
|
||||||
import UpdatePermissionModal from "../Permission/UpdatePermissionModalContainer.js";
|
import UpdatePermissionModal from "../Permission/UpdatePermissionModalContainer.js";
|
||||||
@@ -24,14 +24,6 @@ import {
|
|||||||
Label
|
Label
|
||||||
} from "semantic-ui-react";
|
} from "semantic-ui-react";
|
||||||
|
|
||||||
function planName(planType) {
|
|
||||||
switch (planType) {
|
|
||||||
case freePlanValue:
|
|
||||||
return "Free";
|
|
||||||
case proPlanValue:
|
|
||||||
return "Pro";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class System extends Component {
|
class System extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@@ -55,7 +47,6 @@ class System extends Component {
|
|||||||
);
|
);
|
||||||
this.handleSystemDeleteConfirm = this.handleSystemDeleteConfirm.bind(this);
|
this.handleSystemDeleteConfirm = this.handleSystemDeleteConfirm.bind(this);
|
||||||
this.handleSystemDeleteCancel = this.handleSystemDeleteCancel.bind(this);
|
this.handleSystemDeleteCancel = this.handleSystemDeleteCancel.bind(this);
|
||||||
this.handleUpgradePlan = this.handleUpgradePlan.bind(this);
|
|
||||||
this.handleUpdatePermissionClose = this.handleUpdatePermissionClose.bind(
|
this.handleUpdatePermissionClose = this.handleUpdatePermissionClose.bind(
|
||||||
this
|
this
|
||||||
);
|
);
|
||||||
@@ -259,9 +250,6 @@ class System extends Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleUpgradePlan() {
|
|
||||||
window.location = process.env.REACT_APP_ACCOUNT_SERVER + "/update-plans";
|
|
||||||
}
|
|
||||||
|
|
||||||
handleUpload(file) {
|
handleUpload(file) {
|
||||||
this.props.talkgroupActions
|
this.props.talkgroupActions
|
||||||
@@ -319,7 +307,6 @@ class System extends Component {
|
|||||||
let fileInput = null;
|
let fileInput = null;
|
||||||
var location = "";
|
var location = "";
|
||||||
var example = "";
|
var example = "";
|
||||||
var plan = "";
|
|
||||||
var groupRender = () => {};
|
var groupRender = () => {};
|
||||||
|
|
||||||
if (system) {
|
if (system) {
|
||||||
@@ -348,25 +335,6 @@ class System extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (system.planType) {
|
|
||||||
case freePlanValue:
|
|
||||||
const tempPlan = planName(system.planType) + " plan";
|
|
||||||
plan = (
|
|
||||||
<div>
|
|
||||||
{tempPlan}
|
|
||||||
<Label as="a" onClick={this.handleUpgradePlan}>
|
|
||||||
{" "}
|
|
||||||
<Icon name="plus" />
|
|
||||||
Upgrade Plan
|
|
||||||
</Label>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case proPlanValue:
|
|
||||||
plan = planName(system.planType) + " plan";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
example =
|
example =
|
||||||
'{\n\t"systems": [\n\t\t{\n\t\t\t"shortName": "' +
|
'{\n\t"systems": [\n\t\t{\n\t\t\t"shortName": "' +
|
||||||
@@ -655,7 +623,6 @@ class System extends Component {
|
|||||||
<Header as="h1">
|
<Header as="h1">
|
||||||
<Header.Content>
|
<Header.Content>
|
||||||
{this.props.system.name}
|
{this.props.system.name}
|
||||||
{/* <Header.Subheader>{plan}</Header.Subheader> */}
|
|
||||||
</Header.Content>
|
</Header.Content>
|
||||||
</Header>
|
</Header>
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ export function updateSystem(data) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginUpdateSystem());
|
dispatch(beginUpdateSystem());
|
||||||
|
|
||||||
return makeUserRequest("post", data, process.env.REACT_APP_BACKEND_SERVER + "/systems/" + data.shortName)
|
return makeUserRequest("post", data, process.env.REACT_APP_ADMIN_SERVER + "/systems/" + data.shortName, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(updateSystemSuccess(response.data.system));
|
dispatch(updateSystemSuccess(response.data.system));
|
||||||
@@ -162,7 +162,7 @@ export function fetchSystems() {
|
|||||||
dispatch(beginFetchSystem());
|
dispatch(beginFetchSystem());
|
||||||
|
|
||||||
return axios
|
return axios
|
||||||
.get(process.env.REACT_APP_ADMIN_SERVER + "/systems")
|
.get(process.env.REACT_APP_ADMIN_SERVER + "/systems", {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(fetchSystemSuccess(response.data.systems));
|
dispatch(fetchSystemSuccess(response.data.systems));
|
||||||
@@ -187,7 +187,7 @@ export function deleteSystem(shortName) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginDeleteSystem());
|
dispatch(beginDeleteSystem());
|
||||||
|
|
||||||
return makeUserRequest("delete", null, process.env.REACT_APP_BACKEND_SERVER + "/systems/"+shortName)
|
return makeUserRequest("delete", null, process.env.REACT_APP_ADMIN_SERVER + "/systems/"+shortName, {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(deleteSystemSuccess({shortName: shortName}));
|
dispatch(deleteSystemSuccess({shortName: shortName}));
|
||||||
@@ -211,7 +211,7 @@ export function createSystem(data) {
|
|||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(beginCreateSystem());
|
dispatch(beginCreateSystem());
|
||||||
|
|
||||||
return makeUserRequest("post", data, process.env.REACT_APP_BACKEND_SERVER + "/systems")
|
return makeUserRequest("post", data, process.env.REACT_APP_ADMIN_SERVER + "/systems", {withCredentials: true})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
dispatch(createSystemSuccess(response.data.system));
|
dispatch(createSystemSuccess(response.data.system));
|
||||||
|
|||||||
@@ -49,16 +49,6 @@ function fetchTalkgroupError(data) {
|
|||||||
data };
|
data };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function makeUserRequest(method, data, api) {
|
|
||||||
// returns a Promise
|
|
||||||
return axios({
|
|
||||||
method: method,
|
|
||||||
url: api,
|
|
||||||
data: data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function changeUrl(url) {
|
export function changeUrl(url) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
dispatch(push(url));
|
dispatch(push(url));
|
||||||
@@ -68,13 +58,14 @@ export function changeUrl(url) {
|
|||||||
|
|
||||||
// https://stackoverflow.com/questions/41878838/how-do-i-set-multipart-in-axios-with-react
|
// https://stackoverflow.com/questions/41878838/how-do-i-set-multipart-in-axios-with-react
|
||||||
function fileUpload(shortName, file){
|
function fileUpload(shortName, file){
|
||||||
const url = "/talkgroups/" + shortName + "/import";
|
const url = process.env.REACT_APP_ADMIN_SERVER + "/talkgroups/" + shortName + "/import";
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('file',file)
|
formData.append('file',file)
|
||||||
const config = {
|
const config = {
|
||||||
headers: {
|
headers: {
|
||||||
'content-type': 'multipart/form-data'
|
'content-type': 'multipart/form-data'
|
||||||
}
|
},
|
||||||
|
withCredentials: true
|
||||||
}
|
}
|
||||||
return post(url, formData,config)
|
return post(url, formData,config)
|
||||||
}
|
}
|
||||||
@@ -121,7 +112,7 @@ export function exportTalkgroups(
|
|||||||
dispatch(beginExportTalkgroup());
|
dispatch(beginExportTalkgroup());
|
||||||
|
|
||||||
return axios
|
return axios
|
||||||
.get("/talkgroups/" + shortName + "/export")
|
.get(process.env.REACT_APP_ADMIN_SERVER + "/talkgroups/" + shortName + "/export", { withCredentials: true })
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
var data = {shortName: shortName, talkgroups: response.data.talkgroups}
|
var data = {shortName: shortName, talkgroups: response.data.talkgroups}
|
||||||
@@ -159,7 +150,7 @@ export function fetchTalkgroups(shortName) {
|
|||||||
dispatch(beginFetchTalkgroup());
|
dispatch(beginFetchTalkgroup());
|
||||||
|
|
||||||
return axios
|
return axios
|
||||||
.get("/talkgroups/"+shortName)
|
.get(process.env.REACT_APP_ADMIN_SERVER + "/talkgroups/"+shortName, { withCredentials: true })
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
var data = {shortName: shortName, talkgroups: response.data.talkgroups}
|
var data = {shortName: shortName, talkgroups: response.data.talkgroups}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import App from "./App/App"
|
|||||||
import Restricted from "./App/Restricted"
|
import Restricted from "./App/Restricted"
|
||||||
|
|
||||||
import About from "./Components/About"
|
import About from "./Components/About"
|
||||||
|
import SystemContainer from "./System/SystemContainer"
|
||||||
import ListSystemsContainer from "./System/ListSystemsContainer"
|
import ListSystemsContainer from "./System/ListSystemsContainer"
|
||||||
import UpdateSystemContainer from "./System/UpdateSystemContainer"
|
import UpdateSystemContainer from "./System/UpdateSystemContainer"
|
||||||
import CreateSystemContainer from "./System/CreateSystemContainer"
|
import CreateSystemContainer from "./System/CreateSystemContainer"
|
||||||
@@ -22,10 +23,12 @@ ReactDOM.render(
|
|||||||
<>
|
<>
|
||||||
<App>
|
<App>
|
||||||
<Switch>
|
<Switch>
|
||||||
<Route path="/about" component={About} />
|
<Route path="/about" component={Restricted(About, store)} />
|
||||||
<Route path="/update-system/:shortName" component={UpdateSystemContainer} />
|
<Route path="/system/:shortName" component={Restricted(SystemContainer, store)} />
|
||||||
<Route path="/create-system" component={CreateSystemContainer} />
|
<Route path="/update-system/:shortName" component={Restricted(UpdateSystemContainer, store)} />
|
||||||
<Route path="/list-systems" component={ListSystemsContainer} />
|
<Route path="/create-system" component={Restricted(CreateSystemContainer, store)} />
|
||||||
|
<Route path="/list-systems" component={Restricted(ListSystemsContainer,store)} />
|
||||||
|
<Route path="/" component={Restricted(ListSystemsContainer, store)} />
|
||||||
<Route render={() => (<div>Miss</div>)} />
|
<Route render={() => (<div>Miss</div>)} />
|
||||||
</Switch>
|
</Switch>
|
||||||
</App>
|
</App>
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ import systemReducer from "../System/system-reducer"
|
|||||||
import talkgroupReducer from "../Talkgroups/talkgroup-reducer"
|
import talkgroupReducer from "../Talkgroups/talkgroup-reducer"
|
||||||
import groupReducer from "../Group/group-reducer"
|
import groupReducer from "../Group/group-reducer"
|
||||||
import errorReducer from "../System/error-reducer"
|
import errorReducer from "../System/error-reducer"
|
||||||
|
import statisticReducer from "../System/statistic-reducer"
|
||||||
import permissionReducer from "../Permission/permission-reducer"
|
import permissionReducer from "../Permission/permission-reducer"
|
||||||
import userReducer from "../User/user-reducer"
|
import userReducer from "../User/user-reducer"
|
||||||
|
|
||||||
const createRootReducer = (history) => combineReducers({
|
const createRootReducer = (history) => combineReducers({
|
||||||
router: connectRouter(history),
|
router: connectRouter(history),
|
||||||
system: systemReducer,
|
system: systemReducer,
|
||||||
|
statistic: statisticReducer,
|
||||||
talkgroup: talkgroupReducer,
|
talkgroup: talkgroupReducer,
|
||||||
group: groupReducer,
|
group: groupReducer,
|
||||||
user: userReducer,
|
user: userReducer,
|
||||||
|
|||||||
252
admin/yarn.lock
252
admin/yarn.lock
@@ -1555,6 +1555,44 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/classnames@^2.2.9":
|
||||||
|
version "2.2.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.11.tgz#2521cc86f69d15c5b90664e4829d84566052c1cf"
|
||||||
|
|
||||||
|
"@types/d3-color@^1":
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.1.tgz#0d9746c84dfef28807b2989eed4f37b2575e1f33"
|
||||||
|
|
||||||
|
"@types/d3-interpolate@^1.3.1":
|
||||||
|
version "1.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b"
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-color" "^1"
|
||||||
|
|
||||||
|
"@types/d3-path@^1", "@types/d3-path@^1.0.8":
|
||||||
|
version "1.0.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c"
|
||||||
|
|
||||||
|
"@types/d3-scale@^3.2.1":
|
||||||
|
version "3.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.2.2.tgz#5e28d0b1c599328aaec6094219f10a2570be6d74"
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-time" "*"
|
||||||
|
|
||||||
|
"@types/d3-shape@^1.3.1":
|
||||||
|
version "1.3.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.5.tgz#c0164c1be1429473016f855871d487f806c4e968"
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-path" "^1"
|
||||||
|
|
||||||
|
"@types/d3-time@*":
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.0.0.tgz#831dd093db91f16b83ba980e194bb8e4bcef44d6"
|
||||||
|
|
||||||
|
"@types/d3-time@^1.0.10":
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.1.1.tgz#6cf3a4242c3bbac00440dfb8ba7884f16bedfcbf"
|
||||||
|
|
||||||
"@types/eslint@^7.2.4":
|
"@types/eslint@^7.2.4":
|
||||||
version "7.2.5"
|
version "7.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.5.tgz#92172ecf490c2fce4b076739693d75f30376d610"
|
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.5.tgz#92172ecf490c2fce4b076739693d75f30376d610"
|
||||||
@@ -1618,6 +1656,10 @@
|
|||||||
version "0.0.29"
|
version "0.0.29"
|
||||||
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
|
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
|
||||||
|
|
||||||
|
"@types/lodash@^4.14.146", "@types/lodash@^4.14.160":
|
||||||
|
version "4.14.168"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008"
|
||||||
|
|
||||||
"@types/minimatch@*":
|
"@types/minimatch@*":
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
||||||
@@ -1841,6 +1883,114 @@
|
|||||||
"@typescript-eslint/types" "4.8.1"
|
"@typescript-eslint/types" "4.8.1"
|
||||||
eslint-visitor-keys "^2.0.0"
|
eslint-visitor-keys "^2.0.0"
|
||||||
|
|
||||||
|
"@visx/axis@1.4.0":
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/axis/-/axis-1.4.0.tgz#6a8737d0fb7d4313cf311f9c8b8071e7744b8e7c"
|
||||||
|
dependencies:
|
||||||
|
"@types/classnames" "^2.2.9"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@visx/group" "1.0.0"
|
||||||
|
"@visx/point" "1.0.0"
|
||||||
|
"@visx/scale" "1.4.0"
|
||||||
|
"@visx/shape" "1.4.0"
|
||||||
|
"@visx/text" "1.3.0"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
prop-types "^15.6.0"
|
||||||
|
|
||||||
|
"@visx/curve@1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/curve/-/curve-1.0.0.tgz#f1928821c0beea05d019f3066b28459b4b185c5b"
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-shape" "^1.3.1"
|
||||||
|
d3-shape "^1.0.6"
|
||||||
|
|
||||||
|
"@visx/glyph@1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/glyph/-/glyph-1.0.0.tgz#83d9b7ca331654f9ed624187480335688c7ebd08"
|
||||||
|
dependencies:
|
||||||
|
"@types/classnames" "^2.2.9"
|
||||||
|
"@types/d3-shape" "^1.3.1"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@visx/group" "1.0.0"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
d3-shape "^1.2.0"
|
||||||
|
prop-types "^15.6.2"
|
||||||
|
|
||||||
|
"@visx/group@1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/group/-/group-1.0.0.tgz#d47ac94abec1d191602a501a4fdf7455dfaad0be"
|
||||||
|
dependencies:
|
||||||
|
"@types/classnames" "^2.2.9"
|
||||||
|
"@types/react" "*"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
prop-types "^15.6.2"
|
||||||
|
|
||||||
|
"@visx/legend@1.4.0":
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/legend/-/legend-1.4.0.tgz#4f692680e47f2e04de624652b38b3e1b85e02b41"
|
||||||
|
dependencies:
|
||||||
|
"@types/classnames" "^2.2.9"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@visx/group" "1.0.0"
|
||||||
|
"@visx/scale" "1.4.0"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
prop-types "^15.5.10"
|
||||||
|
|
||||||
|
"@visx/point@1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/point/-/point-1.0.0.tgz#c93cd540989ded394aab8d56cbdc7ca4891c3dd9"
|
||||||
|
|
||||||
|
"@visx/responsive@1.3.0":
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/responsive/-/responsive-1.3.0.tgz#4df0c9d9e2f72ac36e4e1c895b4624626209cca3"
|
||||||
|
dependencies:
|
||||||
|
"@types/lodash" "^4.14.146"
|
||||||
|
"@types/react" "*"
|
||||||
|
lodash "^4.17.10"
|
||||||
|
prop-types "^15.6.1"
|
||||||
|
resize-observer-polyfill "1.5.1"
|
||||||
|
|
||||||
|
"@visx/scale@1.4.0":
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/scale/-/scale-1.4.0.tgz#16cf4ba63dbc595e446397f5bf262591ffe9efd6"
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-interpolate" "^1.3.1"
|
||||||
|
"@types/d3-scale" "^3.2.1"
|
||||||
|
"@types/d3-time" "^1.0.10"
|
||||||
|
d3-interpolate "^1.4.0"
|
||||||
|
d3-scale "^3.2.3"
|
||||||
|
d3-time "^1.1.0"
|
||||||
|
|
||||||
|
"@visx/shape@1.4.0":
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/shape/-/shape-1.4.0.tgz#a8ab713c7df775db357341618c7c0fdbb813f272"
|
||||||
|
dependencies:
|
||||||
|
"@types/classnames" "^2.2.9"
|
||||||
|
"@types/d3-path" "^1.0.8"
|
||||||
|
"@types/d3-shape" "^1.3.1"
|
||||||
|
"@types/lodash" "^4.14.146"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@visx/curve" "1.0.0"
|
||||||
|
"@visx/group" "1.0.0"
|
||||||
|
"@visx/scale" "1.4.0"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
d3-path "^1.0.5"
|
||||||
|
d3-shape "^1.2.0"
|
||||||
|
lodash "^4.17.15"
|
||||||
|
prop-types "^15.5.10"
|
||||||
|
|
||||||
|
"@visx/text@1.3.0":
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@visx/text/-/text-1.3.0.tgz#8ad1afe6819b32c3ab903ca85a32011ea4e223a6"
|
||||||
|
dependencies:
|
||||||
|
"@types/classnames" "^2.2.9"
|
||||||
|
"@types/lodash" "^4.14.160"
|
||||||
|
"@types/react" "*"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
lodash "^4.17.20"
|
||||||
|
prop-types "^15.7.2"
|
||||||
|
reduce-css-calc "^1.3.0"
|
||||||
|
|
||||||
"@webassemblyjs/ast@1.9.0":
|
"@webassemblyjs/ast@1.9.0":
|
||||||
version "1.9.0"
|
version "1.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
|
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
|
||||||
@@ -2461,6 +2611,10 @@ babylon@^6.18.0:
|
|||||||
version "6.18.0"
|
version "6.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
|
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
|
||||||
|
|
||||||
|
balanced-match@^0.4.2:
|
||||||
|
version "0.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
|
||||||
|
|
||||||
balanced-match@^1.0.0:
|
balanced-match@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||||
@@ -2970,6 +3124,10 @@ class-utils@^0.3.5:
|
|||||||
isobject "^3.0.0"
|
isobject "^3.0.0"
|
||||||
static-extend "^0.1.1"
|
static-extend "^0.1.1"
|
||||||
|
|
||||||
|
classnames@^2.2.5:
|
||||||
|
version "2.2.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
|
||||||
|
|
||||||
clean-css@^4.2.3:
|
clean-css@^4.2.3:
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
|
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
|
||||||
@@ -3543,6 +3701,70 @@ cyclist@^1.0.1:
|
|||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
|
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
|
||||||
|
|
||||||
|
d3-array@^2.3.0:
|
||||||
|
version "2.10.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.10.0.tgz#dedf198fe55ea761d196ae40b15dd42e2deaf0b2"
|
||||||
|
dependencies:
|
||||||
|
internmap "^1.0.0"
|
||||||
|
|
||||||
|
d3-color@1:
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
|
||||||
|
|
||||||
|
"d3-color@1 - 2":
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e"
|
||||||
|
|
||||||
|
"d3-format@1 - 2":
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767"
|
||||||
|
|
||||||
|
"d3-interpolate@1.2.0 - 2":
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163"
|
||||||
|
dependencies:
|
||||||
|
d3-color "1 - 2"
|
||||||
|
|
||||||
|
d3-interpolate@^1.4.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
|
||||||
|
dependencies:
|
||||||
|
d3-color "1"
|
||||||
|
|
||||||
|
d3-path@1, d3-path@^1.0.5:
|
||||||
|
version "1.0.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
|
||||||
|
|
||||||
|
d3-scale@^3.2.3:
|
||||||
|
version "3.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.3.tgz#be380f57f1f61d4ff2e6cbb65a40593a51649cfd"
|
||||||
|
dependencies:
|
||||||
|
d3-array "^2.3.0"
|
||||||
|
d3-format "1 - 2"
|
||||||
|
d3-interpolate "1.2.0 - 2"
|
||||||
|
d3-time "1 - 2"
|
||||||
|
d3-time-format "2 - 3"
|
||||||
|
|
||||||
|
d3-shape@^1.0.6, d3-shape@^1.2.0:
|
||||||
|
version "1.3.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
|
||||||
|
dependencies:
|
||||||
|
d3-path "1"
|
||||||
|
|
||||||
|
"d3-time-format@2 - 3", d3-time-format@3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6"
|
||||||
|
dependencies:
|
||||||
|
d3-time "1 - 2"
|
||||||
|
|
||||||
|
"d3-time@1 - 2":
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.0.0.tgz#ad7c127d17c67bd57a4c61f3eaecb81108b1e0ab"
|
||||||
|
|
||||||
|
d3-time@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
|
||||||
|
|
||||||
d@1, d@^1.0.1:
|
d@1, d@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
|
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
|
||||||
@@ -5316,6 +5538,10 @@ internal-slot@^1.0.2:
|
|||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
side-channel "^1.0.2"
|
side-channel "^1.0.2"
|
||||||
|
|
||||||
|
internmap@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.0.tgz#3c6bf0944b0eae457698000412108752bbfddb56"
|
||||||
|
|
||||||
ip-regex@^2.1.0:
|
ip-regex@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
|
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
|
||||||
@@ -6383,7 +6609,7 @@ lodash.uniq@^4.5.0:
|
|||||||
version "4.5.0"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
||||||
|
|
||||||
"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5:
|
"lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5:
|
||||||
version "4.17.20"
|
version "4.17.20"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
|
||||||
|
|
||||||
@@ -6454,6 +6680,10 @@ map-visit@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
object-visit "^1.0.0"
|
object-visit "^1.0.0"
|
||||||
|
|
||||||
|
math-expression-evaluator@^1.2.14:
|
||||||
|
version "1.3.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.3.7.tgz#1b62225db86af06f7ea1fd9576a34af605a5b253"
|
||||||
|
|
||||||
md5.js@^1.3.4:
|
md5.js@^1.3.4:
|
||||||
version "1.3.5"
|
version "1.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
|
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
|
||||||
@@ -8175,7 +8405,7 @@ prompts@2.4.0, prompts@^2.0.1:
|
|||||||
kleur "^3.0.3"
|
kleur "^3.0.3"
|
||||||
sisteransi "^1.0.5"
|
sisteransi "^1.0.5"
|
||||||
|
|
||||||
prop-types@^15.6.2, prop-types@^15.7.2:
|
prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
|
||||||
version "15.7.2"
|
version "15.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -8591,6 +8821,20 @@ redent@^3.0.0:
|
|||||||
indent-string "^4.0.0"
|
indent-string "^4.0.0"
|
||||||
strip-indent "^3.0.0"
|
strip-indent "^3.0.0"
|
||||||
|
|
||||||
|
reduce-css-calc@^1.3.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
|
||||||
|
dependencies:
|
||||||
|
balanced-match "^0.4.2"
|
||||||
|
math-expression-evaluator "^1.2.14"
|
||||||
|
reduce-function-call "^1.0.1"
|
||||||
|
|
||||||
|
reduce-function-call@^1.0.1:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f"
|
||||||
|
dependencies:
|
||||||
|
balanced-match "^1.0.0"
|
||||||
|
|
||||||
redux-thunk@2.3.0, redux-thunk@^2.3.0:
|
redux-thunk@2.3.0, redux-thunk@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
|
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
|
||||||
@@ -8761,6 +9005,10 @@ reselect@^4.0.0:
|
|||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
|
resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
|
||||||
|
|
||||||
|
resize-observer-polyfill@1.5.1:
|
||||||
|
version "1.5.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
|
||||||
|
|
||||||
resolve-cwd@^2.0.0:
|
resolve-cwd@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
|
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
|
||||||
|
|||||||
@@ -6,12 +6,12 @@ var connectMongo = require("connect-mongo");
|
|||||||
var secrets = require("./secrets");
|
var secrets = require("./secrets");
|
||||||
|
|
||||||
const MongoStore = connectMongo(session)
|
const MongoStore = connectMongo(session)
|
||||||
var cookie_domain = process.env['COOKIE_DOMAIN'] != null ? process.env['COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var cookie_domain = process.env['REACT_APP_COOKIE_DOMAIN'] != null ? process.env['REACT_APP_COOKIE_DOMAIN'] : '.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
var backend_server = process.env['BACKEND_SERVER'] != null ? process.env['BACKEND_SERVER'] : 'https://api.openmhz.com';
|
var backend_server = process.env['REACT_APP_BACKEND_SERVER'] != null ? process.env['REACT_APP_BACKEND_SERVER'] : 'https://api.openmhz.com';
|
||||||
var frontend_server = process.env['FRONTEND_SERVER'] != null ? process.env['FRONTEND_SERVER'] : 'https://openmhz.com';
|
var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
|
||||||
var socket_server = process.env['SOCKET_SERVER'] != null ? process.env['SOCKET_SERVER'] : 'wss://socket.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var socket_server = process.env['REACT_APP_SOCKET_SERVER'] != null ? process.env['REACT_APP_SOCKET_SERVER'] : 'wss://socket.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
var admin_server = process.env['ADMIN_SERVER'] != null ? process.env['ADMIN_SERVER'] : 'https://admin.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
var admin_server = process.env['REACT_APP_ADMIN_SERVER'] != null ? process.env['REACT_APP_ADMIN_SERVER'] : 'https://admin.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
||||||
var site_name = process.env['SITE_NAME'] != null ? process.env['SITE_NAME'] : "OpenMHz";
|
var dev_server = frontend_server + ":3000"
|
||||||
|
|
||||||
|
|
||||||
module.exports = function(app, passport) {
|
module.exports = function(app, passport) {
|
||||||
@@ -21,8 +21,7 @@ module.exports = function(app, passport) {
|
|||||||
// Keeping it makes it easier for an attacker to build the site's profile
|
// Keeping it makes it easier for an attacker to build the site's profile
|
||||||
// It can be removed safely
|
// It can be removed safely
|
||||||
app.disable("x-powered-by")
|
app.disable("x-powered-by")
|
||||||
|
app.enable('trust proxy')
|
||||||
app.use('/audio', express.static(__dirname + '/media'));
|
|
||||||
app.use(bodyParser.json())
|
app.use(bodyParser.json())
|
||||||
app.use(bodyParser.urlencoded({ extended: true }))
|
app.use(bodyParser.urlencoded({ extended: true }))
|
||||||
app.use(express.static(path.join(process.cwd(), 'public')));
|
app.use(express.static(path.join(process.cwd(), 'public')));
|
||||||
@@ -66,11 +65,11 @@ module.exports = function(app, passport) {
|
|||||||
allowedOrigins.push(frontend_server);
|
allowedOrigins.push(frontend_server);
|
||||||
allowedOrigins.push(backend_server);
|
allowedOrigins.push(backend_server);
|
||||||
allowedOrigins.push(socket_server);
|
allowedOrigins.push(socket_server);
|
||||||
|
allowedOrigins.push(dev_server);
|
||||||
allowedOrigins.push("https://www.openmhz.com");
|
allowedOrigins.push("https://www.openmhz.com");
|
||||||
|
|
||||||
var origin = req.headers.origin;
|
var origin = req.headers.origin;
|
||||||
|
|
||||||
|
|
||||||
if (allowedOrigins.indexOf(origin) > -1) {
|
if (allowedOrigins.indexOf(origin) > -1) {
|
||||||
res.setHeader('Access-Control-Allow-Origin', origin);
|
res.setHeader('Access-Control-Allow-Origin', origin);
|
||||||
} else if (req.headers["user-agent"] == 'TrunkRecorder1.0') {
|
} else if (req.headers["user-agent"] == 'TrunkRecorder1.0') {
|
||||||
@@ -83,7 +82,8 @@ module.exports = function(app, passport) {
|
|||||||
}
|
}
|
||||||
res.header("Access-Control-Allow-Headers", "X-Requested-With");
|
res.header("Access-Control-Allow-Headers", "X-Requested-With");
|
||||||
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS,WEBSOCKET');
|
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS,WEBSOCKET');
|
||||||
res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Max-Age");
|
res.header('Access-Control-Allow-Credentials', 'true');
|
||||||
|
res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Max-Age");
|
||||||
res.header('Access-Control-Max-Age', '600');
|
res.header('Access-Control-Max-Age', '600');
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
var db = require('../db');
|
var db = require('../db');
|
||||||
var schedule = require('node-schedule');
|
var schedule = require('node-schedule');
|
||||||
var sysStats = require("../sys_stats");
|
var sysStats = require("../sys_stats");
|
||||||
|
const util = require('util');
|
||||||
|
|
||||||
exports.init_stats = function() {
|
exports.init_stats = function() {
|
||||||
sysStats.initStats();
|
sysStats.initStats();
|
||||||
|
|||||||
@@ -99,13 +99,6 @@ function isLoggedIn(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var admin_server = process.env['ADMIN_SERVER'] != null ? process.env['ADMIN_SERVER'] : 'https://admin.openmhz.com';
|
|
||||||
var backend_server = process.env['BACKEND_SERVER'] != null ? process.env['BACKEND_SERVER'] : 'https://api.openmhz.com';
|
|
||||||
var frontend_server = process.env['FRONTEND_SERVER'] != null ? process.env['FRONTEND_SERVER'] : 'https://openmhz.com';
|
|
||||||
var socket_server = process.env['SOCKET_SERVER'] != null ? process.env['SOCKET_SERVER'] : 'wss://api.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
|
||||||
var account_server = process.env['ACCOUNT_SERVER'] != null ? process.env['ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------
|
// -------------------------------------------
|
||||||
|
|
||||||
configurePassport(app, passport)
|
configurePassport(app, passport)
|
||||||
|
|||||||
4
data/mongo/.gitignore
vendored
4
data/mongo/.gitignore
vendored
@@ -1,4 +0,0 @@
|
|||||||
# Ignore everything in this directory
|
|
||||||
*
|
|
||||||
# Except this file
|
|
||||||
!.gitignore
|
|
||||||
@@ -55,16 +55,12 @@ services:
|
|||||||
pid: "host"
|
pid: "host"
|
||||||
environment:
|
environment:
|
||||||
- MONGO_NODE_DRIVER_HOST=mongo
|
- MONGO_NODE_DRIVER_HOST=mongo
|
||||||
- BACKEND_SERVER
|
- REACT_APP_BACKEND_SERVER
|
||||||
- ADMIN_SERVER
|
- REACT_APP_ADMIN_SERVER
|
||||||
- FRONTEND_SERVER
|
- REACT_APP_FRONTEND_SERVER
|
||||||
- SOCKET_SERVER
|
- REACT_APP_SOCKET_SERVER
|
||||||
- COOKIE_DOMAIN
|
- REACT_APP_COOKIE_DOMAIN
|
||||||
- ACCOUNT_SERVER
|
- REACT_APP_ACCOUNT_SERVER
|
||||||
- ADMIN_EMAIL
|
|
||||||
- SITE_NAME
|
|
||||||
- FREE_PLAN_ARCHIVE
|
|
||||||
- PRO_PLAN_ARCHIVE
|
|
||||||
- S3_ENDPOINT
|
- S3_ENDPOINT
|
||||||
- S3_BUCKET
|
- S3_BUCKET
|
||||||
- S3_PROFILE
|
- S3_PROFILE
|
||||||
@@ -87,19 +83,22 @@ services:
|
|||||||
admin:
|
admin:
|
||||||
build:
|
build:
|
||||||
context: ./admin
|
context: ./admin
|
||||||
|
args:
|
||||||
|
- REACT_APP_BACKEND_SERVER
|
||||||
|
- REACT_APP_ADMIN_SERVER
|
||||||
|
- REACT_APP_ACCOUNT_SERVER
|
||||||
|
- REACT_APP_FRONTEND_SERVER
|
||||||
|
- REACT_APP_SITE_NAME
|
||||||
|
- REACT_APP_ADMIN_EMAIL
|
||||||
|
- NODE_ENV
|
||||||
image: "admin:${TAG}-${STAGE}"
|
image: "admin:${TAG}-${STAGE}"
|
||||||
environment:
|
environment:
|
||||||
|
- REACT_APP_BACKEND_SERVER
|
||||||
|
- REACT_APP_ADMIN_SERVER
|
||||||
|
- REACT_APP_ACCOUNT_SERVER
|
||||||
|
- REACT_APP_FRONTEND_SERVER
|
||||||
|
- REACT_APP_SITE_NAME
|
||||||
- MONGO_NODE_DRIVER_HOST=mongo
|
- MONGO_NODE_DRIVER_HOST=mongo
|
||||||
- BACKEND_SERVER
|
|
||||||
- ADMIN_SERVER
|
|
||||||
- FRONTEND_SERVER
|
|
||||||
- SOCKET_SERVER
|
|
||||||
- COOKIE_DOMAIN
|
|
||||||
- ACCOUNT_SERVER
|
|
||||||
- ADMIN_EMAIL
|
|
||||||
- SITE_NAME
|
|
||||||
- FREE_PLAN
|
|
||||||
- PRO_PLAN
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mongo
|
- mongo
|
||||||
networks:
|
networks:
|
||||||
@@ -114,25 +113,26 @@ services:
|
|||||||
account:
|
account:
|
||||||
build:
|
build:
|
||||||
context: ./account
|
context: ./account
|
||||||
|
args:
|
||||||
|
- REACT_APP_BACKEND_SERVER
|
||||||
|
- REACT_APP_ADMIN_SERVER
|
||||||
|
- REACT_APP_ACCOUNT_SERVER
|
||||||
|
- REACT_APP_FRONTEND_SERVER
|
||||||
|
- REACT_APP_SITE_NAME
|
||||||
|
- REACT_APP_ADMIN_EMAIL
|
||||||
|
- NODE_ENV
|
||||||
image: "acount:${TAG}-${STAGE}"
|
image: "acount:${TAG}-${STAGE}"
|
||||||
environment:
|
environment:
|
||||||
- MONGO_NODE_DRIVER_HOST=mongo
|
- MONGO_NODE_DRIVER_HOST=mongo
|
||||||
- STRIPE_PUBLISHABLE_KEY
|
|
||||||
- STRIPE_SECRET_KEY
|
|
||||||
- MAILJET_KEY
|
- MAILJET_KEY
|
||||||
- MAILJET_SECRET
|
- MAILJET_SECRET
|
||||||
- REACT_APP_BACKEND_SERVER
|
- REACT_APP_BACKEND_SERVER
|
||||||
- REACT_APP_ADMIN_SERVER
|
- REACT_APP_ADMIN_SERVER
|
||||||
|
- REACT_APP_ACCOUNT_SERVER
|
||||||
- REACT_APP_FRONTEND_SERVER
|
- REACT_APP_FRONTEND_SERVER
|
||||||
- SOCKET_SERVER
|
- REACT_APP_SITE_NAME
|
||||||
- COOKIE_DOMAIN
|
- REACT_APP_ADMIN_EMAIL
|
||||||
- ACCOUNT_SERVER
|
- REACT_APP_COOKIE_DOMAIN
|
||||||
- ADMIN_EMAIL
|
|
||||||
- SITE_NAME
|
|
||||||
- FREE_PLAN
|
|
||||||
- PRO_PLAN
|
|
||||||
- FREE_PLAN_PRICE
|
|
||||||
- PRO_PLAN_PRICE
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mongo
|
- mongo
|
||||||
networks:
|
networks:
|
||||||
@@ -147,21 +147,16 @@ services:
|
|||||||
frontend:
|
frontend:
|
||||||
build:
|
build:
|
||||||
context: ./frontend
|
context: ./frontend
|
||||||
|
args:
|
||||||
|
- REACT_APP_BACKEND_SERVER
|
||||||
|
- REACT_APP_FRONTEND_SERVER
|
||||||
|
- REACT_APP_SITE_NAME
|
||||||
|
- NODE_ENV
|
||||||
image: "frontend:${TAG}-${STAGE}"
|
image: "frontend:${TAG}-${STAGE}"
|
||||||
environment:
|
environment:
|
||||||
- MONGO_NODE_DRIVER_HOST=mongo
|
- REACT_APP_BACKEND_SERVER
|
||||||
- BACKEND_SERVER
|
- REACT_APP_FRONTEND_SERVER
|
||||||
- ADMIN_SERVER
|
- REACT_APP_SITE_NAME
|
||||||
- FRONTEND_SERVER
|
|
||||||
- SOCKET_SERVER
|
|
||||||
- COOKIE_DOMAIN
|
|
||||||
- ACCOUNT_SERVER
|
|
||||||
- ADMIN_EMAIL
|
|
||||||
- SITE_NAME
|
|
||||||
- FREE_PLAN
|
|
||||||
- PRO_PLAN
|
|
||||||
- FREE_PLAN_ARCHIVE
|
|
||||||
- PRO_PLAN_ARCHIVE
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mongo
|
- mongo
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
source test.env
|
source test.env
|
||||||
|
echo $REACT_APP_ACCOUNT_SERVER
|
||||||
echo $COOKIE_DOMAIN
|
echo "Docker Compose Command: " $@
|
||||||
echo "Docker Compose Commad: " $@
|
|
||||||
docker-compose -f docker-compose.yml -f test-compose.yml $@
|
docker-compose -f docker-compose.yml -f test-compose.yml $@
|
||||||
|
|||||||
2
frontend/.dockerignore
Normal file
2
frontend/.dockerignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/node_modules
|
||||||
|
/build
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
FROM node:13.12.0-alpine as build
|
FROM node:13.12.0-alpine as build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV PATH /app/node_modules/.bin:$PATH
|
ENV PATH /app/node_modules/.bin:$PATH
|
||||||
|
ARG REACT_APP_BACKEND_SERVER
|
||||||
|
ARG REACT_APP_SITE_NAME
|
||||||
|
ARG REACT_APP_FRONTEND_SERVER
|
||||||
|
ARG NODE_ENV
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
RUN npm install react-scripts@3.4.1 -g --silent
|
RUN npm install react-scripts@3.4.1 -g --silent
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ import axios from "axios";
|
|||||||
import * as types from "./call-constants";
|
import * as types from "./call-constants";
|
||||||
import { push } from 'connected-react-router';
|
import { push } from 'connected-react-router';
|
||||||
|
|
||||||
const FETCH_SUCCESS_STATISTIC = "FETCH_SUCCESS_STATISTIC"
|
|
||||||
|
|
||||||
function beginFetchCallInfo() {
|
function beginFetchCallInfo() {
|
||||||
return { type: types.FETCH_CALL_INFO };
|
return { type: types.FETCH_CALL_INFO };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# docker build -t mongo .
|
# docker build -t mongo .
|
||||||
|
|
||||||
FROM mongo:3.4
|
FROM mongo:4.4
|
||||||
|
|
||||||
MAINTAINER Luke Berndt <lukekb@gmail.com>
|
MAINTAINER Luke Berndt <lukekb@gmail.com>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user