TeacherService.cs 30 KB

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