CrazyIter_Bin 1 năm trước cách đây
mục cha
commit
e1f9ac23d0

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/CosmosEntity.cs

@@ -12,5 +12,6 @@ namespace TEAMModelOS.SDK.Models
         public string code { get; set; }
         public string pk { get; set; }
         public int? ttl { get; set; } = -1;
+        public long? _ts { get; set; } = -1;
     }
 }

+ 27 - 19
TEAMModelOS.SDK/Models/Cosmos/School/Debate.cs

@@ -53,10 +53,7 @@ namespace TEAMModelOS.SDK.Models
         /// 回复记录
         /// </summary>
         public List<DebateReply> replies { get; set; } = new List<DebateReply>();
-        /// <summary>
-        /// 点赞记录
-        /// </summary>
-        public List<LikeRcd> likes { get; set; } = new List<LikeRcd>();
+      
         /// <summary>
         /// 允许回复的字数
         /// </summary>
@@ -70,7 +67,7 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public long expire { get; set; } = 0;
         /// <summary>
-        /// 话题创建的来源  默认的normal, classvideo,ability,uploadscore
+        /// 话题创建的来源  默认的normal, classvideo,ability,uploadscore,homework,course
         /// </summary>
         public string source { get; set; } = "normal";
         /// <summary>
@@ -82,19 +79,7 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public List<string> tags = new List<string>();
     }
-    /// <summary>
-    /// 当前话题下的所有评语的点赞记录
-    /// </summary>
-    public class LikeRcd { 
-        /// <summary>
-        /// 评论或者话题本身的id
-        /// </summary>
-        public string id { get; set; }
-        /// <summary>
-        /// 点赞的tmdid
-        /// </summary>
-        public string tmdid { get; set; }
-    }
+    
     /// <summary>
     /// 话题回复
     /// </summary>
@@ -115,7 +100,7 @@ namespace TEAMModelOS.SDK.Models
         /// 回复者的昵称
         /// </summary>
         public string tmdname { get; set; }
-
+        public string picture { get; set; }
         /// <summary>
         /// 回复的评语
         /// </summary>
@@ -130,5 +115,28 @@ namespace TEAMModelOS.SDK.Models
         public int likeCount { get; set; }
         public string atTmdid { get; set; }
         public string atTmdname { get; set; }
+        public string atPicture { get; set; }
+        /// <summary>
+        /// 点赞记录
+        /// </summary>
+        public List<LikeRcd> likes { get; set; } = new List<LikeRcd>();
+
+    }
+    /// <summary>
+    /// 当前话题下的所有评语的点赞记录
+    /// </summary>
+    public class LikeRcd
+    {
+        /// <summary>
+        /// 评论或者话题本身的id
+        /// </summary>
+        public string replyId { get; set; }
+        /// <summary>
+        /// 点赞的tmdid
+        /// </summary>
+        public string tmdid { get; set; }
+        public string tmdname { get; set; }
+        public string userType { get; set; }
+        public string picture { get; set; }
     }
 }

+ 66 - 14
TEAMModelOS/Controllers/School/DebateController.cs

@@ -36,7 +36,7 @@ namespace TEAMModelOS.Controllers
             _option = option?.Value; ;
         }
         /// <summary>
-        /// 查询所有话题
+        /// 查询话题
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
@@ -54,8 +54,9 @@ namespace TEAMModelOS.Controllers
             {
                 if (!request.TryGetProperty("debateId", out JsonElement _debateId)) { return BadRequest(); }
                 if (!request.TryGetProperty("debateCode", out JsonElement _debateCode)) { return BadRequest(); }
+                string debateCode = $"{_debateCode}".StartsWith("Debate-") ? $"{_debateCode}" : $"Debate-{_debateCode}";
                 List<dynamic> debates = new List<dynamic>();
-                Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{_debateCode}"));
+                Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{debateCode}"));
                 return Ok(new { debate = debate , replyCount = debate.replies!=null  ?debate.replies.Count:0});
             }
             catch (Exception ex)
@@ -83,7 +84,7 @@ namespace TEAMModelOS.Controllers
             {
                 if (!request.TryGetProperty("debateId", out JsonElement _debateId)) { return BadRequest(); }
                 if (!request.TryGetProperty("debateCode", out JsonElement _debateCode)) { return BadRequest(); }
-                List<dynamic> debates = new List<dynamic>();
+                string debateCode = $"{_debateCode}".StartsWith("Debate-") ? $"{_debateCode}" : $"Debate-{_debateCode}";
                 await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").DeleteItemAsync<Debate>($"{_debateId}", new PartitionKey($"{_debateCode}"));
                 return Ok(new { status=200});
             }
@@ -116,7 +117,7 @@ namespace TEAMModelOS.Controllers
                 request.TryGetProperty("comid", out JsonElement _comid);
                 if (request.TryGetProperty("code", out JsonElement code))
                 {
-                    StringBuilder stringBuilder = new StringBuilder($"select c.id,c.code,c.tmdid,c.tmdname,c.title,c.comment,c.time,c.comid,c.likeCount,c.school,c.likes,c.wordCount,c.timeoutReply,c.expire,c.source,c.pk, ARRAY_LENGTH( c.replies ) as replyCount from c where c.pk='Debate' ");
+                    StringBuilder stringBuilder = new StringBuilder($"select c.id,c.code,c.tmdid,c.userType,c.tmdname,c.title,c.comment,c.time,c.comid,c.likeCount,c.school,c.wordCount,c.timeoutReply,c.expire,c.source,c.pk, ARRAY_LENGTH( c.replies ) as replyCount from c where c.pk='Debate' ");
                     if (!string.IsNullOrEmpty($"{_source}")) {
                         stringBuilder.Append($" and c.source='{_source}'");
                     }
@@ -176,14 +177,15 @@ namespace TEAMModelOS.Controllers
         [ProducesDefaultResponseType]
         [HttpPost("reply")]
         [Authorize(Roles = "IES")]
-        [AuthToken(Roles = "admin,teacher")]
+        [AuthToken(Roles = "admin,teacher,student")]
         public async Task<IActionResult> reply(JsonElement request) {
             var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
             if (!request.TryGetProperty("opt", out JsonElement _opt)) { return BadRequest(); }
             if (!request.TryGetProperty("debateId", out JsonElement _debateId)) { return BadRequest(); }
             if (!request.TryGetProperty("debateCode", out JsonElement _debateCode)) { return BadRequest(); }
-            if (!request.TryGetProperty("reply", out JsonElement _reply)) { return BadRequest(); }
+           
             DebateReply reply = null;
+            string debateCode = $"{_debateCode}".StartsWith("Debate-") ? $"{_debateCode}" : $"Debate-{_debateCode}";
             if (!string.IsNullOrEmpty($"{_debateId}") && !string.IsNullOrEmpty($"{_debateCode}") && !string.IsNullOrEmpty($"{_opt}"))
             {
                 switch ($"{_opt}")
@@ -191,25 +193,76 @@ namespace TEAMModelOS.Controllers
                     case "add":
                         try
                         {
-                            Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{_debateCode}"));
+                            if (!request.TryGetProperty("reply", out JsonElement _reply)) { return BadRequest(); }
+                            Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{debateCode}"));
                             reply = _reply.ToObject<DebateReply>();
                             reply.pid = string.IsNullOrEmpty(reply.pid) ? $"{_debateId}" : reply.pid;
                             reply.id = string.IsNullOrEmpty(reply.id) ? Guid.NewGuid().ToString() : reply.id;
                             reply.time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                             debate.replies.Add(reply);
-                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Debate>(debate, $"{_debateId}", new PartitionKey($"{_debateCode}"));
+                            debate.likeCount = debate.replies.SelectMany(z => z.likes).Count();
+                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Debate>(debate, $"{_debateId}", new PartitionKey($"{debateCode}"));
                             return Ok(new { reply , replyCount = debate.replies.Count });
                         }
                         catch (CosmosException ex)
                         {
                             return BadRequest();
                         }
+                    case "like":
+                        try
+                        {
+                            Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{debateCode}"));
+                            if (!request.TryGetProperty("likeData", out JsonElement _likeData)) { return BadRequest(); }
+                            LikeRcd likeRcd = _likeData.ToObject<LikeRcd>();
+                            if (likeRcd != null && !string.IsNullOrWhiteSpace(likeRcd.replyId))
+                            {
+                                var replyData = debate.replies.Find(x => $"{likeRcd.replyId}".Equals(x.id));
+                                var like = replyData.likes.FindAll(c => !string.IsNullOrWhiteSpace(c.tmdid) && c.tmdid.Equals(likeRcd.tmdid) && !string.IsNullOrWhiteSpace(c.userType) && c.userType.Equals(likeRcd.userType));
+                                if (like.IsEmpty())
+                                {
+                                    replyData.likes.Add(likeRcd);
+                                }
+                                debate.likeCount = debate.replies.SelectMany(z => z.likes).Count();
+                                await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Debate>(debate, $"{_debateId}", new PartitionKey($"{debateCode}"));
+                                return Ok(new { reply, replyCount = debate.replies.Count });
+                            }
+                            else {
+                                return BadRequest();
+                            }
+                        }
+                        catch (CosmosException ex)
+                        {
+                            return BadRequest();
+                        }
+                    case "unlike":
+                        try
+                        {
+                            Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{debateCode}"));
+                            if (!request.TryGetProperty("likeData", out JsonElement _likeData)) { return BadRequest(); }
+                            LikeRcd likeRcd = _likeData.ToObject<LikeRcd>();
+                            if (likeRcd != null && !string.IsNullOrWhiteSpace(likeRcd.replyId))
+                            {
+                                var replyData = debate.replies.Find(x => $"{likeRcd.replyId}".Equals(x.id) );
+                                replyData.likes.RemoveAll(c => !string.IsNullOrWhiteSpace(c.tmdid) && c.tmdid.Equals(likeRcd.tmdid) && !string.IsNullOrWhiteSpace(c.userType) && c.userType.Equals(likeRcd.userType));
+                                debate.likeCount = debate.replies.SelectMany(z => z.likes).Count();
+                                await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Debate>(debate, $"{_debateId}", new PartitionKey($"{debateCode}"));
+                                return Ok(new { reply, replyCount = debate.replies.Count });
+                            }
+                            else
+                            {
+                                return BadRequest();
+                            }
+                        }
+                        catch (CosmosException ex)
+                        {
+                            return BadRequest();
+                        }
                     case "del":
                         try
                         {
-                            Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{_debateCode}"));
-                            reply = _reply.ToObject<DebateReply>();
-                            var findall = debate.replies.FindAll(x => reply.id .Equals(x.id));
+                            Debate debate = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Debate>($"{_debateId}", new PartitionKey($"{debateCode}"));
+                            if (!request.TryGetProperty("replyId", out JsonElement _replyId)) { return BadRequest(); }
+                            var findall = debate.replies.FindAll(x => $"{_replyId}" .Equals(x.id));
                             if (findall.IsNotEmpty())
                             {   
                                 foreach (var find in findall)
@@ -223,7 +276,8 @@ namespace TEAMModelOS.Controllers
                                         return Ok(new { status = 2, replyCount = debate.replies.Count });
                                     }
                                 }
-                                await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Debate>(debate, $"{_debateId}", new PartitionKey($"{_debateCode}"));
+                                debate.likeCount = debate.replies.SelectMany(z => z.likes).Count();
+                                await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Debate>(debate, $"{_debateId}", new PartitionKey($"{debateCode}"));
                                 //删除成功
                                 return Ok(new { status = 0 , replyCount = debate.replies.Count });
                             }
@@ -314,8 +368,6 @@ namespace TEAMModelOS.Controllers
                     ///保证记录回复记录和点赞记录正常
                     debate.replies = _DBdebate.replies;
                     debate.likeCount = _DBdebate.likeCount;
-                    debate.likes = _DBdebate.likes;
-                    debate.replies = _DBdebate.replies;
                     await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(debate, debate.id, new PartitionKey(debate.code));
                 }
                 catch (CosmosException ex) {