SyllabusController.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using Microsoft.AspNetCore.Mvc;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using TEAMModelOS.SDK;
  5. using TEAMModelOS.SDK.DI;
  6. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  7. using System;
  8. using TEAMModelOS.SDK.Helper.Common.JsonHelper;
  9. using System.Linq;
  10. using TEAMModelOS.Models;
  11. using System.Text.Json;
  12. using TEAMModelOS.SDK.Extension;
  13. using TEAMModelOS.SDK.Models;
  14. using Microsoft.AspNetCore.Http;
  15. using TEAMModelOS.SDK.Models.Cosmos.Common;
  16. using Azure.Cosmos;
  17. using TEAMModelOS.Services.Common;
  18. using Microsoft.Extensions.Options;
  19. namespace TEAMModelOS.Controllers
  20. {
  21. [ProducesResponseType(StatusCodes.Status200OK)]
  22. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  23. //[Authorize(Roles = "IES5")]
  24. [Route("common/syllabus")]
  25. [ApiController]
  26. //[Authorize]
  27. public class SyllabusController : ControllerBase
  28. {
  29. private readonly AzureCosmosFactory _azureCosmos;
  30. private readonly Option _option;
  31. private readonly DingDing _dingDing;
  32. public SyllabusController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option)
  33. {
  34. _azureCosmos = azureCosmos;
  35. _dingDing = dingDing;
  36. _option = option?.Value;
  37. }
  38. /*
  39. [
  40. {
  41. "id": "章节id",
  42. "volumeId": "册别id",
  43. "scope": "school",
  44. "trees": [
  45. {
  46. "id": "b2b15c99-83cc-eca7-5b4b-e58d2a457c8e",
  47. "pid": "0baf00db-0768-4b62-a8f7-280f6bcebf71",
  48. "title": "第一单元",
  49. "type": 1,
  50. "children": []
  51. }
  52. ]
  53. }
  54. ]
  55. */
  56. /// <summary>
  57. /// 批量保存或更新课纲
  58. ///
  59. /// </summary>
  60. /// <param name="request"></param>
  61. /// <returns></returns>
  62. [ProducesDefaultResponseType]
  63. [HttpPost("upsert-tree")]
  64. public async Task<IActionResult> SaveOrUpdateAsTree(List<SyllabusTreeNode> request)
  65. {
  66. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  67. foreach (SyllabusTreeNode syllabusTree in request) {
  68. List<Tnode> nodes = new List<Tnode>();
  69. SyllabusService.TreeToList(syllabusTree.trees, nodes, now);
  70. if (!string.IsNullOrEmpty(syllabusTree.id))
  71. {
  72. Syllabus syllabus = null;
  73. if (syllabusTree.scope == "school")
  74. {
  75. try
  76. {
  77. syllabus = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Syllabus>(syllabusTree.id, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  78. }
  79. catch
  80. {
  81. }
  82. if (syllabus == null)
  83. {
  84. syllabus = new Syllabus();
  85. syllabus.id = syllabusTree.id;
  86. syllabus.children = nodes;
  87. syllabus.code = $"Syllabus-{syllabusTree.volumeId}";
  88. syllabus.pk = "Syllabus";
  89. syllabus.ttl = -1;
  90. syllabus.volumeId = syllabusTree.volumeId;
  91. syllabus.scope = syllabusTree.scope;
  92. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  93. }
  94. else
  95. {
  96. syllabus.children = nodes;
  97. syllabusTree.auth = syllabus.auth;
  98. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Syllabus>(syllabus,syllabus.id, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  99. }
  100. }
  101. else {
  102. try
  103. {
  104. syllabus = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Syllabus>(syllabusTree.id, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  105. }
  106. catch
  107. {
  108. }
  109. if (syllabus == null)
  110. {
  111. syllabus = new Syllabus();
  112. syllabus.id = syllabusTree.id;
  113. syllabus.children = nodes;
  114. syllabus.code = $"Syllabus-{syllabusTree.volumeId}";
  115. syllabus.pk = "Syllabus";
  116. syllabus.ttl = -1;
  117. syllabus.volumeId = syllabusTree.volumeId;
  118. syllabus.scope = syllabusTree.scope;
  119. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  120. }
  121. else
  122. {
  123. syllabus.children = nodes;
  124. syllabusTree.auth = syllabus.auth;
  125. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  126. }
  127. }
  128. }
  129. else {
  130. string id = Guid.NewGuid().ToString();
  131. syllabusTree.id = id;
  132. Syllabus syllabus = new Syllabus {
  133. id = id,
  134. code = $"Syllabus-{syllabusTree.volumeId}",
  135. pk = "Syllabus",
  136. ttl = -1,
  137. volumeId=syllabusTree.volumeId,
  138. children=nodes,
  139. scope = syllabusTree.scope
  140. };
  141. if (syllabusTree.scope == "school") {
  142. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  143. } else {
  144. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
  145. }
  146. }
  147. }
  148. return Ok(request);
  149. }
  150. /*
  151. {"volumeId":"册别id:0baf00db-0768-4b62-a8f7-280f6bcebf71","scope":"school","volumeCode":"册别分区键"}
  152. */
  153. /// <summary>
  154. /// 查找课纲
  155. /// </summary>
  156. /// <param name="request"></param>
  157. /// <returns></returns>
  158. [ProducesDefaultResponseType]
  159. [HttpPost("find-id")]
  160. public async Task<IActionResult> Find(JsonElement request)
  161. {
  162. var client = _azureCosmos.GetCosmosClient();
  163. if (!request.TryGetProperty("volumeId", out JsonElement volumeId)) return BadRequest();
  164. if (!request.TryGetProperty("volumeCode", out JsonElement volumeCode)) return BadRequest();
  165. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  166. Volume volume = null;
  167. List<SyllabusTreeNode> treeNodes = new List<SyllabusTreeNode>();
  168. List<SyllabusTreeNode> redt = new List<SyllabusTreeNode>();
  169. try {
  170. if (scope.ToString().Equals("school"))
  171. {
  172. volume = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Volume>($"{volumeId}", new PartitionKey($"{volumeCode}"));
  173. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Syllabus>(queryText: $"select value(c) from c ",
  174. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Syllabus-{volumeId}") }))
  175. {
  176. List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
  177. SyllabusTreeNode tree = new SyllabusTreeNode() { id = item.id, scope =item.scope, trees = trees ,volumeId=item.volumeId,auth=item.auth};
  178. treeNodes.Add(tree);
  179. }
  180. }
  181. else
  182. {
  183. volume = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Volume>($"{volumeId}", new PartitionKey($"{volumeCode}"));
  184. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Syllabus>(queryText: $"select value(c) from c ",
  185. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Syllabus-{volumeId}") }))
  186. {
  187. List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
  188. SyllabusTreeNode tree = new SyllabusTreeNode() { id = item.id, scope = item.scope, trees = trees, volumeId = item.volumeId, auth = item.auth };
  189. treeNodes.Add(tree);
  190. }
  191. }
  192. if (volume.syllabusIds.IsNotEmpty())
  193. {
  194. volume.syllabusIds.ForEach(x =>
  195. {
  196. for (int index = 0; index < treeNodes.Count; index++)
  197. {
  198. if (treeNodes[index].id == x)
  199. {
  200. redt.Add(treeNodes[index]);
  201. treeNodes.RemoveAt(index);
  202. }
  203. }
  204. });
  205. redt.AddRange(treeNodes);
  206. return Ok(new { tree = redt });
  207. }
  208. else {
  209. return Ok(new { tree = treeNodes });
  210. }
  211. } catch (Exception ex) {
  212. await _dingDing.SendBotMsg($"OS,{_option.Location},common/syllabus/find-id\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  213. return Ok(new { tree= treeNodes });
  214. }
  215. }
  216. /*
  217. {"id":"章节id","code":"册别id","scope":"school/private"}
  218. */
  219. /// <summary>
  220. /// 删除章节
  221. /// </summary>
  222. /// <param name="request"></param>
  223. /// <returns></returns>
  224. [ProducesDefaultResponseType]
  225. [HttpPost("delete")]
  226. public async Task<IActionResult> Delete(JsonElement request)
  227. {
  228. try
  229. {
  230. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  231. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  232. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  233. var client = _azureCosmos.GetCosmosClient();
  234. if (scope.ToString().Equals("school"))
  235. {
  236. Syllabus syllabus = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Syllabus>(id.ToString(), new PartitionKey($"Syllabus-{code}"));
  237. if (syllabus.auth.IsNotEmpty()) {
  238. foreach (var a in syllabus.auth)
  239. {
  240. try
  241. {
  242. Share share = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Share>(syllabus.id, new PartitionKey($"Share-{a.type}-{a.tmdid}"));
  243. share.agree = -1;
  244. await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Share>(share, syllabus.id, new PartitionKey($"Share-{a.type}-{a.tmdid}"));
  245. }
  246. catch (Exception ex)
  247. {
  248. ///仅用于处理查不到该数据的问题
  249. }
  250. }
  251. }
  252. var response = await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Syllabus-{code}"));
  253. return Ok(new { code = response.Status });
  254. }
  255. else
  256. {
  257. Syllabus syllabus = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Syllabus>(id.ToString(), new PartitionKey($"Syllabus-{code}"));
  258. if (syllabus.auth.IsNotEmpty())
  259. {
  260. foreach (var a in syllabus.auth)
  261. {
  262. try
  263. {
  264. Share share = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Share>(syllabus.id, new PartitionKey($"Share-{a.type}-{a.tmdid}"));
  265. share.agree = -1;
  266. await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Share>(share, syllabus.id, new PartitionKey($"Share-{a.type}-{a.tmdid}"));
  267. }
  268. catch (Exception ex)
  269. {
  270. ///仅用于处理查不到该数据的问题
  271. }
  272. }
  273. }
  274. var response = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Syllabus-{code}"));
  275. return Ok(new { code = response.Status });
  276. }
  277. }
  278. catch {
  279. return Ok(new { code = 404});
  280. }
  281. }
  282. }
  283. }