Browse Source

取得教師被分享的課綱API 追加分享學校課綱架構

jeff 6 months ago
parent
commit
ed01708894
1 changed files with 51 additions and 13 deletions
  1. 51 13
      TEAMModelOS/Controllers/Client/HiTeachController.cs

+ 51 - 13
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -3458,11 +3458,12 @@ namespace TEAMModelOS.Controllers.Client
             //參數驗證
             string volumeId = (request.TryGetProperty("volumeId", out JsonElement volumeIdJobj)) ? volumeIdJobj.GetString() : String.Empty;
             string syllabusId = (request.TryGetProperty("syllabusId", out JsonElement syllabusIdJobj)) ? syllabusIdJobj.GetString() : String.Empty;
-            int display = (request.TryGetProperty("display", out JsonElement displayJobj)) ? displayJobj.GetInt32() : 0;
+            int display = (request.TryGetProperty("display", out JsonElement displayJobj)) ? displayJobj.GetInt32() : 0; //0:預設:列出分支 1:只列出卷
             var client = _azureCosmos.GetCosmosClient();
 
             //取得分享內容
-            Dictionary<string, string> tmidDic = new Dictionary<string, string>();
+            Dictionary<string, string> tmidDic = new Dictionary<string, string>(); //TMID SAS 對照字典
+            Dictionary<string, string> schoolIdDic = new Dictionary<string, string>(); //學校ID SAS 對照字典
             List<Volume> volumeList = new List<Volume>();
             StringBuilder queryText = new StringBuilder("SELECT value(c) FROM c WHERE c.type='share' ");
             if (!string.IsNullOrWhiteSpace(volumeId))
@@ -3472,7 +3473,6 @@ namespace TEAMModelOS.Controllers.Client
             await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql<Share>(queryText: queryText.ToString(),
             requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Share-share-{id}") }))
             {
-
                 if (!string.IsNullOrWhiteSpace(syllabusId))
                 {
                     if (item.id.Equals(syllabusId))
@@ -3481,14 +3481,25 @@ namespace TEAMModelOS.Controllers.Client
                         if (volumeExist == null)
                         {
                             Volume volume = new Volume();
+                            volume.scope = item.scope;
+                            volume.school = item.school;
                             volume.id = item.volumeId;
                             volume.name = item.volumeName;
                             volume.creatorId = item.issuer;
                             volume.creatorName = item.issuerName;
                             volume.syllabusIds.Add(item.id);
                             volumeList.Add(volume);
-                            var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(item.issuer, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
-                            if (!tmidDic.ContainsKey(item.issuer)) tmidDic.Add(item.issuer, blob_sas);
+                            //SAS字典
+                            if (volume.scope.Equals("school") && !string.IsNullOrWhiteSpace(volume.school) && !schoolIdDic.ContainsKey(volume.school)) //學校分享的課綱
+                            {
+                                var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(volume.school, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
+                                if (!schoolIdDic.ContainsKey(volume.school)) schoolIdDic.Add(volume.school, blob_sas);
+                            }
+                            else if(!tmidDic.ContainsKey(item.issuer)) //個人分享的課綱
+                            {
+                                var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(item.issuer, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
+                                if (!tmidDic.ContainsKey(item.issuer)) tmidDic.Add(item.issuer, blob_sas);
+                            }
                         }
                         else
                         {
@@ -3502,14 +3513,25 @@ namespace TEAMModelOS.Controllers.Client
                     if (volumeExist == null)
                     {
                         Volume volume = new Volume();
+                        volume.scope = item.scope;
+                        volume.school = item.school;
                         volume.id = item.volumeId;
                         volume.name = item.volumeName;
                         volume.creatorId = item.issuer;
                         volume.creatorName = item.issuerName;
                         volume.syllabusIds.Add(item.id);
                         volumeList.Add(volume);
-                        var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(item.issuer, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
-                        if (!tmidDic.ContainsKey(item.issuer)) tmidDic.Add(item.issuer, blob_sas);
+                        //SAS字典
+                        if (volume.scope.Equals("school") && !string.IsNullOrWhiteSpace(volume.school) && !schoolIdDic.ContainsKey(volume.school)) //學校分享的課綱
+                        {
+                            var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(volume.school, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
+                            if (!schoolIdDic.ContainsKey(volume.school)) schoolIdDic.Add(volume.school, blob_sas);
+                        }
+                        else if(!tmidDic.ContainsKey(item.issuer))//個人分享的課綱
+                        {
+                            var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(item.issuer, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
+                            if (!tmidDic.ContainsKey(item.issuer)) tmidDic.Add(item.issuer, blob_sas);
+                        }
                     }
                     else
                     {
@@ -3525,21 +3547,37 @@ namespace TEAMModelOS.Controllers.Client
                 List<SyllabusTreeNode> treeNodes = new();
                 if (!display.Equals(1))
                 {
-                    string queryTextSyl = $"SELECT value(c) FROM c WHERE ARRAY_CONTAINS({JsonSerializer.Serialize(volTmp.syllabusIds)}, c.id, true)";
-                    await foreach (Syllabus items in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql<Syllabus>(queryText: queryTextSyl, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{volTmp.creatorId}") }))
+                    if(volTmp.scope.Equals("school") && !string.IsNullOrWhiteSpace(volTmp.school))
+                    {
+                        string queryTextSyl = $"SELECT value(c) FROM c WHERE ARRAY_CONTAINS({JsonSerializer.Serialize(volTmp.syllabusIds)}, c.id, true)";
+                        await foreach (Syllabus items in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql<Syllabus>(queryText: queryTextSyl, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{volTmp.school}") }))
+                        {
+                            List<SyllabusTree> trees = SyllabusService.ListToTree(items.children);
+                            SyllabusTreeNode tree = new() { id = items.id, scope = items.scope, trees = trees, volumeId = items.volumeId, auth = items.auth, codeval = $"{volTmp.school}" };
+                            treeNodes.Add(tree);
+                        }
+                    }
+                    else
                     {
-                        List<SyllabusTree> trees = SyllabusService.ListToTree(items.children);
-                        SyllabusTreeNode tree = new() { id = items.id, scope = items.scope, trees = trees, volumeId = items.volumeId, auth = items.auth, codeval = $"{volTmp.creatorId}" };
-                        treeNodes.Add(tree);
+                        string queryTextSyl = $"SELECT value(c) FROM c WHERE ARRAY_CONTAINS({JsonSerializer.Serialize(volTmp.syllabusIds)}, c.id, true)";
+                        await foreach (Syllabus items in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql<Syllabus>(queryText: queryTextSyl, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{volTmp.creatorId}") }))
+                        {
+                            List<SyllabusTree> trees = SyllabusService.ListToTree(items.children);
+                            SyllabusTreeNode tree = new() { id = items.id, scope = items.scope, trees = trees, volumeId = items.volumeId, auth = items.auth, codeval = $"{volTmp.creatorId}" };
+                            treeNodes.Add(tree);
+                        }
                     }
                 }
                 result.Add(new
                 {
                     id = volTmp.id,
                     name = volTmp.name,
+                    scope = volTmp.scope,
                     creatorId = volTmp.creatorId,
                     creatorName = volTmp.creatorName,
-                    creatorSas = (tmidDic.ContainsKey(volTmp.creatorId)) ? tmidDic[volTmp.creatorId] : null,
+                    creatorSas = (!volTmp.scope.Equals("school") && tmidDic.ContainsKey(volTmp.creatorId)) ? tmidDic[volTmp.creatorId] : null,
+                    schoolId = volTmp.school,
+                    schoolSas = (volTmp.scope.Equals("school") && schoolIdDic.ContainsKey(volTmp.school)) ? schoolIdDic[volTmp.school] : null,
                     syllabusIds = volTmp.syllabusIds,
                     syllabus = treeNodes.ToList(),