watering
This commit is contained in:
@@ -101,4 +101,63 @@ router.post('/plans/:id/points', async (req,res,next)=>{
|
||||
} catch (e) { next(e); }
|
||||
});
|
||||
|
||||
// PUT /api/watering/points/:id - update a single point
|
||||
router.put('/points/:id', async (req, res, next) => {
|
||||
try {
|
||||
const pointId = req.params.id;
|
||||
// Verify ownership by joining plans
|
||||
const own = await pool.query(
|
||||
`SELECT wpp.id FROM watering_plan_points wpp
|
||||
JOIN watering_plans wp ON wpp.plan_id = wp.id
|
||||
WHERE wpp.id=$1 AND wp.user_id=$2`, [pointId, req.user.id]
|
||||
);
|
||||
if (own.rows.length === 0) throw new AppError('Point not found', 404);
|
||||
|
||||
const p = req.body || {};
|
||||
// Recompute coverage if geometry changed
|
||||
const coverage = computeCoverageSqft({
|
||||
sprinkler_head_type: p.sprinklerHeadType,
|
||||
sprinkler_throw_feet: p.throwFeet,
|
||||
sprinkler_degrees: p.degrees,
|
||||
sprinkler_length_feet: p.lengthFeet,
|
||||
sprinkler_width_feet: p.widthFeet
|
||||
});
|
||||
|
||||
const rs = await pool.query(
|
||||
`UPDATE watering_plan_points SET
|
||||
lat = COALESCE($1, lat),
|
||||
lng = COALESCE($2, lng),
|
||||
duration_minutes = COALESCE($3, duration_minutes),
|
||||
sprinkler_mount = COALESCE($4, sprinkler_mount),
|
||||
sprinkler_head_type = COALESCE($5, sprinkler_head_type),
|
||||
sprinkler_gpm = COALESCE($6, sprinkler_gpm),
|
||||
sprinkler_throw_feet = COALESCE($7, sprinkler_throw_feet),
|
||||
sprinkler_degrees = COALESCE($8, sprinkler_degrees),
|
||||
sprinkler_length_feet = COALESCE($9, sprinkler_length_feet),
|
||||
sprinkler_width_feet = COALESCE($10, sprinkler_width_feet),
|
||||
sprinkler_heading_degrees = COALESCE($11, sprinkler_heading_degrees),
|
||||
coverage_sqft = COALESCE($12, coverage_sqft)
|
||||
WHERE id=$13 RETURNING *`,
|
||||
[p.lat, p.lng, p.durationMinutes, p.mountType, p.sprinklerHeadType, p.gpm,
|
||||
p.throwFeet, p.degrees, p.lengthFeet, p.widthFeet, p.headingDegrees, coverage || null, pointId]
|
||||
);
|
||||
res.json({ success:true, data:{ point: rs.rows[0] }});
|
||||
} catch (e) { next(e); }
|
||||
});
|
||||
|
||||
// DELETE /api/watering/points/:id
|
||||
router.delete('/points/:id', async (req,res,next)=>{
|
||||
try {
|
||||
const pointId = req.params.id;
|
||||
const own = await pool.query(
|
||||
`SELECT wpp.id FROM watering_plan_points wpp
|
||||
JOIN watering_plans wp ON wpp.plan_id = wp.id
|
||||
WHERE wpp.id=$1 AND wp.user_id=$2`, [pointId, req.user.id]
|
||||
);
|
||||
if (own.rows.length === 0) throw new AppError('Point not found', 404);
|
||||
await pool.query('DELETE FROM watering_plan_points WHERE id=$1', [pointId]);
|
||||
res.json({ success:true });
|
||||
} catch (e) { next(e); }
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user