BaseClient.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using InABox.Core;
  6. namespace InABox.Clients
  7. {
  8. public abstract class BaseClient<TEntity> : IClient<TEntity> where TEntity : Entity, new()
  9. {
  10. public TimeSpan Timeout { get; set; } = new TimeSpan(0, 1, 0);
  11. public abstract IEnumerable<string> SupportedTypes();
  12. public abstract bool IsConnected();
  13. public event LogEvent? OnLog;
  14. protected void RaiseLogEvent(LogType type, String userid, string format, Guid transaction) => OnLog?.Invoke(type, userid, format, transaction);
  15. #region Validation
  16. public virtual IValidationData Validate(string userid, string password, Guid session)
  17. {
  18. return DoValidate(userid, password, session);
  19. }
  20. protected abstract IValidationData DoValidate(string userid, string password, Guid session = default);
  21. public virtual IValidationData Validate(string pin, Guid session)
  22. {
  23. return DoValidate(pin, session);
  24. }
  25. protected abstract IValidationData DoValidate(string pin, Guid session = default);
  26. public virtual IValidationData Validate(Guid session)
  27. {
  28. return DoValidate(session);
  29. }
  30. protected abstract IValidationData DoValidate(Guid session = default);
  31. #endregion
  32. #region Query
  33. public CoreTable Query(object? filter = null, object? columns = null, object? sort = null, CoreRange? range = null)
  34. {
  35. return DoQuery((Filter<TEntity>?)filter, (Columns<TEntity>?)columns, (SortOrder<TEntity>?)sort, range);
  36. }
  37. public CoreTable Query(IFilter? filter = null, IColumns? columns = null, ISortOrder? sort = null, CoreRange? range = null)
  38. {
  39. return DoQuery((Filter<TEntity>?)filter, (Columns<TEntity>?)columns, (SortOrder<TEntity>?)sort, range);
  40. }
  41. public CoreTable Query(Filter<TEntity>? filter = null, Columns<TEntity>? columns = null, SortOrder<TEntity>? sort = null, CoreRange? range = null)
  42. {
  43. return DoQuery(filter, columns, sort, range);
  44. }
  45. public void Query(Filter<TEntity>? filter, Columns<TEntity>? columns, SortOrder<TEntity>? sort, CoreRange? range, Action<CoreTable?, Exception?> callback)
  46. {
  47. Task.Run(() =>
  48. {
  49. Exception? err = null;
  50. CoreTable? result = null;
  51. try
  52. {
  53. result = DoQuery(filter, columns, sort, range);
  54. }
  55. catch (Exception e)
  56. {
  57. err = e;
  58. }
  59. finally
  60. {
  61. callback.Invoke(result, err);
  62. }
  63. });
  64. }
  65. protected abstract CoreTable DoQuery(Filter<TEntity>? filter, Columns<TEntity>? columns, SortOrder<TEntity>? sort = null, CoreRange? range = null);
  66. #endregion
  67. #region Load
  68. public Entity[] Load(object? filter = null, object? sort = null, CoreRange? range = null)
  69. {
  70. return DoLoad(
  71. (Filter<TEntity>?)filter,
  72. (SortOrder<TEntity>?)sort,
  73. range
  74. ).OfType<Entity>()
  75. .ToArray();
  76. }
  77. public TEntity[] Load(Filter<TEntity>? filter = null, SortOrder<TEntity>? sort = null, CoreRange? range = null)
  78. {
  79. return DoLoad(filter, sort, range);
  80. }
  81. public void Load(Filter<TEntity>? filter, SortOrder<TEntity>? sort, CoreRange? range, Action<TEntity[]?, Exception?> callback)
  82. {
  83. Task.Run(() =>
  84. {
  85. Exception? err = null;
  86. TEntity[]? result = null;
  87. try
  88. {
  89. result = DoLoad(filter, sort, range);
  90. }
  91. catch (Exception e)
  92. {
  93. err = e;
  94. }
  95. finally
  96. {
  97. callback.Invoke(result, err);
  98. }
  99. });
  100. }
  101. protected abstract TEntity[] DoLoad(Filter<TEntity>? filter = null, SortOrder<TEntity>? sort = null, CoreRange? range = null);
  102. #endregion
  103. #region Save
  104. public void Save(object entity, string auditnote)
  105. {
  106. var e = (TEntity)entity;
  107. DoSave(e, auditnote);
  108. }
  109. public void Save(IEnumerable<object> entities, string auditnote)
  110. {
  111. var items = entities.Select(x => (TEntity)x);
  112. DoSave(items, auditnote);
  113. }
  114. public void Save(TEntity entity, string auditnote)
  115. {
  116. DoSave(entity, auditnote);
  117. }
  118. public void Save(IEnumerable<TEntity> entities, string auditnote)
  119. {
  120. DoSave(entities, auditnote);
  121. }
  122. public void Save(TEntity entity, string auditnote, Action<TEntity, Exception?> callback)
  123. {
  124. Task.Run(() =>
  125. {
  126. Exception? err = null;
  127. try
  128. {
  129. DoSave(entity, auditnote);
  130. }
  131. catch (Exception e)
  132. {
  133. err = e;
  134. }
  135. finally
  136. {
  137. callback.Invoke(entity, err);
  138. }
  139. });
  140. }
  141. public void Save(IEnumerable<TEntity> entities, string auditnote, Action<IEnumerable<TEntity>, Exception?> callback)
  142. {
  143. Task.Run(() =>
  144. {
  145. Exception? err = null;
  146. var items = entities.AsArray();
  147. try
  148. {
  149. DoSave(items, auditnote);
  150. }
  151. catch (Exception e)
  152. {
  153. err = e;
  154. }
  155. finally
  156. {
  157. callback.Invoke(items, err);
  158. }
  159. });
  160. }
  161. protected abstract void DoSave(TEntity entity, string auditnote);
  162. protected abstract void DoSave(IEnumerable<TEntity> entities, string auditnote);
  163. #endregion
  164. #region Delete
  165. public void Delete(object entity, string auditnote)
  166. {
  167. DoDelete((TEntity)entity, auditnote);
  168. }
  169. public void Delete(IEnumerable<object> entities, string auditnote)
  170. {
  171. var items = entities.Select(x => (TEntity)x).ToList();
  172. DoDelete(items, auditnote);
  173. }
  174. public void Delete(TEntity entity, string auditnote)
  175. {
  176. DoDelete(entity, auditnote);
  177. }
  178. public void Delete(IEnumerable<TEntity> entities, string auditnote)
  179. {
  180. DoDelete(entities, auditnote);
  181. }
  182. public void Delete(TEntity entity, string auditnote, Action<TEntity, Exception?> callback)
  183. {
  184. Task.Run(() =>
  185. {
  186. Exception? err = null;
  187. try
  188. {
  189. DoDelete(entity, auditnote);
  190. }
  191. catch (Exception e)
  192. {
  193. err = e;
  194. }
  195. finally
  196. {
  197. callback.Invoke(entity, err);
  198. }
  199. }
  200. );
  201. }
  202. public void Delete(IEnumerable<TEntity> entities, string auditnote, Action<IList<TEntity>, Exception?> callback)
  203. {
  204. Task.Run(() =>
  205. {
  206. Exception? err = null;
  207. var items = entities.ToArray();
  208. try
  209. {
  210. DoDelete(items, auditnote);
  211. }
  212. catch (Exception e)
  213. {
  214. err = e;
  215. }
  216. finally
  217. {
  218. callback.Invoke(items, err);
  219. }
  220. });
  221. }
  222. protected abstract void DoDelete(TEntity entity, string auditnote);
  223. protected abstract void DoDelete(IEnumerable<TEntity> entities, string auditnote);
  224. #endregion
  225. #region MultipleTables
  226. public Dictionary<string, CoreTable> QueryMultiple(Dictionary<string, IQueryDef> queries)
  227. {
  228. if(queries.Count == 0)
  229. {
  230. return new Dictionary<string, CoreTable>();
  231. }
  232. else
  233. {
  234. return DoQueryMultiple(queries);
  235. }
  236. }
  237. protected abstract Dictionary<string, CoreTable> DoQueryMultiple(Dictionary<string, IQueryDef> queries);
  238. public void QueryMultiple(Action<Dictionary<string, CoreTable>?, Exception?> callback, Dictionary<string, IQueryDef> queries)
  239. {
  240. Task.Run(() =>
  241. {
  242. Exception? err = null;
  243. Dictionary<string, CoreTable>? result = null;
  244. try
  245. {
  246. result = QueryMultiple(queries);
  247. }
  248. catch (Exception e)
  249. {
  250. err = e;
  251. }
  252. finally
  253. {
  254. callback.Invoke(result, err);
  255. }
  256. });
  257. }
  258. #endregion
  259. #region 2FA
  260. public bool Check2FA(string code, Guid? session)
  261. {
  262. return DoCheck2FA(code, session);
  263. }
  264. protected abstract bool DoCheck2FA(string code, Guid? session);
  265. #endregion
  266. #region Ping
  267. public bool Ping()
  268. {
  269. return DoPing();
  270. }
  271. protected abstract bool DoPing();
  272. #endregion
  273. #region Info
  274. public abstract DatabaseInfo? Info();
  275. #endregion
  276. #region Update
  277. public abstract string Version();
  278. public abstract string ReleaseNotes();
  279. public abstract byte[]? Installer();
  280. #endregion
  281. }
  282. }