123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- using Azure.Cosmos;
- using Azure.Storage.Sas;
- using DocumentFormat.OpenXml.Office2010.Excel;
- using HTEXLib.COMM.Helpers;
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Azure.Cosmos.Table;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Options;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Filter;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Cosmos.Common;
- using TEAMModelOS.SDK.Models.Service;
- namespace TEAMModelOS.Controllers
- {
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- [Route("area/art-setting")]
- [ApiController]
- public class ArtSettingController : ControllerBase
- {
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly SnowflakeId _snowflakeId;
- private readonly AzureServiceBusFactory _serviceBus;
- private readonly DingDing _dingDing;
- private readonly Option _option;
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureRedisFactory _azureRedis;
- public IConfiguration _configuration { get; set; }
- private readonly HttpTrigger _httpTrigger;
- public ArtSettingController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing,
- IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, IConfiguration configuration, HttpTrigger httpTrigger)
- {
- _azureCosmos = azureCosmos;
- _serviceBus = serviceBus;
- _snowflakeId = snowflakeId;
- _dingDing = dingDing;
- _option = option?.Value;
- _azureStorage = azureStorage;
- _azureRedis = azureRedis;
- _configuration = configuration;
- _httpTrigger = httpTrigger;
- }
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("find-id")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- [AuthToken(Roles = "teacher,student,admin,area")]
- #endif
- public async Task<IActionResult> FindId(JsonElement request)
- {
- string OAuthShow_domain = HttpContext?.Request?.Host.Host;
- if (OAuthShow_domain.Equals("teammodelos.chinacloudsites.cn"))
- {
- OAuthShow_domain = _option.HostName;
- }
- if (_option.Location.Equals("China"))
- {
- OAuthShow_domain = _option.HostName;
- }
- if (OAuthShow_domain.Equals("localhost"))
- {
- OAuthShow_domain = "test.teammodel.cn";
- }
- var client = _azureCosmos.GetCosmosClient();
- if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
- ArtSetting setting = null;
- try
- {
- setting = await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemAsync<ArtSetting>($"{_areaId}", partitionKey: new Azure.Cosmos.PartitionKey("ArtSetting"));
- return Ok(new { setting });
- }
- catch (CosmosException ex) when (ex.Status == 404)
- {
- var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOAuth");
- string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'OAuthShow' and Domain {QueryComparisons.Equal} '{OAuthShow_domain}'and Type {QueryComparisons.Equal} 'art' and Code {QueryComparisons.Equal} '{_areaId}' ";
- var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<OAuthShow>().Where(tbqurey), null);
- List<OAuthShow> shows = result?.Results;
- if (shows.IsNotEmpty())
- {
- setting = await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<ArtSetting>("default", new PartitionKey($"ArtSetting"));
- setting.id = $"{_areaId}";
- setting.pk = "ArtSetting";
- setting.code = "ArtSetting";
- setting.ttl = -1;
- await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(setting, partitionKey: new PartitionKey("ArtSetting"));
- return Ok(new { setting });
- }
- else
- {
- return Ok(new { error = 401, msg = "艺术评价模组暂未授权。" });
- }
- }
- catch (Exception ex) {
- return Ok(new { error = 500, msg = "系统错误。" });
- }
- }
- /// <summary>
- /// 保存艺术评价的设置
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("upsert")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- [AuthToken(Roles = "teacher,student,admin,area")]
- #endif
- public async Task<IActionResult> upsert(JsonElement json )
- {
- string OAuthShow_domain = HttpContext?.Request?.Host.Host;
- if (OAuthShow_domain.Equals("teammodelos.chinacloudsites.cn"))
- {
- OAuthShow_domain = _option.HostName;
- }
- if (_option.Location.Equals("China"))
- {
- OAuthShow_domain = _option.HostName;
- }
- if (OAuthShow_domain.Equals("localhost"))
- {
- OAuthShow_domain = "test.teammodel.cn";
- }
- var client = _azureCosmos.GetCosmosClient();
- if (!json.TryGetProperty("opt", out JsonElement _opt)) return BadRequest();
- if (!json.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
- ArtSetting setting = null;
- try
- {
- setting = await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<ArtSetting>($"{_areaId}", new PartitionKey($"ArtSetting"));
- }
- catch (CosmosException ex) when (ex.Status == 404)
- {
- var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOAuth");
- string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'OAuthShow' and Domain {QueryComparisons.Equal} '{OAuthShow_domain}'and Type {QueryComparisons.Equal} 'art' and Code {QueryComparisons.Equal} '{_areaId}' ";
- var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<OAuthShow>().Where(tbqurey), null);
- List<OAuthShow> shows = result?.Results;
- if (shows.IsNotEmpty())
- {
- setting = await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<ArtSetting>("default", new PartitionKey($"ArtSetting"));
- setting = new ArtSetting();
- setting.id = $"{_areaId}";
- setting.pk = "ArtSetting";
- setting.code = "ArtSetting";
- setting.ttl = -1;
- await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(setting, partitionKey: new PartitionKey("ArtSetting"));
- }
- else {
- return Ok(new { error = 401,msg="艺术评价模组暂未授权。"});
- }
-
- }
- catch (Exception ex)
- {
- return Ok(new { error = 500, msg = "系统服务器错误。" });
- }
- try
- {
- switch (true) {
- case bool when $"{_opt}".Equals("UpsertDimensions", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("dimensions", out JsonElement _dimensions)):
- List<ArtDimension> dimensions = _dimensions.ToObject<List<ArtDimension>>();
- if (dimensions.IsNotEmpty()) {
- setting.dimensions = dimensions;
- }
- break;
- case bool when $"{_opt}".Equals("UpsertKnowledges", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("knowledges", out JsonElement _knowledges)):
- List<ArtKnowledge> knowledges = _knowledges.ToObject<List<ArtKnowledge>>();
- knowledges.ForEach(x => {
- var knowledge = setting.knowledges.Find(y => x.subjectBind.Equals(y.subjectBind));
- if (knowledge != null)
- {
- knowledge.points = x.points;
- knowledge.blocks = x.blocks;
- }
- else
- {
- setting.knowledges.Add(x);
- }
- });
- break;
- case bool when $"{_opt}".Equals("DeleteSubject", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("subjectId", out JsonElement _subjectId)):
- setting.knowledges.RemoveAll(x => x.subjectBind.Equals($"{_subjectId}"));
- setting.dimensions.RemoveAll(y => y.subjectBind.Equals($"{_subjectId}")); ;
- break;
- case bool when $"{_opt}".Equals("DeleteDimension", StringComparison.OrdinalIgnoreCase) && (json.TryGetProperty("dimension", out JsonElement _dimension)):
- setting.dimensions.RemoveAll(x => x.dimension.Equals($"{_dimension}"));
- break;
- default: break;
- }
- _ = _httpTrigger.RequestHttpTrigger(new { areaId = setting.id}, _option.Location, "area-artsetting-change");
- await client.GetContainer(Constant.TEAMModelOS, Constant.Normal).ReplaceItemAsync<ArtSetting>(setting, setting.id, partitionKey: new Azure.Cosmos.PartitionKey("ArtSetting"));
- return Ok(new { setting });
- }
- catch (CosmosException ex)
- {
- return Ok(new { error = ex.Status });
- }
- }
- }
- }
|