Bladeren bron

1.HiTA用 教師個人資訊API
2.蘇格拉底API格式變更
3.變更學生資訊:class不取gradeId
CLOSE #332
CLOSE #424
CLOSE #587
CLOSE #816
CLOSE #780

jeff 3 jaren geleden
bovenliggende
commit
24eecc99fd

+ 173 - 11
TEAMModelOS/Controllers/Client/HiTAControlller.cs

@@ -15,7 +15,7 @@ using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.Services.Common;
-using static TEAMModelOS.Services.Common.SchoolService;
+using static TEAMModelOS.Services.Common.BlobService;
 
 namespace TEAMModelOS.Controllers.Client
 {
@@ -61,22 +61,23 @@ namespace TEAMModelOS.Controllers.Client
                 if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
                 var id = jwt.Payload.Sub;
 
-                //學校資訊
-                List<object> schools = new List<object>();
+                
                 var clientc = _azureCosmos.GetCosmosClient();
                 var clientr = _azureRedis.GetRedisClient(8);
                 var response = await clientc.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(id, new PartitionKey("Base"));
                 if (response.Status == 200)
                 {
                     var jsonsc = await JsonDocument.ParseAsync(response.ContentStream);
+                    //學校資訊
+                    List<dynamic> schools = new List<dynamic>();
                     if (jsonsc.RootElement.TryGetProperty("schools", out JsonElement value))
                     {
                         foreach (var obj in value.EnumerateArray())
                         {
                             string schoolCodeNow = $"{obj.GetProperty("schoolId")}";
-                            var clients = _azureStorage.GetBlobContainerClient(schoolCodeNow);
+                            var clientss = _azureStorage.GetBlobContainerClient(schoolCodeNow);
                             //Blob使用狀況
-                            UsedBlob schoolUsedBlob = await SchoolService.GetSchoolBlobUsed(clientc, clients, clientr, schoolCodeNow);
+                            UsedBlob schoolUsedBlob = await BlobService.GetBlobUsed(clientc, clientss, clientr, "school", schoolCodeNow);
                             //管理者名單
                             List<Dictionary<string, string>> adminList = new List<Dictionary<string, string>>();
                             string querySchool = $"SELECT c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'admin', true)";
@@ -95,8 +96,24 @@ namespace TEAMModelOS.Controllers.Client
                                 }
                             }
                             //老師在此學校的課程
-
-
+                            List<dynamic> coursesch = new List<dynamic>();
+                            var query = $"SELECT c.id, c.name, c.no FROM c JOIN schedule IN c.schedule WHERE schedule.teacherId = '{id}'";
+                            await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolCodeNow}") }))
+                            {
+                                var jsoncs = await JsonDocument.ParseAsync(item.ContentStream);
+                                if (jsoncs.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                {
+                                    foreach (var obj2 in jsoncs.RootElement.GetProperty("Documents").EnumerateArray())
+                                    {
+                                        dynamic courseExtobj = new ExpandoObject();
+                                        courseExtobj.id = obj2.GetProperty("id");
+                                        courseExtobj.name = obj2.GetProperty("name");
+                                        courseExtobj.no = obj2.GetProperty("no");
+                                        coursesch.Add(courseExtobj);
+                                    }
+                                }
+                            }
+                           
                             //學校資料生成
                             dynamic schoolExtobj = new ExpandoObject();
                             var schoolJson = await clientc.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{obj.GetProperty("schoolId")}", new PartitionKey("Base"));
@@ -106,18 +123,164 @@ namespace TEAMModelOS.Controllers.Client
                             schoolExtobj.status = obj.GetProperty("status");
                             schoolExtobj.picture = school.RootElement.GetProperty("picture");
                             schoolExtobj.size = new ExpandoObject();
-                            schoolExtobj.size.used = schoolUsedBlob.size;
-                            long ssize = (school.RootElement.TryGetProperty("size", out JsonElement size)) ? size.GetInt32() : 0;
+                            schoolExtobj.size.used = schoolUsedBlob.size + schoolUsedBlob.teach * 1073741824;
+                            long ssize = (school.RootElement.TryGetProperty("size", out JsonElement ssizeJson)) ? ssizeJson.GetInt32() : 0;
                             schoolExtobj.size.total = ssize * 1073741824;
                             schoolExtobj.size.avaliable = schoolExtobj.size.total - schoolExtobj.size.used;
                             schoolExtobj.admin = adminList;
+                            schoolExtobj.courses = coursesch;
 
                             schools.Add(schoolExtobj);
                         }
                     }
+                    //預設學校
+                    string defaultschool = null;
+                    if(jsonsc.RootElement.TryGetProperty("defaultSchool", out JsonElement defaultSchoolJson) && !defaultSchoolJson.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        defaultschool = defaultSchoolJson.GetString();
+                    }
+                    //老師個人課程
+                    List<dynamic> courses = new List<dynamic>();
+                    await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.no FROM c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
+                    {
+                        var jsontcs = await JsonDocument.ParseAsync(item.ContentStream);
+                        if (jsontcs.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        {
+                            foreach (var obj in jsontcs.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                dynamic courseExtobj = new ExpandoObject();
+                                courseExtobj.id = obj.GetProperty("id");
+                                courseExtobj.name = obj.GetProperty("name");
+                                courseExtobj.no = obj.GetProperty("no");
+                                courses.Add(courseExtobj);
+                            }
+                        }
+                    }
+                    //老師個人空間  ※老師可用的空間 = (Teacher)Base.size + (School)各校的Teacher-{schoolCode}
+                    dynamic size = new ExpandoObject();
+                    size.resource = 0;
+                    size.records = 0;
+                    size.used = 0;
+                    size.total = 0;
+                    var clientst = _azureStorage.GetBlobContainerClient(id);
+                    ////個人可用空間
+                    if (jsonsc.RootElement.TryGetProperty("size", out JsonElement teaSizeTotalJson) && teaSizeTotalJson.ValueKind.Equals(JsonValueKind.Number))
+                    {
+                        size.total += teaSizeTotalJson.GetInt32();
+                    }
+                    ////學校分派給老師的空間
+                    int GsizeFromSchool = 0;
+                    string querySizeFromSchool = $"SELECT sum(c.size) as size FROM c WHERE c.pk = 'Teacher' AND c.id = {id}";
+                    await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(querySizeFromSchool, requestOptions: new QueryRequestOptions() { }))
+                    {
+                        var json = await JsonDocument.ParseAsync(item.ContentStream);
+                        foreach (var elmt in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            if (elmt.TryGetProperty("size", out JsonElement sizeJson) && sizeJson.ValueKind.Equals(JsonValueKind.Number))
+                            {
+                                GsizeFromSchool = sizeJson.GetInt32();
+                                break;
+                            }
+                        }
+                    }
+                    size.total += GsizeFromSchool;
+                    size.total = Convert.ToInt64(size.total) * 1073741824;
+
+                    ////個人空間使用狀況
+                    UsedBlob teacherUsedBlob = await BlobService.GetBlobUsed(clientc, clientst, clientr, "private", id);
+                    size.used = teacherUsedBlob.size;
+                    foreach (KeyValuePair<string, double?> blobCatalog in teacherUsedBlob.catalog)
+                    {
+                        if(blobCatalog.Key.Equals("records"))
+                        {
+                            size.records = blobCatalog.Value;
+                        }
+                        else
+                        {
+                            size.resource += blobCatalog.Value;
+                        }
+                    }
+                    
 
-                    return Ok(new { schools });
+                    //資源數
+                    int resCount = 0; //教材數
+                    int itemCount = 0; //題目數
+                    int paperCount = 0; //試卷數
+                    List<BlobCount> blogCountList = await BloblogCount(clientc, "private", id, "", "");
+                    foreach(BlobCount blobCountRow in blogCountList)
+                    {
+                        switch (blobCountRow.type)
+                        {
+                            case "item":
+                                itemCount += blobCountRow.count;
+                                break;
+                            case "paper":
+                                paperCount += blobCountRow.count;
+                                break;
+                            case "doc":
+                            case "image":
+                            case "res":
+                            case "video":
+                            case "audio":
+                            case "other":
+                                resCount += blobCountRow.count;
+                                break;
+                        }
+                    }
 
+                    //進行中的活動數
+                    int activityCount = 0;
+                    List<string> examIdList = new List<string>();
+                    await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{id}") }))
+                    {
+                        using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        {
+                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                activityCount += obj.GetProperty("count").GetInt32();
+                            }
+                        }
+                    }
+                    await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{id}") }))
+                    {
+                        using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        {
+                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                activityCount += obj.GetProperty("count").GetInt32();
+                            }
+                        }
+                    }
+                    await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{id}") }))
+                    {
+                        using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        {
+                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                activityCount += obj.GetProperty("count").GetInt32();
+                            }
+                        }
+                    }
+                    await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{id}") }))
+                    {
+                        using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        {
+                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                activityCount += obj.GetProperty("count").GetInt32();
+                            }
+                        }
+                    }
+
+                    return Ok(new { schools, defaultschool, courses, size, resCount, itemCount, paperCount, activityCount });
+                }
+                else //無此老師
+                {
+                    return BadRequest();
                 }
             }
             catch (Exception ex)
@@ -125,7 +288,6 @@ namespace TEAMModelOS.Controllers.Client
                 //await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},Channel/Create()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
-            return Ok();
         }
     }
 }

+ 32 - 29
TEAMModelOS/Controllers/Client/SokrateController.cs

@@ -52,50 +52,53 @@ namespace TEAMModelOS.Controllers.Client
 
         [AllowAnonymous]
         [ProducesDefaultResponseType]
-        [HttpPost("get-school-blob-read")]
-        public async Task<IActionResult> GetSchoolBlobRead(JsonElement request)
+        [HttpPost("get-blob-read")]
+        public async Task<IActionResult> GetBlobRead(JsonElement request)
         {
             //Debug
             //string json = System.Text.Json.JsonSerializer.Serialize(id_token);
             try
             {
-                string service_token = HttpContext.GetXAuth("ServiceToken");
-                if (string.IsNullOrWhiteSpace(service_token)) return BadRequest();
-                if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+                string id_token = HttpContext.GetXAuth("IdToken");
+                if (string.IsNullOrEmpty(id_token)) return BadRequest();
+                var jwt = new JwtSecurityToken(id_token);
+                if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
+                var id = jwt.Payload.Sub;
+                string school_code = (request.TryGetProperty("school_code", out JsonElement schoolCodeJson) && !schoolCodeJson.ValueKind.Equals(JsonValueKind.Null)) ? schoolCodeJson.GetString() : string.Empty;
+                string teacher_blob_uri_read = string.Empty;
+                string teacher_blob_sas_read = string.Empty;
+                string school_blob_uri_read = string.Empty;
+                string school_blob_sas_read = string.Empty;
+
                 var client = _azureCosmos.GetCosmosClient();
-                string location = string.Empty;
-                if (_option.Location.Contains("China"))
+                //取得老師blob sas
+                var responsetea = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(id, new PartitionKey("Base"));
+                if (responsetea.Status == 200)
                 {
-                    location = "China";
+                    (teacher_blob_uri_read, teacher_blob_sas_read) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Read); //讀
                 }
-                else if (_option.Location.Contains("Global"))
+                else
                 {
-                    location = "Global";
+                    return BadRequest();
                 }
-                //驗證ServiceToken
-                string jsonServiceToken = Encoding.UTF8.GetString(Convert.FromBase64String(service_token));
-                ServiceClientInfo ServiceClientInfo = JsonSerializer.Deserialize<ServiceClientInfo>(jsonServiceToken);
-                AuthenticationResult token = await CoreTokenExtensions.CreateAccessToken(ServiceClientInfo.client_id, ServiceClientInfo.client_secret, location);
-                var jwt = new JwtSecurityToken(token.AccessToken);
-                if (CoreTokenExtensions.ValidateAccessToken(jwt))
+                //取得學校blob sas
+                if (!String.IsNullOrWhiteSpace(school_code))
                 {
-                    string school_code_blob = school_code.GetString().ToLower();
-                    //檢測取得學校基本資料
-                    var responsesch = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school_code_blob, new PartitionKey($"Base"));
+                    string school_code_blob = school_code.ToLower();
+                    var responsesch = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school_code_blob, new PartitionKey("Base"));
                     if (responsesch.Status == 200)
                     {
-                        var (blob_uri_read, blob_sas_read) = _azureStorage.GetBlobContainerSAS(school_code_blob, BlobContainerSasPermissions.Read); //讀
-                        return Ok(new { blob_sas_read });
-                    }
-                    else
-                    {
-                        return BadRequest();
+                        (school_blob_uri_read, school_blob_sas_read) = _azureStorage.GetBlobContainerSAS(school_code_blob, BlobContainerSasPermissions.Read); //讀
                     }
                 }
-                else
-                {
-                    return BadRequest();
-                }
+                return Ok(new { teacher_blob_sas_read, school_blob_sas_read });
+
+                //驗證ServiceToken
+                //string jsonServiceToken = Encoding.UTF8.GetString(Convert.FromBase64String(service_token));
+                //ServiceClientInfo ServiceClientInfo = JsonSerializer.Deserialize<ServiceClientInfo>(jsonServiceToken);
+                //AuthenticationResult token = await CoreTokenExtensions.CreateAccessToken(ServiceClientInfo.client_id, ServiceClientInfo.client_secret, location);
+                //var jwt = new JwtSecurityToken(token.AccessToken);
+                //if (CoreTokenExtensions.ValidateAccessToken(jwt)) {}
             }
             catch (Exception ex)
             {

+ 1 - 1
TEAMModelOS/Controllers/School/StudentController.cs

@@ -1437,7 +1437,7 @@ namespace TEAMModelOS.Controllers
                         classId = item.Key;
                         className = classInfo[item.Key].GetProperty("name").GetString();
                         classNo = classInfo[item.Key].GetProperty("no").GetString();
-                        gradeId = classInfo[item.Key].GetProperty("gradeId").GetString();
+                        //gradeId = classInfo[item.Key].GetProperty("gradeId").GetString(); 此欄位已不使用
                         periodId = classInfo[item.Key].GetProperty("periodId").GetString();
                     }
                     else if (item.Key.Length == 0)

+ 157 - 0
TEAMModelOS/Services/Common/BlobService.cs

@@ -0,0 +1,157 @@
+using Azure;
+using Azure.Cosmos;
+using Azure.Storage.Blobs;
+using HTEXLib.COMM.Helpers;
+using StackExchange.Redis;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Models.Cosmos.Common;
+
+namespace TEAMModelOS.Services.Common
+{
+    public static class BlobService
+    {
+        public static async Task<UsedBlob> GetBlobUsed(CosmosClient clientc, BlobContainerClient clients, IDatabase clientr, string scope, string containerName)
+        {
+            UsedBlob result = new UsedBlob();
+            try
+            {
+                //学校已经分配给所有教师的空间大小GB。
+                long teach = 0;
+                if (scope.Equals("school"))
+                {
+                    await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT sum(c.size) as size FROM c ",
+                        requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{containerName}") }))
+                    {
+                        var json = await JsonDocument.ParseAsync(item.ContentStream);
+                        foreach (var elmt in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            if (elmt.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
+                            {
+                                teach = _size.GetInt32();
+                                break;
+                            }
+                        }
+                    }
+                }
+                //使用blob狀況
+                bool getBlobCatalogFromBlob = false; //是否直接去blob取得使用狀況 false:否(Redis)  true:是(Blob)
+                long blobsize = 0;
+                RedisValue value = default;
+                value = clientr.HashGet($"Blob:Record", containerName);
+                if (value != default && !value.IsNullOrEmpty)
+                {
+                    JsonElement record = value.ToString().ToObject<JsonElement>();
+                    if (record.TryGetInt64(out blobsize))
+                    {
+                    }
+                    else
+                    {
+                        getBlobCatalogFromBlob = true;
+                    }
+                }
+                else
+                {
+                    getBlobCatalogFromBlob = true;
+                }
+                Dictionary<string, double?> catalog = new Dictionary<string, double?>();
+                SortedSetEntry[] Scores = clientr.SortedSetRangeByScoreWithScores($"Blob:Catalog:{containerName}");
+                if (Scores != null)
+                {
+                    foreach (var score in Scores)
+                    {
+                        double val = score.Score;
+                        string key = score.Element.ToString();
+                        catalog.Add(key, val);
+                    }
+                }
+                if (!getBlobCatalogFromBlob)
+                {
+                    result.size = blobsize;
+                    result.catalog = catalog;
+                    result.teach = teach;
+                    return result;
+                }
+                else
+                {
+                    var size = await clients.GetBlobsCatalogSize();
+                    result.size = size.Item1;
+                    result.catalog = size.Item2;
+                    result.teach = teach;
+                    return result;
+                }
+            }
+            catch (Exception ex)
+            {
+                //await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},Channel/Create()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
+                return result;
+            }
+        }
+
+        /// <param name="scope">school or private</param>
+        /// <param name="containerName">school code or tmid</param>
+        /// <param name="type">doc, res, item... Empty if no need.</param>
+        /// <param name="periodId">Only for school</param>
+        public static async Task<List<BlobCount>> BloblogCount(CosmosClient clientc, string scope, string containerName, string type, string periodId)
+        {
+            List<BlobCount> bloblogcnt = new List<BlobCount>();
+            try
+            {
+                //必須項檢查
+                if(scope.Equals("school") && string.IsNullOrWhiteSpace(periodId))
+                {
+                    return bloblogcnt;
+                }
+                //資料取得
+                var queryslt = new StringBuilder();
+                queryslt.Append($"SELECT COUNT(1) AS count, c.type FROM c ");
+                if (scope.Equals("school"))
+                {
+                    queryslt.Append($"JOIN A1 IN c.periodId WHERE A1 IN ('{periodId}') ");
+                    if(!string.IsNullOrWhiteSpace(type)) queryslt.Append($"AND c.type='{type}'");
+                    queryslt.Append("GROUP BY c.type");
+                   await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<BlobCount>(queryText: queryslt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{containerName}") }))
+                    {
+                        bloblogcnt.Add(item);
+                    }
+                }
+                else if (scope.Equals("private"))
+                {
+                    if (!string.IsNullOrWhiteSpace(type)) queryslt.Append($"AND c.type='{type}'");
+                    queryslt.Append("GROUP BY c.type");
+                    await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<BlobCount>(queryText: queryslt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{containerName}") }))
+                    {
+                        bloblogcnt.Add(item);
+                    }
+                }
+
+                return bloblogcnt;
+            }
+            catch (Exception ex)
+            {
+                return bloblogcnt;
+            }
+        }
+
+        public class UsedBlob
+        {
+            public long teach { get; set; }
+            public long? size { get; set; }
+            public Dictionary<string, double?> catalog { get; set; }
+
+        }
+
+        public class BlobCount
+        {
+            public string type { get; set; }
+            public int count { get; set; }
+        }
+    }
+}

+ 0 - 102
TEAMModelOS/Services/School/SchoolService.cs

@@ -1,102 +0,0 @@
-using Azure;
-using Azure.Cosmos;
-using Azure.Storage.Blobs;
-using HTEXLib.COMM.Helpers;
-using StackExchange.Redis;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.Json;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Models;
-using TEAMModelOS.SDK.Models.Cosmos.Common;
-
-namespace TEAMModelOS.Services.Common
-{
-    public static class SchoolService
-    {
-        public static async Task<UsedBlob> GetSchoolBlobUsed(CosmosClient clientc, BlobContainerClient clients, IDatabase clientr, string schoolCode)
-        {
-            UsedBlob result = new UsedBlob();
-            try
-            {
-                //学校已经分配给所有教师的空间大小GB。
-                long teach = 0;
-                await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT sum(c.size) as size FROM c ",
-                    requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{schoolCode}") }))
-                {
-                    var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var elmt in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        if (elmt.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
-                        {
-                            teach = _size.GetInt32();
-                            break;
-                        }
-                    }
-                }
-                //學校使用blob狀況
-                bool getBlobCatalogFromBlob = false; //是否直接去blob取得使用狀況 false:否(Redis)  true:是(Blob)
-                long blobsize = 0;
-                RedisValue value = default;
-                value = clientr.HashGet($"Blob:Record", schoolCode);
-                if (value != default && !value.IsNullOrEmpty)
-                {
-                    JsonElement record = value.ToString().ToObject<JsonElement>();
-                    if (record.TryGetInt64(out blobsize))
-                    {
-                    }
-                    else
-                    {
-                        getBlobCatalogFromBlob = true;
-                    }
-                }
-                else
-                {
-                    getBlobCatalogFromBlob = true;
-                }
-                Dictionary<string, double?> catalog = new Dictionary<string, double?>();
-                SortedSetEntry[] Scores = clientr.SortedSetRangeByScoreWithScores($"Blob:Catalog:{schoolCode}");
-                if (Scores != null)
-                {
-                    foreach (var score in Scores)
-                    {
-                        double val = score.Score;
-                        string key = score.Element.ToString();
-                        catalog.Add(key, val);
-                    }
-                }
-                if (!getBlobCatalogFromBlob)
-                {
-                    result.size = blobsize;
-                    result.catalog = catalog;
-                    result.teach = teach;
-                    return result;
-                }
-                else
-                {
-                    var size = await clients.GetBlobsCatalogSize();
-                    result.size = size.Item1;
-                    result.catalog = size.Item2;
-                    result.teach = teach;
-                    return result;
-                }
-            }
-            catch (Exception ex)
-            {
-                //await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},Channel/Create()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
-                return result;
-            }
-        }
-
-        public class UsedBlob
-        {
-            public long teach { get; set; }
-            public long? size { get; set; }
-            public Dictionary<string, double?> catalog { get; set; }
-
-        }
-    }
-}