Free cookie consent management tool by TermsFeed Policy Generator

source: branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs @ 6852

Last change on this file since 6852 was 6852, checked in by ascheibe, 13 years ago

#1648 worked on webservice

File size: 18.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.ServiceModel;
26using System.Web.Security;
27using DA = HeuristicLab.Services.Access.DataAccess;
28using DT = HeuristicLab.Services.Access.DataTransfer;
29
30namespace HeuristicLab.Services.Access {
31  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
32  public class AccessService : IAccessService {
33    private IUserManager userManager;
34    private IUserManager UserManager {
35      get {
36        if (userManager == null) userManager = new UserManager();
37        return userManager;
38      }
39    }
40
41    #region Client Members
42    public bool ClientExists(Guid id) {
43      if (id != Guid.Empty) {
44        using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
45          return (context.Resources.Where(x => x.Id == id).Count() != 0);
46        }
47      }
48      return false;
49    }
50
51    public DT.Client GetClient(Guid id) {
52      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
53        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
54                    where c.Id == id
55                    select c;
56
57        return Convert.ToDto(query.FirstOrDefault());
58      }
59    }
60
61    public IEnumerable<DT.Client> GetClients(IEnumerable<Guid> ids) {
62      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
63        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
64                    where ids.Contains(c.Id)
65                    select Convert.ToDto(c);
66        return query.ToList();
67      }
68    }
69
70    public IEnumerable<DT.Client> GetAllClients() {
71      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
72        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
73                    select Convert.ToDto(c);
74        return query.ToList();
75      }
76    }
77
78    public Guid AddClient(DT.Client client) {
79      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
80        DA.Client entity = Convert.ToEntity(client);
81        context.Resources.InsertOnSubmit(entity);
82        context.SubmitChanges();
83        return entity.Id;
84      }
85    }
86
87    public void UpdateClient(DT.Client client) {
88      AddClient(client);
89    }
90
91    public void DeleteClient(DT.Client client) {
92      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
93        //load client because we could get a detached object
94        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
95                    where c.Id == client.Id
96                    select c;
97        if (query.Count() > 0) {
98          context.Resources.DeleteOnSubmit(query.First());
99          context.SubmitChanges();
100        }
101      }
102    }
103    #endregion
104
105    #region ClientGroup
106    public IEnumerable<DT.ClientGroup> GetAllClientGroups() {
107      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
108        var query = from c in context.GetTable<DA.Resource>().OfType<DA.ClientGroup>()
109                    select Convert.ToDto(c);
110        return query.ToList();
111      }
112    }
113
114    public IEnumerable<DT.ClientGroup> GetClientGroups(IEnumerable<Guid> ids) {
115      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
116        var query = from c in context.GetTable<DA.Resource>().OfType<DA.ClientGroup>()
117                    where ids.Contains(c.Id)
118                    select Convert.ToDto(c);
119        return query.ToList();
120      }
121    }
122
123    public Guid AddClientGroup(DT.ClientGroup group) {
124      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
125        var entity = Convert.ToEntity(group);
126        context.Resources.InsertOnSubmit(entity);
127        context.SubmitChanges();
128        return entity.Id;
129      }
130    }
131
132    public void UpdateClientGroup(DT.ClientGroup group) {
133      AddClientGroup(group);
134    }
135
136    public void DeleteClientGroup(DT.ClientGroup clientGroup) {
137      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
138        //load clientGroup because we could get a detached object
139        var query = from c in context.GetTable<DA.Resource>().OfType<DA.ClientGroup>()
140                    where c.Id == clientGroup.Id
141                    select c;
142        if (query.Count() > 0) {
143          context.Resources.DeleteOnSubmit(query.First());
144          context.SubmitChanges();
145        }
146      }
147    }
148
149    public void AddResourceToGroup(DT.Resource resource, DT.ClientGroup group) {
150      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
151        DA.ResourceResourceGroup rrg = new DA.ResourceResourceGroup() {
152          ResourceId = resource.Id,
153          ResourceGroupId = group.Id
154        };
155
156        context.ResourceResourceGroups.InsertOnSubmit(rrg);
157        context.SubmitChanges();
158      }
159    }
160
161    public void RemoveResourceFromGroup(DT.Resource resource, DT.ClientGroup group) {
162      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
163        var query = context.ResourceResourceGroups.Where(x => x.ResourceId == resource.Id && x.ResourceGroupId == group.Id);
164        if (query.Count() > 0) {
165          context.ResourceResourceGroups.DeleteOnSubmit(query.First());
166          context.SubmitChanges();
167        }
168      }
169    }
170    #endregion
171
172    #region ClientGroupMapping
173    public IEnumerable<DT.ClientGroupMapping> GetClientGroupMapping() {
174      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
175        var query = from c in context.GetTable<DA.ResourceResourceGroup>()
176                    select Convert.ToDto(c);
177        return query.ToList();
178      }
179    }
180    #endregion
181
182    #region Resource
183    public IEnumerable<DT.Resource> GetResources() {
184      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
185        var query = from r in context.Resources
186                    select Convert.ToDto(r);
187        return query.ToList();
188      }
189    }
190    #endregion
191
192    #region ClientLog
193    public DT.ClientLog GetLastClientLog(Guid clientId) {
194      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
195        var query = from r in context.ClientLogs
196                    where r.ResourceId == clientId
197                    select r;
198        return Convert.ToDto(query.OrderBy(x => x.Timestamp).LastOrDefault());
199      }
200    }
201
202    public IEnumerable<DT.ClientLog> GetClientLogs(Guid clientId) {
203      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
204        var query = from r in context.ClientLogs
205                    where r.ResourceId == clientId
206                    select Convert.ToDto(r);
207        return query.ToList();
208      }
209    }
210
211    public IEnumerable<DT.ClientLog> GetClientLogsSince(DateTime startDate) {
212      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
213        var query = from r in context.ClientLogs
214                    where r.Timestamp >= startDate
215                    select Convert.ToDto(r);
216        return query.ToList();
217      }
218    }
219
220    public void AddClientLog(DT.ClientLog log) {
221      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
222        context.ClientLogs.InsertOnSubmit(Convert.ToEntity(log));
223        context.SubmitChanges();
224      }
225    }
226
227    public void DeleteClientLog(DT.ClientLog log) {
228      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
229        context.ClientLogs.DeleteOnSubmit(Convert.ToEntity(log));
230        context.SubmitChanges();
231      }
232    }
233    #endregion
234
235    #region User
236    private DT.User BuildUserDto(Guid userId) {
237      DA.aspnet_User aspUser = null;
238      DA.aspnet_Membership aspMembership = null;
239      DA.User accessUser = null;
240
241      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
242        var query = from u in context.UserGroupBases.OfType<DA.User>()
243                    where u.Id == userId
244                    select u;
245        if (query.Count() == 1) {
246          accessUser = query.First();
247        }
248      }
249
250      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
251        var userQuery = from u in context.aspnet_Users
252                        where u.UserId == userId
253                        select u;
254        if (userQuery.Count() == 1) {
255          aspUser = userQuery.First();
256        }
257
258        var memQuery = from u in context.aspnet_Memberships
259                       where u.UserId == userId
260                       select u;
261        if (memQuery.Count() == 1) {
262          aspMembership = memQuery.First();
263        }
264      }
265
266      if (aspUser == null || aspMembership == null || accessUser == null) {
267        //TODO: error handling
268        return null;
269      } else {
270        return Convert.ToDto(accessUser, aspUser, aspMembership);
271      }
272    }
273
274    public DT.User Login() {
275      Guid userId = UserManager.CurrentUserId;
276      return BuildUserDto(userId);
277    }
278
279    public IEnumerable<DT.User> GetAllUsers() {
280      List<Guid> accessUserGuids = null;
281
282      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
283        var query = from u in context.UserGroupBases.OfType<DA.User>()
284                    select u.Id;
285        accessUserGuids = query.ToList();
286      }
287
288      return accessUserGuids.Select(x => BuildUserDto(x));
289    }
290
291    public IEnumerable<DT.User> GetUsers(IEnumerable<Guid> ids) {
292      List<Guid> accessUserGuids = null;
293
294      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
295        var query = from u in context.UserGroupBases.OfType<DA.User>()
296                    where ids.Contains(u.Id)
297                    select u.Id;
298        accessUserGuids = query.ToList();
299      }
300
301      return accessUserGuids.Select(x => BuildUserDto(x));
302    }
303
304    public DT.User AddUser(DT.User user) {
305      DA.User accessUser;
306      DA.aspnet_User aspUser;
307      DA.aspnet_Membership aspMembership;
308      bool userExistsInASP;
309
310      Convert.ToEntity(user, out accessUser, out aspUser, out aspMembership, out userExistsInASP);
311
312      if (userExistsInASP) {
313        if (accessUser.Id == null || accessUser.Id == Guid.Empty) {
314          accessUser.Id = aspMembership.UserId;
315        }
316        using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
317          context.UserGroupBases.InsertOnSubmit(accessUser);
318          context.SubmitChanges();
319        }
320        MembershipUser membershipUser = Membership.GetUser((object)accessUser.Id);
321        if (membershipUser != null) {
322          membershipUser.Email = aspMembership.Email;
323          membershipUser.IsApproved = aspMembership.IsApproved;
324          membershipUser.Comment = aspMembership.Comment;
325          Membership.UpdateUser(membershipUser);
326        }
327      } else {
328        MembershipUser membershipUser = Membership.CreateUser(aspUser.UserName, aspUser.UserName, aspMembership.Email);
329        membershipUser.IsApproved = aspMembership.IsApproved;
330        membershipUser.Comment = aspMembership.Comment;
331        Membership.UpdateUser(membershipUser);
332
333        Guid userId = (Guid)membershipUser.ProviderUserKey;
334        accessUser.Id = userId;
335
336        using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
337          context.UserGroupBases.InsertOnSubmit(accessUser);
338          context.SubmitChanges();
339        }
340      }
341
342      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
343        var newAspUser = context.aspnet_Users.Where(x => x.UserId == accessUser.Id).FirstOrDefault();
344        var newAspMembership = context.aspnet_Memberships.Where(x => x.UserId == accessUser.Id).FirstOrDefault();
345        return Convert.ToDto(accessUser, newAspUser, newAspMembership);
346      }
347    }
348
349    public void DeleteUser(DT.User user) {
350      if (user.Id != null && user.Id != Guid.Empty) {
351        Membership.DeleteUser(user.UserName);
352        using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
353          context.UserGroupBases.DeleteOnSubmit(Convert.ToEntity(user));
354          context.SubmitChanges();
355        }
356      }
357    }
358
359    public void UpdateUser(DT.User user) {
360      AddUser(user);
361    }
362
363    public void AddUserToRole(DT.Role role, DT.User user) {
364      //TODO: usernames and rolenames have to be unique!
365      MembershipUser msUser = Membership.GetUser((object)user.Id);
366      if (msUser != null) {
367        Roles.AddUserToRole(msUser.UserName, role.Name);
368      }
369    }
370
371    public void RemoveUserFromRole(DT.Role role, DT.User user) {
372      MembershipUser msUser = Membership.GetUser((object)user.Id);
373      if (msUser != null) {
374        Roles.RemoveUserFromRole(msUser.UserName, role.Name);
375      }
376    }
377
378    public bool ResetPassword(DT.User user, string oldPassword, string newPassword) {
379      MembershipUser msUser = Membership.GetUser((object)user.Id);
380      if (msUser != null) {
381        return msUser.ChangePassword(oldPassword, newPassword);
382      }
383      return false;
384    }
385    #endregion
386
387    #region UserGroup
388    public IEnumerable<DT.UserGroup> GetAllUserGroups() {
389      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
390        var query = from u in context.UserGroupBases.OfType<DA.UserGroup>()
391                    select Convert.ToDto(u);
392        return query.ToList();
393      }
394    }
395
396    public IEnumerable<DT.UserGroup> GetUserGroups(IEnumerable<Guid> ids) {
397      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
398        var query = from u in context.UserGroupBases.OfType<DA.UserGroup>()
399                    where ids.Contains(u.Id)
400                    select Convert.ToDto(u);
401        return query.ToList();
402      }
403    }
404
405    public Guid AddUserGroup(DT.UserGroup group) {
406      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
407        context.UserGroupBases.InsertOnSubmit(Convert.ToEntity(group));
408        context.SubmitChanges();
409        return group.Id;
410      }
411    }
412
413    public void UpdateUserGroup(DT.UserGroup group) {
414      AddUserGroup(group);
415    }
416
417    public void DeleteUserGroup(DT.UserGroup group) {
418      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
419        context.UserGroupBases.DeleteOnSubmit(Convert.ToEntity(group));
420        context.SubmitChanges();
421      }
422    }
423
424    public void AddUserGroupBaseToGroup(DT.UserGroupBase resource, DT.UserGroup group) {
425      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
426        DA.UserGroupUserGroup ugug = new DA.UserGroupUserGroup();
427        ugug.UserGroupId = resource.Id;
428        ugug.UserGroupUserGroupId = group.Id;
429        context.UserGroupUserGroups.InsertOnSubmit(ugug);
430        context.SubmitChanges();
431      }
432    }
433
434    public void RemoveUserGroupBaseFromGroup(DT.UserGroupBase resource, DT.UserGroup userGroup) {
435      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
436        var query = from u in context.UserGroupUserGroups
437                    where u.UserGroupId == resource.Id && u.UserGroupUserGroupId == userGroup.Id
438                    select u;
439
440        if (query.Count() == 1) {
441          context.UserGroupUserGroups.DeleteOnSubmit(query.First());
442          context.SubmitChanges();
443        }
444      }
445    }
446
447    public IEnumerable<DT.UserGroupBase> GetUsersAndGroups() {
448      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
449        var query = from u in context.UserGroupBases
450                    select Convert.ToDto(u);
451        return query.ToList();
452      }
453    }
454
455    public IEnumerable<DT.UserGroupMapping> GetUserGroupMapping() {
456      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
457        var query = from u in context.UserGroupUserGroups
458                    select Convert.ToDto(u);
459        return query.ToList();
460      }
461    }
462    #endregion
463
464    #region Roles
465    public IEnumerable<DT.Role> GetRoles() {
466      throw new System.NotImplementedException();
467    }
468
469    public DT.Role AddRole(DT.Role role) {
470      throw new System.NotImplementedException();
471    }
472
473    public void UpdateRole(DT.Role role) {
474      throw new System.NotImplementedException();
475    }
476
477    public void DeleteRole(DT.Role role) {
478      throw new System.NotImplementedException();
479    }
480
481    public IEnumerable<DT.Role> GetUserRoles(DT.User user) {
482      throw new System.NotImplementedException();
483    }
484    #endregion
485
486    #region Error Reporting
487    public void ReportError(DT.ClientError error) {
488      throw new System.NotImplementedException();
489    }
490
491    public IEnumerable<DT.ClientError> GetClientErrors() {
492      throw new System.NotImplementedException();
493    }
494
495    public IEnumerable<DT.ClientError> GetLastClientErrors(DateTime startDate) {
496      throw new System.NotImplementedException();
497    }
498
499    public void DeleteError(DT.ClientError error) {
500      throw new System.NotImplementedException();
501    }
502    #endregion
503  }
504}
Note: See TracBrowser for help on using the repository browser.