|
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
using System.Runtime.InteropServices.ComTypes;
|
|
|
using InABox.Core;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using Newtonsoft.Json.Linq;
|
|
|
|
|
|
namespace InABox.Clients
|
|
|
{
|
|
@@ -14,7 +16,7 @@ namespace InABox.Clients
|
|
|
public string? Password { get; set; }
|
|
|
|
|
|
public Platform Platform { get; set; }
|
|
|
- public string Version { get; set; }
|
|
|
+ public string? Version { get; set; }
|
|
|
public Guid Session { get; set; }
|
|
|
|
|
|
public void SerializeBinary(CoreBinaryWriter writer)
|
|
@@ -22,7 +24,7 @@ namespace InABox.Clients
|
|
|
writer.Write(UserID ?? "");
|
|
|
writer.Write(Password ?? "");
|
|
|
writer.Write(Platform.ToString());
|
|
|
- writer.Write(Version);
|
|
|
+ writer.Write(Version ?? "");
|
|
|
writer.Write(Session);
|
|
|
}
|
|
|
|
|
@@ -148,7 +150,7 @@ namespace InABox.Clients
|
|
|
public IEnumerable<object[]> Data { get; set; }
|
|
|
}*/
|
|
|
|
|
|
- public class QueryRequest<TEntity> : BaseRequest<TEntity> where TEntity : Entity, new()
|
|
|
+ public class QueryRequest<TEntity> : BaseRequest<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
public Filter<TEntity>? Filter { get; set; }
|
|
|
|
|
@@ -156,7 +158,39 @@ namespace InABox.Clients
|
|
|
|
|
|
public SortOrder<TEntity>? Sort { get; set; }
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
+ public QueryRequest()
|
|
|
+ {
|
|
|
+ Filter = null;
|
|
|
+ Columns = null;
|
|
|
+ Sort = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public QueryRequest(Filter<TEntity>? filter, Columns<TEntity>? columns, SortOrder<TEntity>? sort)
|
|
|
+ {
|
|
|
+ Filter = filter;
|
|
|
+ Columns = columns;
|
|
|
+ Sort = sort;
|
|
|
+ }
|
|
|
+
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Query;
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.Write(Filter);
|
|
|
+ writer.Write(Columns);
|
|
|
+ writer.Write(Sort);
|
|
|
+ }
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ Filter = reader.ReadFilter<TEntity>();
|
|
|
+ Columns = reader.ReadColumns<TEntity>();
|
|
|
+ Sort = reader.ReadSortOrder<TEntity>();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public class QueryResponse<TEntity> : BaseResponse<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
@@ -215,6 +249,19 @@ namespace InABox.Clients
|
|
|
// Added 11/04/23 to address incompatibility, remove as soon as possible; the relevant code to update is in RestService; update assuming that ReturnOnlyChanged is always true.
|
|
|
public bool ReturnOnlyChanged { get; set; } = false;
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
+ public MultiSaveRequest()
|
|
|
+ {
|
|
|
+ Items = Array.Empty<TEntity>();
|
|
|
+ AuditNote = "";
|
|
|
+ }
|
|
|
+
|
|
|
+ public MultiSaveRequest(TEntity[] items, string auditNode)
|
|
|
+ {
|
|
|
+ Items = items;
|
|
|
+ AuditNote = auditNode;
|
|
|
+ }
|
|
|
+
|
|
|
public override RequestMethod GetMethod() => RequestMethod.MultiSave;
|
|
|
|
|
|
public override void SerializeBinary(CoreBinaryWriter writer)
|
|
@@ -236,12 +283,54 @@ namespace InABox.Clients
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public class MultiSaveResponse<TEntity> : BaseResponse<TEntity> where TEntity : Entity, new()
|
|
|
+ public class MultiSaveResponse<TEntity> : BaseResponse<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
//public Guid[] IDs { get; set; }
|
|
|
- public TEntity[] Items { get; set; }
|
|
|
+ public TEntity[]? Items { get; set; }
|
|
|
|
|
|
public List<Dictionary<string, object?>> ChangedValues { get; set; } = new List<Dictionary<string, object?>>();
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ if(Items is null)
|
|
|
+ {
|
|
|
+ writer.Write(false);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ writer.Write(true);
|
|
|
+ writer.WriteObjects(Items);
|
|
|
+ }
|
|
|
+
|
|
|
+ writer.Write(ChangedValues.Count);
|
|
|
+ foreach(var changed in ChangedValues)
|
|
|
+ {
|
|
|
+ SaveResponse<TEntity>.SerializeChangedValues(writer, changed);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ if (reader.ReadBoolean())
|
|
|
+ {
|
|
|
+ Items = reader.ReadObjects<TEntity>().ToArray();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Items = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ ChangedValues.Clear();
|
|
|
+ var nChangedValues = reader.ReadInt32();
|
|
|
+ for(int i = 0; i < nChangedValues; ++i)
|
|
|
+ {
|
|
|
+ ChangedValues.Add(SaveResponse<TEntity>.DeserializeChangedValues(reader));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public class SaveRequest<TEntity> : BaseRequest<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
@@ -251,6 +340,18 @@ namespace InABox.Clients
|
|
|
|
|
|
public bool ReturnOnlyChanged { get; set; } = false;
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
+ public SaveRequest()
|
|
|
+ {
|
|
|
+ // Newtonsoft should initialise Item to non-null
|
|
|
+ }
|
|
|
+
|
|
|
+ public SaveRequest(TEntity item, string auditNote)
|
|
|
+ {
|
|
|
+ Item = item;
|
|
|
+ AuditNote = auditNote;
|
|
|
+ }
|
|
|
+
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Save;
|
|
|
|
|
|
public override void SerializeBinary(CoreBinaryWriter writer)
|
|
@@ -272,46 +373,265 @@ namespace InABox.Clients
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public class SaveResponse<TEntity> : BaseResponse<TEntity> where TEntity : Entity, new()
|
|
|
+ public class SaveResponse<TEntity> : BaseResponse<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
//public Guid ID { get; set; }
|
|
|
- public TEntity Item { get; set; }
|
|
|
+ public TEntity? Item { get; set; }
|
|
|
|
|
|
public Dictionary<string, object?> ChangedValues { get; set; } = new Dictionary<string, object?>();
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ if (Item is null)
|
|
|
+ {
|
|
|
+ writer.Write(false);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ writer.Write(true);
|
|
|
+ writer.WriteObject(Item);
|
|
|
+ }
|
|
|
+ SerializeChangedValues(writer, ChangedValues);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ if (reader.ReadBoolean())
|
|
|
+ {
|
|
|
+ Item = reader.ReadObject<TEntity>();
|
|
|
+ }
|
|
|
+ ChangedValues = DeserializeChangedValues(reader);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void SerializeChangedValues(CoreBinaryWriter writer, Dictionary<string, object?> changedValues)
|
|
|
+ {
|
|
|
+ var props = new List<Tuple<string, Type, object?>>();
|
|
|
+
|
|
|
+ writer.Write(changedValues.Count);
|
|
|
+ foreach (var (key, value) in changedValues)
|
|
|
+ {
|
|
|
+ var property = DatabaseSchema.Property(typeof(TEntity), key);
|
|
|
+ if (property != null)
|
|
|
+ {
|
|
|
+ props.Add(new Tuple<string, Type, object?>(key, property.PropertyType, value));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Logger.Send(LogType.Error, "", $"Error serializing changedValues: Property {key} does not exist");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach (var (key, type, value) in props)
|
|
|
+ {
|
|
|
+ writer.Write(key);
|
|
|
+ writer.WriteBinaryValue(type, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static Dictionary<string, object?> DeserializeChangedValues(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ var changedDict = new Dictionary<string, object?>();
|
|
|
+ var nChanged = reader.ReadInt32();
|
|
|
+ for (int j = 0; j < nChanged; ++j)
|
|
|
+ {
|
|
|
+ var key = reader.ReadString();
|
|
|
+ var property = DatabaseSchema.Property(typeof(TEntity), key);
|
|
|
+ if (property != null)
|
|
|
+ {
|
|
|
+ changedDict.Add(key, reader.ReadBinaryValue(property.PropertyType));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ throw new Exception($"Property {key} does not exist");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return changedDict;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- public class DeleteRequest<TEntity> : BaseRequest<TEntity> where TEntity : Entity, new()
|
|
|
+ public class DeleteRequest<TEntity> : BaseRequest<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
public TEntity Item { get; set; }
|
|
|
public string AuditNote { get; set; }
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
+ public DeleteRequest()
|
|
|
+ {
|
|
|
+ // Newtonsoft should initialise Item to non-null.
|
|
|
+ }
|
|
|
+
|
|
|
+ public DeleteRequest(TEntity item, string auditNote)
|
|
|
+ {
|
|
|
+ Item = item;
|
|
|
+ AuditNote = auditNote;
|
|
|
+ }
|
|
|
+
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Delete;
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.WriteObject(Item);
|
|
|
+ writer.Write(AuditNote);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ Item = reader.ReadObject<TEntity>();
|
|
|
+ AuditNote = reader.ReadString();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public class DeleteResponse<TEntity> : BaseResponse<TEntity> where TEntity : Entity, new()
|
|
|
+ public class DeleteResponse<TEntity> : BaseResponse<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- public class MultiDeleteRequest<TEntity> : BaseRequest<TEntity> where TEntity : Entity, new()
|
|
|
+ public class MultiDeleteRequest<TEntity> : BaseRequest<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
public TEntity[] Items { get; set; }
|
|
|
public string AuditNote { get; set; }
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
+ public MultiDeleteRequest()
|
|
|
+ {
|
|
|
+ // Newtonsoft should initialise Items to non-null.
|
|
|
+ }
|
|
|
+
|
|
|
+ public MultiDeleteRequest(TEntity[] items, string auditNote)
|
|
|
+ {
|
|
|
+ Items = items;
|
|
|
+ AuditNote = auditNote;
|
|
|
+ }
|
|
|
+
|
|
|
public override RequestMethod GetMethod() => RequestMethod.MultiDelete;
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.WriteObjects(Items);
|
|
|
+ writer.Write(AuditNote);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ Items = reader.ReadObjects<TEntity>().ToArray();
|
|
|
+ AuditNote = reader.ReadString();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public class MultiDeleteResponse<TEntity> : BaseResponse<TEntity> where TEntity : Entity, new()
|
|
|
+ public class MultiDeleteResponse<TEntity> : BaseResponse<TEntity>, ISerializeBinary where TEntity : Entity, new()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- public class MultiQueryRequest : Request
|
|
|
+ public interface IMultiQueryTableQuery
|
|
|
{
|
|
|
- public Dictionary<string, string> TableTypes { get; set; }
|
|
|
- public Dictionary<string, string> Filters { get; set; }
|
|
|
- public Dictionary<string, string> Columns { get; set; }
|
|
|
- public Dictionary<string, string> Sorts { get; set; }
|
|
|
+ string Type { get; }
|
|
|
+
|
|
|
+ IFilter? Filter { get; set; }
|
|
|
+
|
|
|
+ IColumns? Columns { get; set; }
|
|
|
+
|
|
|
+ ISortOrder? Sort { get; set; }
|
|
|
+
|
|
|
+ void SerializeBinary(CoreBinaryWriter writer) => SerializeBinary(this, writer);
|
|
|
+
|
|
|
+ public static void SerializeBinary(IMultiQueryTableQuery query, CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ writer.Write(query.Type);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static IMultiQueryTableQuery DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ var typeString = reader.ReadString();
|
|
|
+ var type = CoreUtils.GetEntity(typeString);
|
|
|
+
|
|
|
+ var query = (Activator.CreateInstance(typeof(MultiQueryTableQuery<>).MakeGenericType(type)) as ISerializeBinary)!;
|
|
|
+ query.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ return (query as IMultiQueryTableQuery)!;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class MultiQueryTableQuery<TEntity> : IMultiQueryTableQuery, ISerializeBinary
|
|
|
+ where TEntity : Entity, new()
|
|
|
+ {
|
|
|
+ public string Type => typeof(TEntity).EntityName();
|
|
|
+
|
|
|
+ public Filter<TEntity>? Filter { get; set; }
|
|
|
+
|
|
|
+ public Columns<TEntity>? Columns { get; set; }
|
|
|
+
|
|
|
+ public SortOrder<TEntity>? Sort { get; set; }
|
|
|
+
|
|
|
+ IFilter? IMultiQueryTableQuery.Filter { get => Filter; set => Filter = value as Filter<TEntity>; }
|
|
|
+ IColumns? IMultiQueryTableQuery.Columns { get => Columns; set => Columns = value as Columns<TEntity>; }
|
|
|
+ ISortOrder? IMultiQueryTableQuery.Sort { get => Sort; set => Sort = value as SortOrder<TEntity>; }
|
|
|
+
|
|
|
+ public void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ IMultiQueryTableQuery.SerializeBinary(this, writer);
|
|
|
+
|
|
|
+ writer.Write(Filter);
|
|
|
+ writer.Write(Columns);
|
|
|
+ writer.Write(Sort);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ Filter = reader.ReadFilter<TEntity>();
|
|
|
+ Columns = reader.ReadColumns<TEntity>();
|
|
|
+ Sort = reader.ReadSortOrder<TEntity>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class MultiQueryRequest : Request, ISerializeBinary
|
|
|
+ {
|
|
|
+ public Dictionary<string, IMultiQueryTableQuery> Queries { get; set; } = new Dictionary<string, IMultiQueryTableQuery>();
|
|
|
+
|
|
|
+ public void AddQuery(string key, IQueryDef queryDef)
|
|
|
+ {
|
|
|
+ var query = Activator.CreateInstance(typeof(MultiQueryTableQuery<>).MakeGenericType(queryDef.Type)) as IMultiQueryTableQuery;
|
|
|
+ query.Filter = queryDef.Filter;
|
|
|
+ query.Columns = queryDef.Columns;
|
|
|
+ query.Sort = queryDef.SortOrder;
|
|
|
+ Queries.Add(key, query);
|
|
|
+ }
|
|
|
|
|
|
public override RequestMethod GetMethod() => RequestMethod.MultiQuery;
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.Write(Queries.Count);
|
|
|
+ foreach(var (key, query) in Queries)
|
|
|
+ {
|
|
|
+ writer.Write(key);
|
|
|
+ query.SerializeBinary(writer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ var nQueries = reader.ReadInt32();
|
|
|
+ for(int i = 0; i < nQueries; ++i)
|
|
|
+ {
|
|
|
+ var key = reader.ReadString();
|
|
|
+ var query = IMultiQueryTableQuery.DeserializeBinary(reader);
|
|
|
+ Queries[key] = query;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public class MultiQueryResponse : Response, ISerializeBinary
|
|
@@ -360,7 +680,7 @@ namespace InABox.Clients
|
|
|
PASSWORD_EXPIRED
|
|
|
}
|
|
|
|
|
|
- public class ValidateRequest : Request
|
|
|
+ public class ValidateRequest : Request, ISerializeBinary
|
|
|
{
|
|
|
public string? UserID { get; set; }
|
|
|
public string? Password { get; set; }
|
|
@@ -371,14 +691,33 @@ namespace InABox.Clients
|
|
|
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Validate;
|
|
|
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.Write(UserID ?? "");
|
|
|
+ writer.Write(Password ?? "");
|
|
|
+ writer.Write(PIN ?? "");
|
|
|
+ writer.Write(UsePIN);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ UserID = reader.ReadString();
|
|
|
+ Password = reader.ReadString();
|
|
|
+ PIN = reader.ReadString();
|
|
|
+ UsePIN = reader.ReadBoolean();
|
|
|
+ }
|
|
|
}
|
|
|
- public class ValidateResponse : Response
|
|
|
+ public class ValidateResponse : Response, ISerializeBinary
|
|
|
{
|
|
|
public ValidationResult ValidationResult { get; set; }
|
|
|
|
|
|
public Guid UserGuid { get; set; }
|
|
|
|
|
|
- public string UserID { get; set; }
|
|
|
+ public string? UserID { get; set; }
|
|
|
|
|
|
public Guid SecurityID { get; set; }
|
|
|
|
|
@@ -387,50 +726,186 @@ namespace InABox.Clients
|
|
|
public string? Recipient2FA { get; set; }
|
|
|
|
|
|
public DateTime PasswordExpiration { get; set; }
|
|
|
-
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.Write((int)ValidationResult);
|
|
|
+ writer.Write(UserGuid);
|
|
|
+ writer.Write(UserID ?? "");
|
|
|
+ writer.Write(SecurityID);
|
|
|
+ writer.Write(Session);
|
|
|
+ writer.Write(Recipient2FA ?? "");
|
|
|
+ writer.Write(PasswordExpiration.ToUniversalTime().Ticks);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ ValidationResult = (ValidationResult)reader.ReadInt32();
|
|
|
+ UserGuid = reader.ReadGuid();
|
|
|
+ UserID = reader.ReadString();
|
|
|
+ SecurityID = reader.ReadGuid();
|
|
|
+ Session = reader.ReadGuid();
|
|
|
+ Recipient2FA = reader.ReadString();
|
|
|
+ PasswordExpiration = new DateTime(reader.ReadInt64(), DateTimeKind.Utc).ToLocalTime();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public class Check2FARequest : Request
|
|
|
+ public class Check2FARequest : Request, ISerializeBinary
|
|
|
{
|
|
|
public string Code { get; set; }
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
+ public Check2FARequest()
|
|
|
+ {
|
|
|
+ Code = "";
|
|
|
+ }
|
|
|
+
|
|
|
+ public Check2FARequest(string code)
|
|
|
+ {
|
|
|
+ Code = code;
|
|
|
+ }
|
|
|
+
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Check2FA;
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.Write(Code);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ Code = reader.ReadString();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public class Check2FAResponse : Response
|
|
|
+ public class Check2FAResponse : Response, ISerializeBinary
|
|
|
{
|
|
|
public bool Valid { get; set; }
|
|
|
+
|
|
|
+ [JsonConstructor]
|
|
|
+ public Check2FAResponse()
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public Check2FAResponse(bool valid)
|
|
|
+ {
|
|
|
+ Valid = valid;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ writer.Write(Valid);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ Valid = reader.ReadBoolean();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public class PingRequest : Request
|
|
|
+ public class PingRequest : Request, ISerializeBinary
|
|
|
{
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Ping;
|
|
|
}
|
|
|
|
|
|
- public class PingResponse : Response { }
|
|
|
+ public class PingResponse : Response, ISerializeBinary { }
|
|
|
|
|
|
- public class InfoRequest : Request
|
|
|
+ public class InfoRequest : Request, ISerializeBinary
|
|
|
{
|
|
|
public override RequestMethod GetMethod() => RequestMethod.Info;
|
|
|
}
|
|
|
|
|
|
- public class DatabaseInfo
|
|
|
+ public class DatabaseInfo : ISerializeBinary
|
|
|
{
|
|
|
public string? ColorScheme { get; set; }
|
|
|
public byte[]? Logo { get; set; }
|
|
|
public string Version { get; set; }
|
|
|
|
|
|
public bool IsHTTPS { get; set; }
|
|
|
+
|
|
|
+ [JsonConstructor]
|
|
|
+ public DatabaseInfo()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public DatabaseInfo(string? colorScheme, byte[]? logo, string version, bool isHTTTPS)
|
|
|
+ {
|
|
|
+ ColorScheme = colorScheme;
|
|
|
+ Logo = logo;
|
|
|
+ Version = version;
|
|
|
+ IsHTTPS = isHTTTPS;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ writer.Write(ColorScheme ?? "");
|
|
|
+
|
|
|
+ if(Logo is null)
|
|
|
+ {
|
|
|
+ writer.Write(0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ writer.Write(Logo.Length);
|
|
|
+ writer.Write(Logo);
|
|
|
+ }
|
|
|
+
|
|
|
+ writer.Write(Version);
|
|
|
+ writer.Write(IsHTTPS);
|
|
|
+ }
|
|
|
+ public void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ ColorScheme = reader.ReadString();
|
|
|
+
|
|
|
+ var nLogoBytes = reader.ReadInt32();
|
|
|
+ Logo = reader.ReadBytes(nLogoBytes);
|
|
|
+
|
|
|
+ Version = reader.ReadString();
|
|
|
+ IsHTTPS = reader.ReadBoolean();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public class InfoResponse : Response
|
|
|
+ public class InfoResponse : Response, ISerializeBinary
|
|
|
{
|
|
|
public DatabaseInfo Info { get; set; }
|
|
|
|
|
|
+ [JsonConstructor]
|
|
|
public InfoResponse() : base()
|
|
|
{
|
|
|
Info = new DatabaseInfo();
|
|
|
}
|
|
|
+
|
|
|
+ public InfoResponse(DatabaseInfo info)
|
|
|
+ {
|
|
|
+ Info = info;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void SerializeBinary(CoreBinaryWriter writer)
|
|
|
+ {
|
|
|
+ base.SerializeBinary(writer);
|
|
|
+
|
|
|
+ Info.SerializeBinary(writer);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void DeserializeBinary(CoreBinaryReader reader)
|
|
|
+ {
|
|
|
+ base.DeserializeBinary(reader);
|
|
|
+
|
|
|
+ Info.DeserializeBinary(reader);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public static class Extensions
|