Skip to content

Commit

Permalink
fix(get_passenger_reservations): added functions and refactored code (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
brunocalderon authored Oct 28, 2019
1 parent 374bfdd commit 5057d50
Showing 1 changed file with 123 additions and 14 deletions.
137 changes: 123 additions & 14 deletions get_passenger_reservations.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,143 @@
const aws = require('aws-sdk');

// eslint-disable-next-line import/no-absolute-path
const bearerToUserId = require('/opt/nodejs/bearer_to_user_id.js');

const dynamoDB = new aws.DynamoDB.DocumentClient();
const PlacesTableName = process.env.dynamodb_table_name_places;

async function getReservations(userId) {
async function getReservationsForUser(userId) {
const params = {
TableName: process.env.dynamodb_table_name,
IndexName: process.env.dynamodb_index_name,
KeyConditionExpression: 'passenger_id = :passengerId',
TableName: process.env.dynamodb_table_name_reservations,
IndexName: process.env.dynamodb_table_name_reservations_index,
KeyConditionExpression: 'passenger_id = :passenger_id',
ExpressionAttributeValues: {
':passengerId': userId
':passenger_id': userId
},
ProjectionExpression:
'reservation_id, reserved_seats, route, reservation_status'
'reservation_id'
};
const data = await dynamoDB.query(params).promise();
return data.Items;
}

exports.handler = async (event) => { // eslint-disable-line no-unused-vars
const userId = await bearerToUserId.bearerToUserId(event.headers.Authorization.substring(7));
async function getReservation(reservationId) {
const params = {
TableName: process.env.dynamodb_table_name_reservations,
Key: {
reservation_id: reservationId
},
ProjectionExpression:
'reservation_id, reserved_seats, route, reservation_status, trip_id'
};
const data = await dynamoDB.get(params).promise();
return data.Item;
}

async function getTrip(tripId) {
const params = {
TableName: process.env.dynamodb_table_name_trips,
Key: {
trip_id: tripId
},
ProjectionExpression:
'driver_id, etd_info, route_points, vehicle_id'
};
const data = await dynamoDB.get(params).promise();
return data.Item;
}

const reservations = await getReservations(userId);
// Next release
async function getDriverScore(driverId) { // eslint-disable-line no-unused-vars
return 5;
}

async function getDriverInformation(driverId) {
const params = {
TableName: process.env.dynamodb_table_name_users,
Key: {
user_id: driverId
},
ProjectionExpression:
'first_name, phone'
};
const data = await dynamoDB.get(params).promise();
const response = {
driver_id: driverId,
driver_name: data.Item.first_name,
driver_phone: data.Item.phone,
driver_score: await getDriverScore(driverId)
};
return response;
}

async function getVehicleInformation(vehicleId) {
const params = {
TableName: process.env.dynamodb_table_name_vehicles,
Key: {
vehicle_id: vehicleId
},
ProjectionExpression:
'vehicle_attributes, vehicle_identifications'
};
const data = await dynamoDB.get(params).promise();
const response = {
vehicle_id: vehicleId,
vehicle_type: data.Item.vehicle_attributes.type,
vehicle_color: data.Item.vehicle_attributes.color,
vehicle_identification: data.Item.vehicle_identifications.identification
};
return response;
}

async function getFullPlaceInfoFromReservationRoute(routePlaces) {
const params = {
RequestItems: {
[PlacesTableName]: {
Keys: [{ place_id: routePlaces.start }, { place_id: routePlaces.end }],
ProjectionExpression:
'place_id, place_name',
ConsistentRead: false
}
},
ReturnConsumedCapacity: 'NONE'
};
const data = await dynamoDB.batchGet(params).promise();
return data.Responses[PlacesTableName];
}

async function formatResponse(reservation, trip) {
return {
reservation_id: reservation.reservation_id,
reservation_status: reservation.reservation_status,
trip_id: reservation.trip_id,
trip_role: 'passenger',
driver: await getDriverInformation(trip.driver_id),
vehicle: await getVehicleInformation(trip.vehicle_id),
etd_info: trip.etd_info,
route: trip.route,
trip_route: await getFullPlaceInfoFromReservationRoute(reservation.route)
};
}

async function singleReservationResponse(reservationId) {
const reservation = await getReservation(reservationId);
const trip = await getTrip(reservation.trip_id);
const result = await formatResponse(reservation, trip);
return result;
}

exports.handler = async (event) => {
const userId = event.requestContext.authorizer.user_id;
const reservations = await getReservationsForUser(userId);
let response = [];

for (let i = 0; i < reservations.length; i += 1) {
let singleReservationId = reservations[i].reservation_id;
let singleReservation = await singleReservationResponse(singleReservationId);
response.push(singleReservation);
}

return {
statusCode: 200,
headers: { 'Access-Control-Allow-Origin': '*' },
body: JSON.stringify(reservations)
body: JSON.stringify(response)
};
return response;
};

0 comments on commit 5057d50

Please sign in to comment.