Infrasctructure: Add StreetRepository

This commit is contained in:
Jonas Seiler 2025-04-03 11:03:00 +02:00
parent 226e5e4e3e
commit c3567fcd59

View File

@ -0,0 +1,86 @@
using Microsoft.EntityFrameworkCore;
using NetTopologySuite.Geometries;
public class StreetRepository
{
private readonly StreetDbContext Context;
public StreetRepository(StreetDbContext context)
{
Context = context;
}
public async Task<Street> GetByNameAsync(string name)
{
return await Context.Streets.FirstOrDefaultAsync(s => s.Name == name);
}
public async Task<bool> ExistsAsync(string name)
{
return await Context.Streets.AnyAsync(s => s.Name == name);
}
public async Task AddAsync(Street street)
{
await Context.Streets.AddAsync(street);
await Context.SaveChangesAsync();
}
public async Task<bool> RemoveAsync(string name)
{
var street = await GetByNameAsync(name);
if (street == null)
{
return false;
}
Context.Streets.Remove(street);
await Context.SaveChangesAsync();
return true;
}
public async Task UpdateGeometryInBackend(string name, Geometry point)
{
var street = await GetByNameAsync(name);
if (street == null)
{
throw new KeyNotFoundException($"Street '{name}' not found.");
}
street.AddPointToGeometry(point.Coordinate);
try
{
await Context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
throw new InvalidOperationException("Concurrency conflict: The street was modified by another transaction.");
}
}
public async Task UpdateGeometryWithPostGIS(string name, Geometry point)
{
var street = await GetByNameAsync(name);
if (street == null)
{
throw new KeyNotFoundException($"Street '{name}' not found.");
}
try
{
// PostgreSQL's UPDATE already checks for concurrency by default
await Context.Database.ExecuteSqlRawAsync(
"UPDATE \"Streets\" SET \"Geometry\" = ST_AddPoint(\"Geometry\", ST_SetSRID(ST_MakePoint({0}, {1}), 4326)) WHERE \"Name\" = {2}",
point.Coordinate.X, point.Coordinate.Y, name
);
}
catch (DbUpdateConcurrencyException)
{
throw new InvalidOperationException("Concurrency conflict: The street was modified by another transaction.");
}
}
}