Commit f35288d8 authored by Brayan Sarmiento's avatar Brayan Sarmiento
Browse files

Agregar Controladores al proyecto

parent 04fe20e8
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="BaseUrl" value="http://localhost:9000" />
<add key="UrlServicio" value="http://10.100.43.30:89/ServiciosRG.svc" />
<add key="Estacion" value="CONVIVENCIA3" />
<add key="ArchivoBines" value="C:\\RUTALOGPINPADADEFINIR\\BINES.TXT" />
</appSettings>
</configuration>
\ No newline at end of file
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
// Ruta por defecto
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
using app_datafono_difare.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
namespace app_datafono_difare.Controllers
{
[ApiController]
[Route("api/pinpad")]
public class PinpadController : ControllerBase
public class PinpadController : ApiController // <- heredar ApiController
{
private readonly PinpadInitializer _init;
private readonly PinpadRestService _service;
public PinpadController(PinpadInitializer init, PinpadRestService service)
[HttpPost]
public async Task<IHttpActionResult> Autorizar([FromBody] decimal amount)
{
_init = init;
_service = service;
}
try
{
var service = new TransactionService(
RgService.Instance,
System.Configuration.ConfigurationManager.AppSettings["ArchivoBines"]
);
[HttpPost("init")]
public IActionResult Inicializar([FromBody] InitPinpadRequest req)
{
_init.Inicializar(req.Url, req.Estacion);
return Ok(new { message = "Pinpad inicializado" });
}
// SOLO se envía la venta — sin reconfigurar el pinpad
var resp = await service.EnviarVenta(amount, 0);
[HttpPost("venta")]
public async Task<IActionResult> Venta([FromBody] VentaRequest req)
{
var resp = await _service.AutorizarAsync(req.Amount, req.Cuotas);
return Ok(resp);
return Ok(resp);
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
}
public class InitPinpadRequest
{
public string Url { get; set; }
public string Estacion { get; set; }
}
public class VentaRequest
{
public decimal Amount { get; set; }
public int Cuotas { get; set; }
}
}
using app_datafono_difare.Services;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Serilog;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Serilog;
using Serilog.Events;
using Topshelf;
namespace app_datafono_difare
{
class Program
{
static async Task Main(string[] args)
static void Main()
{
//Validación de argumentos
if (args.Length == 0)
{
Log.Error("ERROR: Sin argumentos");
return;
}
var appConfig = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false)
.Build();
var serilogConfig = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.serilog.json", optional: true)
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(serilogConfig)
.MinimumLevel.Debug()
.WriteTo.File("logs\\rest-pinpad.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
//Redirige la salida a Serilog para logs
Console.SetOut(new SerilogTextWriter(Log.Logger));
Console.SetError(new SerilogTextWriter(Log.Logger));
try
HostFactory.Run(x =>
{
if (args[0].ToLower() == "autorizar")
x.Service<PinpadService>(s =>
{
// Leer monto enviado desde el wrapper
if (args.Length < 2)
{
Log.Error("ERROR: No se recibio el monto");
Console.WriteLine("{\"Success\":false,\"Message\":\"Monto no recibido\"}");
return;
}
decimal amount = decimal.Parse(args[1]);
var rgService = RgService.Instance;
s.ConstructUsing(() => new PinpadService());
s.WhenStarted(p => p.Start());
s.WhenStopped(p => p.Stop());
});
string rutaBines = appConfig["ArchivoBines"];
string url = appConfig["UrlServicio"];
string estacion = appConfig["Estacion"];
x.RunAsLocalSystem(); // Permisos de servicio
var ventaService = new TransactionService(rgService, rutaBines);
var resp = await ventaService.ProcesarVenta(url, estacion, amount, 0);
// RESTAURAR OUTPUT A CONSOLA
Console.SetOut(new StreamWriter(Console.OpenStandardOutput(), Encoding.UTF8) { AutoFlush = true });
Console.SetError(new StreamWriter(Console.OpenStandardError(), Encoding.UTF8) { AutoFlush = true });
// mandamos JSON al wrapper
var json = JsonConvert.SerializeObject(resp);
Console.WriteLine(json);
return;
}
Log.Error("Comando no reconocido");
}
catch (Exception ex)
{
Log.Error(ex, "Error ejecutando la aplicación");
}
finally
{
Log.CloseAndFlush();
}
x.SetServiceName("PinpadRestService");
x.SetDisplayName("Pinpad REST Service");
x.SetDescription("Servicio REST que expone las funciones del pinpad via OWIN Self-Host.");
});
}
}
......
using Microsoft.Owin.Hosting;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace app_datafono_difare.Services
{
public class PinpadService
{
private IDisposable _webApp;
public void Start()
{
Log.Information("Iniciando servicio OWIN...");
string baseUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUrl"];
InicializarPinpad();
_webApp = WebApp.Start<Startup>(url: baseUrl);
Log.Information($"Servicio REST running en {baseUrl}");
}
public void Stop()
{
Log.Information("Deteniendo servicio REST...");
_webApp?.Dispose();
}
private void InicializarPinpad()
{
try
{
var rg = RgService.Instance;
var config = System.Configuration.ConfigurationManager.AppSettings;
string url = config["UrlServicio"];
string estacion = config["Estacion"];
rg.Rg.EstablecerServicio(url);
rg.Rg.EstablecerEstacion(estacion);
rg.Rg.ConfigurarTerminal(estacion);
rg.Rg.ConfigurarPinpad();
Log.Information("Pinpad inicializado correctamente");
}
catch (Exception ex)
{
Log.Error(ex, "Error inicializando el pinpad");
}
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Owin;
using System.Web.Http;
namespace app_datafono_difare
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
app.UseWebApi(config);
}
}
}
......@@ -16,14 +16,19 @@
<PackageReference Include="IKVM" Version="8.1.5717.0" />
<PackageReference Include="IKVM.OpenJDK.Core.8.1.5717" Version="1.0.0" />
<PackageReference Include="IKVM.Runtime" Version="7.2.4630.5" />
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.3.0" />
<PackageReference Include="Microsoft.AspNet.WebApi.OwinSelfHost" Version="5.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.3.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="Owin" Version="1.0.0" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.0" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.0" />
<PackageReference Include="Topshelf" Version="4.3.0" />
</ItemGroup>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment