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