From bde1666b42ee6d2ea7e4bd35df83e5b36ad13694 Mon Sep 17 00:00:00 2001 From: Thomas Fransolet Date: Fri, 6 Mar 2026 15:22:02 +0100 Subject: [PATCH] Update save geometry + other, id null etc (thx claude) --- .../Controllers/SectionAgendaController.cs | 4 +- .../Controllers/SectionMapController.cs | 6 +-- ManagerService/DTOs/EventAgendaDTO.cs | 4 +- ManagerService/DTOs/GuidedPathDTO.cs | 2 +- ManagerService/DTOs/GuidedStepDTO.cs | 2 +- .../DTOs/OrderedTranslationAndResourceDTO.cs | 2 +- ManagerService/DTOs/SubSection/MapDTO.cs | 4 +- ManagerService/DTOs/SubSection/QuizzDTO.cs | 2 +- ManagerService/DTOs/SubSection/SliderDTO.cs | 2 +- ManagerService/Data/SubSection/Categorie.cs | 2 +- ManagerService/Data/SubSection/Content.cs | 2 +- ManagerService/Data/SubSection/EventAgenda.cs | 43 ++++++++++++++----- ManagerService/Data/SubSection/GuidedPath.cs | 2 +- ManagerService/Data/SubSection/GuidedStep.cs | 2 +- .../OrderedTranslationAndResource.cs | 2 +- ManagerService/Helpers/GeometryMapper.cs | 29 +++++++++---- ManagerService/Services/SectionFactory.cs | 2 +- ManagerService/Startup.cs | 2 +- 18 files changed, 75 insertions(+), 39 deletions(-) diff --git a/ManagerService/Controllers/SectionAgendaController.cs b/ManagerService/Controllers/SectionAgendaController.cs index 14f6822..4ceb010 100644 --- a/ManagerService/Controllers/SectionAgendaController.cs +++ b/ManagerService/Controllers/SectionAgendaController.cs @@ -163,9 +163,9 @@ namespace ManagerService.Controllers State = eventAgendaDTO.address.state, PostCode = eventAgendaDTO.address.postCode, Country = eventAgendaDTO.address.country, - Geometry = eventAgendaDTO.address.geometry?.FromDto(), + Geometry = eventAgendaDTO.address.geometry, PolyColor = eventAgendaDTO.address.polyColor, - Zoom = eventAgendaDTO.address.zoom + Zoom = eventAgendaDTO.address.zoom.GetValueOrDefault() }; } diff --git a/ManagerService/Controllers/SectionMapController.cs b/ManagerService/Controllers/SectionMapController.cs index 38d832d..c2e927a 100644 --- a/ManagerService/Controllers/SectionMapController.cs +++ b/ManagerService/Controllers/SectionMapController.cs @@ -451,7 +451,7 @@ namespace ManagerService.Controllers existingGuidedPath.IsLinear = guidedPathDTO.isLinear; existingGuidedPath.RequireSuccessToAdvance = guidedPathDTO.requireSuccessToAdvance; existingGuidedPath.HideNextStepsUntilComplete = guidedPathDTO.hideNextStepsUntilComplete; - existingGuidedPath.Order = guidedPathDTO.order; + existingGuidedPath.Order = guidedPathDTO.order.GetValueOrDefault(); // Sync steps var dtoStepIds = (guidedPathDTO.steps ?? new List()) @@ -643,7 +643,7 @@ namespace ManagerService.Controllers throw new KeyNotFoundException("GuidedStep does not exist"); existingGuidedStep.GuidedPathId = guidedStepDTO.guidedPathId; - existingGuidedStep.Order = guidedStepDTO.order; + existingGuidedStep.Order = guidedStepDTO.order.GetValueOrDefault(); existingGuidedStep.Title = guidedStepDTO.title; existingGuidedStep.Description = guidedStepDTO.description; if (guidedStepDTO.geometry != null) @@ -666,7 +666,7 @@ namespace ManagerService.Controllers _myInfoMateDbContext.SaveChanges(); - return new OkObjectResult(existingGuidedStep); + return new OkObjectResult(existingGuidedStep.ToDTO()); } catch (ArgumentNullException ex) { diff --git a/ManagerService/DTOs/EventAgendaDTO.cs b/ManagerService/DTOs/EventAgendaDTO.cs index bb574d2..70af08e 100644 --- a/ManagerService/DTOs/EventAgendaDTO.cs +++ b/ManagerService/DTOs/EventAgendaDTO.cs @@ -6,7 +6,7 @@ namespace ManagerService.DTOs { public class EventAgendaDTO { - public int id { get; set; } + public int? id { get; set; } public List label { get; set; } @@ -58,6 +58,6 @@ namespace ManagerService.DTOs public string polyColor { get; set; } // color of the polyline or polygon - public int zoom { get; set; } + public int? zoom { get; set; } } } diff --git a/ManagerService/DTOs/GuidedPathDTO.cs b/ManagerService/DTOs/GuidedPathDTO.cs index 3764443..b11b612 100644 --- a/ManagerService/DTOs/GuidedPathDTO.cs +++ b/ManagerService/DTOs/GuidedPathDTO.cs @@ -14,7 +14,7 @@ namespace ManagerService.DTOs public bool isLinear { get; set; } public bool requireSuccessToAdvance { get; set; } public bool hideNextStepsUntilComplete { get; set; } - public int order { get; set; } + public int? order { get; set; } public List steps { get; set; } } } diff --git a/ManagerService/DTOs/GuidedStepDTO.cs b/ManagerService/DTOs/GuidedStepDTO.cs index e425d07..9a08e91 100644 --- a/ManagerService/DTOs/GuidedStepDTO.cs +++ b/ManagerService/DTOs/GuidedStepDTO.cs @@ -8,7 +8,7 @@ namespace ManagerService.DTOs { public string id { get; set; } public string guidedPathId { get; set; } - public int order { get; set; } + public int? order { get; set; } public List title { get; set; } public List description { get; set; } public GeometryDTO geometry { get; set; } diff --git a/ManagerService/DTOs/OrderedTranslationAndResourceDTO.cs b/ManagerService/DTOs/OrderedTranslationAndResourceDTO.cs index 9f7dd23..441579e 100644 --- a/ManagerService/DTOs/OrderedTranslationAndResourceDTO.cs +++ b/ManagerService/DTOs/OrderedTranslationAndResourceDTO.cs @@ -6,6 +6,6 @@ namespace ManagerService.DTOs public class OrderedTranslationAndResourceDTO { public List translationAndResourceDTOs { get; set; } - public int order { get; set; } + public int? order { get; set; } } } diff --git a/ManagerService/DTOs/SubSection/MapDTO.cs b/ManagerService/DTOs/SubSection/MapDTO.cs index 726fa2e..9484810 100644 --- a/ManagerService/DTOs/SubSection/MapDTO.cs +++ b/ManagerService/DTOs/SubSection/MapDTO.cs @@ -5,7 +5,7 @@ namespace Manager.DTOs { public class MapDTO : SectionDTO { - public int zoom { get; set; } // Default = 18 + public int? zoom { get; set; } // Default = 18 public MapTypeApp? mapType { get; set; } // Default = Hybrid for Google public MapTypeMapBox? mapTypeMapbox { get; set; } // Default = standard for MapBox public MapProvider? mapProvider { get; set; } // Default = Google @@ -41,7 +41,7 @@ namespace Manager.DTOs public class CategorieDTO { - public int id { get; set; } + public int? id { get; set; } public List label { get; set; } public string icon { get; set; } // icon material public ResourceDTO resourceDTO { get; set; } // Icon diff --git a/ManagerService/DTOs/SubSection/QuizzDTO.cs b/ManagerService/DTOs/SubSection/QuizzDTO.cs index 5d29692..e454505 100644 --- a/ManagerService/DTOs/SubSection/QuizzDTO.cs +++ b/ManagerService/DTOs/SubSection/QuizzDTO.cs @@ -28,7 +28,7 @@ namespace Manager.DTOs { public List label { get; set; } public bool isGood { get; set; } - public int order { get; set; } // Order to show + public int? order { get; set; } // Order to show } /*public class LevelDTO diff --git a/ManagerService/DTOs/SubSection/SliderDTO.cs b/ManagerService/DTOs/SubSection/SliderDTO.cs index 609d02c..e7aca2d 100644 --- a/ManagerService/DTOs/SubSection/SliderDTO.cs +++ b/ManagerService/DTOs/SubSection/SliderDTO.cs @@ -13,7 +13,7 @@ namespace Manager.DTOs { public List title { get; set; } public List description { get; set; } - public int order { get; set; } // Order to show + public int? order { get; set; } // Order to show public string resourceId { get; set; } public ResourceDTO resource { get; set; } } diff --git a/ManagerService/Data/SubSection/Categorie.cs b/ManagerService/Data/SubSection/Categorie.cs index 0ef3134..c0115c4 100644 --- a/ManagerService/Data/SubSection/Categorie.cs +++ b/ManagerService/Data/SubSection/Categorie.cs @@ -46,7 +46,7 @@ namespace ManagerService.Data.SubSection { return new Categorie() { - Id = categorieDTO.id, + Id = categorieDTO.id.GetValueOrDefault(), // TODO /*Label = categorieDTO.label, */ diff --git a/ManagerService/Data/SubSection/Content.cs b/ManagerService/Data/SubSection/Content.cs index dc2b41b..a1b62a1 100644 --- a/ManagerService/Data/SubSection/Content.cs +++ b/ManagerService/Data/SubSection/Content.cs @@ -48,7 +48,7 @@ namespace ManagerService.Data.SubSection { Title = contentDTO.title, Description = contentDTO.description, - Order = contentDTO.order, + Order = contentDTO.order.GetValueOrDefault(), ResourceId = contentDTO.resourceId }; } diff --git a/ManagerService/Data/SubSection/EventAgenda.cs b/ManagerService/Data/SubSection/EventAgenda.cs index 79c94b9..312ad43 100644 --- a/ManagerService/Data/SubSection/EventAgenda.cs +++ b/ManagerService/Data/SubSection/EventAgenda.cs @@ -1,7 +1,5 @@ using Manager.DTOs; using ManagerService.DTOs; -using ManagerService.Helpers; -using NetTopologySuite.Geometries; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -80,11 +78,7 @@ namespace ManagerService.Data.SubSection state = Address.State, postCode = Address.PostCode, country = Address.Country, - geometry = Address.Geometry != null ? new GeometryDTO - { - type = Address.Geometry.GeometryType, - coordinates = Address.Geometry.Coordinates, - } : null, + geometry = Address.Geometry, polyColor = Address.PolyColor, zoom = Address.Zoom } : null, @@ -114,9 +108,9 @@ namespace ManagerService.Data.SubSection State = dto.address.state, PostCode = dto.address.postCode, Country = dto.address.country, - Geometry = dto.address.geometry != null ? dto.address.geometry.FromDto() : null, + Geometry = dto.address.geometry, PolyColor = dto.address.polyColor, - Zoom = dto.address.zoom + Zoom = dto.address.zoom.GetValueOrDefault() } : null; Phone = dto.phone; Email = dto.email; @@ -124,6 +118,35 @@ namespace ManagerService.Data.SubSection return this; } + public void UpdateFromDTO(EventAgendaDTO dto) + { + Label = dto.label; + Description = dto.description; + Type = dto.type; + DateAdded = dto.dateAdded; + DateFrom = dto.dateFrom; + DateTo = dto.dateTo; + Website = dto.website; + ResourceId = dto.resourceId; + Address = dto.address != null ? new EventAddress + { + Address = dto.address.address, + StreetNumber = dto.address.streetNumber, + StreetName = dto.address.streetName, + City = dto.address.city, + State = dto.address.state, + PostCode = dto.address.postCode, + Country = dto.address.country, + Geometry = dto.address.geometry, + PolyColor = dto.address.polyColor, + Zoom = dto.address.zoom.GetValueOrDefault() + } : null; + Phone = dto.phone; + Email = dto.email; + SectionAgendaId = dto.sectionAgendaId; + SectionEventId = dto.sectionEventId; + } + } public class EventAddress { @@ -141,7 +164,7 @@ namespace ManagerService.Data.SubSection public string Country { get; set; } - public Geometry Geometry { get; set; } + public GeometryDTO Geometry { get; set; } public string PolyColor { get; set; } // color of the polyline or polygon diff --git a/ManagerService/Data/SubSection/GuidedPath.cs b/ManagerService/Data/SubSection/GuidedPath.cs index 6e0cf2b..9b5bffc 100644 --- a/ManagerService/Data/SubSection/GuidedPath.cs +++ b/ManagerService/Data/SubSection/GuidedPath.cs @@ -75,7 +75,7 @@ namespace ManagerService.Data.SubSection IsLinear = dto.isLinear; RequireSuccessToAdvance = dto.requireSuccessToAdvance; HideNextStepsUntilComplete = dto.hideNextStepsUntilComplete; - Order = dto.order; + Order = dto.order.GetValueOrDefault(); //Steps = dto.Steps?.Select(s => s.FromDTO()).ToList() ?? new List() // Other method return this; } diff --git a/ManagerService/Data/SubSection/GuidedStep.cs b/ManagerService/Data/SubSection/GuidedStep.cs index 6053e77..83cc4ca 100644 --- a/ManagerService/Data/SubSection/GuidedStep.cs +++ b/ManagerService/Data/SubSection/GuidedStep.cs @@ -95,7 +95,7 @@ namespace ManagerService.Data.SubSection IsStepLocked = dto.isStepLocked; TimerSeconds = dto.timerSeconds; TimerExpiredMessage = dto.timerExpiredMessage ?? new List(); - Order = dto.order; + Order = dto.order.GetValueOrDefault(); QuizQuestions = dto.quizQuestions; return this; } diff --git a/ManagerService/Data/SubSection/OrderedTranslationAndResource.cs b/ManagerService/Data/SubSection/OrderedTranslationAndResource.cs index 920f1ee..0096df9 100644 --- a/ManagerService/Data/SubSection/OrderedTranslationAndResource.cs +++ b/ManagerService/Data/SubSection/OrderedTranslationAndResource.cs @@ -37,7 +37,7 @@ namespace ManagerService.Data.SubSection return new OrderedTranslationAndResource() { TranslationAndResources = orderedTranslationAndResourceDTO.translationAndResourceDTOs.Select(tar => new TranslationAndResource().FromDTO(tar)).ToList(), - Order = orderedTranslationAndResourceDTO.order + Order = orderedTranslationAndResourceDTO.order.GetValueOrDefault() }; } } diff --git a/ManagerService/Helpers/GeometryMapper.cs b/ManagerService/Helpers/GeometryMapper.cs index dbb32de..302d255 100644 --- a/ManagerService/Helpers/GeometryMapper.cs +++ b/ManagerService/Helpers/GeometryMapper.cs @@ -1,10 +1,11 @@ using Manager.DTOs; using NetTopologySuite; using NetTopologySuite.Geometries; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; -using System; namespace ManagerService.Helpers { @@ -54,24 +55,36 @@ namespace ManagerService.Helpers }; } + private static T DeserializeCoordinates(object coordinates) + { + if (coordinates is JsonElement jsonElement) + return jsonElement.Deserialize(); + + // Newtonsoft JToken (JArray etc.) — convert via JSON string + var json = JsonConvert.SerializeObject(coordinates); + return System.Text.Json.JsonSerializer.Deserialize(json); + } + private static Point CreatePoint(GeometryDTO dto, GeometryFactory factory) { - var coords = ((JsonElement)dto.coordinates).Deserialize>(); - var point = factory.CreatePoint(new Coordinate(coords[0], coords[1])); - return point; + var coords = DeserializeCoordinates>(dto.coordinates); + return factory.CreatePoint(new CoordinateZ(coords[0], coords[1], 0.0)); } private static LineString CreateLineString(GeometryDTO dto, GeometryFactory factory) { - var coords = ((JsonElement)dto.coordinates).Deserialize>>(); - var coordinates = coords.Select(c => new Coordinate(c[0], c[1])).ToArray(); + var coords = DeserializeCoordinates>>(dto.coordinates); + var coordinates = coords.Select(c => new CoordinateZ(c[0], c[1], 0.0)).ToArray(); return factory.CreateLineString(coordinates); } private static Polygon CreatePolygon(GeometryDTO dto, GeometryFactory factory) { - var rings = ((JsonElement)dto.coordinates).Deserialize>>>(); - var exterior = rings.First().Select(c => new Coordinate(c[0], c[1])).ToArray(); + var rings = DeserializeCoordinates>>>(dto.coordinates); + var exterior = rings.First().Select(c => new CoordinateZ(c[0], c[1], 0.0)).ToArray(); + // NTS requires closed rings + if (exterior.Length > 0 && !exterior.First().Equals2D(exterior.Last())) + exterior = exterior.Append(exterior.First()).ToArray(); return factory.CreatePolygon(exterior); } } diff --git a/ManagerService/Services/SectionFactory.cs b/ManagerService/Services/SectionFactory.cs index 4366792..f5ef648 100644 --- a/ManagerService/Services/SectionFactory.cs +++ b/ManagerService/Services/SectionFactory.cs @@ -163,7 +163,7 @@ namespace ManagerService.Services Longitude = dto.longitude, MeterZoneGPS = dto.meterZoneGPS, Type = dto.type, - MapZoom = mapDTO.zoom, + MapZoom = mapDTO.zoom ?? 18, MapMapType = mapDTO.mapType, MapTypeMapbox = mapDTO.mapTypeMapbox, MapMapProvider = mapDTO.mapProvider, diff --git a/ManagerService/Startup.cs b/ManagerService/Startup.cs index f66f9b1..f1b41a2 100644 --- a/ManagerService/Startup.cs +++ b/ManagerService/Startup.cs @@ -191,7 +191,7 @@ namespace ManagerService app.UseCors( #if DEBUG options => options - .SetIsOriginAllowed(origin => string.IsNullOrEmpty(origin) || origin == "http://localhost:62080") + .SetIsOriginAllowed(origin => string.IsNullOrEmpty(origin) || origin == "http://localhost:64402") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials()