Application: Add StreetService

This commit is contained in:
Jonas Seiler 2025-04-03 11:05:50 +02:00
parent db51476d4d
commit 2a68fa8257

View File

@ -0,0 +1,81 @@
using System.Data;
using NetTopologySuite.Geometries;
public class StreetService
{
private readonly StreetRepository repository;
public StreetService(StreetRepository repository)
{
this.repository = repository;
}
public static Point ToGeometryPoint(CoordinateDTO coordinate)
{
return new Point(coordinate.X, coordinate.Y);
}
public static LineString ToGeometry(List<CoordinateDTO> coordinates)
{
if (coordinates == null || coordinates.Count() < 2)
{
throw new ArgumentException("Street must contain at least two points.");
}
var geometryFactory = new GeometryFactory();
return geometryFactory.CreateLineString(coordinates.Select(g => new Coordinate(g.X, g.Y)).ToArray());
}
public async Task<Street> CreateStreetAsync(Street street)
{
if (await repository.ExistsAsync(street.Name))
{
throw new InvalidOperationException($"Street '{street.Name}' already exists.");
}
await repository.AddAsync(street);
return street;
}
public async Task<bool> DeleteStreetAsync(string name)
{
if (!await repository.ExistsAsync(name))
{
throw new InvalidOperationException($"Street '{name}' does not exist.");
}
return await repository.RemoveAsync(name);
}
public async Task<GetStreetDTO> GetStreetAsync(string name)
{
var street = await repository.GetByNameAsync(name);
if (street == null)
{
throw new KeyNotFoundException($"Street '{name}' not found.");
}
return new GetStreetDTO { Name = street.Name, Capacity = street.Capacity, Geometry = street.Geometry.Coordinates.Select(c => new CoordinateDTO { X = (int)c.X, Y = (int)c.Y }).ToList() };
}
public async Task AddPointAsync(string name, Point point, bool usePostGIS)
{
try
{
if (usePostGIS)
{
await repository.UpdateGeometryWithPostGIS(name, point);
}
else
{
await repository.UpdateGeometryInBackend(name, point);
}
}
catch
{
throw;
}
}
}