123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- using Azure.Cosmos;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using System;
- using System.Collections.Generic;
- using System.IdentityModel.Tokens.Jwt;
- using System.IO;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.Context.Constant.Common;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Helper.Common.StringHelper;
- using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
- namespace TEAMModelOS.Controllers.Learn
- {
- // TODO 代码优化
- /// <summary>
- /// 学习活动
- /// </summary>
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- [Route("common/learn")]
- [ApiController]
- public class LearnController: ControllerBase
- {
- private readonly SnowflakeId _snowflakeId;
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly AzureServiceBusFactory _serviceBus;
- public LearnController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId)
- {
- _snowflakeId = snowflakeId;
- _serviceBus = serviceBus;
- _azureCosmos = azureCosmos;
- }
- // /// <summary>
- // /// 保存或更新学习任务
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("upsert-task")]
- // public async Task<IActionResult> UpsertTask(LearnTask request)
- // {
- // /*//if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
- // if (!requert.TryGetProperty("id", out JsonElement id)) 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();
- // var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(id.ToString(), new PartitionKey($"LearnTask-{id}"));
- // if (response.Status == 200)
- // {
- // using var json = await JsonDocument.ParseAsync(response.ContentStream);
-
- // }
- // else
- // {
- // //如果沒有,則初始化LearnTask
- // requert.TryGetProperty("endTime", out JsonElement endTime);
- // requert.TryGetProperty("status", out JsonElement status);
- // requert.TryGetProperty("type", out JsonElement type);
- // requert.TryGetInt64(out long createTime);
- // requert.TryGetProperty("stage", out JsonElement stage);
- // requert.TryGetProperty("passScore", out JsonElement passScore);
- // if (createTime <= 0)
- // {
- // createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // }
- // if (endTime.GetInt64() > 0)
- // {
- // //设定结束时间
- // string msgEndId = _snowflakeId.NextId() + "";
- // await _serviceBus.GetServiceBusClient().SendLeamMessage<LearnTask>(Constants.TopicName, id, $"LearnTask-{id}", endTime.GetInt64(), 300, msgEndId);
- // }
- // using var stream = new MemoryStream();
- // using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
- // writer.WriteStartObject();
- // writer.WriteString("code", $"LearnTask-{id}");
- // writer.WriteString("id", id.ToString());
- // writer.WriteNumber("endTime", endTime.GetInt64());
- // writer.WriteNumber("status", status.GetInt32());
- // writer.WriteNumber("type", type.GetInt32());
- // writer.WriteNumber("stage", stage.GetInt32());
- // writer.WriteNumber("createTime", createTime);
- // writer.WriteNumber("passScore", passScore.GetInt32());
- // writer.WriteEndObject();
- // writer.Flush();
- // //Debug
- // //string teacher = Encoding.UTF8.GetString(stream.ToArray());
- // response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemStreamAsync(stream, new PartitionKey($"LearnTask-{id}"));
- // }*/
- // var client = _azureCosmos.GetCosmosClient();
- // LearnTask learnTask;
- // request.pk = typeof(LearnTask).Name;
- // if (string.IsNullOrEmpty(request.id))
- // {
- // request.id = _snowflakeId.NextId() + "";
- // request.code = typeof(LearnTask).Name + "-" + request.code;
- // request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // learnTask = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"{request.code}"));
- // //await _azureCosmos.Save(request);
- // }
- // else
- // {
- // learnTask = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
- // //await _azureCosmos.Update(request);
- // }
- // return Ok(new { learnTask });
- // /* ResponseBuilder builder = ResponseBuilder.custom();
- // if (request.createTime <= 0) {
- // request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // }
- // if (request.endTime > 0) {
- // //设定结束时间
- // string msgEndId = _snowflakeId.NextId()+"";
- // await _serviceBus.GetServiceBusClient().SendLeamMessage<LearnTask>(Constants.TopicName, request.id, request.code, request.endTime, 300, msgEndId);
- // }
- // await _azureCosmos.Save(request);
- // return builder.Data(request).build();*/
- // }
- // /// <summary>
- // /// 查询学习任务
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("find-task")]
- // public async Task<IActionResult> FindTask(JsonElement requert)
- // {
- // var client = _azureCosmos.GetCosmosClient();
- // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
- // //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
- ///* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) 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;*/
- // List<object> tasks = new List<object>();
- // var query = $"select c.id,c.endTime,c.status, c.type,c.createTime,c.stage,c.passScore from c";
- // await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnTask-{id}") }))
- // {
- // 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())
- // {
- // tasks.Add(obj.ToObject<object>());
- // }
- // }
- // }
- // return Ok(new { tasks });
- // /*ResponseBuilder builder = ResponseBuilder.custom();
- // if (request.TryGetProperty("id",out _) || request.TryGetProperty("code",out _))
- // {
- // List<LearnTask> tasks = await _azureCosmos.FindByDict<LearnTask>(request);
- // return builder.Data(tasks).build();
- // }
- // else {
- // return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
- // }*/
- // }
- // /// <summary>
- // /// 删除学习任务
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("delete-task")]
- // public async Task<IActionResult> DeleteTask(IdPk request)
- // {
- // ResponseBuilder builder = ResponseBuilder.custom();
- // return Ok(await _azureCosmos.DeleteAsync<LearnTask>(request));
- // }
- // /// <summary>
- // /// 保存或更新学习单元单元
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("upsert-unit")]
- // public async Task<IActionResult> UpsertUnit(LearnUnit request)
- // {
- // var client = _azureCosmos.GetCosmosClient();
- // LearnUnit learnUnit;
- // request.pk = typeof(LearnUnit).Name;
- // if (string.IsNullOrEmpty(request.id))
- // {
- // request.id = _snowflakeId.NextId() + "";
- // request.code = typeof(LearnUnit).Name + "-" + request.code;
- // request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // learnUnit = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"{request.code}"));
- // //await _azureCosmos.Save(request);
- // }
- // else
- // {
- // request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // learnUnit = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
- // //await _azureCosmos.Update(request);
- // }
- // return Ok(new { learnUnit });
- // /*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();
- // var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"LearnUnit-{id}"));
- // if (response.Status == 200)
- // {
- // using var json = await JsonDocument.ParseAsync(response.ContentStream);
- // }
- // else
- // {
- // //如果沒有,則初始化LearnTask
- // requert.TryGetProperty("endTime", out JsonElement endTime);
- // requert.TryGetProperty("status", out JsonElement status);
- // requert.TryGetProperty("type", out JsonElement type);
- // //requert.TryGetInt64(out long createTime);
- // requert.TryGetProperty("stage", out JsonElement stage);
- // requert.TryGetProperty("passScore", out JsonElement passScore);
- // long createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // using var stream = new MemoryStream();
- // using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
- // writer.WriteStartObject();
- // writer.WriteString("code", $"LearnUnit-{id}");
- // writer.WriteString("id", id);
- // writer.WriteNumber("endTime", endTime.GetInt64());
- // writer.WriteNumber("status", status.GetInt32());
- // writer.WriteNumber("type", type.GetInt32());
- // writer.WriteNumber("stage", stage.GetInt32());
- // writer.WriteNumber("createTime", createTime);
- // writer.WriteNumber("passScore", passScore.GetInt32());
- // writer.WriteEndObject();
- // writer.Flush();
- // //Debug
- // //string teacher = Encoding.UTF8.GetString(stream.ToArray());
- // response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemStreamAsync(stream, new PartitionKey($"LearnUnit-{id}"));
- // }
- // return Ok();*/
- // /*ResponseBuilder builder = ResponseBuilder.custom();
- // if (string.IsNullOrEmpty(request.id))
- // {
- // request.id = _snowflakeId.NextId() + "";
- // request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // await _azureCosmos.Save(request);
- // }
- // else
- // {
- // await _azureCosmos.Update(request);
- // }
- // return builder.Data(request).build();*/
- // }
- // /// <summary>
- // /// 查询学习单元
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("find-unit")]
- // public async Task<IActionResult> FindUnit(JsonElement requert)
- // {
- // var client = _azureCosmos.GetCosmosClient();
- // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
- // //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
- ///* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) 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;*/
- // List<object> units = new List<object>();
- // var query = $"select c.id,c.resource,c.item, c.name,c.createTime from c";
- // await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnUnit-{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())
- // {
- // units.Add(obj.ToObject<object>());
- // }
- // }
- // }
- // return Ok(new { units });
- // /*ResponseBuilder builder = ResponseBuilder.custom();
- // if (StringHelper.getKeyCount(request) > 0)
- // {
- // return builder.Data(await _azureCosmos.FindByDict<LearnUnit>(request)).build();
- // }
- // else {
- // return builder.build();
- // }*/
- // }
- // /// <summary>
- // /// 删除学习单元
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("delete-unit")]
- // public async Task<IActionResult> DeleteUnit(IdPk request)
- // {
- // ResponseBuilder builder = ResponseBuilder.custom();
- // return Ok(await _azureCosmos.DeleteAsync<LearnUnit>(request));
- // }
- // /// <summary>
- // /// 保存或新增编序学习活动
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("upsert-process")]
- // public async Task<IActionResult> UpsertProcess(LearnProcess request) {
- // //ResponseBuilder builder = ResponseBuilder.custom();
- // var client = _azureCosmos.GetCosmosClient();
- // LearnProcess learnProcess;
- // request.pk = typeof(LearnProcess).Name;
- // if (string.IsNullOrEmpty(request.id))
- // {
- // request.id = _snowflakeId.NextId() + "";
- // request.code = typeof(LearnProcess).Name + "-" + request.code;
- // request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- // learnProcess = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"LearnProcess-{request.code}"));
- // // await _azureCosmos.Save<LearnProcess>(request);
- // }
- // else {
- // learnProcess = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id,new PartitionKey($"{request.code}"));
- // //await _azureCosmos.Update<LearnProcess>(request);
- // }
-
- // return Ok(new { learnProcess });
- // }
- // /// <summary>
- // /// 查询编序学习活动
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("find-process")]
- // public async Task<IActionResult> FindProcess(JsonElement requert)
- // {
- // var client = _azureCosmos.GetCosmosClient();
- // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
- // //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
- ///* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) 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;*/
- // List<object> process = new List<object>();
- // var query = $"select c.id,c.name,c.subjectCode, c.periodCode,c.Introduce from c where id = {id}";
- // await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnProcess-{id}") }))
- // {
- // 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())
- // {
- // process.Add(obj.ToObject<object>());
- // }
- // }
- // }
- // return Ok(new { process });
- // /* ResponseBuilder builder = ResponseBuilder.custom();
- // if (StringHelper.getKeyCount(request) > 0) {
- // builder.Data(await _azureCosmos.FindByDict<LearnProcess>(request));
- // }
- // return builder.build();*/
- // }
- // /// <summary>
- // /// 删除编序学习活动
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("delete-process")]
- // public async Task<IActionResult> DeleteProcess(IdPk request)
- // {
- // //ResponseBuilder builder = ResponseBuilder.custom();
- // if (request != null)
- // {
- // await _azureCosmos.DeleteAsync<LearnProcess>(request);
- // }
- // return Ok(request);
- // }
- // /// <summary>
- // /// 保存或新增作答记录
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("upsert-record")]
- // public async Task<IActionResult> UpsertRecord(List<LearnRecord> request)
- // {
- // //ResponseBuilder builder = ResponseBuilder.custom();
- // List<LearnRecord> leanProcesses = null;
- // if (ValidateHelper.IsValid(request))
- // {
- // request.ForEach(c => {
- // if (string.IsNullOrEmpty(c.id)) {
- // c.code = typeof(LearnRecord).Name + "-" + c.code;
- // }
- // });
- // leanProcesses = await _azureCosmos.SaveOrUpdateAll<LearnRecord>(request);
- // //builder.Data(leanProcesses);
- // }
- // return Ok(leanProcesses);
- // }
- // /// <summary>
- // /// 查询编序作答记录
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("find-record")]
- // public async Task<IActionResult> FindRecord(JsonElement requert)
- // {
- // var client = _azureCosmos.GetCosmosClient();
- // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
- // //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
- ///* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) 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;*/
- // List<object> records = new List<object>();
- // var query = $"select c.id,c.steps from c where id = {id}";
- // await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnRecord-{id}") }))
- // {
- // 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())
- // {
- // records.Add(obj.ToObject<object>());
- // }
- // }
- // }
- // return Ok(new { records });
- // /* ResponseBuilder builder = ResponseBuilder.custom();
- // if (StringHelper.getKeyCount(request) > 0)
- // {
- // builder.Data(await _azureCosmos.FindByDict<LearnRecord>(request));
- // }
- // return builder.build();*/
- // }
- // /// <summary>
- // /// 删除作答记录
- // /// </summary>
- // /// <param name="request"></param>
- // /// <returns></returns>
- // [ProducesDefaultResponseType]
- // [HttpPost("delete-record")]
- // public async Task<IActionResult> DeleteRecord(IdPk request)
- // {
- // //ResponseBuilder builder = ResponseBuilder.custom();
- // if (request != null)
- // {
- // await _azureCosmos.DeleteAsync<LearnRecord>(request);
- // }
- // return Ok(request);
- // }
- }
- }
|