BaseClient.cs 9.9 KB

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