SignalR, Sumup
This commit is contained in:
parent
96cfebdaaf
commit
d4ed125cae
|
|
@ -62,7 +62,8 @@ namespace TIAMMobileApp
|
||||||
builder.Services.AddScoped<IWizardProcessor, WizardProcessor>();
|
builder.Services.AddScoped<IWizardProcessor, WizardProcessor>();
|
||||||
builder.Services.AddScoped<IImageDataService, ImageDataService>();
|
builder.Services.AddScoped<IImageDataService, ImageDataService>();
|
||||||
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Shared.Application.Resources", typeof(Main).Assembly));
|
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Shared.Application.Resources", typeof(Main).Assembly));
|
||||||
|
builder.Services.AddSingleton<SignalRService>();
|
||||||
|
builder.Services.AddSingleton<SumupService>();
|
||||||
builder.Services.Configure<AnimationOptions>(Guid.NewGuid().ToString(), c => { });
|
builder.Services.Configure<AnimationOptions>(Guid.NewGuid().ToString(), c => { });
|
||||||
return builder.Build();
|
return builder.Build();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
@page "/chat"
|
||||||
|
@using TIAMWebApp.Shared.Application.Services
|
||||||
|
@inject SignalRService SignalRService
|
||||||
|
|
||||||
|
<h3>Chat</h3>
|
||||||
|
<div class="container mt-5">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3>Chat</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
@foreach (var message in messages)
|
||||||
|
{
|
||||||
|
<li class="mb-2">
|
||||||
|
<div class="alert alert-secondary" role="alert">
|
||||||
|
@message
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<div class="input-group">
|
||||||
|
<input @bind="newMessage" @bind:event="oninput" class="form-control" placeholder="Enter your message" />
|
||||||
|
<button @onclick="SendMessage" class="btn btn-primary">Send</button>
|
||||||
|
<button @onclick="MuteChat" class="btn btn-danger ms-2">Mute Chat</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<NavLink href="create-payment">
|
||||||
|
Create Payment
|
||||||
|
</NavLink>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private string userName;
|
||||||
|
private string newMessage;
|
||||||
|
private List<string> messages = new List<string>();
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
userName = Guid.NewGuid().ToString();
|
||||||
|
|
||||||
|
SignalRService.OnMessageReceived += (user, message) =>
|
||||||
|
{
|
||||||
|
messages.Add($"{user}: {message}");
|
||||||
|
InvokeAsync(StateHasChanged);
|
||||||
|
};
|
||||||
|
|
||||||
|
SignalRService.OnUserMuted += (user) =>
|
||||||
|
{
|
||||||
|
messages.Add($"{user} has been muted.");
|
||||||
|
InvokeAsync(StateHasChanged);
|
||||||
|
};
|
||||||
|
|
||||||
|
SignalRService.OnUserLoggedIn += (user) =>
|
||||||
|
{
|
||||||
|
messages.Add($"{user} has logged in.");
|
||||||
|
InvokeAsync(StateHasChanged);
|
||||||
|
};
|
||||||
|
|
||||||
|
SignalRService.OnUserLoggedOut += (user) =>
|
||||||
|
{
|
||||||
|
messages.Add($"{user} has logged out.");
|
||||||
|
InvokeAsync(StateHasChanged);
|
||||||
|
};
|
||||||
|
|
||||||
|
await SignalRService.StartConnection(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SendMessage()
|
||||||
|
{
|
||||||
|
await SignalRService.SendMessage(userName, newMessage);
|
||||||
|
newMessage = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task MuteChat()
|
||||||
|
{
|
||||||
|
await SignalRService.MuteChat(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LoggedInToChat()
|
||||||
|
{
|
||||||
|
await SignalRService.LoggedInToChat(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LoggedOutFromChat()
|
||||||
|
{
|
||||||
|
await SignalRService.LoggedOutFromChat(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
SignalRService.OnMessageReceived -= (user, message) => { };
|
||||||
|
SignalRService.OnUserMuted -= (user) => { };
|
||||||
|
SignalRService.OnUserLoggedIn -= (user) => { };
|
||||||
|
LoggedOutFromChat();
|
||||||
|
SignalRService.OnUserLoggedOut -= (user) => { };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
@page "/create-payment"
|
||||||
|
@using TIAM.Entities.Transfers
|
||||||
|
@using TIAMWebApp.Shared.Application.Services;
|
||||||
|
@using TIAMWebApp.Shared.Application.Models.ClientSide.Payment;
|
||||||
|
@inject SumupService SumUpService
|
||||||
|
|
||||||
|
<h3>Create Payment</h3>
|
||||||
|
|
||||||
|
<button @onclick="CreatePaymentLink">Create Payment Link</button>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private async Task CreatePaymentLink()
|
||||||
|
{
|
||||||
|
Transfer subject = new Transfer();
|
||||||
|
subject.Id = Guid.NewGuid();
|
||||||
|
subject.Price = 17000;
|
||||||
|
subject.ContactEmail = "fyloruta@citmo.net";
|
||||||
|
subject.OrderId = 1232131;
|
||||||
|
var paymentLink = await SumUpService.CreatePaymentLinkAsync(subject);
|
||||||
|
Console.WriteLine($"Payment Link: {paymentLink}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
@page "/transferdetails"
|
@page "/mytransfer"
|
||||||
<PageTitle>Transferdetails</PageTitle>
|
<PageTitle>Transferdetails</PageTitle>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -76,5 +76,6 @@
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
[Parameter]
|
||||||
|
public Guid? TransferId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,7 @@
|
||||||
public List<string> ignoreList = new List<string>
|
public List<string> ignoreList = new List<string>
|
||||||
{
|
{
|
||||||
"ReceiverEmailAddress",
|
"ReceiverEmailAddress",
|
||||||
|
"ReceiverFullName",
|
||||||
"ReceiverId",
|
"ReceiverId",
|
||||||
"SenderEmailAddress",
|
"SenderEmailAddress",
|
||||||
"SenderFullName",
|
"SenderFullName",
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,16 @@
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(enableChat)
|
||||||
|
{
|
||||||
|
<li class="nav-item">
|
||||||
|
<NavLink class="nav-link" href="chat">
|
||||||
|
Chat
|
||||||
|
</NavLink>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ namespace TIAMSharedUI.Shared.Components
|
||||||
private bool enableTransfer = true;
|
private bool enableTransfer = true;
|
||||||
private bool enableLanguage = false;
|
private bool enableLanguage = false;
|
||||||
private bool enableApi = true;
|
private bool enableApi = true;
|
||||||
|
private bool enableChat = true;
|
||||||
|
|
||||||
|
|
||||||
private bool collapseNavMenu = true;
|
private bool collapseNavMenu = true;
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,8 @@ builder.Services.AddScoped<SessionStorageAccessor>();
|
||||||
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Client.Resources.MyResources", typeof(Program).Assembly));
|
builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Client.Resources.MyResources", typeof(Program).Assembly));
|
||||||
builder.Services.AddSingleton<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
|
builder.Services.AddSingleton<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
|
||||||
builder.Services.AddSingleton<IAcLogWriterClientBase, HttpClientLogItemWriter>();
|
builder.Services.AddSingleton<IAcLogWriterClientBase, HttpClientLogItemWriter>();
|
||||||
|
builder.Services.AddSingleton<SignalRService>();
|
||||||
|
builder.Services.AddSingleton<SumupService>();
|
||||||
|
|
||||||
//builder.Services.AddScoped<BrowserConsoleLogWriter>();
|
//builder.Services.AddScoped<BrowserConsoleLogWriter>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ using AyCode.Entities.Server.LogItems;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Cors;
|
using Microsoft.AspNetCore.Cors;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using System.Text.Json;
|
||||||
using TIAM.Database.DataLayers.Admins;
|
using TIAM.Database.DataLayers.Admins;
|
||||||
using TIAM.Database.DataLayers.Users;
|
using TIAM.Database.DataLayers.Users;
|
||||||
using TIAM.Entities.Emails;
|
using TIAM.Entities.Emails;
|
||||||
|
|
@ -14,6 +16,8 @@ using TIAM.Services.Server;
|
||||||
using TIAM.Services.Server.Logins;
|
using TIAM.Services.Server.Logins;
|
||||||
using TIAMWebApp.Server.Services;
|
using TIAMWebApp.Server.Services;
|
||||||
using TIAMWebApp.Shared.Application.Models;
|
using TIAMWebApp.Shared.Application.Models;
|
||||||
|
using TIAMWebApp.Shared.Application.Models.ClientSide.Payment;
|
||||||
|
using TIAMWebApp.Shared.Application.Models.PageModels;
|
||||||
|
|
||||||
namespace TIAMWebApp.Server.Controllers
|
namespace TIAMWebApp.Server.Controllers
|
||||||
{
|
{
|
||||||
|
|
@ -24,16 +28,18 @@ namespace TIAMWebApp.Server.Controllers
|
||||||
public class PaymentAPIController : ControllerBase
|
public class PaymentAPIController : ControllerBase
|
||||||
{
|
{
|
||||||
|
|
||||||
private LoginService _loginService;
|
|
||||||
private AdminDal _adminDal;
|
private AdminDal _adminDal;
|
||||||
|
private SumupService _sumupService;
|
||||||
private readonly TIAM.Core.Loggers.ILogger _logger;
|
private readonly TIAM.Core.Loggers.ILogger _logger;
|
||||||
private readonly IMessageSenderService _messageSenderService;
|
private readonly IMessageSenderService _messageSenderService;
|
||||||
|
|
||||||
public PaymentAPIController(LoginService loginService, AdminDal adminDal, IMessageSenderService messageSenderService, IEnumerable<IAcLogWriterBase> logWriters)
|
public PaymentAPIController(AdminDal adminDal, SumupService sumupService, IMessageSenderService messageSenderService, IEnumerable<IAcLogWriterBase> logWriters)
|
||||||
{
|
{
|
||||||
|
|
||||||
_loginService = loginService;
|
|
||||||
_adminDal = adminDal;
|
_adminDal = adminDal;
|
||||||
|
_sumupService = sumupService;
|
||||||
_messageSenderService = messageSenderService;
|
_messageSenderService = messageSenderService;
|
||||||
_logger = new TIAM.Core.Loggers.Logger<PaymentAPIController>(logWriters.ToArray());
|
_logger = new TIAM.Core.Loggers.Logger<PaymentAPIController>(logWriters.ToArray());
|
||||||
}
|
}
|
||||||
|
|
@ -42,9 +48,22 @@ namespace TIAMWebApp.Server.Controllers
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Route(APIUrls.CreatePaymentRouteName)]
|
[Route(APIUrls.CreatePaymentRouteName)]
|
||||||
public async Task CreatePayment(Transfer? paymentItem)
|
public async Task<string> CreatePayment([FromBody] JsonElement paymentItem)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
_logger.Detail($"CreatePayment called! {paymentItem.ToString()}");
|
||||||
|
var transferToPay = JObject.Parse(paymentItem.GetRawText()).ToObject<Transfer>();
|
||||||
|
var paymentRequest = new SumupPaymentRequest
|
||||||
|
{
|
||||||
|
CheckoutReference = transferToPay.OrderId.ToString(),
|
||||||
|
Amount = transferToPay.Price.ToString(),
|
||||||
|
Currency = "HUF",
|
||||||
|
PayToEmail = "adam.g@aycode.com",
|
||||||
|
Description = "Test transfer payment"
|
||||||
|
};
|
||||||
|
var result = await _sumupService.CreateCheckout(paymentRequest);
|
||||||
|
_logger.Detail($"CreatePayment result: {result}");
|
||||||
|
var checkoutUrl = result.CheckoutUrl;
|
||||||
|
return checkoutUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -328,6 +328,8 @@ namespace TIAMWebApp.Server.Controllers
|
||||||
{
|
{
|
||||||
_logger.Info($"Created transfer, send emailMessage!!!");
|
_logger.Info($"Created transfer, send emailMessage!!!");
|
||||||
var message = new MessageSenderModel<EmailMessage>();
|
var message = new MessageSenderModel<EmailMessage>();
|
||||||
|
message.Message = new EmailMessage();
|
||||||
|
message.MessageType = AyCode.Models.Enums.MessageTypesEnum.email;
|
||||||
message.Message.Subject = "[Tour I Am] New transfer in Budapest";
|
message.Message.Subject = "[Tour I Am] New transfer in Budapest";
|
||||||
message.Message.ContextId = createdTransfer.Id;
|
message.Message.ContextId = createdTransfer.Id;
|
||||||
message.Message.SenderId = Guid.Empty;
|
message.Message.SenderId = Guid.Empty;
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,9 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using TIAMWebApp.Server.Controllers;
|
using TIAMWebApp.Server.Controllers;
|
||||||
using TIAMWebApp.Server.Services;
|
using TIAMWebApp.Server.Services;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
//using TIAM.Database.DataLayers.ServiceProviders;
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
|
@ -28,6 +29,7 @@ const string myAllowSpecificOrigins = "_myAllowSpecificOrigins";
|
||||||
|
|
||||||
builder.Services.AddControllersWithViews();
|
builder.Services.AddControllersWithViews();
|
||||||
builder.Services.AddRazorPages();
|
builder.Services.AddRazorPages();
|
||||||
|
builder.Services.AddServerSideBlazor();
|
||||||
|
|
||||||
builder.Services.AddSingleton<LoggerToLoggerApiController>();
|
builder.Services.AddSingleton<LoggerToLoggerApiController>();
|
||||||
builder.Services.AddSingleton<IAcLogWriterBase, ConsoleLogWriter>();
|
builder.Services.AddSingleton<IAcLogWriterBase, ConsoleLogWriter>();
|
||||||
|
|
@ -38,23 +40,24 @@ builder.Services.AddScoped<AdminDal>();
|
||||||
builder.Services.AddScoped<AuctionDal>();
|
builder.Services.AddScoped<AuctionDal>();
|
||||||
builder.Services.AddScoped<TransferDestinationDal>();
|
builder.Services.AddScoped<TransferDestinationDal>();
|
||||||
|
|
||||||
|
builder.Services.AddSignalR();
|
||||||
|
|
||||||
builder.Services.AddCors(options => {
|
builder.Services.AddCors(options =>
|
||||||
options.AddPolicy(myAllowSpecificOrigins,
|
{
|
||||||
policy => {
|
options.AddPolicy(myAllowSpecificOrigins, policy =>
|
||||||
|
{
|
||||||
policy.AllowAnyOrigin();
|
policy.AllowAnyOrigin();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.AddSwaggerGen(swagger =>
|
builder.Services.AddSwaggerGen(swagger =>
|
||||||
{
|
{
|
||||||
swagger.SwaggerDoc("v1",
|
swagger.SwaggerDoc("v1", new OpenApiInfo
|
||||||
new OpenApiInfo
|
{
|
||||||
{
|
Title = "API Title",
|
||||||
Title = "API Title",
|
Version = "V1",
|
||||||
Version = "V1",
|
Description = "API Description"
|
||||||
Description = "API Description"
|
});
|
||||||
});
|
|
||||||
|
|
||||||
var securitySchema = new OpenApiSecurityScheme
|
var securitySchema = new OpenApiSecurityScheme
|
||||||
{
|
{
|
||||||
|
|
@ -72,19 +75,19 @@ builder.Services.AddSwaggerGen(swagger =>
|
||||||
swagger.AddSecurityDefinition(securitySchema.Reference.Id, securitySchema);
|
swagger.AddSecurityDefinition(securitySchema.Reference.Id, securitySchema);
|
||||||
swagger.AddSecurityRequirement(new OpenApiSecurityRequirement
|
swagger.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||||
{
|
{
|
||||||
{securitySchema,Array.Empty<string>() }
|
{ securitySchema, Array.Empty<string>() }
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.AddAuthentication(f =>
|
builder.Services.AddAuthentication(options =>
|
||||||
{
|
{
|
||||||
f.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
|
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||||
f.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
|
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||||
}).AddJwtBearer(k =>
|
}).AddJwtBearer(options =>
|
||||||
{
|
{
|
||||||
var key = Encoding.UTF8.GetBytes(builder.Configuration["JWT:Key"]);
|
var key = Encoding.UTF8.GetBytes(builder.Configuration["JWT:Key"]);
|
||||||
k.SaveToken = true;
|
options.SaveToken = true;
|
||||||
k.TokenValidationParameters = new TokenValidationParameters
|
options.TokenValidationParameters = new TokenValidationParameters
|
||||||
{
|
{
|
||||||
ValidateIssuer = true,
|
ValidateIssuer = true,
|
||||||
ValidateAudience = true,
|
ValidateAudience = true,
|
||||||
|
|
@ -95,17 +98,31 @@ builder.Services.AddAuthentication(f =>
|
||||||
IssuerSigningKey = new SymmetricSecurityKey(key),
|
IssuerSigningKey = new SymmetricSecurityKey(key),
|
||||||
ClockSkew = TimeSpan.Zero
|
ClockSkew = TimeSpan.Zero
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.Configure<FormOptions>(options =>
|
builder.Services.Configure<FormOptions>(options =>
|
||||||
{
|
{
|
||||||
options.MultipartBodyLengthLimit = 200000000; // Increase the limit to 200MB
|
options.MultipartBodyLengthLimit = 200000000; // Increase the limit to 200MB
|
||||||
});
|
});
|
||||||
|
|
||||||
|
builder.Services.AddHttpClient<SumupService>(client =>
|
||||||
|
{
|
||||||
|
//ApiKey: sup_sk_0rt9IFrMpE9qA6328vqMwCtiCntRXZxGR
|
||||||
|
client.BaseAddress = new Uri("https://api.sumup.com/");
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Services.AddTransient(provider =>
|
||||||
|
new SumupService(
|
||||||
|
provider.GetRequiredService<HttpClient>(),
|
||||||
|
//"your-client-id",
|
||||||
|
//"your-client-secret"
|
||||||
|
"cc_classic_FHVxlhLMqFfX3ZqBe5GW4gEhySnuq",
|
||||||
|
"cc_sk_classic_SDxnPImsFMmw0ApNk2KlmFwqgHN29FClMvH3op3Kkus6Zn5Ge3",
|
||||||
|
provider.GetRequiredService<IEnumerable<IAcLogWriterBase>>()
|
||||||
|
));
|
||||||
|
|
||||||
builder.Services.AddScoped<IMessageSenderService, MessageSenderService>();
|
builder.Services.AddScoped<IMessageSenderService, MessageSenderService>();
|
||||||
builder.Services.AddScoped<TransferBackendService, TransferBackendService>();
|
builder.Services.AddScoped<TransferBackendService, TransferBackendService>();
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
|
||||||
builder.Services.AddSwaggerGen();
|
|
||||||
|
|
||||||
builder.Services.ConfigureApplicationCookie(options =>
|
builder.Services.ConfigureApplicationCookie(options =>
|
||||||
{
|
{
|
||||||
|
|
@ -124,11 +141,8 @@ builder.WebHost.ConfigureKestrel((context, options) =>
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
// Configure the HTTP request pipeline.
|
||||||
if (app.Environment.IsDevelopment())
|
if (app.Environment.IsDevelopment())
|
||||||
{
|
{
|
||||||
|
|
@ -137,7 +151,6 @@ if (app.Environment.IsDevelopment())
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
app.UseExceptionHandler("/Error");
|
app.UseExceptionHandler("/Error");
|
||||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
|
||||||
app.UseHsts();
|
app.UseHsts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -147,19 +160,19 @@ app.UseSwaggerUI(c =>
|
||||||
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
|
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
//app.UseHttpsRedirection();
|
|
||||||
|
|
||||||
app.UseBlazorFrameworkFiles();
|
app.UseBlazorFrameworkFiles();
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
|
|
||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
//cors
|
|
||||||
app.UseCors(myAllowSpecificOrigins);
|
app.UseCors(myAllowSpecificOrigins);
|
||||||
app.UseAuthorization();
|
app.UseAuthorization();
|
||||||
app.UsePathBase("/");
|
|
||||||
app.MapRazorPages();
|
app.MapRazorPages();
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
app.MapBlazorHub();
|
||||||
|
app.MapHub<SignalRHub>("/myhub");
|
||||||
app.MapFallbackToFile("index.html");
|
app.MapFallbackToFile("index.html");
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
|
||||||
|
namespace TIAMWebApp.Server.Services;
|
||||||
|
public class SignalRHub : Hub
|
||||||
|
{
|
||||||
|
public async Task SendMessage(string user, string message)
|
||||||
|
{
|
||||||
|
await Clients.All.SendAsync("ReceiveMessage", user, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task MuteChat(string user)
|
||||||
|
{
|
||||||
|
|
||||||
|
await Clients.All.SendAsync("UserMuted", user);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task LoggedInToChat(string user)
|
||||||
|
{
|
||||||
|
|
||||||
|
await Clients.All.SendAsync("UserLoggedInToChat", user);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task LoggedOutFromChat(string user)
|
||||||
|
{
|
||||||
|
|
||||||
|
await Clients.All.SendAsync("UserLoggedOutFromChat", user);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,123 @@
|
||||||
|
using AyCode.Core.Loggers;
|
||||||
|
using AyCode.Services.Loggers;
|
||||||
|
using System;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TIAM.Core.Loggers;
|
||||||
|
using TIAMWebApp.Shared.Application.Models.ClientSide.Payment;
|
||||||
|
using TIAMWebApp.Shared.Application.Services;
|
||||||
|
using TIAMWebApp.Shared.Application.Utility;
|
||||||
|
|
||||||
|
namespace TIAMWebApp.Server.Services
|
||||||
|
{
|
||||||
|
|
||||||
|
public class SumupService
|
||||||
|
{
|
||||||
|
private readonly HttpClient _httpClient;
|
||||||
|
private readonly TIAM.Core.Loggers.ILogger _logger;
|
||||||
|
private readonly string _clientId;
|
||||||
|
private readonly string _clientSecret;
|
||||||
|
|
||||||
|
public SumupService(HttpClient httpClient, string clientId, string clientSecret, IEnumerable<IAcLogWriterBase> logWriters)
|
||||||
|
{
|
||||||
|
_httpClient = httpClient;
|
||||||
|
_clientId = clientId;
|
||||||
|
_clientSecret = clientSecret;
|
||||||
|
_logger = new TIAM.Core.Loggers.Logger<SumupService>(logWriters.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> GetAccessTokenAsync()
|
||||||
|
{
|
||||||
|
var authToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_clientId}:{_clientSecret}"));
|
||||||
|
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authToken);
|
||||||
|
|
||||||
|
var requestContent = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");
|
||||||
|
|
||||||
|
var response = await _httpClient.PostAsync("https://api.sumup.com/token", requestContent);
|
||||||
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
|
var responseContent = await response.Content.ReadAsStringAsync();
|
||||||
|
var tokenResponse = JsonSerializer.Deserialize<SumUpTokenResponse>(responseContent);
|
||||||
|
|
||||||
|
return tokenResponse.AccessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> CreatePaymentLinkAsync(SumupPaymentRequest paymentRequest)
|
||||||
|
{
|
||||||
|
var accessToken = await GetAccessTokenAsync();
|
||||||
|
//_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
|
||||||
|
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "sup_sk_0rt9IFrMpE9qA6328vqMwCtiCntRXZxGR");
|
||||||
|
|
||||||
|
var requestContent = new StringContent(JsonSerializer.Serialize(paymentRequest), Encoding.UTF8, "application/json");
|
||||||
|
|
||||||
|
var response = await _httpClient.PostAsync("https://api.sumup.com/v0.1/checkouts", requestContent);
|
||||||
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
|
var responseContent = await response.Content.ReadAsStringAsync();
|
||||||
|
var paymentResponse = JsonSerializer.Deserialize<PaymentResponse>(responseContent);
|
||||||
|
|
||||||
|
return paymentResponse.CheckoutUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<PaymentResponse> CreateCheckout(SumupPaymentRequest request)
|
||||||
|
{
|
||||||
|
var options = new JsonSerializerOptions
|
||||||
|
{
|
||||||
|
PropertyNamingPolicy = new LowercaseNamingPolicy(),
|
||||||
|
PropertyNameCaseInsensitive = true // To ensure deserialization works regardless of case
|
||||||
|
};
|
||||||
|
|
||||||
|
var checkoutRequest = new HttpRequestMessage(HttpMethod.Post, "https://api.sumup.com/v0.1/checkouts");
|
||||||
|
checkoutRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "sup_sk_0rt9IFrMpE9qA6328vqMwCtiCntRXZxGR");
|
||||||
|
var kvaanyad = JsonSerializer.Serialize(request, options);
|
||||||
|
_logger.Detail($"Request json: {kvaanyad}");
|
||||||
|
checkoutRequest.Content = new StringContent(kvaanyad, Encoding.UTF8, "application/json");
|
||||||
|
_logger.Detail($"Request content: { await checkoutRequest.Content.ReadAsStringAsync()}");
|
||||||
|
var response = await _httpClient.SendAsync(checkoutRequest);
|
||||||
|
_logger.Detail(await response.Content.ReadAsStringAsync());
|
||||||
|
if (response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||||
|
var bleh = response.Content.ToString();
|
||||||
|
var valami = JsonSerializer.Deserialize<PaymentResponse>(jsonResponse);
|
||||||
|
return valami;
|
||||||
|
}
|
||||||
|
|
||||||
|
var errorResponse = await response.Content.ReadAsStringAsync();
|
||||||
|
throw new Exception($"Unable to create checkout. Response: {errorResponse}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SumUpTokenResponse
|
||||||
|
{
|
||||||
|
[JsonPropertyName("access_token")]
|
||||||
|
public string AccessToken { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// SumUpService.cs (continued)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class PaymentResponse
|
||||||
|
{
|
||||||
|
[JsonPropertyName("checkout_url")]
|
||||||
|
public string CheckoutUrl { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LowercaseNamingPolicy : JsonNamingPolicy
|
||||||
|
{
|
||||||
|
public override string ConvertName(string name)
|
||||||
|
{
|
||||||
|
return name.ToLowerInvariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TIAMWebApp.Shared.Application.Models.ClientSide.Payment
|
||||||
|
{
|
||||||
|
public class SumupPaymentRequest
|
||||||
|
{
|
||||||
|
[JsonPropertyName("checkout_reference")]
|
||||||
|
public string CheckoutReference { get; set; }
|
||||||
|
[JsonPropertyName("amount")]
|
||||||
|
public string Amount { get; set; }
|
||||||
|
[JsonPropertyName("currency")]
|
||||||
|
public string Currency { get; set; }
|
||||||
|
[JsonPropertyName("pay_to_email")]
|
||||||
|
public string PayToEmail { get; set; }
|
||||||
|
[JsonPropertyName("description")]
|
||||||
|
public string Description { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -38,7 +38,7 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
|
||||||
Text = obj.Content,
|
Text = obj.Content,
|
||||||
EmailAddress = obj.SenderEmailAddress,
|
EmailAddress = obj.SenderEmailAddress,
|
||||||
Recipients = new List<EmailRecipient> { new EmailRecipient(
|
Recipients = new List<EmailRecipient> { new EmailRecipient(
|
||||||
Guid.NewGuid(), obj.ReceiverId, id, "recipient@aycode.com") }
|
Guid.NewGuid(), obj.ReceiverId, id, obj.ReceiverEmailAddress) }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TIAMWebApp.Shared.Application.Models.ClientSide;
|
||||||
|
|
||||||
|
namespace TIAMWebApp.Shared.Application.Services
|
||||||
|
{
|
||||||
|
public class SignalRService
|
||||||
|
{
|
||||||
|
private HubConnection _hubConnection;
|
||||||
|
|
||||||
|
public event Action<string, string> OnMessageReceived;
|
||||||
|
public event Action<string> OnUserMuted;
|
||||||
|
public event Action<string> OnUserLoggedIn;
|
||||||
|
public event Action<string> OnUserLoggedOut;
|
||||||
|
|
||||||
|
public async Task StartConnection(string userName)
|
||||||
|
{
|
||||||
|
_hubConnection = new HubConnectionBuilder()
|
||||||
|
.WithUrl($"{Setting.BaseUrl}/myhub")
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
_hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
|
||||||
|
{
|
||||||
|
OnMessageReceived?.Invoke(user, message);
|
||||||
|
});
|
||||||
|
|
||||||
|
_hubConnection.On<string>("UserMuted", (user) =>
|
||||||
|
{
|
||||||
|
OnUserMuted?.Invoke(user);
|
||||||
|
});
|
||||||
|
|
||||||
|
_hubConnection.On<string>("UserLoggedInToChat", (user) =>
|
||||||
|
{
|
||||||
|
OnUserLoggedIn?.Invoke(user);
|
||||||
|
});
|
||||||
|
|
||||||
|
_hubConnection.On<string>("UserLoggedOutFromChat", (user) =>
|
||||||
|
{
|
||||||
|
OnUserLoggedOut?.Invoke(user);
|
||||||
|
});
|
||||||
|
|
||||||
|
await _hubConnection.StartAsync();
|
||||||
|
await LoggedInToChat(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SendMessage(string user, string message)
|
||||||
|
{
|
||||||
|
await _hubConnection.SendAsync("SendMessage", user, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task MuteChat(string user)
|
||||||
|
{
|
||||||
|
await _hubConnection.SendAsync("MuteChat", user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task LoggedInToChat(string user)
|
||||||
|
{
|
||||||
|
await _hubConnection.SendAsync("LoggedInToChat", user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task LoggedOutFromChat(string user)
|
||||||
|
{
|
||||||
|
await _hubConnection.SendAsync("LoggedOutFromChat", user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StopConnection()
|
||||||
|
{
|
||||||
|
await _hubConnection.StopAsync();
|
||||||
|
await _hubConnection.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
using AyCode.Services.Loggers;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http.Json;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TIAM.Entities.Transfers;
|
||||||
|
using TIAMWebApp.Shared.Application.Models.ClientSide;
|
||||||
|
using TIAMWebApp.Shared.Application.Models;
|
||||||
|
using TIAMWebApp.Shared.Application.Utility;
|
||||||
|
using TIAM.Core.Loggers;
|
||||||
|
using TIAMWebApp.Shared.Application.Models.ClientSide.Payment;
|
||||||
|
using static System.Net.WebRequestMethods;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using TIAM.Models.Dtos.Users;
|
||||||
|
|
||||||
|
namespace TIAMWebApp.Shared.Application.Services
|
||||||
|
{
|
||||||
|
public class SumupService
|
||||||
|
{
|
||||||
|
private readonly HttpClient _http;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
public SumupService(HttpClient http, IEnumerable<IAcLogWriterClientBase> logWriters)
|
||||||
|
{
|
||||||
|
_http = http;
|
||||||
|
_logger = new LoggerClient<TransferDataService>(logWriters.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<string> CreatePaymentLinkAsync(Transfer transferToPay)
|
||||||
|
{
|
||||||
|
var url = $"{Setting.ApiBaseUrl}/{APIUrls.CreatePayment}";
|
||||||
|
//var url = $"{APIUrls.GetTransferDestinations}";
|
||||||
|
_logger.Info(url);
|
||||||
|
var response = await _http.PostAsJsonAsync(url, transferToPay);
|
||||||
|
|
||||||
|
if (response == null)
|
||||||
|
return "Not ok";
|
||||||
|
|
||||||
|
var result = await response.Content.ReadAsStringAsync();
|
||||||
|
var paymentLink = result;
|
||||||
|
return paymentLink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.5" />
|
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.5" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
|
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.5" />
|
||||||
<PackageReference Include="Microsoft.JSInterop" Version="8.0.5" />
|
<PackageReference Include="Microsoft.JSInterop" Version="8.0.5" />
|
||||||
<PackageReference Include="SkiaSharp" Version="2.88.8" />
|
<PackageReference Include="SkiaSharp" Version="2.88.8" />
|
||||||
<PackageReference Include="SkiaSharp.Views.Desktop.Common" Version="2.88.8" />
|
<PackageReference Include="SkiaSharp.Views.Desktop.Common" Version="2.88.8" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue