mirror of
https://gitea.tendokyu.moe/Kayori/MedusaPluginChargeMachine.git
synced 2026-09-27 09:37:58 +03:00
Work
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Rider ignored files
|
||||
/contentModel.xml
|
||||
/modules.xml
|
||||
/.idea.MedusaPluginChargeMachine.iml
|
||||
/projectSettingsUpdater.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||
</project>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="UserContentModel">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -0,0 +1,3 @@
|
||||
<Solution>
|
||||
<Project Path="MedusaPluginChargeMachine/MedusaPluginChargeMachine.csproj" />
|
||||
</Solution>
|
||||
@@ -0,0 +1,25 @@
|
||||
using Abstractions;
|
||||
using MedusaPluginChargeMachine.Services;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace MedusaPluginChargeMachine;
|
||||
|
||||
public class ChargeMachinePlugin: IMedusaPlugin
|
||||
{
|
||||
public string Name => "Charge Machine";
|
||||
public string Version => "1.0.0";
|
||||
public string Description => "Plugin for the paseli charge machine";
|
||||
|
||||
public Task OnBuilderInitialize(WebApplicationBuilder builder)
|
||||
{
|
||||
builder.Services.AddTransient<ISessionService, SessionService>();
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task OnAppInitialize(WebApplication app)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using System.Xml.Linq;
|
||||
using Abstractions.Entities;
|
||||
using Abstractions.Handlers;
|
||||
using Abstractions.Services;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using ISessionService = MedusaPluginChargeMachine.Services.ISessionService;
|
||||
|
||||
namespace MedusaPluginChargeMachine.Handlers.LA9
|
||||
{
|
||||
public class ChargeEaChargeHandler(ICardService cardService, ISessionService sessionService, UserManager<User> userManager, XDocument body): Handler
|
||||
{
|
||||
public override void Configure()
|
||||
{
|
||||
Module("eacharge");
|
||||
Method("charge");
|
||||
}
|
||||
public override async Task<XDocument> HandleAsync(string model)
|
||||
{
|
||||
var rootCall = body.Root;
|
||||
var charge = rootCall?.Element("eacharge")!;
|
||||
var amount = int.Parse(charge.Element("chargenum")?.Value!) * 1000;
|
||||
var session = charge.Element("sessid")?.Value!;
|
||||
|
||||
var foundSession = sessionService.GetSession(session);
|
||||
|
||||
var card = await cardService.FindByCardId(foundSession.refId)!;
|
||||
|
||||
card!.User.PaseliAmount += amount;
|
||||
|
||||
await userManager.UpdateAsync(card.User);
|
||||
|
||||
var balance = new XElement("balance", card.User.PaseliAmount, new XAttribute("__type", "s32"));
|
||||
var chargeDailyLimit = new XElement("chargedailylimit", 100000, new XAttribute("__type", "s32"));
|
||||
var chargeDaily = new XElement("chargedaily", 0, new XAttribute("__type", "s32"));
|
||||
var chargepoint = new XElement("chargepoint", amount, new XAttribute("__type", "s32"));
|
||||
|
||||
var eaCharge = new XElement("charge", balance, chargeDailyLimit, chargeDaily, chargepoint, new XAttribute("status", "0"));
|
||||
var document = new XDocument(new XElement("response", eaCharge));
|
||||
return document;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using System.Xml.Linq;
|
||||
using Abstractions.Handlers;
|
||||
using Abstractions.Services;
|
||||
using MedusaPluginChargeMachine.Services;
|
||||
|
||||
namespace MedusaPluginChargeMachine.Handlers.LA9
|
||||
{
|
||||
public class CheckInEaChargeHandler(ISessionService sessionService, ICardService cardService, XDocument body): Handler
|
||||
{
|
||||
private readonly XDocument _body = body;
|
||||
private readonly ISessionService _sessionService = sessionService;
|
||||
private readonly ICardService _cardService = cardService;
|
||||
|
||||
public override void Configure()
|
||||
{
|
||||
Module("eacharge");
|
||||
Method("checkin");
|
||||
}
|
||||
public override async Task<XDocument> HandleAsync(string model)
|
||||
{
|
||||
var rootCall = _body.Root;
|
||||
var eaCharge = rootCall?.Element("eacharge")!;
|
||||
var cardId = eaCharge.Element("cardid")?.Value!;
|
||||
|
||||
var sessionId = _sessionService.AddSession(cardId);
|
||||
|
||||
var card = await _cardService.FindByCardId(cardId);
|
||||
|
||||
var userPaseli = card!.User.PaseliAmount;
|
||||
|
||||
var sessseq = new XElement("sessseq", 0, new XAttribute("__type", "s32"));
|
||||
var acname = new XElement("acname", "DUMMY_NAME", new XAttribute("__type", "str"));
|
||||
var balance = new XElement("balance", userPaseli, new XAttribute("__type", "s32"));
|
||||
var buyablep = new XElement("buyablep", 100000, new XAttribute("__type", "s32"));
|
||||
var sessionIdXElement = new XElement("sessid", sessionId, new XAttribute("__type", "str"));
|
||||
var eacharge = new XElement("eacharge", sessseq, acname, balance, buyablep, sessionIdXElement, new XAttribute("status", "0"));
|
||||
var document = new XDocument(new XElement("response", eacharge));
|
||||
return document;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System.Xml.Linq;
|
||||
using Abstractions.Handlers;
|
||||
using Abstractions.Services;
|
||||
using ISessionService = MedusaPluginChargeMachine.Services.ISessionService;
|
||||
|
||||
namespace MedusaPluginChargeMachine.Handlers.LA9
|
||||
{
|
||||
public class CheckoutEaCharge(ISessionService sessionService, XDocument body): Handler
|
||||
{
|
||||
private readonly ISessionService _sessionService = sessionService;
|
||||
private readonly XDocument _body = body;
|
||||
public override void Configure()
|
||||
{
|
||||
Module("eacharge");
|
||||
Method("checkout");
|
||||
}
|
||||
public override XDocument Handle(string model)
|
||||
{
|
||||
var eaCharge = _body.Root?.Element("eacharge")!;
|
||||
var sessionId = eaCharge.Element("sessid")!.Value!;
|
||||
|
||||
_sessionService.RemoveSession(sessionId);
|
||||
|
||||
var checkoutCharge = new XElement("eacharge", new XAttribute("status", "0"));
|
||||
var document = new XDocument(new XElement("response", checkoutCharge));
|
||||
return document;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
using System.Xml.Linq;
|
||||
using Abstractions.Handlers;
|
||||
|
||||
namespace MedusaPluginChargeMachine.Handlers.LA9
|
||||
{
|
||||
public class GetConfigEaChargeHandler(XDocument body): Handler
|
||||
{
|
||||
private readonly XDocument _body = body;
|
||||
|
||||
public override void Configure()
|
||||
{
|
||||
Module("eacharge");
|
||||
Method("getconf");
|
||||
}
|
||||
|
||||
public override XDocument Handle(string model)
|
||||
{
|
||||
var articlerevision = new XElement("articlerevision", 1, new XAttribute("__type", "str"));
|
||||
|
||||
var articletype1 = new XElement("articletype", "DOCMT_0000", new XAttribute("__type", "str"));
|
||||
var articledoc1 = new XElement("articledoc", new XAttribute("__type", "str"));
|
||||
var item1 = new XElement("item", articletype1, articledoc1);
|
||||
|
||||
var articletype2 = new XElement("articletype", "DOCMT_0001", new XAttribute("__type", "str"));
|
||||
var articledoc2 = new XElement("articledoc", new XAttribute("__type", "str"));
|
||||
var item2 = new XElement("item", articletype2, articledoc2);
|
||||
|
||||
var articletype3 = new XElement("articletype", "DOCMT_0002", new XAttribute("__type", "str"));
|
||||
var articledoc3 = new XElement("articledoc", new XAttribute("__type", "str"));
|
||||
var item3 = new XElement("item", articletype3, articledoc3);
|
||||
|
||||
var articletype4 = new XElement("articletype", "DOCMT_0003", new XAttribute("__type", "str"));
|
||||
var articledoc4 = new XElement("articledoc", new XAttribute("__type", "str"));
|
||||
var item4 = new XElement("item", articletype4, articledoc4);
|
||||
|
||||
var articletype5 = new XElement("articletype", "URL_0001_A", new XAttribute("__type", "str"));
|
||||
var articledoc5 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item5 = new XElement("item", articletype5, articledoc5);
|
||||
|
||||
var articletype6 = new XElement("articletype", "URL_0001_B", new XAttribute("__type", "str"));
|
||||
var articledoc6 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item6 = new XElement("item", articletype6, articledoc6);
|
||||
|
||||
var articletype7 = new XElement("articletype", "URL_0002_A", new XAttribute("__type", "str"));
|
||||
var articledoc7 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item7 = new XElement("item", articletype7, articledoc7);
|
||||
|
||||
var articletype8 = new XElement("articletype", "URL_0002_B", new XAttribute("__type", "str"));
|
||||
var articledoc8 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item8 = new XElement("item", articletype8, articledoc8);
|
||||
|
||||
var articletype9 = new XElement("articletype", "URL_0003_A", new XAttribute("__type", "str"));
|
||||
var articledoc9 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item9 = new XElement("item", articletype9, articledoc9);
|
||||
|
||||
var articletype10 = new XElement("articletype", "URL_0003_B", new XAttribute("__type", "str"));
|
||||
var articledoc10 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item10 = new XElement("item", articletype10, articledoc10);
|
||||
|
||||
var articletype11 = new XElement("articletype", "URL_0004_A", new XAttribute("__type", "str"));
|
||||
var articledoc11 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item11 = new XElement("item", articletype11, articledoc11);
|
||||
|
||||
var articletype12 = new XElement("articletype", "URL_0004_B", new XAttribute("__type", "str"));
|
||||
var articledoc12 = new XElement("articledoc", "http://eagate.573.jp", new XAttribute("__type", "str"));
|
||||
var item12 = new XElement("item", articletype12, articledoc12);
|
||||
|
||||
var articletype13 = new XElement("articletype", "PASELIUNIT", new XAttribute("__type", "str"));
|
||||
var articledoc13 = new XElement("articledoc", "P", new XAttribute("__type", "str"));
|
||||
var item13 = new XElement("item", articletype13, articledoc13);
|
||||
|
||||
var articlelist = new XElement("articlelist", item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13);
|
||||
var chargearticle = new XElement("chargearticle", articlerevision, articlelist);
|
||||
|
||||
var chargedaily = new XElement("chargedaily", 0, new XAttribute("__type", "s32"));
|
||||
var chargedailylimit = new XElement("chargedailylimit", 100000, new XAttribute("__type", "s32"));
|
||||
var chargedetail = new XElement("chargedetail", chargedaily, chargedailylimit);
|
||||
|
||||
var currentcode = new XElement("currentcode", 0, new XAttribute("__type", "s32"));
|
||||
var lastchargestatus = new XElement("lastchargestatus", 1, new XAttribute("__type", "s32"));
|
||||
var chargestatus = new XElement("chargestatus", currentcode, lastchargestatus);
|
||||
|
||||
var eacharge = new XElement("eacharge",
|
||||
new XAttribute("status", "0"), new XAttribute("expire", "1200"), chargearticle, chargedetail, chargestatus);
|
||||
|
||||
var document = new XDocument(
|
||||
new XElement("response",
|
||||
eacharge
|
||||
)
|
||||
);
|
||||
|
||||
return document;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Abstractions">
|
||||
<HintPath>..\..\Medusa.net\Abstractions\bin\Debug\net9.0\Abstractions.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.6" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.6" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="9.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.6" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace MedusaPluginChargeMachine.Services
|
||||
{
|
||||
public interface ISessionService
|
||||
{
|
||||
public void AddSession(string sessionId, string refId);
|
||||
public string AddSession(string cardId);
|
||||
public (string sessionId, string refId) GetSession(string sessionId);
|
||||
public void RemoveSession(string sessionId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
namespace MedusaPluginChargeMachine.Services
|
||||
{
|
||||
public class SessionService : ISessionService
|
||||
{
|
||||
private readonly List<(string sessionId, string refId)> sessions = [];
|
||||
public void AddSession(string sessionId, string refId)
|
||||
{
|
||||
sessions.Add((sessionId, refId));
|
||||
}
|
||||
|
||||
public string AddSession(string cardid)
|
||||
{
|
||||
var sessionId = GenerateSessionId();
|
||||
sessions.Add((sessionId, cardid));
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
public (string sessionId, string refId) GetSession(string sessionId)
|
||||
{
|
||||
return sessions.Find(s => s.sessionId == sessionId);
|
||||
}
|
||||
|
||||
public void RemoveSession(string sessionId)
|
||||
{
|
||||
sessions.Remove(sessions.Find(s => s.sessionId == sessionId));
|
||||
}
|
||||
|
||||
private string GenerateSessionId()
|
||||
{
|
||||
return Guid.NewGuid().ToString().Replace("-", "").ToUpper();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user