TeacherService.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. using Microsoft.Azure.Cosmos;
  2. using Azure.Storage.Blobs.Models;
  3. using Azure.Storage.Sas;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Dynamic;
  7. using System.Linq;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModelOS.Models;
  11. using TEAMModelOS.SDK.Models;
  12. using TEAMModelOS.SDK.DI;
  13. using TEAMModelOS.SDK.Extension;
  14. using TEAMModelOS.SDK;
  15. using static TEAMModelOS.SDK.Models.Teacher;
  16. using static TEAMModelOS.SDK.DI.AzureCosmosExtensions;
  17. namespace TEAMModelOS.Services
  18. {
  19. public static class TeacherService
  20. {
  21. public static async Task<TeacherInfo> TeacherInfoLite(AzureCosmosFactory _azureCosmos, string name, string picture, string id,
  22. AzureStorageFactory _azureStorage, Option _option, AzureRedisFactory _azureRedis, string ip, HttpTrigger _httpTrigger, string lang, int timezone, string schoolCode = null)
  23. {
  24. Teacher teacher = null;
  25. string defaultschool = null;
  26. //TODO 取得Teacher 個人相關數據(課程清單、虛擬教室清單、歷史紀錄清單等),學校數據另外API處理,多校切換時不同
  27. var client = _azureCosmos.GetCosmosClient();
  28. try
  29. {
  30. if (teacher == null)
  31. {
  32. teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(id, new PartitionKey("Base"));
  33. if (!string.IsNullOrWhiteSpace(lang) && string.IsNullOrWhiteSpace(teacher.lang))
  34. {
  35. teacher.lang = lang;
  36. }
  37. teacher.name = $"{name}";
  38. teacher.picture = $"{picture}";
  39. }
  40. else
  41. {
  42. name = teacher.name;
  43. picture = teacher.picture;
  44. id = teacher.id;
  45. }
  46. //处理导入时,在学校名单有该教师加入的,但是基本信息没有的
  47. string schoolJoinTeacher = $"SELECT value c.id FROM c join b in c.teachers where c.code='TeacherImport' and b.tmdid='{teacher.id}' and b.status='join'";
  48. var schoolJoins = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<string>(schoolJoinTeacher, "TeacherImport");
  49. if (schoolJoins.list.IsNotEmpty())
  50. {
  51. var notInBase = schoolJoins.list.Except(teacher.schools.Select(z => z.schoolId));
  52. if (notInBase.Any())
  53. {
  54. string sqlSchoolBase = $"SELECT value c FROM c where c.id in ({string.Join(",", notInBase.Select(z => $"'{z}'"))})";
  55. var schoolBase = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>(sqlSchoolBase, "Base");
  56. if (schoolBase.list.IsNotEmpty())
  57. {
  58. var nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  59. foreach (var school in schoolBase.list)
  60. {
  61. if (!teacher.schools.Exists(z => z.schoolId.Equals(school.id)))
  62. {
  63. teacher.schools.Add(new TeacherSchool { schoolId = school.id, areaId = school.areaId, name = school.name, picture = school.picture, status = "join", time = nowtime });
  64. }
  65. }
  66. }
  67. }
  68. }
  69. //检查是否有加入学校,如果加入学校,则当个人空间size是0G的时候,则免费获得一个G空间,但无论加入多少个学校,只能获取一次 1G的免费空间。没有加入学校则默认0G空间,除非自己购买空间
  70. if (teacher.schools.IsNotEmpty())
  71. {
  72. foreach (var sc in teacher.schools)
  73. {
  74. string statusNow = sc.status != null ? sc.status : "";
  75. if (statusNow.Equals("join"))
  76. {
  77. var sctch = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{sc.schoolId}"));
  78. if (sctch.StatusCode == System.Net.HttpStatusCode.OK && sctch != null && sctch.Content != null)
  79. {
  80. var jsonDoc = await JsonDocument.ParseAsync(sctch.Content);
  81. SchoolTeacher schoolTeacher = jsonDoc.RootElement.ToObject<SchoolTeacher>();
  82. if (schoolTeacher.name == null || schoolTeacher.picture == null || !schoolTeacher.name.Equals($"{name}") || !schoolTeacher.picture.Equals($"{picture}"))
  83. {
  84. schoolTeacher.name = $"{name}";
  85. schoolTeacher.picture = $"{picture}";
  86. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(schoolTeacher, id, new PartitionKey($"Teacher-{sc.schoolId}"));
  87. }
  88. }
  89. }
  90. }
  91. //如果包含任何申请,邀请,加入学校的记录 且个人空间未分配2G 则默认分配个人空间至2G.
  92. if (teacher.size < 2 && teacher.schools.Count > 0)
  93. {
  94. teacher.size = 2;
  95. }
  96. //如果未包含任何申请,邀请,加入学校的记录 且 个人空间没有分配1G 则默认赠送一个G
  97. if (teacher.schools.Count == 0 && teacher.size < 1)
  98. {
  99. teacher.size = 1;
  100. }
  101. }
  102. if (string.IsNullOrEmpty(teacher.defaultSchool) && teacher.schools.IsNotEmpty())
  103. {
  104. var tech = teacher.schools.FindAll(x => x.status.Equals("join"));
  105. if (tech.IsNotEmpty())
  106. {
  107. teacher.defaultSchool = teacher.schools[0].schoolId;
  108. }
  109. }
  110. if (!string.IsNullOrEmpty(teacher.defaultSchool))
  111. {
  112. if (teacher.schools.IsNotEmpty())
  113. {
  114. var tech = teacher.schools.FindAll(x => x.status.Equals("join") && x.schoolId.Equals(teacher.defaultSchool));
  115. if (!tech.IsNotEmpty())
  116. {
  117. var techde = teacher.schools.FindAll(x => x.status.Equals("join"));
  118. if (techde.IsNotEmpty())
  119. {
  120. teacher.defaultSchool = techde[0].schoolId;
  121. }
  122. else
  123. {
  124. teacher.defaultSchool = null;
  125. }
  126. }
  127. }
  128. else
  129. {
  130. teacher.defaultSchool = null;
  131. }
  132. }
  133. teacher.timezone=timezone;
  134. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, id, new PartitionKey("Base"));
  135. //預設學校ID
  136. defaultschool = teacher.defaultSchool;
  137. }
  138. catch (CosmosException ex)
  139. {
  140. if (ex.StatusCode == System.Net.HttpStatusCode.NotFound && teacher == null)
  141. {
  142. //如果沒有,則初始化Teacher基本資料到Cosmos
  143. teacher = new Teacher
  144. {
  145. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  146. id = id,
  147. pk = "Base",
  148. code = "Base",
  149. name = name?.ToString(),
  150. picture = picture?.ToString(),
  151. //创建账号并第一次登录IES5则默认赠送1G
  152. size = 1,
  153. defaultSchool = null,
  154. schools = new List<Teacher.TeacherSchool>(),
  155. lang=lang,
  156. timezone=timezone,
  157. };
  158. var container = _azureStorage.GetBlobContainerClient(id);
  159. await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
  160. teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<Teacher>(teacher, new PartitionKey("Base"));
  161. }
  162. }
  163. catch (Exception ex)
  164. {
  165. throw new Exception($"{ex.Message}\n{ex.StackTrace}");
  166. }
  167. List<string> roles = new List<string>() { "teacher" };
  168. //換取AuthToken,提供給前端
  169. //用户在线记录
  170. //try
  171. //{
  172. // _ = _httpTrigger.RequestHttpTrigger(new { school = defaultschool, scope = $"{Constant.ScopeTeacher}", id = $"{id}", ip = $"{ip}", expire = 1 }, _option.Location, "online-record");
  173. //}
  174. //catch { }
  175. //換取AuthToken,提供給前端
  176. var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, Website: "IES", timezone: timezone, scope: Constant.ScopeTeacher,schoolID:!string.IsNullOrWhiteSpace(schoolCode) ? schoolCode : defaultschool, standard: "", roles: roles.ToArray(), expire: 1);
  177. //取得Teacher Blob 容器位置及SAS
  178. await _azureStorage.GetBlobContainerClient(id).CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
  179. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete);
  180. return new TeacherInfo
  181. {
  182. blob_uri = blob_uri,
  183. blob_sas = blob_sas,
  184. defaultschool = defaultschool,
  185. teacher = teacher,
  186. auth_token = auth_token,
  187. };
  188. }
  189. public static async Task<TeacherInfo> TeacherInfo(AzureCosmosFactory _azureCosmos, Teacher teacher, string name, string picture, string id,
  190. AzureStorageFactory _azureStorage, Option _option, AzureRedisFactory _azureRedis, string ip, HttpTrigger _httpTrigger, string lang,int timezone)
  191. {
  192. List<object> schools = new List<object>();
  193. List<AreaDto> areas = new List<AreaDto>();
  194. string defaultschool = null;
  195. //TODO 取得Teacher 個人相關數據(課程清單、虛擬教室清單、歷史紀錄清單等),學校數據另外API處理,多校切換時不同
  196. var client = _azureCosmos.GetCosmosClient();
  197. int total = 0;
  198. int tsize = 0;
  199. List<Area> areasDbs = new List<Area>();
  200. List<AreaSetting> areaSettings = new List<AreaSetting>();
  201. try
  202. {
  203. if (teacher == null)
  204. {
  205. teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(id, new PartitionKey("Base"));
  206. if (!string.IsNullOrWhiteSpace(lang) && string.IsNullOrWhiteSpace(teacher.lang))
  207. {
  208. teacher.lang = lang;
  209. }
  210. teacher.name = $"{name}";
  211. teacher.picture = $"{picture}";
  212. }
  213. else
  214. {
  215. name = teacher.name;
  216. picture = teacher.picture;
  217. id = teacher.id;
  218. }
  219. ///教师的个人空间
  220. tsize = teacher.size;
  221. ///教师的总空间 包含 个人空间和学校赠送的空间累加
  222. total = teacher.size;
  223. HashSet<string> areaIds = new HashSet<string>();
  224. if (teacher.areas.IsNotEmpty())
  225. {
  226. teacher.areas.ForEach(x => {
  227. areaIds.Add(x.areaId);
  228. });
  229. }
  230. if (teacher.schools.IsNotEmpty())
  231. {
  232. teacher.schools.ForEach(x => {
  233. if (!string.IsNullOrEmpty(x.areaId))
  234. {
  235. areaIds.Add(x.areaId);
  236. }
  237. });
  238. }
  239. if (areaIds.Count > 0)
  240. {
  241. string queryText = $"select value(c) from c where c.id in ({string.Join(",", areaIds.Select(x => $"'{x}'"))})";
  242. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIteratorSql<Area>(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base-Area") }))
  243. {
  244. areasDbs.Add(item);
  245. }
  246. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIteratorSql<AreaSetting>(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("AreaSetting") }))
  247. {
  248. areaSettings.Add(item);
  249. }
  250. }
  251. if (teacher.areas.IsNotEmpty())
  252. {
  253. foreach (var areat in teacher.areas)
  254. {
  255. Area area = areasDbs.Find(x => x.id.Equals(areat.areaId));
  256. AreaSetting setting = null;
  257. if (area != null)
  258. {
  259. setting = areaSettings.Find(x => x.id.Equals(areat.areaId));
  260. }
  261. int access = 0;
  262. if (setting != null && !string.IsNullOrWhiteSpace(setting.accessConfig))
  263. {
  264. access = 1;
  265. }
  266. if (!string.IsNullOrWhiteSpace(area?.id)) {
  267. var container = _azureStorage.GetBlobContainerClient(area?.id);
  268. await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
  269. var blobArea = _azureStorage.GetBlobContainerSAS(area?.id, blobContainerSasPermissions: BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete);
  270. //if (setting != null)
  271. //{
  272. // setting.accessConfig = null;
  273. //}
  274. areas.Add(new AreaDto { sas= blobArea.sas, url =blobArea.uri, areaId = area?.id, name = area?.name, standard = area?.standard, standardName = area?.standardName, setting = setting, access = access, shortCode=area.shortCode });
  275. }
  276. }
  277. }
  278. //处理导入时,在学校名单有该教师加入的,但是基本信息没有的
  279. string schoolJoinTeacher = $"SELECT value c.id FROM c join b in c.teachers where c.code='TeacherImport' and b.tmdid='{teacher.id}' and b.status='join'";
  280. var schoolJoins = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<string>(schoolJoinTeacher, "TeacherImport");
  281. if (schoolJoins.list.IsNotEmpty())
  282. {
  283. var notInBase = schoolJoins.list.Except(teacher.schools.Select(z => z.schoolId));
  284. if (notInBase.Any())
  285. {
  286. string sqlSchoolBase = $"SELECT value c FROM c where c.id in ({string.Join(",", notInBase.Select(z => $"'{z}'"))})";
  287. var schoolBase = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>(sqlSchoolBase, "Base");
  288. if (schoolBase.list.IsNotEmpty())
  289. {
  290. var nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  291. foreach (var school in schoolBase.list)
  292. {
  293. if (!teacher.schools.Exists(z => z.schoolId.Equals(school.id)))
  294. {
  295. teacher.schools.Add(new TeacherSchool { schoolId = school.id, areaId = school.areaId, name = school.name, picture = school.picture, status = "join", time = nowtime });
  296. }
  297. }
  298. }
  299. }
  300. }
  301. //检查是否有加入学校,如果加入学校,则当个人空间size是0G的时候,则免费获得一个G空间,但无论加入多少个学校,只能获取一次 1G的免费空间。没有加入学校则默认0G空间,除非自己购买空间
  302. if (teacher.schools.IsNotEmpty())
  303. {
  304. foreach (var sc in teacher.schools)
  305. {
  306. string statusNow = sc.status != null ? sc.status : "";
  307. if (statusNow.Equals("join") || statusNow.Equals("invite") || statusNow.Equals("request"))
  308. {
  309. dynamic schoolExtobj = new ExpandoObject();
  310. schoolExtobj.schoolId = sc.schoolId;
  311. schoolExtobj.name = sc.name;
  312. schoolExtobj.status = sc.status;
  313. schoolExtobj.time = sc.time;
  314. schoolExtobj.picture = sc.picture;
  315. schoolExtobj.areaId = $"{sc.areaId}";
  316. Area area = null;
  317. int access = 0;
  318. if (!string.IsNullOrEmpty($"{sc.areaId}"))
  319. {
  320. area = areasDbs.Find(x => x.id.Equals(sc.areaId));
  321. AreaSetting setting = null;
  322. if (area != null)
  323. {
  324. setting = areaSettings.Find(x => x.id.Equals(sc.areaId));
  325. }
  326. if (setting != null && !string.IsNullOrWhiteSpace(setting.accessConfig))
  327. {
  328. access = 1;
  329. }
  330. }
  331. if (area != null)
  332. {
  333. schoolExtobj.area = new { area.name, area.id, area.institution, area.provName, area.code, area.cityCode, area.cityName, area.standard, area.provCode, area.pk, access };
  334. }
  335. else
  336. {
  337. schoolExtobj.area = area;
  338. }
  339. var sctch = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{sc.schoolId}"));
  340. if (sctch.StatusCode == System.Net.HttpStatusCode.OK && sctch != null && sctch.Content != null)
  341. {
  342. var jsonDoc = await JsonDocument.ParseAsync(sctch.Content);
  343. SchoolTeacher schoolTeacher = jsonDoc.RootElement.ToObject<SchoolTeacher>();
  344. sc.roles=schoolTeacher.roles;
  345. if (schoolTeacher.name == null || schoolTeacher.picture == null || !schoolTeacher.name.Equals($"{name}") || !schoolTeacher.picture.Equals($"{picture}"))
  346. {
  347. schoolTeacher.name = $"{name}";
  348. schoolTeacher.picture = $"{picture}";
  349. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(schoolTeacher, id, new PartitionKey($"Teacher-{sc.schoolId}"));
  350. }
  351. if (jsonDoc.RootElement.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
  352. {
  353. total += _size.GetInt32();
  354. schoolExtobj.size = _size.GetInt32();
  355. }
  356. else { schoolExtobj.size = 0; }
  357. }
  358. else
  359. {
  360. schoolExtobj.size = 0;
  361. }
  362. //if (statusNow.Equals("join"))
  363. //{
  364. // await TmdUserService.JoinSchool(client, teacher.id, teacher.picture, teacher.name, sc.schoolId, sc.name);
  365. //}
  366. schoolExtobj.roles= sc.roles;
  367. schools.Add(schoolExtobj);
  368. }
  369. }
  370. //如果包含任何申请,邀请,加入学校的记录 且个人空间未分配2G 则默认分配个人空间至2G.
  371. if (teacher.size < 2 && teacher.schools.Count > 0)
  372. {
  373. teacher.size = 2;
  374. }
  375. //如果未包含任何申请,邀请,加入学校的记录 且 个人空间没有分配1G 则默认赠送一个G
  376. if (teacher.schools.Count == 0 && teacher.size < 1)
  377. {
  378. teacher.size = 1;
  379. }
  380. }
  381. if (string.IsNullOrEmpty(teacher.defaultSchool) && teacher.schools.IsNotEmpty())
  382. {
  383. var tech = teacher.schools.FindAll(x => x.status.Equals("join"));
  384. if (tech.IsNotEmpty())
  385. {
  386. teacher.defaultSchool = teacher.schools[0].schoolId;
  387. }
  388. }
  389. if (!string.IsNullOrEmpty(teacher.defaultSchool))
  390. {
  391. if (teacher.schools.IsNotEmpty())
  392. {
  393. var tech = teacher.schools.FindAll(x => x.status.Equals("join") && x.schoolId.Equals(teacher.defaultSchool));
  394. if (!tech.IsNotEmpty())
  395. {
  396. var techde = teacher.schools.FindAll(x => x.status.Equals("join"));
  397. if (techde.IsNotEmpty())
  398. {
  399. teacher.defaultSchool = techde[0].schoolId;
  400. }
  401. else
  402. {
  403. teacher.defaultSchool = null;
  404. }
  405. }
  406. }
  407. else
  408. {
  409. teacher.defaultSchool = null;
  410. }
  411. }
  412. teacher.timezone=timezone;
  413. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, id, new PartitionKey("Base"));
  414. //預設學校ID
  415. defaultschool = teacher.defaultSchool;
  416. }
  417. catch (CosmosException ex)
  418. {
  419. if (ex.StatusCode == System.Net.HttpStatusCode.NotFound && teacher == null)
  420. {
  421. //如果沒有,則初始化Teacher基本資料到Cosmos
  422. teacher = new Teacher
  423. {
  424. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  425. id = id,
  426. pk = "Base",
  427. code = "Base",
  428. name = name?.ToString(),
  429. picture = picture?.ToString(),
  430. //创建账号并第一次登录IES5则默认赠送1G
  431. size = 1,
  432. defaultSchool = null,
  433. schools = new List<Teacher.TeacherSchool>(),
  434. lang=lang,
  435. timezone=timezone,
  436. };
  437. var container = _azureStorage.GetBlobContainerClient(id);
  438. await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
  439. teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<Teacher>(teacher, new PartitionKey("Base"));
  440. total = teacher.size;
  441. tsize = teacher.size;
  442. }
  443. }
  444. catch (Exception ex)
  445. {
  446. throw new Exception($"{ex.Message}\n{ex.StackTrace}");
  447. }
  448. //私人課程
  449. List<object> courses = new List<object>();
  450. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIteratorSql(queryText: $"select value(c) from c WHERE c.creatorId = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseBase") }))
  451. {
  452. using var json = await JsonDocument.ParseAsync(item.Content);
  453. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  454. {
  455. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  456. {
  457. courses.Add(obj.ToObject<object>());
  458. }
  459. }
  460. }
  461. List<string> roles = new List<string>() { "teacher" };
  462. Area areaa = null;
  463. if (areas.Count > 0)
  464. {
  465. roles.Add("area");
  466. if (!string.IsNullOrEmpty($"{areas[0]}"))
  467. {
  468. areaa = areasDbs.Find(x => x.Equals(areas[0].areaId));
  469. }
  470. }
  471. //換取AuthToken,提供給前端
  472. var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, Website: "IES", timezone: timezone, scope: Constant.ScopeTeacher, standard: areaa != null ? areaa.standard : "", roles: roles.ToArray(), expire: 1);
  473. //用户在线记录
  474. //try
  475. //{
  476. // _ = _httpTrigger.RequestHttpTrigger(new { school = defaultschool, scope = $"{Constant.ScopeTeacher}", id = $"{id}", ip = $"{ip}", expire = 1 }, _option.Location, "online-record");
  477. //}
  478. //catch { }
  479. //取得Teacher Blob 容器位置及SAS
  480. await _azureStorage.GetBlobContainerClient(id).CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
  481. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete);
  482. var (osblob_uri, osblob_sas) = roles.Contains("area") ? _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
  483. return new TeacherInfo
  484. {
  485. auth_token = auth_token,
  486. blob_uri = blob_uri,
  487. blob_sas = blob_sas,
  488. schools = schools,
  489. defaultschool = defaultschool,
  490. courses = courses,
  491. total = total,
  492. osblob_sas = osblob_sas,
  493. osblob_uri = osblob_uri,
  494. tsize = tsize,
  495. areas = areas,
  496. teacher = teacher
  497. };
  498. }
  499. }
  500. public record AreaDto
  501. {
  502. //areaId = area.id, name = area.name, area.standard, area.standardName
  503. public string areaId { get; set; }
  504. public string name { get; set; }
  505. public string standard { get; set; }
  506. public string standardName { get; set; }
  507. //public string accessConfig { get; set; }
  508. public AreaSetting setting { get; set; }
  509. public int access { get; set; } = 0;
  510. public string shortCode { get; set; }
  511. public string sas { get; set; }
  512. public string url { get; set; }
  513. }
  514. public record TeacherInfo
  515. {
  516. public string auth_token { get; set; }
  517. public string blob_uri { get; set; }
  518. public string blob_sas { get; set; }
  519. public List<object> schools { get; set; } = new List<object>();
  520. public string defaultschool { get; set; }
  521. public string defaultschoolPeriod { get; set; }
  522. public List<object> courses { get; set; } = new List<object>();
  523. public int total { get; set; }
  524. public string osblob_uri { get; set; }
  525. public string osblob_sas { get; set; }
  526. public int tsize { get; set; }
  527. public List<AreaDto> areas { get; set; } = new List<AreaDto>();
  528. public Teacher teacher { get; set; }
  529. }
  530. }