1 | using HeuristicLab.Clients.Access.Administration;
|
---|
2 | using HeuristicLab.Clients.Hive.WebJobManager.Services;
|
---|
3 | using HeuristicLab.Clients.Hive.WebJobManager.ViewModels.User;
|
---|
4 | using Microsoft.AspNet.SignalR;
|
---|
5 | using Newtonsoft.Json;
|
---|
6 | using System;
|
---|
7 | using System.Collections.Generic;
|
---|
8 | using System.Linq;
|
---|
9 | using System.Threading;
|
---|
10 | using System.Threading.Tasks;
|
---|
11 |
|
---|
12 | namespace HeuristicLab.Clients.Hive.WebJobManager.Hubs
|
---|
13 | {
|
---|
14 | public class CalendarHub : Hub
|
---|
15 | {
|
---|
16 | private WebLoginService weblog;
|
---|
17 | private Guid userId;
|
---|
18 | private HiveAdminClientWeb adminClient;
|
---|
19 | private HiveServiceLocatorWeb servloc;
|
---|
20 | private AccessAdministrationClient accessClient;
|
---|
21 | private void loader()
|
---|
22 | {
|
---|
23 | weblog = WebLoginService.Instance;
|
---|
24 | string uid = Context.QueryString["userid"];
|
---|
25 | if (uid == null || uid == "" || Guid.Parse(uid) == Guid.Empty)
|
---|
26 | {
|
---|
27 | userId = Guid.Empty;
|
---|
28 | }
|
---|
29 | else
|
---|
30 | {
|
---|
31 | userId = Guid.Parse(uid);
|
---|
32 | adminClient = weblog.getAdminClient(userId);
|
---|
33 | servloc = weblog.getServiceLocator(userId);
|
---|
34 | accessClient = weblog.getAccessAdminClient(userId);
|
---|
35 | }
|
---|
36 | }
|
---|
37 | public void requestInfo()
|
---|
38 | {
|
---|
39 | loader();
|
---|
40 | adminClient.Refresh();
|
---|
41 | UserViewModel vm = new UserViewModel(accessClient).refreshAll();
|
---|
42 | var users = JsonConvert.SerializeObject(vm.users);
|
---|
43 | var groups = JsonConvert.SerializeObject(vm.ugroups);
|
---|
44 | var res = JsonConvert.SerializeObject(adminClient.Resources);
|
---|
45 | Clients.Caller.processData(res, users, groups);
|
---|
46 | }
|
---|
47 | public void requestDownTime(string id)
|
---|
48 | {
|
---|
49 | loader();
|
---|
50 | adminClient.Refresh();
|
---|
51 | Guid t = Guid.Parse(id);
|
---|
52 | adminClient.DowntimeForResourceId = t;
|
---|
53 | adminClient.RefreshCalendar();
|
---|
54 | var down = JsonConvert.SerializeObject(adminClient.Downtimes);
|
---|
55 | Clients.Caller.processDowntime(id, down);
|
---|
56 | }
|
---|
57 | public void requestPermissions(string id)
|
---|
58 | {
|
---|
59 | loader();
|
---|
60 | Guid r = Guid.Parse(id);
|
---|
61 | var perm = servloc.CallHiveService(x => x.GetResourcePermissions(r));
|
---|
62 | Clients.Caller.processPermissions(id, JsonConvert.SerializeObject(perm));
|
---|
63 | }
|
---|
64 |
|
---|
65 | public void changePermissions(string[] perms, string idresource)
|
---|
66 | {
|
---|
67 | loader();
|
---|
68 | var res = Guid.Parse(idresource);
|
---|
69 | var exist = servloc.CallHiveService(x => x.GetResourcePermissions(res));
|
---|
70 | List<Guid> newPerms = new List<Guid>();
|
---|
71 | List<Guid> revokePerms = new List<Guid>();
|
---|
72 | for (var i = 0; i < perms.Length; i++)
|
---|
73 | {
|
---|
74 | var p = Guid.Parse(perms[i]);
|
---|
75 | var elemid = exist.FindIndex(x => x.GrantedUserId == p);
|
---|
76 | if (elemid != -1)
|
---|
77 | {
|
---|
78 | exist[elemid].GrantedUserId = Guid.Empty;
|
---|
79 | }
|
---|
80 | else
|
---|
81 | {
|
---|
82 | newPerms.Add(p);
|
---|
83 | }
|
---|
84 | }
|
---|
85 | servloc.CallHiveService(x => x.GrantResourcePermissions(res, newPerms));
|
---|
86 | foreach (var ex in exist)
|
---|
87 | {
|
---|
88 | if(ex.GrantedUserId != Guid.Empty)
|
---|
89 | {
|
---|
90 | revokePerms.Add(ex.GrantedUserId);
|
---|
91 | }
|
---|
92 | }
|
---|
93 | servloc.CallHiveService(x => x.RevokeResourcePermissions(res, revokePerms));
|
---|
94 | requestPermissions(idresource);
|
---|
95 | }
|
---|
96 | public void toggleDisposable(string id)
|
---|
97 | {
|
---|
98 | loader();
|
---|
99 | adminClient.Refresh();
|
---|
100 | Guid c = Guid.Parse(id);
|
---|
101 | var obj = adminClient.Resources.ToList().Find(x => x.Id == c);
|
---|
102 | ((Slave)(obj)).IsDisposable = !((Slave)(obj)).IsDisposable;
|
---|
103 | adminClient.Store(obj, CancellationToken.None);
|
---|
104 | Clients.Caller.processDispose( ((Slave)(obj)).IsDisposable);
|
---|
105 |
|
---|
106 | }
|
---|
107 | public void saveCalendar(string id, string[] del, string[][] add, string[][] upd, bool fresh, bool last)
|
---|
108 | {
|
---|
109 | loader();
|
---|
110 | var calid = Guid.Parse(id);
|
---|
111 | adminClient.Refresh();
|
---|
112 | adminClient.DowntimeForResourceId = calid;
|
---|
113 | adminClient.RefreshCalendar();
|
---|
114 | var downlist = adminClient.Downtimes.ToList();
|
---|
115 | foreach(var s in del)
|
---|
116 | {
|
---|
117 | var gu = Guid.Parse(s);
|
---|
118 | var el = downlist.Find(x => x.Id == gu);
|
---|
119 | adminClient.Delete(el);
|
---|
120 | }
|
---|
121 | foreach (var s in add)
|
---|
122 | {
|
---|
123 | var obj = new Downtime();
|
---|
124 | obj.Id = Guid.Empty;
|
---|
125 | if (s[0] == "Unavailable")
|
---|
126 | obj.DowntimeType = DowntimeType.Offline;
|
---|
127 | else
|
---|
128 | obj.DowntimeType = DowntimeType.Shutdown;
|
---|
129 | obj.StartDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[1]));
|
---|
130 | obj.EndDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[2]));
|
---|
131 | if (s[3] == "true")
|
---|
132 | obj.AllDayEvent = true;
|
---|
133 | else
|
---|
134 | obj.AllDayEvent = false;
|
---|
135 | obj.ResourceId = Guid.Parse(s[4]);
|
---|
136 | if (s[5] == "true")
|
---|
137 | {
|
---|
138 | obj.Recurring = true;
|
---|
139 | if (s[6] == "0")
|
---|
140 | {
|
---|
141 | var dayarr = s[9].Split(',');
|
---|
142 | var start = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[7]));
|
---|
143 | var end = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[8]));
|
---|
144 | loopAddDowns(start, end, dayarr, obj);
|
---|
145 | }
|
---|
146 | else
|
---|
147 | {
|
---|
148 | obj.RecurringId = Guid.Parse(s[6]);
|
---|
149 | adminClient.Store(obj, CancellationToken.None);
|
---|
150 | }
|
---|
151 | }
|
---|
152 | else {
|
---|
153 | obj.Recurring = false;
|
---|
154 | adminClient.Store(obj, CancellationToken.None);
|
---|
155 | }
|
---|
156 |
|
---|
157 |
|
---|
158 | }
|
---|
159 | foreach(var s in upd)
|
---|
160 | {
|
---|
161 | var obj = downlist.Find(x => x.Id == Guid.Parse(s[0]));
|
---|
162 | if (s[1] == "Unavailable")
|
---|
163 | obj.DowntimeType = DowntimeType.Offline;
|
---|
164 | else
|
---|
165 | obj.DowntimeType = DowntimeType.Shutdown;
|
---|
166 | obj.StartDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[2]));
|
---|
167 | obj.EndDate = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[3]));
|
---|
168 | if (s[4] == "true")
|
---|
169 | obj.AllDayEvent = true;
|
---|
170 | else
|
---|
171 | obj.AllDayEvent = false;
|
---|
172 | if (s[5] == "true" && !obj.Recurring)
|
---|
173 | {
|
---|
174 | obj.Recurring = true;
|
---|
175 | if (s[6] == "00000000-0000-0000-0000-000000000000")
|
---|
176 | {
|
---|
177 | var dayarr = s[9].Split(',');
|
---|
178 | var start = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[7]));
|
---|
179 | var end = (new DateTime(1970, 1, 1)).AddMilliseconds(double.Parse(s[8]));
|
---|
180 | //loopAddDowns(start, end, dayarr, obj);
|
---|
181 | }
|
---|
182 | else
|
---|
183 | {
|
---|
184 | obj.RecurringId = Guid.Parse(s[6]);
|
---|
185 | //adminClient.Store(obj, CancellationToken.None); //Throws error
|
---|
186 | }
|
---|
187 | }
|
---|
188 | else
|
---|
189 | {
|
---|
190 | //adminClient.Store(obj, CancellationToken.None); //Throws error
|
---|
191 | }
|
---|
192 |
|
---|
193 |
|
---|
194 | }
|
---|
195 | if( last)
|
---|
196 | {
|
---|
197 | Clients.Caller.savingAllDone();
|
---|
198 | }
|
---|
199 | else if (fresh)
|
---|
200 | {
|
---|
201 | Clients.Caller.savingCurrentDone();
|
---|
202 | }
|
---|
203 | }
|
---|
204 | private void loopAddDowns(DateTime start, DateTime end, string[] dayarr, Downtime obj)
|
---|
205 | {
|
---|
206 | var rid = Guid.NewGuid();
|
---|
207 | for (; start < end;)
|
---|
208 | {
|
---|
209 | if (dayarr[(int)(start.DayOfWeek)] == "true")
|
---|
210 | {
|
---|
211 | var temp = new Downtime();
|
---|
212 | temp.StartDate = start.AddHours(obj.StartDate.Hour - start.Hour).AddMinutes(obj.StartDate.Minute - start.Minute);
|
---|
213 | temp.EndDate = start.AddHours(obj.EndDate.Hour - start.Hour).AddMinutes(obj.EndDate.Minute - start.Minute);
|
---|
214 | temp.Id = obj.Id;
|
---|
215 | temp.DowntimeType = obj.DowntimeType;
|
---|
216 | temp.AllDayEvent = obj.AllDayEvent;
|
---|
217 | temp.ResourceId = obj.ResourceId;
|
---|
218 | temp.Recurring = obj.Recurring;
|
---|
219 | temp.RecurringId = rid;
|
---|
220 | adminClient.Store(temp, CancellationToken.None);
|
---|
221 | }
|
---|
222 | start = start.AddDays(1);
|
---|
223 | }
|
---|
224 | }
|
---|
225 | }
|
---|
226 | }
|
---|