using EasyBL; using Entity.Sugar; using Microsoft.Office365.OutlookServices; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using WebApp.Outlook.Models; namespace WebApp.Outlook { public class ServiceHelper { public static string RedirectUri { get { return Common.GetAppSettings("ida:RedirectUri"); } } public static string AppId { get { return Common.GetAppSettings("ida:AppId"); } } public static string AppSecret { get { return Common.GetAppSettings("ida:AppPassword"); } } public static string Scopes { get { return Common.GetAppSettings("ida:AppScopes"); //return Common.GetAppSettings("ida:AppScopes").Replace(" ", ",https://outlook.office.com/").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } } public static string Scopes_Outlook { get { return Common.GetAppSettings("ida:AppScopes").Replace(" ", ",https://outlook.office.com/").Replace(",", " "); } } public static async Task SendRequestAsync(HttpMethod method, String endPoint, string accessToken, dynamic content = null) { HttpResponseMessage response = null; using (var client = new HttpClient()) { using (var request = new HttpRequestMessage(method, endPoint)) { request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); if (content != null) { string c; c = content is string ? content : JsonConvert.SerializeObject(content); request.Content = new StringContent(c, Encoding.UTF8, "application/json"); } response = await client.SendAsync(request); } } return response; } /// /// Helper function to prepare the ResultsItem list from request response. /// /// Request response /// Property name of the item Id /// Property name of the item display name /// todo: describe resourcePropId parameter on GetResultsItemAsync /// public static async Task> GetResultsItemAsync( HttpResponseMessage response, string idPropertyName, string displayPropertyName, string resourcePropId) { var items = new List(); var json = JObject.Parse(await response.Content.ReadAsStringAsync()); foreach (JProperty content in json.Children()) { if (content.Name.Equals("value")) { var res = content.Value.AsJEnumerable().GetEnumerator(); res.MoveNext(); while (res.Current != null) { var display = ""; var id = ""; foreach (JProperty prop in res.Current.Children()) { if (prop.Name.Equals(idPropertyName)) { id = prop.Value.ToString(); } if (prop.Name.Equals(displayPropertyName)) { display = prop.Value.ToString(); } } items.Add(new ResultsItem { Display = display, Id = id, Properties = new Dictionary { { resourcePropId, id } } }); res.MoveNext(); } } } return items; } public static Microsoft.Graph.Event BuildEvents(SqlSugarClient db, OTB_SYS_Calendar evnt, bool requested = false) { var saAttendee = new List(); if (evnt.OpenMent == "G") { var saGroupMembers = evnt.GroupMembers.Split(new string[] { ",", "," }, StringSplitOptions.RemoveEmptyEntries); foreach (string member in saGroupMembers) { var oMembers = db.Queryable().Single(x => x.MemberID == member && x.OrgID == evnt.OrgID); if (oMembers == null) {//外部人員 var oOuterUsers = db.Queryable().Single(x => x.Guid == member); if (oOuterUsers != null) { saAttendee.Add(new Microsoft.Graph.Attendee { EmailAddress = new Microsoft.Graph.EmailAddress { Address = oOuterUsers.Email, Name = oOuterUsers.UserName }, Type = Microsoft.Graph.AttendeeType.Resource }); } } else {//內部人員 saAttendee.Add(new Microsoft.Graph.Attendee { EmailAddress = new Microsoft.Graph.EmailAddress { Address = oMembers.OutlookAccount, Name = oMembers.MemberName }, Type = Microsoft.Graph.AttendeeType.Resource }); } } } else if (evnt.OpenMent == "C") { var saMembers = db.Queryable().Where(x => x.Effective == "Y" && x.OrgID == evnt.OrgID).ToList(); foreach (var _user in saMembers) {//公司所有人 saAttendee.Add(new Microsoft.Graph.Attendee { EmailAddress = new Microsoft.Graph.EmailAddress { Address = _user.OutlookAccount, Name = _user.MemberName }, Type = Microsoft.Graph.AttendeeType.Resource }); } } var _event = new Microsoft.Graph.Event { Subject = evnt.Title, Importance = evnt.Importment == "H" ? Microsoft.Graph.Importance.High : Microsoft.Graph.Importance.Normal, IsAllDay = evnt.AllDay, Body = new Microsoft.Graph.ItemBody { ContentType = Microsoft.Graph.BodyType.Html, Content = evnt.Description }, BodyPreview = evnt.Description, Start = new Microsoft.Graph.DateTimeTimeZone { DateTime = evnt.StartDate.ToString("yyyy-MM-dd HH:mm:ss"), TimeZone = "Asia/Shanghai" }, End = new Microsoft.Graph.DateTimeTimeZone { DateTime = evnt.EndDate.ToString("yyyy-MM-dd HH:mm:ss"), TimeZone = "Asia/Shanghai" }, Attendees = saAttendee,//邀請的所有人員 ResponseRequested = false//如果發送方希望在接受或拒絕事件時響應,則設置為true }; return _event; } public static Event BuildOutlookEvents(SqlSugarClient db, OTB_SYS_Calendar evnt, bool leave_privilege = false) { var saAttendee = new List(); if (evnt.OpenMent == "G") { var saGroupMembers = evnt.GroupMembers.Split(new string[] { ",", "," }, StringSplitOptions.RemoveEmptyEntries); foreach (string member in saGroupMembers) { var oMembers = db.Queryable().Single(x => x.MemberID == member && x.OrgID == evnt.OrgID); if (oMembers == null) {//外部人員 var oOuterUsers = db.Queryable().Single(x => x.Guid == member); if (oOuterUsers != null) { saAttendee.Add(new Attendee { EmailAddress = new EmailAddress { Address = oOuterUsers.Email, Name = oOuterUsers.UserName }, Type = AttendeeType.Resource }); } } else {//內部人員 saAttendee.Add(new Attendee { EmailAddress = new EmailAddress { Address = oMembers.OutlookAccount, Name = oMembers.MemberName }, Type = AttendeeType.Resource }); } } } else if (evnt.OpenMent == "C") { var saMembers = db.Queryable().Where(x => x.Effective == "Y" && x.OrgID == evnt.OrgID).ToList(); if (evnt.Memo == "leave") {//如果是請假的話,(依據系統設定抓去能看到所有資訊的人來分類同步) var oSystemSetting = db.Queryable().Single(x => x.Effective == "Y" && x.OrgID == evnt.OrgID && x.SettingItem == "Leave_Privilege"); if (leave_privilege) {//特權 if (oSystemSetting != null) { var saMembersPrivileges = saMembers.FindAll(x => oSystemSetting.SettingValue.IndexOf(x.MemberID) > -1); foreach (var privilege in saMembersPrivileges) { saAttendee.Add(new Attendee { EmailAddress = new EmailAddress { Address = privilege.OutlookAccount, Name = privilege.MemberName }, Type = AttendeeType.Resource }); } } } else {//非特權 var saMembersUnPrivileges = saMembers; if (oSystemSetting != null) { var saMembersPrivileges = saMembers.FindAll(x => oSystemSetting.SettingValue.IndexOf(x.MemberID) == -1); } foreach (var unprivilege in saMembersUnPrivileges) { saAttendee.Add(new Attendee { EmailAddress = new EmailAddress { Address = unprivilege.OutlookAccount, Name = unprivilege.MemberName }, Type = AttendeeType.Resource }); } } } else {//其他 foreach (var _user in saMembers) {//公司所有人 saAttendee.Add(new Attendee { EmailAddress = new EmailAddress { Address = _user.OutlookAccount, Name = _user.MemberName }, Type = AttendeeType.Resource }); } } } var _event = new Event { Subject = evnt.Title, Importance = evnt.Importment == "H" ? Importance.High : Importance.Normal, IsAllDay = evnt.AllDay, Body = new ItemBody { ContentType = BodyType.HTML, Content = evnt.Description }, BodyPreview = evnt.Description, Start = new DateTimeTimeZone { DateTime = evnt.StartDate.ToString("yyyy-MM-dd HH:mm:ss"), TimeZone = "Asia/Shanghai" }, End = new DateTimeTimeZone { DateTime = evnt.EndDate.ToString("yyyy-MM-dd HH:mm:ss"), TimeZone = "Asia/Shanghai" }, Attendees = saAttendee, ResponseRequested = false }; return _event; } } }