-
Notifications
You must be signed in to change notification settings - Fork 2
/
RestrictRecordDelete.cs
112 lines (94 loc) · 4.15 KB
/
RestrictRecordDelete.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// File Name: RestrictRecordDelete.cs
// Created: July 14, 2017
// Author: Someswara Siripuram
// Revisions:
// ======================================================================
// VERSION DATE(mm/dd/yyyy) Modified By DESCRIPTION
// ----------------------------------------------------------------------
// 1.0 07/14/2017 Someswara Siripuram CREATED
// ======================================================================
namespace CommonApps.CRMPlugins
{
using System;
using System.Reflection;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
/// <summary>
/// Validate Influencer Connection record- To Parameter is null, delete the current record
/// </summary>
public class RestrictRecordDelete : IPlugin
{
/// <summary>
/// Organization Service
/// </summary>
private IOrganizationService service = null;
/// <summary>
/// Plugin Context
/// </summary>
private IPluginExecutionContext context = null;
/// <summary>
/// Tracing service
/// </summary>
private ITracingService tracer = null;
/// <summary>
/// Organization factory
/// </summary>
private IOrganizationServiceFactory factory = null;
/// <summary>
/// Entity fields
/// </summary>
private Entity currentRecord = null;
/// <summary>
/// Execute Main method
/// </summary>
/// <param name="serviceProvider">Service Provider</param>
public void Execute(IServiceProvider serviceProvider)
{
if (serviceProvider != null)
{
this.tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
this.context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
this.factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
this.service = this.factory.CreateOrganizationService(this.context.UserId);
}
else
{
throw new InvalidPluginExecutionException("Service Provider is null");
}
try
{
if (this.context.MessageName.ToLower().Equals("delete"))
{
Guid currentUserID = context.UserId;
tracer.Trace("Current User ID: " + context.UserId.ToString());
if (!HasAdminRole(currentUserID))
throw new InvalidPluginExecutionException("Only Sytem Administrators can delete this Entity. Please contact your System Administrator.");
}
}
catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> e)
{
//this.service.Create(ErrorLogger.LogError(e.Message, e.StackTrace, this.GetType().Name, MethodBase.GetCurrentMethod().Name, this.context.PrimaryEntityId));
throw;
}
catch (InvalidPluginExecutionException e)
{
throw;
}
catch (System.Exception e)
{
//this.service.Create(ErrorLogger.LogError(e.Message, e.StackTrace, this.GetType().Name, MethodBase.GetCurrentMethod().Name, this.context.PrimaryEntityId));
throw;
}
}
public bool HasAdminRole(Guid systemUserId)
{
Guid AdminRoleTemplateId = new Guid("627090FF-40A3-4053-8790-584EDC5BE201");
QueryExpression query = new QueryExpression("role");
query.Criteria.AddCondition("roletemplateid", ConditionOperator.Equal, AdminRoleTemplateId);
LinkEntity link = query.AddLink("systemuserroles", "roleid", "roleid");
link.LinkCriteria.AddCondition("systemuserid", ConditionOperator.Equal, systemUserId);
return service.RetrieveMultiple(query).Entities.Count > 0;
}
}
}