corrected

This commit is contained in:
bogap
2024-10-15 13:36:13 +03:00
parent 02891fe301
commit 637939e9af
3 changed files with 164 additions and 146 deletions

View File

@@ -1,145 +1,142 @@
const { exec } = require('child_process');
exec('npm list axios', (err, stdout, stderr) => {
if (stderr.includes('empty')) {
console.log('Installing axios...');
exec('npm install axios', (error, stdout, stderr) => {
if (error) {
console.error('Error installing axios:', error);
} else {
console.log('Axios installed successfully');
startApp();
}
});
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 {
startApp();
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'});
}
});
function startApp() {
const express = require('express');
const axios = require('axios');
const FormData = require('form-data');
const plantsRouter = express.Router();
const cors = require('cors');
const CONFIG = require('./config');
plantsRouter.get ('/:id', async (req, res) => {
const plantId = req.params.id;
const plantData = await fetchPlantData (plantId);
plantsRouter.use(cors());
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,
};
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);
res.send (detailedPlantData);
} else {
res.status (404).send ({message: 'Plant not found'});
}
});
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;
}
module.exports = plantsRouter;