using HeuristicLab.Clients.Access.Administration; using HeuristicLab.Clients.Hive.WebJobManager.Services; using HeuristicLab.Clients.Hive.WebJobManager.ViewModels.User; using Microsoft.AspNet.SignalR; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace HeuristicLab.Clients.Hive.WebJobManager.Hubs { public class CalendarHub : Hub { private WebLoginService weblog; private Guid userId; private HiveAdminClientWeb adminClient; private HiveServiceLocatorWeb servloc; private AccessAdministrationClient accessClient; private void loader() { weblog = WebLoginService.Instance; string uid = Context.QueryString["userid"]; if (uid == null || uid == "" || Guid.Parse(uid) == Guid.Empty) { userId = Guid.Empty; } else { userId = Guid.Parse(uid); adminClient = weblog.getAdminClient(userId); servloc = weblog.getServiceLocator(userId); accessClient = weblog.getAccessAdminClient(userId); } } public void requestInfo() { loader(); adminClient.Refresh(); UserViewModel vm = new UserViewModel(accessClient).refreshAll(); var users = JsonConvert.SerializeObject(vm.users); var groups = JsonConvert.SerializeObject(vm.ugroups); var res = JsonConvert.SerializeObject(adminClient.Resources); Clients.Caller.processData(res, users, groups); } public void requestDownTime(string id) { loader(); adminClient.Refresh(); Guid t = Guid.Parse(id); adminClient.DowntimeForResourceId = t; adminClient.RefreshCalendar(); var down = JsonConvert.SerializeObject(adminClient.Downtimes); Clients.Caller.processDowntime(id, down); } public void requestPermissions(string id) { loader(); Guid r = Guid.Parse(id); var perm = servloc.CallHiveService(x => x.GetResourcePermissions(r)); Clients.Caller.processPermissions(id, JsonConvert.SerializeObject(perm)); } public void changePermissions(string[] perms, string idresource) { loader(); var res = Guid.Parse(idresource); var exist = servloc.CallHiveService(x => x.GetResourcePermissions(res)); List newPerms = new List(); List revokePerms = new List(); for (var i = 0; i < perms.Length; i++) { var p = Guid.Parse(perms[i]); var elemid = exist.FindIndex(x => x.GrantedUserId == p); if (elemid != -1) { exist[elemid].GrantedUserId = Guid.Empty; } else { newPerms.Add(p); } } servloc.CallHiveService(x => x.GrantResourcePermissions(res, newPerms)); foreach (var ex in exist) { if(ex.GrantedUserId != Guid.Empty) { revokePerms.Add(ex.GrantedUserId); } } servloc.CallHiveService(x => x.RevokeResourcePermissions(res, revokePerms)); requestPermissions(idresource); } public void toggleDisposable(string id) { loader(); adminClient.Refresh(); Guid c = Guid.Parse(id); var obj = adminClient.Resources.ToList().Find(x => x.Id == c); ((Slave)(obj)).IsDisposable = !((Slave)(obj)).IsDisposable; adminClient.Store(obj, CancellationToken.None); Clients.Caller.processDispose( ((Slave)(obj)).IsDisposable); } public void saveCalendar(string id, string[] del, string[][] add, string[][] upd, bool fresh, bool last) { loader(); var calid = Guid.Parse(id); adminClient.Refresh(); adminClient.DowntimeForResourceId = calid; adminClient.RefreshCalendar(); var downlist = adminClient.Downtimes.ToList(); foreach(var s in del) { var gu = Guid.Parse(s); var el = downlist.Find(x => x.Id == gu); adminClient.Delete(el); } foreach (var s in add) { var obj = new Downtime(); obj.Id = Guid.Empty; if (s[0] == "Unavailable") obj.DowntimeType = DowntimeType.Offline; else obj.DowntimeType = DowntimeType.Shutdown; obj.StartDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[1])); obj.EndDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[2])); if (s[3] == "true") obj.AllDayEvent = true; else obj.AllDayEvent = false; obj.ResourceId = Guid.Parse(s[4]); if (s[5] == "true") { obj.Recurring = true; if (s[6] == "0") { var dayarr = s[9].Split(','); var start = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[7])); var end = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[8])); loopAddDowns(start, end, dayarr, obj); } else { obj.RecurringId = Guid.Parse(s[6]); adminClient.Store(obj, CancellationToken.None); } } else { obj.Recurring = false; adminClient.Store(obj, CancellationToken.None); } } foreach(var s in upd) { var obj = downlist.Find(x => x.Id == Guid.Parse(s[0])); if (s[1] == "Unavailable") obj.DowntimeType = DowntimeType.Offline; else obj.DowntimeType = DowntimeType.Shutdown; obj.StartDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[2])); obj.EndDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[3])); if (s[4] == "true") obj.AllDayEvent = true; else obj.AllDayEvent = false; if (s[5] == "true" && !obj.Recurring) { obj.Recurring = true; if (s[6] == "00000000-0000-0000-0000-000000000000") { var dayarr = s[9].Split(','); var start = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[7])); var end = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[8])); //loopAddDowns(start, end, dayarr, obj); } else { obj.RecurringId = Guid.Parse(s[6]); //adminClient.Store(obj, CancellationToken.None); //Throws error } } else { //adminClient.Store(obj, CancellationToken.None); //Throws error } } if( last) { Clients.Caller.savingAllDone(); } else if (fresh) { Clients.Caller.savingCurrentDone(); } } private void loopAddDowns(DateTime start, DateTime end, string[] dayarr, Downtime obj) { var rid = Guid.NewGuid(); for (; start < end;) { if (dayarr[(int)(start.DayOfWeek)] == "true") { var temp = new Downtime(); temp.StartDate = start.AddHours(obj.StartDate.Hour - start.Hour).AddMinutes(obj.StartDate.Minute - start.Minute); temp.EndDate = start.AddHours(obj.EndDate.Hour - start.Hour).AddMinutes(obj.EndDate.Minute - start.Minute); temp.Id = obj.Id; temp.DowntimeType = obj.DowntimeType; temp.AllDayEvent = obj.AllDayEvent; temp.ResourceId = obj.ResourceId; temp.Recurring = obj.Recurring; temp.RecurringId = rid; adminClient.Store(temp, CancellationToken.None); } start = start.AddDays(1); } } } }