using Azure.Cosmos; using Azure.Storage.Blobs.Models; using HTEXLib.COMM.Helpers; using Microsoft.Azure.Cosmos.Table; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Reflection; using System.Text; using System.Text.Json; using System.Threading.Tasks; using TEAMModelOS.Filter; using TEAMModelOS.SDK; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Models.Cosmos.Teacher; using TEAMModelOS.SDK.Models.Table; using static TEAMModelOS.SDK.Models.Teacher; namespace TEAMModelOS.SDK.DI { public class WebHookHttpTrigger { private readonly AzureCosmosFactory _azureCosmos; private readonly DingDing _dingDing; private readonly AzureStorageFactory _azureStorage; private readonly AzureRedisFactory _azureRedis; private readonly HttpClient _httpClient; public WebHookHttpTrigger(HttpClient httpClient,AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage , AzureRedisFactory azureRedis) { _azureCosmos = azureCosmos; _dingDing = dingDing; _azureStorage = azureStorage; _azureRedis = azureRedis; _httpClient = httpClient; } /// /// 学校数据授权变更,学校基础信息 10开头 /// /// /// [Function("school-auth-change")] [ApiToken(Auth = "1001", Name = "学校数据授权变更", RWN = "N")] public async Task NoticeSchoolAuthChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "webhook/school-auth-change")] HttpRequestData request) { var response = request.CreateResponse(HttpStatusCode.OK); ( List businessConfigs, List webhookdomain, SchoolAuthChange data) = await GetRequestData(request); if (webhookdomain.IsNotEmpty()) { foreach (var domain in webhookdomain) { await send(new { data.addSchools, data.rmvSchools }, domain, "school-auth-change"); } } return response; } public class SchoolAuthChange { public string bizcode { get; set; } /// /// 添加的学校数据授权 /// public List addSchools { get; set; } = new List(); /// /// 取消的学校数据授权 /// public List rmvSchools { get; set; } = new List(); } /// /// 名单变更通知,名单类12开头 /// /// /// [Function("group-member-change")] [ApiToken(Auth = "1201", Name = "名单成员变更", RWN = "N")] public async Task NoticeGroupChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "webhook/group-member-change")] HttpRequestData request) { var response = request.CreateResponse(HttpStatusCode.OK); ( List < BusinessConfig > businessConfigs, List webhookdomain, GroupChange data) = await GetRequestData(request); if ( webhookdomain.IsNotEmpty()&& string.IsNullOrWhiteSpace(data.school)) { foreach (var domain in webhookdomain) { await send(new { data.status, data.type, data.listid, data.tmdjoin, data.tmdleave, data.stujoin, data.stuleave, data.tchjoin, data.tchleave, data.school }, domain,"group-member-change"); } } return response; } /// /// 测试域名的webhook是否接入 /// /// /// [Function("check-domain-webhook")] public async Task CheckDomainWebhook([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "webhook/check-domain-webhook")] HttpRequestData request) { string data = await new StreamReader(request.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; if (json.TryGetProperty("domain", out JsonElement domain) && json.TryGetProperty("https", out JsonElement _https)) { string https = _https.ValueKind.Equals(JsonValueKind.Number) && int.Parse($"{_https}") == 1 ? "https" : "http"; string url = $"{https}://{domain}"; HttpStatusCode httpStatus = await send(new { }, url, "check-domain-webhook"); var response = request.CreateResponse(httpStatus); return response; } else { var response = request.CreateResponse(HttpStatusCode.BadRequest); return response; } } /// /// 消息发送方法 /// /// /// /// public async Task send (dynamic data,string domain, string notice) { var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); _httpClient.Timeout=new TimeSpan(0,0,10); HttpResponseMessage httpResponse =await _httpClient.PostAsJsonAsync($"{domain}/webhook", new { time = timestamp, notice =notice, data = data }); return httpResponse.StatusCode; } /// /// 解析HttpRequestData 传递的数据 /// /// /// /// public async Task<( List businessConfigs,List webhookdomain, T data)> GetRequestData(HttpRequestData request) { //var response = request.CreateResponse(HttpStatusCode.OK); string data = await new StreamReader(request.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; string school = null; List businessConfigs = null ; var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOpenApi"); if (json.TryGetProperty("school", out JsonElement _school)) { school = _school.GetString(); List schools = table.FindListByDictSync(new Dictionary { { "PartitionKey", $"BusinessSchool" }, { "school", school } }); var bizid = schools.Select(x => x.bizid).ToList(); List Codes = new List(); bizid.ForEach(x => { Codes.Add($" RowKey {QueryComparisons.Equal} '{x}' "); }); string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'BusinessConfig' and ( {string.Join(" or ", Codes)} ) "; var result = await table.ExecuteQuerySegmentedAsync(new TableQuery().Where(tbqurey), null); if (result != null) { businessConfigs= result.Results; } } if (json.TryGetProperty("bizid", out JsonElement _bizid)) { string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'BusinessConfig' and RowKey {QueryComparisons.Equal} '{_bizid}' "; var result = await table.ExecuteQuerySegmentedAsync(new TableQuery().Where(tbqurey), null); if (result != null) { businessConfigs = result.Results; } } if (json.TryGetProperty("data", out JsonElement _data) && businessConfigs.IsNotEmpty()) { var webhookdomain = businessConfigs.Where(z => !string.IsNullOrWhiteSpace(z.webhook)).ToList(); List webhookdomains = new List(); webhookdomain.ForEach(x => { webhookdomains.AddRange(x.webhook.Split(",").Select(y =>x.https==1? $"https://{y}":$"http://{y}")); }); return ( businessConfigs, webhookdomains, _data.ToObject()); } else { return ( businessConfigs,null , default(T)); } } } public class WebhookSchoolData { public string school { get; set; } public string data { get; set; } } }