using AyCode.Services.SignalRs;
using FruitBank.Common.Dtos;
using FruitBank.Common.SignalRs;
using System.Globalization;
using System.Text.Json.Serialization;
namespace Mango.Sandbox.EndPoints;
///
/// Egyszerű teszt SignalR endpoint a DevAdminSignalRHub teszteléséhez.
/// Ez az endpoint minimális függőséggel rendelkezik, hogy könnyebben diagnosztizálható legyen a SignalR Hub működése.
///
public class TestSignalREndpoint : ITestSignalREndpointServer
{
#region Primitív Paraméter Handlerek
///
/// Egyszerű ping metódus - visszaadja a kapott üzenetet és egy timestampet.
///
[SignalR(TestSignalRTags.PingTag)]
public Task Ping(string message)
{
return Task.FromResult(new TestPingResponse
{
Message = message,
ReceivedAt = DateTime.UtcNow,
ServerInfo = $"Sandbox Server - {Environment.MachineName}"
});
}
///
/// Int paraméter teszt
///
[SignalR(TestSignalRTags.SingleIntParam)]
public Task HandleSingleInt(int value)
{
return Task.FromResult($"Received: {value}");
}
///
/// Két int paraméter teszt
///
[SignalR(TestSignalRTags.TwoIntParams)]
public Task HandleTwoInts(int a, int b)
{
return Task.FromResult(a + b);
}
///
/// Bool paraméter teszt
///
[SignalR(TestSignalRTags.BoolParam)]
public Task HandleBool(bool loadRelations)
{
return Task.FromResult(loadRelations);
}
///
/// String paraméter teszt
///
[SignalR(TestSignalRTags.StringParam)]
public Task HandleString(string text)
{
return Task.FromResult($"Echo: {text}");
}
///
/// Guid paraméter teszt
///
[SignalR(TestSignalRTags.GuidParam)]
public Task HandleGuid(Guid id)
{
return Task.FromResult(id);
}
///
/// Enum paraméter teszt
///
[SignalR(TestSignalRTags.EnumParam)]
public Task HandleEnum(TestStatus status)
{
return Task.FromResult(status);
}
///
/// Paraméter nélküli metódus teszt
///
[SignalR(TestSignalRTags.NoParams)]
public Task HandleNoParams()
{
return Task.FromResult("OK");
}
///
/// Több típusú paraméter teszt
///
[SignalR(TestSignalRTags.MultipleTypesParams)]
public Task HandleMultipleTypes(bool flag, string text, int number)
{
return Task.FromResult($"{flag}-{text}-{number}");
}
///
/// Decimal paraméter teszt
///
[SignalR(TestSignalRTags.DecimalParam)]
public Task HandleDecimal(decimal value)
{
return Task.FromResult(value * 2);
}
///
/// DateTime paraméter teszt
///
[SignalR(TestSignalRTags.DateTimeParam)]
public Task HandleDateTime(DateTime dateTime)
{
return Task.FromResult(dateTime);
}
///
/// Double paraméter teszt
///
[SignalR(TestSignalRTags.DoubleParam)]
public Task HandleDouble(double value)
{
return Task.FromResult(value);
}
///
/// Long paraméter teszt
///
[SignalR(TestSignalRTags.LongParam)]
public Task HandleLong(long value)
{
return Task.FromResult(value);
}
#endregion
#region Komplex Objektum Handlerek
///
/// Egyszerű echo metódus - visszaadja a kapott objektumot változtatás nélkül.
///
[SignalR(TestSignalRTags.EchoTag)]
public Task Echo(TestEchoRequest request)
{
return Task.FromResult(new TestEchoResponse
{
Id = request?.Id ?? 0,
Name = request?.Name ?? "Unknown",
Timestamp = DateTime.UtcNow,
EchoedSuccessfully = true
});
}
///
/// TestOrderItem komplex objektum teszt
///
[SignalR(TestSignalRTags.TestOrderItemParam)]
public Task HandleTestOrderItem(TestOrderItem item)
{
return Task.FromResult(new TestOrderItem
{
Id = item.Id,
ProductName = $"Processed: {item.ProductName}",
Quantity = item.Quantity * 2,
UnitPrice = item.UnitPrice * 2,
});
}
///
/// TestOrder komplex objektum teszt (beágyazott objektumokkal)
///
[SignalR(TestSignalRTags.TestOrderParam)]
public Task HandleTestOrder(TestOrder order)
{
return Task.FromResult(order);
}
///
/// SharedTag komplex objektum teszt
///
[SignalR(TestSignalRTags.SharedTagParam)]
public Task HandleSharedTag(SharedTag tag)
{
return Task.FromResult(tag);
}
#endregion
#region Kollekció Handlerek
///
/// Lista visszaadása teszthez.
///
[SignalR(TestSignalRTags.GetTestItems)]
public Task> GetTestItems()
{
var items = new List
{
new() { Id = 1, Name = "Item 1", Value = 100.5m },
new() { Id = 2, Name = "Item 2", Value = 200.75m },
new() { Id = 3, Name = "Item 3", Value = 300.25m }
};
return Task.FromResult(items);
}
///
/// Int tömb paraméter teszt
///
[SignalR(TestSignalRTags.IntArrayParam)]
public Task HandleIntArray(int[] values)
{
return Task.FromResult(values.Select(x => x * 2).ToArray());
}
///
/// Guid tömb paraméter teszt
///
[SignalR(TestSignalRTags.GuidArrayParam)]
public Task HandleGuidArray(Guid[] ids)
{
return Task.FromResult(ids);
}
///
/// String lista paraméter teszt
///
[SignalR(TestSignalRTags.StringListParam)]
public Task> HandleStringList(List items)
{
return Task.FromResult(items.Select(x => x.ToUpper()).ToList());
}
///
/// TestOrderItem lista paraméter teszt
///
[SignalR(TestSignalRTags.TestOrderItemListParam)]
public Task> HandleTestOrderItemList(List items)
{
return Task.FromResult(items);
}
///
/// Int lista paraméter teszt
///
[SignalR(TestSignalRTags.IntListParam)]
public Task> HandleIntList(List numbers)
{
return Task.FromResult(numbers.Select(x => x * 2).ToList());
}
///
/// Bool tömb paraméter teszt
///
[SignalR(TestSignalRTags.BoolArrayParam)]
public Task HandleBoolArray(bool[] flags)
{
return Task.FromResult(flags);
}
///
/// Vegyes paraméterek tömbbel teszt
///
[SignalR(TestSignalRTags.MixedWithArrayParam)]
public Task HandleMixedWithArray(bool flag, int[] numbers, string text)
{
return Task.FromResult($"{flag}-[{string.Join(",", numbers)}]-{text}");
}
///
/// Beágyazott lista teszt
///
[SignalR(TestSignalRTags.NestedListParam)]
public Task>> HandleNestedList(List> nestedList)
{
return Task.FromResult(nestedList);
}
///
/// Long tömb paraméter teszt
///
[SignalR(TestSignalRTags.LongArrayParam)]
public Task HandleLongArray(long[] values)
{
return Task.FromResult(values);
}
///
/// Decimal tömb paraméter teszt
///
[SignalR(TestSignalRTags.DecimalArrayParam)]
public Task HandleDecimalArray(decimal[] values)
{
return Task.FromResult(values);
}
///
/// DateTime tömb paraméter teszt
///
[SignalR(TestSignalRTags.DateTimeArrayParam)]
public Task HandleDateTimeArray(DateTime[] values)
{
return Task.FromResult(values);
}
///
/// Enum tömb paraméter teszt
///
[SignalR(TestSignalRTags.EnumArrayParam)]
public Task HandleEnumArray(TestStatus[] values)
{
return Task.FromResult(values);
}
///
/// Double tömb paraméter teszt
///
[SignalR(TestSignalRTags.DoubleArrayParam)]
public Task HandleDoubleArray(double[] values)
{
return Task.FromResult(values);
}
///
/// SharedTag tömb paraméter teszt
///
[SignalR(TestSignalRTags.SharedTagArrayParam)]
public Task HandleSharedTagArray(SharedTag[] tags)
{
return Task.FromResult(tags);
}
///
/// Dictionary paraméter teszt
///
[SignalR(TestSignalRTags.DictionaryParam)]
public Task> HandleDictionary(Dictionary dict)
{
return Task.FromResult(dict);
}
#endregion
#region Vegyes Paraméter Handlerek
///
/// Int és DTO vegyes paraméter teszt
///
[SignalR(TestSignalRTags.IntAndDtoParam)]
public Task HandleIntAndDto(int id, TestOrderItem item)
{
return Task.FromResult($"{id}-{item?.ProductName}");
}
///
/// DTO és lista vegyes paraméter teszt
///
[SignalR(TestSignalRTags.DtoAndListParam)]
public Task HandleDtoAndList(TestOrderItem item, List numbers)
{
return Task.FromResult($"{item?.ProductName}-[{string.Join(",", numbers ?? [])}]");
}
///
/// Három komplex paraméter teszt
///
[SignalR(TestSignalRTags.ThreeComplexParams)]
public Task HandleThreeComplexParams(TestOrderItem item, List tags, SharedTag sharedTag)
{
return Task.FromResult($"{item?.ProductName}-{tags?.Count}-{sharedTag?.Name}");
}
///
/// Öt paraméter teszt
///
[SignalR(TestSignalRTags.FiveParams)]
public Task HandleFiveParams(int a, string b, bool c, Guid d, decimal e)
{
return Task.FromResult($"{a}-{b}-{c}-{d}-{e.ToString(CultureInfo.InvariantCulture)}");
}
#endregion
#region FruitBank Specifikus Metódusok
///
/// OrderDto lista visszaadása ID-k alapján
///
[SignalR(SignalRTags.GetAllOrderDtoByIds)]
public Task> GetOrderDtoByIds(int[] orderIds)
{
return Task.FromResult(new List());
}
#endregion
#region Binary Serialization Tesztek - CustomerDto reprodukálás
///
/// CustomerDto lista visszaadása - reprodukálja a GetMeasuringUsers forgatókönyvet
///
[SignalR(TestSignalRTags.GetCustomerDtoList)]
public Task> GetCustomerDtoList()
{
var customers = new List
{
new()
{
Id = 1,
Username = "user1",
Email = "user1@test.com",
FirstName = "First1",
LastName = "Last1",
RegisteredInStoreId = 1,
Deleted = false
},
new()
{
Id = 2,
Username = "user2",
Email = "user2@test.com",
FirstName = "First2",
LastName = "Last2",
RegisteredInStoreId = 1,
Deleted = false
},
new()
{
Id = 3,
Username = "user3",
Email = "user3@test.com",
FirstName = "First3",
LastName = "Last3",
RegisteredInStoreId = 2,
Deleted = true
}
};
return Task.FromResult(customers);
}
///
/// Nagyobb CustomerDto lista - több interned string a szerializációban
///
[SignalR(TestSignalRTags.GetLargeCustomerDtoList)]
public Task> GetLargeCustomerDtoList()
{
var customers = new List();
for (int i = 1; i <= 30; i++)
{
customers.Add(new TestCustomerDto
{
Id = i,
Username = $"user{i}",
Email = $"user{i}@test.com",
FirstName = $"FirstName{i}",
LastName = $"LastName{i}",
RegisteredInStoreId = (i % 3) + 1,
Deleted = i % 5 == 0
});
}
return Task.FromResult(customers);
}
#endregion
}
///
/// Teszt SignalR Tags - egyszerű értékek a teszteléshez
///
public static class TestSignalRTags
{
// Eredeti tagok
public const int PingTag = SignalRTags.PingTag;
public const int EchoTag = SignalRTags.EchoTag;
public const int GetTestItems = 9003;
// Primitív paraméterek
public const int SingleIntParam = 9010;
public const int TwoIntParams = 9011;
public const int BoolParam = 9012;
public const int StringParam = 9013;
public const int GuidParam = 9014;
public const int EnumParam = 9015;
public const int NoParams = 9016;
public const int MultipleTypesParams = 9017;
public const int DecimalParam = 9018;
public const int DateTimeParam = 9019;
public const int DoubleParam = 9020;
public const int LongParam = 9021;
// Komplex objektumok
public const int TestOrderItemParam = 9030;
public const int TestOrderParam = 9031;
public const int SharedTagParam = 9032;
// Kollekciók
public const int IntArrayParam = 9040;
public const int GuidArrayParam = 9041;
public const int StringListParam = 9042;
public const int TestOrderItemListParam = 9043;
public const int IntListParam = 9044;
public const int BoolArrayParam = 9045;
public const int MixedWithArrayParam = 9046;
public const int NestedListParam = 9047;
public const int LongArrayParam = 9048;
public const int DecimalArrayParam = 9049;
public const int DateTimeArrayParam = 9050;
public const int EnumArrayParam = 9051;
public const int DoubleArrayParam = 9052;
public const int SharedTagArrayParam = 9053;
public const int DictionaryParam = 9054;
// Vegyes paraméterek
public const int IntAndDtoParam = 9060;
public const int DtoAndListParam = 9061;
public const int ThreeComplexParams = 9062;
public const int FiveParams = 9063;
// Binary serialization tesztek - CustomerDto reprodukálás
public const int GetCustomerDtoList = 9070;
public const int GetLargeCustomerDtoList = 9071;
}
///
/// Interface a TestSignalREndpoint-hoz
///
public interface ITestSignalREndpointServer
{
// Primitívek
Task Ping(string message);
Task HandleSingleInt(int value);
Task HandleTwoInts(int a, int b);
Task HandleBool(bool loadRelations);
Task HandleString(string text);
Task HandleGuid(Guid id);
Task HandleEnum(TestStatus status);
Task HandleNoParams();
Task HandleMultipleTypes(bool flag, string text, int number);
Task HandleDecimal(decimal value);
Task HandleDateTime(DateTime dateTime);
Task HandleDouble(double value);
Task HandleLong(long value);
// Komplex objektumok
Task Echo(TestEchoRequest request);
Task HandleTestOrderItem(TestOrderItem item);
Task HandleTestOrder(TestOrder order);
Task HandleSharedTag(SharedTag tag);
// Kollekciók
Task> GetTestItems();
Task HandleIntArray(int[] values);
Task HandleGuidArray(Guid[] ids);
Task> HandleStringList(List items);
Task> HandleTestOrderItemList(List items);
Task> HandleIntList(List numbers);
Task HandleBoolArray(bool[] flags);
Task HandleMixedWithArray(bool flag, int[] numbers, string text);
Task>> HandleNestedList(List> nestedList);
Task HandleLongArray(long[] values);
Task HandleDecimalArray(decimal[] values);
Task HandleDateTimeArray(DateTime[] values);
Task HandleEnumArray(TestStatus[] values);
Task HandleDoubleArray(double[] values);
Task HandleSharedTagArray(SharedTag[] tags);
Task> HandleDictionary(Dictionary dict);
// Vegyes paraméterek
Task HandleIntAndDto(int id, TestOrderItem item);
Task HandleDtoAndList(TestOrderItem item, List numbers);
Task HandleThreeComplexParams(TestOrderItem item, List tags, SharedTag sharedTag);
Task HandleFiveParams(int a, string b, bool c, Guid d, decimal e);
// Binary serialization tesztek - CustomerDto reprodukálás
Task> GetCustomerDtoList();
Task> GetLargeCustomerDtoList();
}
#region DTOs
public class TestPingResponse
{
public string Message { get; set; } = string.Empty;
public DateTime ReceivedAt { get; set; }
public string ServerInfo { get; set; } = string.Empty;
}
public class TestEchoRequest
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
}
public class TestEchoResponse
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public DateTime Timestamp { get; set; }
public bool EchoedSuccessfully { get; set; }
}
public class TestItem
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Value { get; set; }
}
///
/// Teszt enum a különböző állapotok teszteléséhez
///
public enum TestStatus
{
Pending = 0,
Active = 1,
Completed = 2,
Cancelled = 3
}
///
/// Teszt rendelési tétel komplex objektum teszteléshez
///
public class TestOrderItem
{
public int Id { get; set; }
public string ProductName { get; set; } = string.Empty;
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal TotalPrice => Quantity * UnitPrice;
}
///
/// Teszt rendelés beágyazott objektumokkal
///
public class TestOrder
{
public int Id { get; set; }
public string CustomerName { get; set; } = string.Empty;
public DateTime OrderDate { get; set; }
public TestStatus Status { get; set; }
public List Items { get; set; } = [];
public decimal TotalAmount => Items.Sum(x => x.TotalPrice);
}
///
/// Megosztott tag objektum teszteléshez
///
public class SharedTag
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public DateTime CreatedAt { get; set; }
public bool IsActive { get; set; }
}
///
/// Teszt CustomerDto a felhasználók teszteléséhez
///
public class TestCustomerDto
{
public int Id { get; set; }
public string Username { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public string FullName => $"{LastName} {FirstName}";
public int RegisteredInStoreId { get; set; }
public bool Deleted { get; set; }
}
#endregion