ArtSettingController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using Azure.Cosmos;
  2. using Azure.Storage.Sas;
  3. using DocumentFormat.OpenXml.Office2010.Excel;
  4. using HTEXLib.COMM.Helpers;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Microsoft.AspNetCore.Http;
  7. using Microsoft.AspNetCore.Mvc;
  8. using Microsoft.Azure.Cosmos.Table;
  9. using Microsoft.Extensions.Configuration;
  10. using Microsoft.Extensions.Options;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Net;
  15. using System.Text;
  16. using System.Text.Json;
  17. using System.Threading.Tasks;
  18. using TEAMModelOS.Filter;
  19. using TEAMModelOS.Models;
  20. using TEAMModelOS.SDK;
  21. using TEAMModelOS.SDK.DI;
  22. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  23. using TEAMModelOS.SDK.Extension;
  24. using TEAMModelOS.SDK.Models;
  25. using TEAMModelOS.SDK.Models.Cosmos.Common;
  26. using TEAMModelOS.SDK.Models.Service;
  27. namespace TEAMModelOS.Controllers
  28. {
  29. [ProducesResponseType(StatusCodes.Status200OK)]
  30. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  31. [Route("area/art-setting")]
  32. [ApiController]
  33. public class ArtSettingController : ControllerBase
  34. {
  35. private readonly AzureCosmosFactory _azureCosmos;
  36. private readonly SnowflakeId _snowflakeId;
  37. private readonly AzureServiceBusFactory _serviceBus;
  38. private readonly DingDing _dingDing;
  39. private readonly Option _option;
  40. private readonly AzureStorageFactory _azureStorage;
  41. private readonly AzureRedisFactory _azureRedis;
  42. public IConfiguration _configuration { get; set; }
  43. private readonly HttpTrigger _httpTrigger;
  44. public ArtSettingController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing,
  45. IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, IConfiguration configuration, HttpTrigger httpTrigger)
  46. {
  47. _azureCosmos = azureCosmos;
  48. _serviceBus = serviceBus;
  49. _snowflakeId = snowflakeId;
  50. _dingDing = dingDing;
  51. _option = option?.Value;
  52. _azureStorage = azureStorage;
  53. _azureRedis = azureRedis;
  54. _configuration = configuration;
  55. _httpTrigger = httpTrigger;
  56. }
  57. /// <param name="request"></param>
  58. /// <returns></returns>
  59. [ProducesDefaultResponseType]
  60. //[AuthToken(Roles = "teacher")]
  61. [HttpPost("find-id")]
  62. #if !DEBUG
  63. [Authorize(Roles = "IES")]
  64. [AuthToken(Roles = "teacher,student,admin,area")]
  65. #endif
  66. public async Task<IActionResult> FindId(JsonElement request)
  67. {
  68. string OAuthShow_domain = HttpContext?.Request?.Host.Host;
  69. if (OAuthShow_domain.Equals("teammodelos.chinacloudsites.cn"))
  70. {
  71. OAuthShow_domain = _option.HostName;
  72. }
  73. if (_option.Location.Equals("China"))
  74. {
  75. OAuthShow_domain = _option.HostName;
  76. }
  77. if (OAuthShow_domain.Equals("localhost"))
  78. {
  79. OAuthShow_domain = "test.teammodel.cn";
  80. }
  81. var client = _azureCosmos.GetCosmosClient();
  82. if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  83. ArtSetting setting = null;
  84. try
  85. {
  86. setting = await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemAsync<ArtSetting>($"{_areaId}", partitionKey: new Azure.Cosmos.PartitionKey("ArtSetting"));
  87. return Ok(new { setting });
  88. }
  89. catch (CosmosException ex) when (ex.Status == 404)
  90. {
  91. var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOAuth");
  92. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'OAuthShow' and Domain {QueryComparisons.Equal} '{OAuthShow_domain}'and Type {QueryComparisons.Equal} 'art' and Code {QueryComparisons.Equal} '{_areaId}' ";
  93. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<OAuthShow>().Where(tbqurey), null);
  94. List<OAuthShow> shows = result?.Results;
  95. if (shows.IsNotEmpty())
  96. {
  97. setting = await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<ArtSetting>("default", new PartitionKey($"ArtSetting"));
  98. setting.id = $"{_areaId}";
  99. setting.pk = "ArtSetting";
  100. setting.code = "ArtSetting";
  101. setting.ttl = -1;
  102. await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(setting, partitionKey: new PartitionKey("ArtSetting"));
  103. return Ok(new { setting });
  104. }
  105. else
  106. {
  107. return Ok(new { error = 401, msg = "艺术评价模组暂未授权。" });
  108. }
  109. }
  110. catch (Exception ex) {
  111. return Ok(new { error = 500, msg = "系统错误。" });
  112. }
  113. }
  114. /// <summary>
  115. /// 保存艺术评价的设置
  116. /// </summary>
  117. /// <param name="request"></param>
  118. /// <returns></returns>
  119. [ProducesDefaultResponseType]
  120. [HttpPost("upsert")]
  121. #if !DEBUG
  122. [Authorize(Roles = "IES")]
  123. [AuthToken(Roles = "teacher,student,admin,area")]
  124. #endif
  125. public async Task<IActionResult> upsert(JsonElement json )
  126. {
  127. string OAuthShow_domain = HttpContext?.Request?.Host.Host;
  128. if (OAuthShow_domain.Equals("teammodelos.chinacloudsites.cn"))
  129. {
  130. OAuthShow_domain = _option.HostName;
  131. }
  132. if (_option.Location.Equals("China"))
  133. {
  134. OAuthShow_domain = _option.HostName;
  135. }
  136. if (OAuthShow_domain.Equals("localhost"))
  137. {
  138. OAuthShow_domain = "test.teammodel.cn";
  139. }
  140. var client = _azureCosmos.GetCosmosClient();
  141. if (!json.TryGetProperty("opt", out JsonElement _opt)) return BadRequest();
  142. if (!json.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  143. ArtSetting setting = null;
  144. try
  145. {
  146. setting = await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<ArtSetting>($"{_areaId}", new PartitionKey($"ArtSetting"));
  147. }
  148. catch (CosmosException ex) when (ex.Status == 404)
  149. {
  150. var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOAuth");
  151. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'OAuthShow' and Domain {QueryComparisons.Equal} '{OAuthShow_domain}'and Type {QueryComparisons.Equal} 'art' and Code {QueryComparisons.Equal} '{_areaId}' ";
  152. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<OAuthShow>().Where(tbqurey), null);
  153. List<OAuthShow> shows = result?.Results;
  154. if (shows.IsNotEmpty())
  155. {
  156. setting = await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<ArtSetting>("default", new PartitionKey($"ArtSetting"));
  157. setting = new ArtSetting();
  158. setting.id = $"{_areaId}";
  159. setting.pk = "ArtSetting";
  160. setting.code = "ArtSetting";
  161. setting.ttl = -1;
  162. await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(setting, partitionKey: new PartitionKey("ArtSetting"));
  163. }
  164. else {
  165. return Ok(new { error = 401,msg="艺术评价模组暂未授权。"});
  166. }
  167. }
  168. catch (Exception ex)
  169. {
  170. return Ok(new { error = 500, msg = "系统服务器错误。" });
  171. }
  172. try
  173. {
  174. switch (true) {
  175. case bool when $"{_opt}".Equals("UpsertDimensions", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("dimensions", out JsonElement _dimensions)):
  176. List<ArtDimension> dimensions = _dimensions.ToObject<List<ArtDimension>>();
  177. if (dimensions.IsNotEmpty()) {
  178. setting.dimensions = dimensions;
  179. }
  180. break;
  181. case bool when $"{_opt}".Equals("UpsertKnowledges", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("knowledges", out JsonElement _knowledges)):
  182. List<ArtKnowledge> knowledges = _knowledges.ToObject<List<ArtKnowledge>>();
  183. knowledges.ForEach(x => {
  184. var knowledge = setting.knowledges.Find(y => x.subjectBind.Equals(y.subjectBind));
  185. if (knowledge != null)
  186. {
  187. knowledge.points = x.points;
  188. knowledge.blocks = x.blocks;
  189. }
  190. else
  191. {
  192. setting.knowledges.Add(x);
  193. }
  194. });
  195. break;
  196. case bool when $"{_opt}".Equals("DeleteSubject", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("subjectId", out JsonElement _subjectId)):
  197. setting.knowledges.RemoveAll(x => x.subjectBind.Equals($"{_subjectId}"));
  198. setting.dimensions.RemoveAll(y => y.subjectBind.Equals($"{_subjectId}")); ;
  199. break;
  200. case bool when $"{_opt}".Equals("DeleteDimension", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("dimension", out JsonElement _dimension)):
  201. setting.dimensions.RemoveAll(x => x.dimension.Equals($"{_dimension}"));
  202. break;
  203. default: break;
  204. }
  205. _ = _httpTrigger.RequestHttpTrigger(new { areaId = setting.id}, _option.Location, "area-artsetting-change");
  206. await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReplaceItemAsync<ArtSetting>(setting, setting.id, partitionKey: new Azure.Cosmos.PartitionKey("ArtSetting"));
  207. return Ok(new { setting });
  208. }
  209. catch (CosmosException ex)
  210. {
  211. return Ok(new { error = ex.Status });
  212. }
  213. }
  214. }
  215. }