diff --git a/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs b/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs index c89ec99..d2514f3 100644 --- a/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs +++ b/mqttApi/src/Mqtt.App.Application/Interfaces/IPersistenciaService.cs @@ -22,6 +22,9 @@ namespace Mqtt.App.Application.Interfaces public Task AddMqtt(MqttEntity e); + public Task AddMqtt(List e); + public Task UpdateOrInsertqtt(List lista); + public Task> getPendiente(string keytopic); } diff --git a/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs b/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs index eb36d70..1b85855 100644 --- a/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs +++ b/mqttApi/src/Mqtt.App.Application/configuration/MapperProfile.cs @@ -20,6 +20,8 @@ namespace Mqtt.App.Application.configuration public MapperProfile() { CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); CreateMap().ReverseMap(); diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/IMqttAppService.cs b/mqttApi/src/Mqtt.App.Application/mqtt/IMqttAppService.cs index 85e82dd..b5abb5c 100644 --- a/mqttApi/src/Mqtt.App.Application/mqtt/IMqttAppService.cs +++ b/mqttApi/src/Mqtt.App.Application/mqtt/IMqttAppService.cs @@ -1,4 +1,5 @@ -using System; +using Mqtt.App.Application.mqtt.commands; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,5 +10,7 @@ namespace Mqtt.App.Application.mqtt public interface IMqttAppService { Task Publica(mqttPublish data); + Task> get(GetMqttModel data); + } } diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/MqttAppService.cs b/mqttApi/src/Mqtt.App.Application/mqtt/MqttAppService.cs index d0bb8b7..ea473e3 100644 --- a/mqttApi/src/Mqtt.App.Application/mqtt/MqttAppService.cs +++ b/mqttApi/src/Mqtt.App.Application/mqtt/MqttAppService.cs @@ -1,7 +1,12 @@ -using Mqtt.App.Application.Interfaces.External; +using AutoMapper; +using Mqtt.App.Application.Interfaces; +using Mqtt.App.Application.Interfaces.External; +using Mqtt.App.Application.mqtt.commands; +using Mqtt.App.Domain.Entities.User; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -10,9 +15,14 @@ namespace Mqtt.App.Application.mqtt public class MqttAppService: IMqttAppService { private readonly IMqttService _mqttService; - - public MqttAppService(IMqttService mqttService) + private readonly IPersistenciaService _persistenciaService; + private IMapper _mapper; + public MqttAppService(IMqttService mqttService, + IPersistenciaService persistenciaService, + IMapper mapper) { + _persistenciaService = persistenciaService; + _mapper = mapper; _mqttService=mqttService; } @@ -20,6 +30,18 @@ namespace Mqtt.App.Application.mqtt { return CompruebaKey(data) && await _mqttService.publishAsync(data.topic, data.payload); } + public async Task> get(GetMqttModel data) + { + var res = new List (); + if(data==null || String.IsNullOrWhiteSpace(data.topic) || !CompruebaKey(data)) + return res; + var resBD = await _persistenciaService.getPendiente(data.topic); + res = _mapper.Map>(resBD); + return res; + } + + + internal bool CompruebaKey(MqttBase data) { return _mqttService.CompruebaKey(data.key); diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs b/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs index 2901009..a50b6f2 100644 --- a/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs +++ b/mqttApi/src/Mqtt.App.Application/mqtt/MqttBackgroundService.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Mqtt.App.Application.Interfaces; using Mqtt.App.Application.Interfaces.External; @@ -19,34 +20,50 @@ namespace Mqtt.App.Application.mqtt private readonly IMqttService _mqttService; - private readonly IPersistenciaService _persistenciaService; + private IPersistenciaService _persistenciaService; private IMapper _mapper; - public MqttBackgroundService(IPersistenciaService persistenciaService, + private readonly IServiceScopeFactory _scopeFactory; + private List cola; + public MqttBackgroundService(IServiceScopeFactory scopeFactory, IMqttService mqttService, IMapper mapper) { - _persistenciaService = persistenciaService; + _scopeFactory = scopeFactory; _mqttService = mqttService; _mapper = mapper; + cola = new List(); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - - + using var scope = _scopeFactory.CreateScope(); + _persistenciaService = scope.ServiceProvider.GetRequiredService(); + _mqttService.TastOnReceive(stoppingToken, this); while (!stoppingToken.IsCancellationRequested) { - _mqttService.TastOnReceive(stoppingToken, this); + await Task.Delay(1000, stoppingToken); + await revisaCola(); } + await revisaCola(); - } + public async Task revisaCola() + { + if(cola.Any()) + { + + var aux= new List(); + var cola2 = cola; + cola = aux; + await _persistenciaService.UpdateOrInsertqtt(cola2); + } + } public void onReceived(string topic, string payload) { var model = new CreateMqttModel(); model.Procesa(topic, payload); var entity = _mapper.Map(model); - _persistenciaService.AddMqtt(entity); + cola.Add(entity); } } } diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/commands/GetMqttModel.cs b/mqttApi/src/Mqtt.App.Application/mqtt/commands/GetMqttModel.cs new file mode 100644 index 0000000..b866783 --- /dev/null +++ b/mqttApi/src/Mqtt.App.Application/mqtt/commands/GetMqttModel.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mqtt.App.Application.mqtt.commands +{ + public class GetMqttModel : MqttBase + { + } +} diff --git a/mqttApi/src/Mqtt.App.Application/mqtt/commands/resultGetMqttModel.cs b/mqttApi/src/Mqtt.App.Application/mqtt/commands/resultGetMqttModel.cs new file mode 100644 index 0000000..a021adc --- /dev/null +++ b/mqttApi/src/Mqtt.App.Application/mqtt/commands/resultGetMqttModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mqtt.App.Application.mqtt.commands +{ + public class resultGetMqttModel + { + public string payload { get; set; } + public string topic { get; set; } + } +} diff --git a/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs b/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs index 1433a4c..bb47697 100644 --- a/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs +++ b/mqttApi/src/Mqtt.App.Domain/Entities/Mqtt/MqttEntity.cs @@ -8,7 +8,7 @@ namespace Mqtt.App.Domain.Entities.Mqtt { public class MqttEntity { - public Int64 Id { get; set; } + public int Id { get; set; } public string Payload { get; set; } public string Topic { get; set; } public string KeyTopic { get; set; } diff --git a/mqttApi/src/Mqtt.App.api/Controllers/mqttController.cs b/mqttApi/src/Mqtt.App.api/Controllers/mqttController.cs index a3b0457..10993ca 100644 --- a/mqttApi/src/Mqtt.App.api/Controllers/mqttController.cs +++ b/mqttApi/src/Mqtt.App.api/Controllers/mqttController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Mqtt.App.Application.Features; using Mqtt.App.Application.mqtt; +using Mqtt.App.Application.mqtt.commands; using Mqtt.App.Application.Persistencia.user.commands.CreateUser; namespace Mqtt.App.api.Controllers @@ -22,5 +23,15 @@ namespace Mqtt.App.api.Controllers var data = await mqttService.Publica(model); return StatusCode(StatusCodes.Status201Created, ResponseApiService.Response(StatusCodes.Status201Created, data)); } + [AllowAnonymous] + [HttpGet] + public async Task Create( + [FromBody] GetMqttModel model, + [FromServices] IMqttAppService mqttService + ) + { + var data = await mqttService.get(model); + return StatusCode(StatusCodes.Status201Created, ResponseApiService.Response(StatusCodes.Status201Created, data)); + } } } diff --git a/mqttApi/src/Mqtt.App.api/appsettings.json b/mqttApi/src/Mqtt.App.api/appsettings.json index fed3cd1..4c970f9 100644 --- a/mqttApi/src/Mqtt.App.api/appsettings.json +++ b/mqttApi/src/Mqtt.App.api/appsettings.json @@ -6,7 +6,7 @@ } }, "AllowedHosts": "*", - "SqlConnectionString": "server=192.168.56.1,1433;user id=sa;password=pass1234.4321@#;initial catalog=AppPrueba; Trust Server Certificate=True", + "SqlConnectionString": "server=192.168.2.20,1433;user id=sa;password=Filoctetes.66337788;initial catalog=MqttApp; Trust Server Certificate=True", "SecretKeyJwt": "NFAJJSAK3523dgsdf.dasfas.dsnfansnvDSFaskin908348", "IssuerJWT": "MqttApp.com", "AudienceJwt": "MqttApp.com", diff --git a/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs b/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs index fb7cbf0..4b7fa75 100644 --- a/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs +++ b/mqttApi/src/Mqtt.app.Persistencia/Configurations/UserConfiguration.cs @@ -13,7 +13,7 @@ namespace Mqtt.App.Persistencia.Configurations public class UserConfiguration { public UserConfiguration( EntityTypeBuilder entityBuilder) { - entityBuilder.ToTable("UserEntity"); + entityBuilder.ToTable("User"); entityBuilder.HasKey(x => x.Id); entityBuilder.Property(x => x.UserName).IsRequired(); entityBuilder.Property(x => x.LastName).IsRequired(); @@ -25,7 +25,7 @@ namespace Mqtt.App.Persistencia.Configurations } public UserConfiguration(EntityTypeBuilder entityBuilder) { - entityBuilder.ToTable("UserEntity"); + entityBuilder.ToTable("Mqtt"); entityBuilder.HasKey(x => x.Id); entityBuilder.Property(x => x.Payload).IsRequired(); entityBuilder.Property(x => x.Topic).IsRequired(); diff --git a/mqttApi/src/Mqtt.app.Persistencia/DependencyInjectionService.cs b/mqttApi/src/Mqtt.app.Persistencia/DependencyInjectionService.cs index c06d569..541497a 100644 --- a/mqttApi/src/Mqtt.app.Persistencia/DependencyInjectionService.cs +++ b/mqttApi/src/Mqtt.app.Persistencia/DependencyInjectionService.cs @@ -18,7 +18,7 @@ namespace Mqtt.App.Persistencia services.AddDbContext( options => options.UseSqlServer(config["SqlConnectionString"])); - services.AddScoped(); + services.AddTransient(); //para cifrado de bbdd diff --git a/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs b/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs index 510f4c7..f286c0f 100644 --- a/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs +++ b/mqttApi/src/Mqtt.app.Persistencia/Services/PersistenciaService.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Mqtt.App.Domain.Entities.Mqtt; +using System.Runtime.Serialization; namespace Mqtt.App.Persistencia.Services { @@ -83,6 +84,59 @@ namespace Mqtt.App.Persistencia.Services Mqtt.Add(e); return await BoolAsync(); } + public async Task AddMqtt(List e) + { + Mqtt.AddRange(e); + return await BoolAsync(); + } + public async Task> getPendiente(string keytopic) + { + using var transaction = await Database.BeginTransactionAsync(); + var res = new List(); + try + { + res = Mqtt.Where(e => !e.IsActive && e.KeyTopic.Equals(keytopic)).OrderBy(e => e.Fecha).ToList(); + if (res == null) + res = new List(); + else + { + foreach (var e in res) + { + var ent = await Set().FindAsync(e.Id); + ent.IsActive = true; + } + } + await SaveChangesAsync(); + await transaction.CommitAsync(); + } + catch (Exception) + { + await transaction.RollbackAsync(); + throw; + } + return res; + } + + public async Task UpdateOrInsertqtt(List lista) + { + foreach(var e in lista) + { + var eDB = Mqtt.FirstOrDefault(a => a.Topic.Equals(e.Topic)); + if (eDB == null || eDB.Id<=0) + Mqtt.AddRange(e); + else + { + eDB.Payload = e.Payload; + eDB.Fecha = e.Fecha; + eDB.IsActive = e.IsActive; + Mqtt.Update(eDB); + } + + } + + + return await BoolAsync(); + } #endregion private async Task BoolAsync() diff --git a/mqttApi/src/Mqtt.app.Persistencia/script/inicio.sql b/mqttApi/src/Mqtt.app.Persistencia/script/inicio.sql new file mode 100644 index 0000000..3e5b1b3 --- /dev/null +++ b/mqttApi/src/Mqtt.app.Persistencia/script/inicio.sql @@ -0,0 +1,29 @@ + USE [MqttApp] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +--motivos cancelacion +-- DROP TABLE [MqttApp].[dbo].[User] +-- SELECT * [MqttApp].[dbo].[User] +CREATE TABLE [MqttApp].[dbo].[User]( + [Id] [int] IDENTITY(1,1) NOT NULL, + [UserName] [nvarchar](125) NULL, + [FristName] [nvarchar](125) NULL, + [LastName] [nvarchar](125) NULL, + [Password] [nvarchar](256) NULL +PRIMARY KEY ([ID]) +) +CREATE TABLE [MqttApp].[dbo].[Mqtt]( + [Id] [int] IDENTITY(1,1) NOT NULL, + [Payload] [nvarchar](256) NULL, + [Topic] [nvarchar](125) NULL, + [KeyTopic] [nvarchar](125) NULL, + [TypeTopic] [nvarchar](32) NULL, + [Fecha] [date] NOT NULL, + IsActive bit not NULL +PRIMARY KEY ([Id]) +) \ No newline at end of file