123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- using Microsoft.AspNetCore.Mvc;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Helper.Common.StringHelper;
- using Microsoft.AspNetCore.Http;
- using System.IdentityModel.Tokens.Jwt;
- using Azure.Cosmos;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
- using System.Text;
- using Azure.Messaging.ServiceBus;
- using Microsoft.Extensions.Configuration;
- namespace TEAMModelOS.Controllers
- {
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- //[Authorize(Roles = "IES5")]
- [Route("paper")]
- [ApiController]
- public class PaperController: ControllerBase
- {
- private readonly SnowflakeId _snowflakeId;
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureServiceBusFactory _serviceBus;
- public IConfiguration _configuration { get; set; }
- public PaperController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,AzureStorageFactory azureStorage, AzureServiceBusFactory serviceBus, IConfiguration configuration)
- {
- _azureCosmos = azureCosmos;
- _snowflakeId = snowflakeId;
- _azureStorage = azureStorage;
- _serviceBus = serviceBus;
- _configuration = configuration;
- }
- /// <summary>
- /// 删除
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "Teacher")]
- [HttpPost("delete")]
- public async Task<IActionResult> Delete(JsonElement request)
- {
- if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- //ResponseBuilder builder = ResponseBuilder.custom();
- Paper paper;
- var client = _azureCosmos.GetCosmosClient();
- //删除blob 相关资料
- await _azureStorage.GetBlobServiceClient().DelectBlobs(code.ToString().Replace("Paper-",""), $"paper/{id}");
- //通知删除信息
- var messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "delete", root = $"paper/{id}", name = code.ToString().Replace("Paper-", "")}.ToJsonString());
- messageBlob.ApplicationProperties.Add("name", "BlobRoot");
- var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
- await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
- if (scope.ToString().Equals("school"))
- {
- paper = await client.GetContainer("TEAMModelOS", "School").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
- }
- else {
- paper = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
- }
- //IdPk items = await _azureCosmos.DeleteAsync<Paper>(request.id, request.pk);
- return Ok(new { paper });
- }
- /// <summary>
- /// 查询试卷摘要信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "Teacher")]
- [HttpPost("find-summary")]
- public async Task<IActionResult> findSummary(JsonElement requert)
- {
- //ResponseBuilder builder = ResponseBuilder.custom();
- if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
- if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
- var jwt = new JwtSecurityToken(id_token.GetString());
- if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
- var id = jwt.Payload.Sub;
- var client = _azureCosmos.GetCosmosClient();
- List<object> papers = new List<object>();
- 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}";
- await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- papers.Add(obj.ToObject<object>());
- }
- }
- }
- return Ok(new { papers });
- /* List<string> props = new List<string> {
- "subjectCode", "id", "code", "periodCode",
- "name","itemCount","level","pointItem","pointScore","score", "gradeCode"
- };
- if (StringHelper.getKeyCount(request) > 0)
- {
- return builder.Data(await _azureCosmos.FindByDict<Paper>(request, propertys: props)).build();
- }
- else {
- return builder.build();
- }*/
- }
- /// <summary>
- /// 查询试卷
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "Teacher")]
- [HttpPost("find")]
- public async Task<IActionResult> Find(JsonElement requert)
- {
- //ResponseBuilder builder = ResponseBuilder.custom();
- //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
- if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
- if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- /*var jwt = new JwtSecurityToken(id_token.GetString());
- if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
- var id = jwt.Payload.Sub;*/
- var client = _azureCosmos.GetCosmosClient();
- StringBuilder sql = new StringBuilder();
- Dictionary<string, object> dict = new Dictionary<string, object>();
- var emobj = requert.EnumerateObject();
- while (emobj.MoveNext())
- {
- dict[emobj.Current.Name] = emobj.Current.Value;
- }
- //处理code
- if (dict.TryGetValue("code", out object _))
- {
- dict.Remove("code");
- }
- List<object> papers = new List<object>();
-
- if (scope.ToString().Equals("school"))
- {
- 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");
- AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
- await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- papers.Add(obj.ToObject<object>());
- }
- }
- }
- }
- if (scope.ToString().Equals("private"))
- {
- 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");
- AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
- await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- papers.Add(obj.ToObject<object>());
- }
- }
- }
- }
- return Ok(new { papers });
- /*if (StringHelper.getKeyCount(request) > 0) {
- return builder.Data(await _azureCosmos.FindByDict<Paper>(request)).build();
- }
- else
- {
- return builder.build();
- }*/
- }
- /// <summary>
- /// 保存试卷
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "Teacher")]
- [HttpPost("upsert")]
- public async Task<IActionResult> Upsert(JsonElement request)
- {
- var client = _azureCosmos.GetCosmosClient();
- if (!request.TryGetProperty("paper", out JsonElement papers)) return BadRequest();
- if (!request.TryGetProperty("option", out JsonElement option)) return BadRequest();
- Paper paper;
- paper = papers.ToObject<Paper>();
- paper.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- paper.size = await _azureStorage.GetBlobContainerClient(paper.code).GetBlobsSize($"paper/{paper.id}");
- var messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "update", root = $"paper/{paper.id}", name = $"{paper.code}" }.ToJsonString());
- messageBlob.ApplicationProperties.Add("name", "BlobRoot");
- var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
- await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
- paper.code = "Paper-" + paper.code;
- if (option.ToString().Equals("insert"))
- {
- if (paper.scope.Equals("private"))
- {
- paper = await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(paper, new PartitionKey($"{paper.code}"));
- }
- else
- {
- paper = await client.GetContainer("TEAMModelOS", "School").UpsertItemAsync(paper, new PartitionKey($"{paper.code}"));
- }
-
- }
- else
- {
- if (paper.scope.Equals("private"))
- {
- paper = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
- }
- else
- {
- paper = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
- }
- }
- return Ok(new { paper });
- }
- }
- }
|