Skip to content
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

API Testing & Test Data Scripts #31

Open
wants to merge 11 commits into
base: dev
Choose a base branch
from
69 changes: 42 additions & 27 deletions src/controllers/authController.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
const jwt = require('jsonwebtoken');
const formdata = require('form-data')
const Mailgun = require('mailgun.js')
const mailgun = new Mailgun(formdata)
const formdata = require('form-data');
const Mailgun = require('mailgun.js');
const mailgun = new Mailgun(formdata);
const User = require('../models/usersModel.js');
const { StatusCodes } = require('http-status-codes');
const { BadRequestError, UnauthenticatedError, NotFoundError } = require('../errors');
const {
BadRequestError,
UnauthenticatedError,
NotFoundError,
} = require('../errors');

// Create the maildun client
const mg = mailgun.client({
username: 'api',
key: process.env.MAILGUN_API_KEY || 'apiKey',
domain: process.env.MAILGUN_DOMAIN || 'sandbox-123.mailgun.org'
domain: process.env.MAILGUN_DOMAIN || 'sandbox-123.mailgun.org',
});

// Register controller
Expand All @@ -37,6 +41,7 @@ const register = async (req, res, next) => {
// Respond with user data and token
res.status(StatusCodes.CREATED).json({
user: {
_id: user._id,
parentName: user.parentName,
email: user.email,
},
Expand All @@ -63,26 +68,27 @@ const login = async (req, res, next) => {

if (!user) {
throw new UnauthenticatedError('Invalid Credentials');
};
}

const isPasswordCorrect = await user.comparePassword(password);

if (!isPasswordCorrect) {
throw new UnauthenticatedError('Invalid Credentials');
};
}

const token = await user.generateAuthToken();

await user.save()
await user.save();

res.status(StatusCodes.OK).json({ user: { name: user.parentName }, token });
res
.status(StatusCodes.OK)
.json({ user: { name: user.parentName }, token });
} catch (error) {
console.error('Login Error;', error);
next(error);
};
}
};


// Forgot Password Controller
const forgotPassword = async (req, res) => {
const { email } = req.body;
Expand All @@ -107,20 +113,24 @@ const forgotPassword = async (req, res) => {
from: process.env.EMAIL_USER,
to: user.email,
subject: 'Password reset',
text: `You requested a password reset. Please click on the following link to reset your password: ${resetUrl}`
text: `You requested a password reset. Please click on the following link to reset your password: ${resetUrl}`,
};

mg.messages.create(process.env.MAILGUN_DOMAIN, data)
mg.messages
.create(process.env.MAILGUN_DOMAIN, data)
.then(() => {
res.status(StatusCodes.OK).json({ message: 'Password reset link sent to your email' });
res
.status(StatusCodes.OK)
.json({ message: 'Password reset link sent to your email' });
})
.catch(error => {
.catch((error) => {
console.error('Error sending email:', error);
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ message: 'Failed to send email' });
res
.status(StatusCodes.INTERNAL_SERVER_ERROR)
.json({ message: 'Failed to send email' });
});
};


const resetPassword = async (req, res) => {
const { token } = req.params;
const { password } = req.body;
Expand All @@ -130,7 +140,7 @@ const resetPassword = async (req, res) => {
try {
decoded = jwt.verify(token, process.env.JWT_SECRET);
} catch (err) {
throw new BadRequestError("Token is invalid or has expired");
throw new BadRequestError('Token is invalid or has expired');
}

// Find the user by ID
Expand All @@ -145,31 +155,36 @@ const resetPassword = async (req, res) => {

await user.save();

res.status(StatusCodes.OK).json({ message: "Password has been reset successfully" });
res
.status(StatusCodes.OK)
.json({ message: 'Password has been reset successfully' });
};

// Logout API
const logout = async (req, res) => {
const { token } = req.user
const { token } = req.user;

const user = await User.findOne({ 'tokens.token' : token})
const user = await User.findOne({ 'tokens.token': token });

if (!user) {
throw new UnauthenticatedError('Invalid Token')
throw new UnauthenticatedError('Invalid Token');
}

user.tokens = user.tokens.filter((userToken) => userToken.token !== token)
user.tokens = user.tokens.filter(
(userToken) => userToken.token !== token
);

await user.save();

res.status(StatusCodes.OK).json({ message: 'Logged out successfully'})
}

res
.status(StatusCodes.OK)
.json({ message: 'Logged out successfully' });
};

module.exports = {
register,
login,
forgotPassword,
resetPassword,
logout
logout,
};
21 changes: 21 additions & 0 deletions src/db/seeders/populateRequests.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
require('dotenv').config();

const connectDB = require('../conn');
const RideRequest = require('../../models/requestModel');

const rideRequests = require('./testRequests.json');

const start = async () => {
try {
await connectDB(process.env.MONGO_URI);
await RideRequest.deleteMany();
await RideRequest.create(rideRequests);
console.log('Success seeding ride requests database!!!!');
process.exit(0);
} catch (error) {
console.log(error);
process.exit(1);
}
};

start();
21 changes: 21 additions & 0 deletions src/db/seeders/populateUsers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
require('dotenv').config();

const connectDB = require('../conn');
const users = require('../../models/usersModel');

const testUsers = require('./testUsers.json');

const start = async () => {
try {
await connectDB(process.env.MONGO_URI);
await users.deleteMany();
await users.create(testUsers);
console.log('Success seeding users database!!!!');
process.exit(0);
} catch (error) {
console.error(error);
process.exit(1);
}
};

start();
87 changes: 87 additions & 0 deletions src/db/seeders/testRequests.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
[
{
"requester": "66da634df62f6553ab5c19bc",
"profile": "66da634df62f6553ab5c19c3",
"requestedPickUpDays": ["Tuesday", "Thursday", "Friday"],
"status": "pending"
},
{
"requester": "66da634df62f6553ab5c19c3",
"profile": "66da634df62f6553ab5c19cc",
"requestedDropOffDays": ["Monday", "Wednesday", "Friday"],
"requestedPickUpDays": ["Monday", "Wednesday", "Friday"],
"status": "approved"
},
{
"requester": "66da634df62f6553ab5c19cc",
"profile": "66da634df62f6553ab5c19c3",
"requestedDropOffDays": ["Thursday"],
"requestedPickUpDays": ["Tuesday", "Thursday"],
"status": "approved"
},
{
"requester": "66da634df62f6553ab5c19c2",
"profile": "66da634df62f6553ab5c19c4",
"requestedDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"status": "approved"
},
{
"requester": "66da634df62f6553ab5c19c4",
"profile": "66da634df62f6553ab5c19c2",
"requestedPickUpDays": ["Monday", "Tuesday", "Friday"],
"status": "pending"
},
{
"requester": "66da634df62f6553ab5c19cd",
"profile": "66da634df62f6553ab5c19ce",
"requestedDropOffDays": ["Tuesday", "Thursday"],
"requestedPickUpDays": ["Tuesday", "Thursday"],
"status": "pending"
},
{
"requester": "66da634df62f6553ab5c19cf",
"profile": "66da634df62f6553ab5c19bc",
"requestedDropOffDays": ["Monday", "Tuesday", "Thursday"],
"requestedPickUpDays": ["Monday"],
"status": "declined"
},
{
"requester": "66da634df62f6553ab5c19bd",
"profile": "66da634df62f6553ab5c19c7",
"requestedPickUpDays": ["Wednesday"],
"status": "pending"
},
{
"requester": "66da634df62f6553ab5c19c8",
"profile": "66da634df62f6553ab5c19d2",
"requestedDropOffDays": ["Monday", "Friday"],
"requestedPickUpDays": ["Monday", "Thursday"],
"status": "approved"
},
{
"requester": "66da634df62f6553ab5c19c8",
"profile": "66da634df62f6553ab5c19d6",
"requestedDropOffDays": ["Wednesday"],
"requestedPickUpDays": ["Wednesday"],
"status": "approved"
},
{
"requester": "66da634df62f6553ab5c19c8",
"profile": "66da634df62f6553ab5c19eb",
"requestedDropOffDays": ["Friday"],
"requestedPickUpDays": ["Thursday"],
"status": "declined"
},
{
"requester": "66da634df62f6553ab5c19d6",
"profile": "66da634df62f6553ab5c19eb",
"requestedDropOffDays": ["Friday"],
"status": "approved"
},
{
"requester": "66da634df62f6553ab5c19e2",
"profile": "66da634df62f6553ab5c19ca",
"requestedPickUpDays": ["Monday", "Friday"],
"status": "approved"
}
]
Loading