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.BI.BINormal;
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 = "学校数据授权变更", TName = "", EName = "", 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 = "名单成员变更",TName ="",EName ="", RWN = "N")]
public async Task NoticeGroupChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "webhook/group-member-change")] HttpRequestData request) {
var response = request.CreateResponse(HttpStatusCode.OK);
( List < BizConfig > 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;
List< BizConfig > bizConfigs = new List< BizConfig >();
try {
var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOpenApi");
if (json.TryGetProperty("school", out JsonElement _school) && !string.IsNullOrWhiteSpace($"{_school}"))
{
string sql = $"select distinct value c from c join s in c.schools where s.id='{_school}' ";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal)
.GetItemQueryIterator(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("BizConfig") }))
{
bizConfigs.Add(item);
}
}
if (json.TryGetProperty("bizid", out JsonElement _bizid))
{
try
{
BizConfig bizConfig = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReadItemAsync($"{_bizid}", new PartitionKey("BizConfig"));
bizConfigs.Add(bizConfig);
}
catch (CosmosException ex) when (ex.Status == 404)
{
return (bizConfigs, null, default(T));
}
}
if (json.TryGetProperty("data", out JsonElement _data) && bizConfigs.IsNotEmpty())
{
var webhookdomain = bizConfigs.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 (bizConfigs, webhookdomains, _data.ToObject());
}
else
{
return (bizConfigs, null, default(T));
}
} catch {
return (bizConfigs, null, default(T));
}
}
}
public class WebhookSchoolData {
public string school { get; set; }
public string data { get; set; }
}
}