SHA256
feat StayExport - Added service SpainCodigoMunicipio
- This service gets the "municipio" code of INE using Catastro API services.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
+106
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user