Parcourir la source

補足取得老師所在學校相關數據(get-school-info)

jeff il y a 4 ans
Parent
commit
c562dd3ca4

+ 21 - 2
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -151,8 +151,9 @@ namespace TEAMModelOS.Controllers.Client
             var id = jwt.Payload.Sub;
 
             var client = _azureCosmos.GetCosmosClient();
+            //學校課程
             List<object> courses = new List<object>();
-            var query = $"select c.id,c.name,c.period,c.subject,c.notice,c.scope from c where ARRAY_CONTAINS(c.teacherIds, {id} , true)";
+            var query = $"SELECT c.id,c.name,c.period,c.subject,c.classes,c.notice,c.scope FROM c WHERE EXISTS( SELECT VALUE t.id FROM t IN c.teachers WHERE t.id = '{id}')";
             await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -164,7 +165,25 @@ namespace TEAMModelOS.Controllers.Client
                     }
                 }
             }
-            return Ok(new { courses });
+            //校本課綱
+            List<object> syllabus = new List<object>();
+            await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.scope FROM c WHERE c.teacherId = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{school_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())
+                    {
+                        syllabus.Add(obj.ToObject<object>());
+                    }
+                }
+            }
+            //取得Teacher Blob 容器位置及SAS 
+            var container = _azureStorage.GetBlobContainerClient(id);
+            await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
+            var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read);
+            
+            return Ok(new { blob_uri, blob_sas, courses, syllabus });
         }
 
        

+ 49 - 4
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -131,7 +131,7 @@ namespace TEAMModelOS.Controllers
 
                 //私人課綱
                 List<object> syllabus = new List<object>();
-                await foreach (var item in client.GetContainer("TEAMModelOSTemp", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id, c.name, c.classes, c.notice ,c.scope from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{id}") }))
+                await foreach (var item in client.GetContainer("TEAMModelOSTemp", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id, c.name, c.scope from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{id}") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -174,9 +174,35 @@ namespace TEAMModelOS.Controllers
             var id = jwt.Payload.Sub;
 
             var client = _azureCosmos.GetCosmosClient();
+
+            //權限token
+            jwt.Payload.TryGetValue("name", out object name);
+            jwt.Payload.TryGetValue("picture", out object picture);
+            List<string> roles = new List<string>();
+            List<string> permissions = new List<string>();
+            var response = await client.GetContainer("TEAMModelOSTemp", "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{school_code}"));
+            if (response.Status == 200)
+            {
+                using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                foreach (var obj in json.RootElement.GetProperty("roles").EnumerateArray())
+                {
+                    roles.Add(obj.GetString());
+                }
+                foreach (var obj in json.RootElement.GetProperty("permissions").EnumerateArray())
+                {
+                    permissions.Add(obj.GetString());
+                }
+            }
+            if(roles.Count == 0)
+            {
+                roles.Add("Teacher");
+            }
+            var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, roles: roles.ToArray(), permissions: permissions.ToArray());
+
+            //學校課程
             List<object> courses = new List<object>();
-            var query = $"select c.id,c.name,c.period,c.subject,c.notice,c.scope from c where ARRAY_CONTAINS(c.teacherIds, {id} , true)";
-            await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
+            var query = $"SELECT c.id,c.name,c.period,c.subject,c.classes,c.notice,c.scope FROM c WHERE EXISTS( SELECT VALUE t.id FROM t IN c.teachers WHERE t.id = '{id}')";
+            await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -187,7 +213,26 @@ namespace TEAMModelOS.Controllers
                     }
                 }
             }
-            return Ok(new { courses });
+            //校本課綱
+            List<object> syllabus = new List<object>();
+            await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.scope FROM c WHERE c.teacherId = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{school_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())
+                    {
+                        syllabus.Add(obj.ToObject<object>());
+                    }
+                }
+            }
+
+            //取得Teacher Blob 容器位置及SAS 
+            var container = _azureStorage.GetBlobContainerClient(id);
+            await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
+            var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read);
+
+            return Ok(new { auth_token, blob_uri, blob_sas, courses, syllabus });
         }
 
         [ProducesDefaultResponseType]