HiTeachccControlller.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using Azure;
  2. using Azure.Cosmos;
  3. using Azure.Storage.Blobs.Models;
  4. using Azure.Storage.Sas;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Microsoft.AspNetCore.Http;
  7. using Microsoft.AspNetCore.Mvc;
  8. using Microsoft.Extensions.Options;
  9. using StackExchange.Redis;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Dynamic;
  13. using System.IdentityModel.Tokens.Jwt;
  14. using System.Linq;
  15. using System.Text.Json;
  16. using System.Threading.Tasks;
  17. using TEAMModelOS.Models;
  18. using TEAMModelOS.SDK.DI;
  19. using TEAMModelOS.SDK.Extension;
  20. namespace TEAMModelOS.Controllers.Client
  21. {
  22. [Authorize(Roles = "HiTeachCC")]
  23. [Route("hiteachcc")]
  24. [ApiController]
  25. public class HiTeachccControlller : ControllerBase
  26. {
  27. private readonly AzureStorageFactory _azureStorage;
  28. private readonly AzureRedisFactory _azureRedis;
  29. private readonly AzureCosmosFactory _azureCosmos;
  30. private readonly DingDing _dingDing;
  31. private readonly Option _option;
  32. private readonly SnowflakeId _snowflakeId;
  33. public HiTeachccControlller(
  34. AzureStorageFactory azureStorage,
  35. AzureRedisFactory azureRedis,
  36. AzureCosmosFactory azureCosmos,
  37. DingDing dingDing,
  38. SnowflakeId snowflakeId,
  39. IOptionsSnapshot<Option> option)
  40. {
  41. _azureStorage = azureStorage;
  42. _azureRedis = azureRedis;
  43. _azureCosmos = azureCosmos;
  44. _dingDing = dingDing;
  45. _snowflakeId = snowflakeId;
  46. _option = option?.Value;
  47. }
  48. //取得老師資訊
  49. [ProducesResponseType(StatusCodes.Status200OK)]
  50. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  51. [ProducesDefaultResponseType]
  52. [HttpPost("get-teacher-info")]
  53. public async Task<IActionResult> GetTeacherInfo()
  54. {
  55. try
  56. {
  57. string id_token = HttpContext.GetXAuth("IdToken");
  58. if (string.IsNullOrEmpty(id_token)) return BadRequest();
  59. var jwt = new JwtSecurityToken(id_token);
  60. if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
  61. var id = jwt.Payload.Sub;
  62. var container = _azureStorage.GetBlobContainerClient(id);
  63. await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
  64. var (blob_uri, blob_sas_read) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Read);
  65. var (blob_uri_write, blob_sas_write) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write);
  66. return Ok(new { blob_uri, blob_sas_read, blob_sas_write });
  67. }
  68. catch (Exception ex)
  69. {
  70. //await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},Channel/Create()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  71. return BadRequest();
  72. }
  73. }
  74. //刪除Blob下Temp資料夾
  75. [ProducesResponseType(StatusCodes.Status200OK)]
  76. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  77. [ProducesDefaultResponseType]
  78. [HttpGet("del-blob-temp")]
  79. [HttpPost("del-blob-temp")]
  80. public async Task<IActionResult> DelBlobTemp()
  81. {
  82. int error = 0;
  83. string message = string.Empty;
  84. try
  85. {
  86. string id_token = HttpContext.GetXAuth("IdToken");
  87. if (string.IsNullOrEmpty(id_token)) return BadRequest();
  88. var jwt = new JwtSecurityToken(id_token);
  89. if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
  90. var id = jwt.Payload.Sub;
  91. var container = _azureStorage.GetBlobContainerClient(id);
  92. string path = $"temp/HiTeachCC/";
  93. Azure.Pageable<BlobItem> blobs = container.GetBlobs(prefix: path);
  94. foreach (var blobItem in blobs)
  95. {
  96. var blob = container.GetBlobClient(blobItem.Name);
  97. DateTimeOffset blobTime = (DateTimeOffset)blobItem.Properties.CreatedOn;
  98. var now = DateTimeOffset.UtcNow;
  99. DateTimeOffset today = new DateTimeOffset(now.Year, now.Month, now.Day, 0, 0, 0, 0, TimeSpan.Zero);
  100. int diff = DateTimeOffset.Compare(blobTime, today);
  101. if(diff < 0)
  102. {
  103. await blob.DeleteIfExistsAsync();
  104. }
  105. }
  106. return Ok(new { error, message });
  107. }
  108. catch (RequestFailedException blobex)
  109. {
  110. error = 1;
  111. message = blobex.Message;
  112. return Ok(new { error, message });
  113. }
  114. catch (Exception ex)
  115. {
  116. //await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},Channel/Create()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  117. return BadRequest();
  118. }
  119. }
  120. }
  121. }