PaperController.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text.Json;
  6. using System.Threading.Tasks;
  7. using TEAMModelOS.SDK;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.SDK.Models;
  10. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  11. using Microsoft.AspNetCore.Http;
  12. using System.IdentityModel.Tokens.Jwt;
  13. using Azure.Cosmos;
  14. using TEAMModelOS.SDK.Extension;
  15. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  16. using System.Text;
  17. using Azure.Messaging.ServiceBus;
  18. using Microsoft.Extensions.Configuration;
  19. namespace TEAMModelOS.Controllers
  20. {
  21. [ProducesResponseType(StatusCodes.Status200OK)]
  22. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  23. //[Authorize(Roles = "IES5")]
  24. [Route("paper")]
  25. [ApiController]
  26. public class PaperController: ControllerBase
  27. {
  28. private readonly SnowflakeId _snowflakeId;
  29. private readonly AzureCosmosFactory _azureCosmos;
  30. private readonly AzureStorageFactory _azureStorage;
  31. private readonly AzureServiceBusFactory _serviceBus;
  32. public IConfiguration _configuration { get; set; }
  33. public PaperController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,AzureStorageFactory azureStorage, AzureServiceBusFactory serviceBus, IConfiguration configuration)
  34. {
  35. _azureCosmos = azureCosmos;
  36. _snowflakeId = snowflakeId;
  37. _azureStorage = azureStorage;
  38. _serviceBus = serviceBus;
  39. _configuration = configuration;
  40. }
  41. /// <summary>
  42. /// 删除
  43. /// </summary>
  44. /// <param name="request"></param>
  45. /// <returns></returns>
  46. [ProducesDefaultResponseType]
  47. //[AuthToken(Roles = "Teacher")]
  48. [HttpPost("delete")]
  49. public async Task<IActionResult> Delete(JsonElement request)
  50. {
  51. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  52. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  53. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  54. //ResponseBuilder builder = ResponseBuilder.custom();
  55. Paper paper;
  56. var client = _azureCosmos.GetCosmosClient();
  57. //删除blob 相关资料
  58. await _azureStorage.GetBlobServiceClient().DelectBlobs(code.ToString().Replace("Paper-",""), $"paper/{id}");
  59. //通知删除信息
  60. var messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "delete", root = $"paper/{id}", name = code.ToString().Replace("Paper-", "")}.ToJsonString());
  61. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  62. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  63. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  64. if (scope.ToString().Equals("school"))
  65. {
  66. paper = await client.GetContainer("TEAMModelOS", "School").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
  67. }
  68. else {
  69. paper = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
  70. }
  71. //IdPk items = await _azureCosmos.DeleteAsync<Paper>(request.id, request.pk);
  72. return Ok(new { paper });
  73. }
  74. /// <summary>
  75. /// 查询试卷摘要信息
  76. /// </summary>
  77. /// <param name="request"></param>
  78. /// <returns></returns>
  79. [ProducesDefaultResponseType]
  80. //[AuthToken(Roles = "Teacher")]
  81. [HttpPost("find-summary")]
  82. public async Task<IActionResult> findSummary(JsonElement requert)
  83. {
  84. //ResponseBuilder builder = ResponseBuilder.custom();
  85. if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  86. if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  87. var jwt = new JwtSecurityToken(id_token.GetString());
  88. if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  89. var id = jwt.Payload.Sub;
  90. var client = _azureCosmos.GetCosmosClient();
  91. List<object> papers = new List<object>();
  92. var query = $"select c.id,c.subjectCode,c.code,c.periodCode,c.name,c.itemCount,c.level,c.pointItem,c.pointScore,c.score,c.gradeCode,c.createTime from c where c.id = {id}";
  93. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
  94. {
  95. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  96. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  97. {
  98. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  99. {
  100. papers.Add(obj.ToObject<object>());
  101. }
  102. }
  103. }
  104. return Ok(new { papers });
  105. /* List<string> props = new List<string> {
  106. "subjectCode", "id", "code", "periodCode",
  107. "name","itemCount","level","pointItem","pointScore","score", "gradeCode"
  108. };
  109. if (StringHelper.getKeyCount(request) > 0)
  110. {
  111. return builder.Data(await _azureCosmos.FindByDict<Paper>(request, propertys: props)).build();
  112. }
  113. else {
  114. return builder.build();
  115. }*/
  116. }
  117. /// <summary>
  118. /// 查询试卷
  119. /// </summary>
  120. /// <param name="request"></param>
  121. /// <returns></returns>
  122. [ProducesDefaultResponseType]
  123. //[AuthToken(Roles = "Teacher")]
  124. [HttpPost("find")]
  125. public async Task<IActionResult> Find(JsonElement requert)
  126. {
  127. //ResponseBuilder builder = ResponseBuilder.custom();
  128. //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  129. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  130. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  131. /*var jwt = new JwtSecurityToken(id_token.GetString());
  132. if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  133. var id = jwt.Payload.Sub;*/
  134. var client = _azureCosmos.GetCosmosClient();
  135. StringBuilder sql = new StringBuilder();
  136. Dictionary<string, object> dict = new Dictionary<string, object>();
  137. var emobj = requert.EnumerateObject();
  138. while (emobj.MoveNext())
  139. {
  140. dict[emobj.Current.Name] = emobj.Current.Value;
  141. }
  142. //处理code
  143. if (dict.TryGetValue("code", out object _))
  144. {
  145. dict.Remove("code");
  146. }
  147. List<object> papers = new List<object>();
  148. if (scope.ToString().Equals("school"))
  149. {
  150. sql.Append("select c.id,c.code,c.name,c.blob,c.periodId,c.gradeIds,c.subjectId,c.subjectName,c.score,c.useCount,c.scope,c.scoring,c.createTime from c");
  151. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  152. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
  153. {
  154. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  155. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  156. {
  157. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  158. {
  159. papers.Add(obj.ToObject<object>());
  160. }
  161. }
  162. }
  163. }
  164. if (scope.ToString().Equals("private"))
  165. {
  166. sql.Append("select c.id,c.code,c.name,c.blob,c.subjectName,c.score,c.useCount,c.scope,c.scoring ,c.createTime from c");
  167. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  168. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
  169. {
  170. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  171. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  172. {
  173. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  174. {
  175. papers.Add(obj.ToObject<object>());
  176. }
  177. }
  178. }
  179. }
  180. return Ok(new { papers });
  181. /*if (StringHelper.getKeyCount(request) > 0) {
  182. return builder.Data(await _azureCosmos.FindByDict<Paper>(request)).build();
  183. }
  184. else
  185. {
  186. return builder.build();
  187. }*/
  188. }
  189. /// <summary>
  190. /// 保存试卷
  191. /// </summary>
  192. /// <param name="request"></param>
  193. /// <returns></returns>
  194. [ProducesDefaultResponseType]
  195. //[AuthToken(Roles = "Teacher")]
  196. [HttpPost("upsert")]
  197. public async Task<IActionResult> Upsert(JsonElement request)
  198. {
  199. var client = _azureCosmos.GetCosmosClient();
  200. if (!request.TryGetProperty("paper", out JsonElement papers)) return BadRequest();
  201. if (!request.TryGetProperty("option", out JsonElement option)) return BadRequest();
  202. Paper paper;
  203. paper = papers.ToObject<Paper>();
  204. paper.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  205. paper.size = await _azureStorage.GetBlobContainerClient(paper.code).GetBlobsSize($"paper/{paper.id}");
  206. var messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "update", root = $"paper/{paper.id}", name = $"{paper.code}" }.ToJsonString());
  207. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  208. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  209. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  210. paper.code = "Paper-" + paper.code;
  211. if (option.ToString().Equals("insert"))
  212. {
  213. if (paper.scope.Equals("private"))
  214. {
  215. paper = await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(paper, new PartitionKey($"{paper.code}"));
  216. }
  217. else
  218. {
  219. paper = await client.GetContainer("TEAMModelOS", "School").UpsertItemAsync(paper, new PartitionKey($"{paper.code}"));
  220. }
  221. }
  222. else
  223. {
  224. if (paper.scope.Equals("private"))
  225. {
  226. paper = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
  227. }
  228. else
  229. {
  230. paper = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
  231. }
  232. }
  233. return Ok(new { paper });
  234. }
  235. }
  236. }