forked from bro-students/multy-stub
143 lines
4.3 KiB
JavaScript
143 lines
4.3 KiB
JavaScript
const express = require ('express');
|
|
const axios = require ('axios');
|
|
const plantsRouter = express.Router ();
|
|
const CONFIG = require ('./config');
|
|
|
|
async function getAccessToken () {
|
|
const formData = new FormData ();
|
|
formData.append ('grant_type', 'client_credentials');
|
|
formData.append ('client_id', CONFIG.CLIENT_ID);
|
|
formData.append ('client_secret', CONFIG.CLIENT_SECRET);
|
|
|
|
try {
|
|
const response = await axios.post (
|
|
'https://open.plantbook.io/api/v1/token/',
|
|
formData,
|
|
{
|
|
headers: {'Content-Type': 'multipart/form-data'},
|
|
}
|
|
);
|
|
if (response.data && response.data.access_token) {
|
|
console.log ('Access token retrieved:', response.data.access_token);
|
|
return response.data.access_token;
|
|
} else {
|
|
console.error ('Error: access_token not found in response');
|
|
return null;
|
|
}
|
|
} catch (error) {
|
|
console.error (
|
|
'Error fetching access token:',
|
|
error.response ? error.response.data : error.message
|
|
);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async function fetchPlantData (plantId) {
|
|
const accessToken = await getAccessToken ();
|
|
if (!accessToken) {
|
|
return null;
|
|
}
|
|
try {
|
|
const response = await axios.get (
|
|
`https://open.plantbook.io/api/v1/plant/detail/${encodeURIComponent (plantId)}/`,
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
},
|
|
}
|
|
);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error (
|
|
'Error fetching plant data:',
|
|
error.response ? error.response.data : error.message
|
|
);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
plantsRouter.get ('/list', async (req, res) => {
|
|
const accessToken = await getAccessToken ();
|
|
if (!accessToken) {
|
|
res.status (500).send ({message: 'Error obtaining access token'});
|
|
return;
|
|
}
|
|
try {
|
|
const alias = req.query.alias || 'monstera';
|
|
const response = await axios.get (
|
|
'https://open.plantbook.io/api/v1/plant/search',
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
},
|
|
params: {
|
|
alias: alias,
|
|
},
|
|
}
|
|
);
|
|
|
|
const plantsList = response.data.results;
|
|
|
|
const plants = await Promise.all (
|
|
plantsList.map (async plant => {
|
|
const plantDetails = await fetchPlantData (plant.pid);
|
|
return {
|
|
id: plant.pid,
|
|
alias: plant.alias,
|
|
display_name: plant.display_name,
|
|
image_url: plantDetails ? plantDetails.image_url : null,
|
|
max_light: plantDetails ? plantDetails.max_light : null,
|
|
min_light: plantDetails ? plantDetails.min_light : null,
|
|
max_temp: plantDetails ? plantDetails.max_temp : null,
|
|
min_temp: plantDetails ? plantDetails.min_temp : null,
|
|
max_env_humid: plantDetails ? plantDetails.max_env_humid : null,
|
|
min_env_humid: plantDetails ? plantDetails.min_env_humid : null,
|
|
max_soil_moist: plantDetails ? plantDetails.max_soil_moist : null,
|
|
min_soil_moist: plantDetails ? plantDetails.min_soil_moist : null,
|
|
max_soil_ec: plantDetails ? plantDetails.max_soil_ec : null,
|
|
min_soil_ec: plantDetails ? plantDetails.min_soil_ec : null,
|
|
};
|
|
})
|
|
);
|
|
|
|
res.send ({results: plants});
|
|
} catch (error) {
|
|
console.error (
|
|
'Error fetching plant list:',
|
|
error.response ? error.response.data : error.message
|
|
);
|
|
res.status (500).send ({message: 'Error fetching plant list'});
|
|
}
|
|
});
|
|
|
|
plantsRouter.get ('/:id', async (req, res) => {
|
|
const plantId = req.params.id;
|
|
const plantData = await fetchPlantData (plantId);
|
|
|
|
if (plantData) {
|
|
const detailedPlantData = {
|
|
id: plantData.pid,
|
|
display_name: plantData.display_name,
|
|
alias: plantData.alias,
|
|
max_light: plantData.max_light,
|
|
min_light: plantData.min_light,
|
|
max_temperature: plantData.max_temp,
|
|
min_temperature: plantData.min_temp,
|
|
max_humidity: plantData.max_env_humid,
|
|
min_humidity: plantData.min_env_humid,
|
|
max_soil_moisture: plantData.max_soil_moist,
|
|
min_soil_moisture: plantData.min_soil_moist,
|
|
max_soil_ec: plantData.max_soil_ec,
|
|
min_soil_ec: plantData.min_soil_ec,
|
|
image_url: plantData.image_url,
|
|
};
|
|
|
|
res.send (detailedPlantData);
|
|
} else {
|
|
res.status (404).send ({message: 'Plant not found'});
|
|
}
|
|
});
|
|
|
|
module.exports = plantsRouter;
|