Skip to content

Commit

Permalink
Merge pull request #39 from dheffer/update-odometer&add-vehicle
Browse files Browse the repository at this point in the history
Got update odometer and add vehicle working.
  • Loading branch information
ntuff authored Apr 10, 2024
2 parents 6332923 + 2224d45 commit 7ef00ba
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 58 deletions.
75 changes: 43 additions & 32 deletions backend/src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -286,12 +286,12 @@ app.delete('/api/delete-maintenance-history', async (req, res) => {
*/
app.get('/api/get-user-vehicles', async (req, res) => {
const garage = DATABASE.collection("user_garage");
const brandon = "[email protected]"


const vehicles = await garage.aggregate([
{
$match: {
email: brandon
email: EMAIL
}
},
{
Expand Down Expand Up @@ -333,17 +333,6 @@ app.delete('/api/delete-user-vehicle', async (req, res) => {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

app.get('/api/get-maintenance', async (req , res) => {
const message = DATABASE.collection("maintenance");

// const docObject = await message.findOne({ config_id: { $eq: 401988727} });

const docObject = await message.findOne({});
await console.log(docObject.schedules[0].tasks);
res.send(docObject.message);
})


app.get('/api/get-config-id', async (req, res) => {
const year = req.query.year;
const make = req.query.make;
Expand Down Expand Up @@ -507,18 +496,38 @@ app.post('/api/update-odometer', async (req, res) => {
const userEmail = process.env.EMAIL;
const odometer = req.body.odometer;
const config_id = req.body.config_id;
const picture_url = req.body.picture_url;

console.log("UPDATE BODY: "+JSON.stringify(req.body));
console.log("UPDATE ODOMETER: "+odometer);
console.log("UPDATE config_id: "+config_id);
console.log("UPDATE EMAIL: "+userEmail)
console.log("UPDATE PICTURE URL: "+picture_url)

const database = client.db("vehicleDB");
const userVehicle = database.collection("user_vehicle_info");

try{
try{
const updateFields = { email: userEmail, config_id: config_id};
const updateData = {};
console.log("IN TRY BLOCK")

if(odometer !== undefined) {
console.log("ODOMETER DEFINED")
updateData.odometer = parseInt(odometer);
console.log("ODOMETER UPDATED")
}
if(picture_url !== undefined) {
console.log("PICTURE DEFINED")
updateData.picture_url = picture_url;
console.log("PICTURE UPDATED")
}

await userVehicle.updateOne(
{ email: userEmail, vehicle_config_ids: config_id },
{ $set: { odometer: odometer }}
updateFields,
{ $set: updateData }
);
console.log("ODOMETER/PICTURE UPDATED")
return res.status(200).json({message: "Odometer updated"});
}
catch(err) {
Expand All @@ -528,11 +537,10 @@ app.post('/api/update-odometer', async (req, res) => {

app.get('/api/get-user-vehicle-odometers', async (req, res) => {
console.log("HIT GET USER VEHICLE ODOMETERS")
const userEmail = process.env.EMAIL;
const database = client.db("vehicleDB");
const garage = database.collection("user_garage");
const userVehicle = database.collection("user_vehicle_info");
const userGarage = await garage.findOne({email: userEmail});
const userGarage = await garage.findOne({email: EMAIL});
if(!userGarage){
return res.status(404).json({message: "User not found"});
}
Expand All @@ -541,35 +549,38 @@ app.get('/api/get-user-vehicle-odometers', async (req, res) => {
if(!vehicleConfigIds){
return res.status(404).json({message: "User has no vehicles"});
}
console.log("VEHICLE CONFIG IDS in get ODOMETERS: "+vehicleConfigIds)

const odometerReadings = await userVehicle.find(
{email: userEmail, vehicle_config_ids: {$in: vehicleConfigIds} },
{_id: 0, vehicle_config_ids: 1, odometer: 1}
{email: EMAIL, config_id: {$in: vehicleConfigIds} },
{_id: 0, undefined: 1, odometer: 1}
).toArray();

console.log("ODOMETER READINGS: "+JSON.stringify(odometerReadings))
const pictureReadings = await userVehicle.find(
{email: EMAIL, config_id: {$in: vehicleConfigIds} },
{_id: 0, undefined: 1, picture_url: 1}
).toArray();

const odometerMap = {};
odometerReadings.forEach(reading => {
odometerMap[reading.vehicle_config_ids] = reading.odometer;
odometerMap[reading.config_id] = reading.odometer;
});

console.log("ODOMETER MAP: "+JSON.stringify(odometerMap))
const pictureMap = {};
pictureReadings.forEach(reading => {
pictureMap[reading.config_id] = reading.picture_url;
});

const response = vehicleConfigIds.map(configId => ({
vehicle_config_ids: configId,
odometer: odometerMap[configId]}));
config_id: configId,
odometer: odometerMap[configId],
picture_url: pictureMap[configId]
}));

console.log("RESPONSE: "+JSON.stringify(response))

response.forEach((item, index) => {
console.log(`${index + 1}. vehicle_config_ids: ${item.vehicle_config_ids}, odometer: ${item.odometer}`);
})

res.status(200).json(response);
});


//TODO: Request to get a list of all engines given a year, make, and model (Non-repeating).

//TODO: Request to get a list of all transmissions given a year, make, model, and engine (Non-repeating).
Expand All @@ -582,6 +593,6 @@ app.get('/api/get-user-vehicle-odometers', async (req, res) => {


app.listen(port, () => {
console.log(`Predictive Vehicle Maintenance app listening on port ${port}`)
console.log(`Driveline app listening on port ${port}`)
//console.log(mongo);
});
111 changes: 85 additions & 26 deletions frontend/src/pages/garage/Vehicle.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import {useEffect, useState} from "react";
function Vehicle(props) {
const [odometerValue, setOdometerValue] = useState(0);
const [odometerReading, setOdometerReading] = useState([]);
const [pictureUrl, setPictureUrl] = useState("");
const email = process.env.EMAIL;

useEffect(() => {
fetchReadings();
Expand All @@ -16,6 +18,7 @@ function Vehicle(props) {
const response = await fetch("/api/get-user-vehicle-odometers");
if(response.ok){
const data = await response.json();
console.log("READINGS "+ JSON.stringify(data));
setOdometerReading(data);
}
else{
Expand All @@ -27,45 +30,90 @@ function Vehicle(props) {
}
}


const v = props.vehicle;

const handleUpdateOdometer = () => {
console.log("Updating odometer");
try{
const response = fetch("/api/update-odometer", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
vehicle_config_ids : v.configurations.config_id,
email: "[email protected]",
odometer: odometerValue
})
});
if(response.ok){
console.log("Odometer updated");
console.log(v.configurations.config_id+ "= config");
console.log(odometerValue+ "= odometer");

const reqOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
config_id : v.configurations.config_id,
email: email,
odometer: odometerValue,
}),
redirect: 'follow'
};
console.log("reqOptions " + reqOptions);

fetch('/api/update-odometer', reqOptions)
.then(res => {
if (!res.ok) {
throw new Error('Network response was not ok');
}
return res.json();
})
.then(data => {
console.log("Odometer Updated! "+data);
fetchReadings();
}
else{
console.log("Odometer update failed");
}
}
catch (e) {
console.error('There has been a problem with your fetch operation:', e);
setOdometerValue(0);
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});
}
}

const getOdometer = (config) => {
const reading = odometerReading.find(vehicle => vehicle.vehicle_config_ids === config);
const reading = odometerReading.find(vehicle => vehicle.config_id === config);
return reading ? reading.odometer : -9999;
}

const getPicture = (config) => {
const reading = odometerReading.find(vehicle => vehicle.config_id === config);
return reading ? reading.picture_url : "https://cdn.dealerk.it/cars/placeholder/placeholder-800.png";
}


const handleUpdatePicture = () => {
const reqOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
config_id : v.configurations.config_id,
email: email,
picture_url: pictureUrl
}),
redirect: 'follow'
};
fetch('/api/update-odometer', reqOptions)
.then(res => {
if (!res.ok) {
throw new Error('Network response was not ok');
}
return res.json();
})
.then(data => {
console.log("Picture Updated! "+data);
pictureUrl = data.picture_url;
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});
}


return (
<div>
<Card style={{width: '22rem'}} id={v.configurations.year+v.configurations.make+v.configurations.model}>
<Card.Img variant="top"
src="https://cdn.dealerk.it/cars/placeholder/placeholder-800.png"/>
src={getPicture(v.configurations.config_id) || "https://cdn.dealerk.it/cars/placeholder/placeholder-800.png"}/>
<Card.Body>
<Card.Title className={'d-flex justify-content-center'}>{v.configurations.year} {v.configurations.make} {v.configurations.model}</Card.Title>
<Card.Text className="d-flex justify-content-around">
Expand All @@ -87,7 +135,18 @@ function Vehicle(props) {
onChange={e => setOdometerValue(e.target.value)}
/>
</Form.Group>
<Button variant="primary" onClick={handleUpdateOdometer}>Update Odometer</Button>
<Button variant="primary" size="sm" onClick={handleUpdateOdometer}>Update Odometer</Button>
</Card.Footer>
<Card.Footer className="d-flex justify-content-around">
<Form.Group>
<Form.Control
type="text"
placeholder="Enter a Picture URL"
value={pictureUrl}
onChange={e => setPictureUrl(e.target.value)}
/>
</Form.Group>
<Button variant="primary" size="sm" onClick={handleUpdatePicture}>Update Picture</Button>
</Card.Footer>
</Card.Body>
</Card>
Expand Down

0 comments on commit 7ef00ba

Please sign in to comment.