Skip to content
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
13 changes: 0 additions & 13 deletions __tests__/app.test.js
Original file line number Diff line number Diff line change
@@ -1,13 +0,0 @@
import app from '../src/index';

describe('app module', () => {
test('it exists', async () => {
expect(app).toBeDefined();
});

test('it returns program name with SDGs', async () => {
const result = await app();
const sdgPos = (result || '').indexOf('SDG');
expect(sdgPos).toBeGreaterThanOrEqual(0);
});
});
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,14 @@
},
"license": "MIT",
"dependencies": {
"bcrypt": "^4.0.1",
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.9.11",
"mongoose-unique-validator": "^2.0.3",
"nodemon": "^2.0.3"
},
"devDependencies": {
Expand Down
8 changes: 8 additions & 0 deletions src/app.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable linebreak-style */
const express = require('express');

const cors = require('cors');
Expand All @@ -18,6 +19,13 @@ const connect = mongoose.connection;

connect.once('open', () => 'connected');

const registrationRoutes = require('./routes/registration');

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use('/auth', registrationRoutes);

app.use((req, res) => {
res.json({ message: 'your request wass successfull' });
});
Expand Down
23 changes: 23 additions & 0 deletions src/models/registration.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/* eslint-disable linebreak-style */
/* eslint-disable eol-last */
/* eslint-disable function-paren-newline */
/* eslint-disable indent */
/* eslint-disable linebreak-style */
/* eslint-disable prefer-destructuring */
/* eslint-disable linebreak-style */
/* eslint-disable import/newline-after-import */
const mongoose = require('mongoose');

const Schema = mongoose.Schema;


const signupSchema = new Schema({
username: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true }
}
);

const Signup = mongoose.model('Signup', signupSchema);

module.exports = Signup;
132 changes: 132 additions & 0 deletions src/routes/registration.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
/* eslint-disable consistent-return */
/* eslint-disable no-underscore-dangle */
/* eslint-disable no-useless-escape */
/* eslint-disable no-trailing-spaces */
/* eslint-disable linebreak-style */
/* eslint-disable padded-blocks */
/* eslint-disable eol-last */
/* eslint-disable linebreak-style */
const router = require('express').Router();

const bcrypt = require('bcrypt');

const jwt = require('jsonwebtoken');

const Signup = require('../models/registration');

router.post('/add', (req, res) => {

const errorArray = [];

const userRegex = /^[a-z]+[0-9]*/gi;

const emailRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/gi;

const { username, email, password } = req.body;

if (!username || !email || !password) {
errorArray.push('please fill all fields');
}

if (username.length < 3) {
errorArray.push('username should be 3 0r more characters');
}

if (!userRegex.test(username)) {

errorArray.push('username does not fit the required specification');
}

// check if username already exists
Signup.findOne({ username }).then(
(user) => {
if (user) {

errorArray.push('username already exist');
}
}
).catch((err) => res.status(400).json(`Error : ${err}`));


// check if email already exists
Signup.findOne({ email }).then(
(emailCheck) => {
if (emailCheck) {

errorArray.push('email already exists');

}

if (!emailRegex.test(email)) {
errorArray.push('please input the correct email');
}

if (errorArray.length > 0) {
return res.status(400).json({ errorArray });
}

// hash the password and save to database
bcrypt.hash(password, 10).then(
(hash) => {
const newSignup = new Signup({
username,
email,
password: hash
});

newSignup.save()
.then(() => res.json('user registered'))
.catch((err) => res.status(400).json(`Error: ${err}`));

}
).catch((err) => res.status(400).json(`Error: ${err}`));


}

).catch((err) => res.status(400).json(`Error: ${err}`));


});


// login Router
router.post('/login', (req, res) => {

const { email, password } = req.body;

Signup.findOne({ email }).then(
(user) => {

if (!user) {
return res.status(401).json({ message: 'invalid credentials' });
}

bcrypt.compare(password, user.password).then(
(valid) => {

if (!valid) {

return res.status(401).json({ message: 'invalid credentials' });
}

const token = jwt.sign(
{ userId: user._id },
'RANDOM_TOKEN-SECRET_NUMBER',
{ expiresIn: '24h' }
);

res.status(201).json({
username: user.username,
token,
message: 'user logged in'
});
}
).catch((err) => res.status(400).json(`Error: ${err}`));
}
).catch((err) => res.status(400).json(`Error: ${err}`));


});

module.exports = router;
1 change: 1 addition & 0 deletions src/server.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable linebreak-style */
const http = require('http');

const app = require('./app');
Expand Down
Loading