using Azaion.Missions.Database; using Azaion.Missions.Database.Entities; using Azaion.Missions.DTOs; namespace Azaion.Missions.Services; public class WaypointService(AppDataConnection db) { public async Task CreateWaypoint(Guid missionId, CreateWaypointRequest request) { var missionExists = await db.Missions.AnyAsync(m => m.Id == missionId); if (!missionExists) throw new KeyNotFoundException($"Mission {missionId} not found"); var waypoint = new Waypoint { Id = Guid.NewGuid(), MissionId = missionId, Lat = request.GeoPoint?.Lat, Lon = request.GeoPoint?.Lon, Mgrs = request.GeoPoint?.Mgrs, WaypointSource = request.WaypointSource, WaypointObjective = request.WaypointObjective, OrderNum = request.OrderNum, Height = request.Height }; await db.InsertAsync(waypoint); return waypoint; } public async Task UpdateWaypoint(Guid missionId, Guid waypointId, UpdateWaypointRequest request) { var waypoint = await db.Waypoints.FirstOrDefaultAsync(w => w.MissionId == missionId && w.Id == waypointId) ?? throw new KeyNotFoundException($"Waypoint {waypointId} not found"); waypoint.Lat = request.GeoPoint?.Lat; waypoint.Lon = request.GeoPoint?.Lon; waypoint.Mgrs = request.GeoPoint?.Mgrs; waypoint.WaypointSource = request.WaypointSource; waypoint.WaypointObjective = request.WaypointObjective; waypoint.OrderNum = request.OrderNum; waypoint.Height = request.Height; await db.UpdateAsync(waypoint); return waypoint; } public async Task> GetWaypoints(Guid missionId) { return await db.Waypoints .Where(w => w.MissionId == missionId) .OrderBy(w => w.OrderNum) .ToListAsync(); } public async Task DeleteWaypoint(Guid missionId, Guid waypointId) { var waypoint = await db.Waypoints.FirstOrDefaultAsync(w => w.MissionId == missionId && w.Id == waypointId) ?? throw new KeyNotFoundException($"Waypoint {waypointId} not found"); var mediaIds = await db.Media.Where(m => m.WaypointId == waypointId).Select(m => m.Id).ToListAsync(); if (mediaIds.Count > 0) { var annotationIds = await db.Annotations.Where(a => mediaIds.Contains(a.MediaId)) .Select(a => a.Id).ToListAsync(); if (annotationIds.Count > 0) await db.Detections.DeleteAsync(d => annotationIds.Contains(d.AnnotationId)); await db.Annotations.DeleteAsync(a => mediaIds.Contains(a.MediaId)); } await db.Media.DeleteAsync(m => m.WaypointId == waypointId); await db.Waypoints.DeleteAsync(w => w.Id == waypointId); } }