feat StayExport - Added service SpainCodigoMunicipio

- This service gets the "municipio" code of INE using Catastro API services.
This commit is contained in:
2026-09-08 13:27:17 +02:00
parent 4b72e3b3d3
commit dc5293bdf7
3 changed files with 114 additions and 0 deletions
+2
View File
@@ -10,6 +10,7 @@ using Somnia.GuestLog.Models.DTOs;
using Somnia.GuestLog.Services;
using Somnia.GuestLog.Services.AddressQuery;
using Somnia.GuestLog.Services.Entity;
using Somnia.GuestLog.Services.SpainCodigoMunicipio;
using Somnia.GuestLog.Services.StayExport;
using Somnia.GuestLog.Utils;
using Somnia.GuestLog.Validators;
@@ -67,6 +68,7 @@ builder.Services.AddSingleton<IDataListService, StaticDataListService>();
builder.Services.AddScoped<IUserMessageService, UserMessageService>();
builder.Services.AddSingleton<ILocalizerService, LocalizerService>();
builder.Services.AddSingleton<IStayExportService, StayExportService>();
builder.Services.AddSingleton<ISpainCodigoMunicipioService, SpainCodigoMunicipioCatastroService>();
// Add Factories (and it's services)
builder.Services.AddFactoryDI<IAddressQueryFactory, ConfigFileAddressQueryFactory>();
@@ -0,0 +1,6 @@
namespace Somnia.GuestLog.Services.SpainCodigoMunicipio;
public interface ISpainCodigoMunicipioService
{
public Task<string?> GetCodigoMunicipioAsync(string municipio, string province);
}
@@ -0,0 +1,106 @@
using System.Xml.Serialization;
using Microsoft.AspNetCore.WebUtilities;
namespace Somnia.GuestLog.Services.SpainCodigoMunicipio;
public class SpainCodigoMunicipioCatastroService(
ILogger<SpainCodigoMunicipioCatastroService> logger,
IHttpClientFactory httpFactory
) : ISpainCodigoMunicipioService
{
private const string Api_Host = "https://ovc.catastro.meh.es";
private const string Api_Address = "OVCServWeb/OVCWcfCallejero/COVCCallejero.svc/rest/ObtenerMunicipios";
private const string Api_Param_Provincia = "Provincia";
private const string Api_Param_Municipio = "Municipio";
public async Task<string?> GetCodigoMunicipioAsync(string municipio, string province)
{
try
{
string uri = GetRequestUri(municipio, province);
logger.LogInformation("SpainCodigoMunicipioCatastroService - Getting municipios with query: '{addr}'", uri);
var httpClient = httpFactory.CreateClient();
using var rsStream = await httpClient.GetStreamAsync(uri);
XmlSerializer serializer = new(typeof(CatastroApiResult));
if (serializer.Deserialize(rsStream) is not CatastroApiResult rs)
{
logger.LogError("SpainCodigoMunicipioCatastroService - Result can't be deserialized!");
return null;
}
if (rs.municipios.Count == 0)
{
logger.LogWarning("SpainCodigoMunicipioCatastroService - No municipios found for query: '{addr}'", uri);
return null;
}
if (rs.municipios.Count > 1)
{
logger.LogWarning("SpainCodigoMunicipioCatastroService - More than 1 municipio was returned. First one will be used!");
}
CatastroApiResultCodigoIne? codIne = rs.municipios.First().codigoIne;
if (codIne == null || codIne.codigoMunicipio == null || codIne.codigoProvincia == null)
{
logger.LogWarning("SpainCodigoMunicipioCatastroService - Returned Municipio without data!");
return null;
}
return $"{codIne.codigoProvincia}{codIne.codigoMunicipio}";
}
catch (Exception ex)
{
logger.LogError(ex, "SpainCodigoMunicipioCatastroService - Error getting codigo municipio from catastro API!");
return null;
}
}
#region Internal Methods
private static string GetRequestUri(string municipio, string province)
{
string baseAddress = $"{Api_Host}/{Api_Address}";
return QueryHelpers.AddQueryString(baseAddress, [
new KeyValuePair<string, string?>(Api_Param_Provincia, province),
new KeyValuePair<string, string?>(Api_Param_Municipio, municipio),
]);
}
#endregion
#region API Model
[XmlRoot(ElementName = "consulta_municipiero", Namespace = "http://www.catastro.meh.es/")]
public class CatastroApiResult()
{
[XmlArray(ElementName = "municipiero")]
[XmlArrayItem(ElementName = "muni")]
public required List<CatastroApiResultMunicipio> municipios;
}
public class CatastroApiResultMunicipio()
{
[XmlElement(ElementName = "nm")]
public string? municipio;
[XmlElement(ElementName = "loine")]
public CatastroApiResultCodigoIne? codigoIne;
}
public class CatastroApiResultCodigoIne
{
[XmlElement(ElementName = "cp")]
public string? codigoProvincia;
[XmlElement(ElementName = "cm")]
public string? codigoMunicipio;
}
#endregion
}