Skip to content

+2347039468700 #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
PORT = port_number
NODE_ENV =
DBURL =
USER = email_address
PASS = password
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.vscode

# Logs
logs
*.log
npm-debug.log*


# Dependency directory
node_modules

.env
106 changes: 106 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
'use strict';

require('dotenv').config();

/***********************
* Module dependencies *
***********************/
const express = require("express"),
compress = require("compression"),
bodyParser = require("body-parser"),
cookieParser = require("cookie-parser"),
mongoose = require("mongoose"),
session = require("express-session"),
http = require('http'),
log4js = require('log4js'),
nodemon = require("nodemon"),
path = require('path'),
cors = require('cors'),
log = require('./util/logger').getLogger('APP');

/********************
* express instance *
********************/
const app = express();

/********************
* Module variables *
********************/
const
port = process.env.PORT,
env = process.env.NODE_ENV,
DBURL = process.env.DBURL;
let db;

/********************
* App config *
********************/
app.set('port', port);
app.set('env', env);

/********************
* database config *
********************/

mongoose.Promise = require('bluebird');

var options = {
useMongoClient: true,
socketTimeoutMS: 0,
keepAlive: true,
reconnectTries: 30
};
mongoose.connect(DBURL, options);
db = mongoose.connection;
db.on('error', err => {
log.error('There was a db connection error');
});
db.once('connected', () => {
log.info('connection created successfully!');
});
db.once('disconnected', () => {
log.error('Successfully disconnected!');
});
process.on('SIGINT', () => {
mongoose.connection.close(() => {
log.error('dBase connection closed due to app termination');
process.exit(0);
});
});

/*********************
* Module middleware *
*********************/
app.use(log4js.connectLogger(log, { level: 'auto' }));
app.enabled('trust proxy');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
if(req.method === 'OPTIONS') {
res.status(200).end();
}
else {
next();
}
});

app.use(express.static(path.join(__dirname, 'public')));
// view engine setup

app.set('view engine', 'jade');


/**********
* Routes *
*********/
app.use('/', require('./app/routes/index'));


/**************
* Export app *
*************/

module.exports = app;
107 changes: 107 additions & 0 deletions app/models/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/***********************
* Module dependencies *
***********************/
let mongoose = require("mongoose");
bcrypt = require('bcrypt');


/********************************************
* MONGOOSE MODEL CONFIGURATION *
*******************************************/
const userSchema = new mongoose.Schema({
firstName: {
type: String,
required: [true, 'Please enter your firstname']
},
lastName: {
type: String,
required: [true, 'Please add your last name']
},
phone: {
type: Number,
required: [true, 'Please add your phone number'],
unique: true
},
email: {type: String, unique: true, required: true},
password: {
type: String,
required: [true, 'Please add a password']
},
resetPasswordToken: String,
resetPasswordExpires: Date,
meta: {
created_at: {type: Date, default: Date.now},
updated_at: {type: Date, default: Date.now},
}
});

userSchema.statics.isEmailUnique = (email) => {
return new Promise((resolve, reject) => {
this.findOne({email:email})
.exec((err, user) => {
if (user) reject();
else resolve();
});
});

};

userSchema.pre('save', (next) => {
let user = this;
bcrypt.hash(user.password, 10, (err, hash) => {
if(err){
return next(err);
}
user.password = hash;
next()
})
})


userSchema.statics.authenticate = function (phone, password, callback){
User.findOne({ phone: phone}).exec(function (err, user){
if(err){
return callback(err)
}else if(!user){
let err = new Error('User not found');
err.status = 401;
return callback(err);
}
bcrypt.compare(password, user.password, (err, result) => {
if (result === true){
return callback(null, user);
}
else{
return callback()
}

})
})
}

userSchema.statics.authenticateWithOtp = ( otp, callback) => {
User.findOne({resetPasswordToken: otp}).exec( (err, user) => {
if(err){
return callback(err)
}else if(!user){
let err = new Error('User not found');
err.status = 401;
return callback(err);
}
if(user.resetPasswordExpires >= Date.now()){
return callback(null, user);
}else{
let err = new Error('OTP Expired');
err.status = 401;
return callback(err);
}


})
}


/******************
* Export schema *
******************/
module.exports = mongoose.model('User', userSchema);
31 changes: 31 additions & 0 deletions app/routes/airtime.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
const express = require('express');
const router = express.Router();
// Get authentication secrets from a file
const credentials = require('./app/private');
const AfricasTalking = require('africastalking')(credentials.TEST_ACCOUNT);
const airtime = AfricasTalking.AIRTIME;
// Send airtime
router.post('/send', (req, res) => {
const {
to,
currencyCode,
amount
} = req.body;
const airtimeRecipientList = to.split(',')
.map(number => {
return {
phoneNumber: number.trim(),
currencyCode,
amount: Number(amount)
}
});
let options = { recipients: airtimeRecipientList }
airtime.send(options).then(response => {
console.log(response);
res.json(response);
}).catch(error => {
console.log(error);
res.json(error.toString());
});
});
module.exports = router;
37 changes: 37 additions & 0 deletions app/routes/app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/***********************
* Module dependencies *
***********************/
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');

/**********************
* Imported files *
**********************/
const config = require('../../../config');
const publicRoutes = require('./public');
// const privateRoutes = require('./private');


const airtime = require('../airtime');
const sms = require('../sms');
const payment = require('../payment');


router.use(airtime);
router.use(sms);
router.use(payment);


//All public routes
// const userControl = require('../user');


module.exports = publicRoutes;
router.use(publicRoutes);


/******************
* Export router *
******************/
module.exports = router;
7 changes: 7 additions & 0 deletions app/routes/app/private.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict';

exports.TEST_ACCOUNT = {
apiKey: "b71309224be00d914b570b7dec3d050c8cbb96382c491735169b0e1d8d34519f",
username: "sandbox",
format: "json"
};
12 changes: 12 additions & 0 deletions app/routes/app/public.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const publicRoutes = require('express').Router();
const userControl = require('../user');
const sms = require('../sms');
const payment = require('../payment');
// voice = require('../voice');

publicRoutes.post('/register', userControl.register);
publicRoutes.post('/login', userControl.login);
publicRoutes.post('/forgot', userControl.forgot);
publicRoutes.post('/reset_pword', userControl.reset_pword);

module.exports = publicRoutes;
62 changes: 62 additions & 0 deletions app/routes/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
const os = require('os');
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const config = require('../../config');
const user = require('./app/index');

const ifaces = os.networkInterfaces();
const ips = [];

Object.keys(ifaces).forEach(function (ifname) {
var alias = 0;

ifaces[ifname].forEach(function (iface) {
if ('IPv4' !== iface.family || iface.internal !== false) {
return;
}
ips.push(iface.address);
});
});

/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Africa\'s Talking \n'});
});


/* GET users listing. */
router.get('/register', (req, res, next) => {
res.render('register', {title:'Register'});
});


router.get('/airtime', (req, res, next) => {
res.render('airtime', {title:'Airtime'});
});


router.get('/mobileCheckout', (req, res, next) => {
res.render('mobileCheckout', {title:'Mobile Checkout'});
});

router.get('/sms', (req, res, next) => {
res.render('sms', {title:'SMS'});
});


router.get('/forgot', (req, res, next) => {
res.render('forgot', {title:'Forgot'});
});

router.get('/login', function(req, res, next) {
res.render('login', {
user: req.user
});
});

//All routes to be used
router.use('/', user);


module.exports = router;
Loading