source: branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Hubs/CalendarHub.cs @ 13795

Last change on this file since 13795 was 13795, checked in by jlodewyc, 5 years ago

#2582 Resource Permissions added

File size: 9.1 KB
Line 
1using HeuristicLab.Clients.Access.Administration;
2using HeuristicLab.Clients.Hive.WebJobManager.Services;
3using HeuristicLab.Clients.Hive.WebJobManager.ViewModels.User;
4using Microsoft.AspNet.SignalR;
5using Newtonsoft.Json;
6using System;
7using System.Collections.Generic;
8using System.Linq;
9using System.Threading;
10using System.Threading.Tasks;
11
12namespace 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}
Note: See TracBrowser for help on using the repository browser.