﻿<?xml version="1.0" encoding="utf-16"?>
<JiwaDocument xmlns:jiwa="http://www.jiwa.com.au/xml/schemas" Type="JiwaFinancials.Jiwa.JiwaApplication.Plugin.Plugin">
  <RecID>3e650e67-d23d-4b04-bb40-eb389dc40a5f</RecID>
  <Name>Webhook Retention</Name>
  <Description>Adds a new route, /Webhooks/Messages/Retention - which is a DELETE request.&amp;#13;&amp;#10;&amp;#13;&amp;#10;Invoking this route will delete old webhook messages (and their responses) if they are more than a configured number of days old.&amp;#13;&amp;#10;&amp;#13;&amp;#10;A system setting, WebHookMessageRetentionDays defines the number of days to retain the sent and not permanently failed webhook messages.</Description>
  <IsEnabled>true</IsEnabled>
  <IsIsolatedToOwnAppDomain>false</IsIsolatedToOwnAppDomain>
  <ExecutionOrder>1</ExecutionOrder>
  <Author>Jiwa Financials</Author>
  <Version>7.2.1.0</Version>
  <Code>using System;
using System.Collections;
using System.Linq;

using ServiceStack;
using ServiceStack.Model;
using ServiceStack.Host;
using System.Reflection;
using ServiceStack.OrmLite;

namespace JiwaFinancials.Jiwa.JiwaServiceModel
{	
	public class WebHookRetentionRESTAPIPlugin : System.MarshalByRefObject, JiwaFinancials.Jiwa.JiwaApplication.IJiwaRESTAPIPlugin
	{		
		public static int WebHookMessageRetentionDays = 30;
		
		#region "Configuration"					
		public void Configure(JiwaFinancials.Jiwa.JiwaApplication.Plugin.Plugin Plugin, ServiceStack.ServiceStackHost AppHost, Funq.Container Container, JiwaApplication.Manager JiwaApplicationManager)
		{																															
			// Read system setting value
			WebHookMessageRetentionDays = Plugin.Manager.Database.ReadSystemSetting&lt;int&gt;(Plugin.Name, "WebHookMessageRetentionDays", 30);			
			AppHost.RegisterService&lt;WebhookServices&gt;();
			AppHost.Routes.Add(typeof(WebhooksMessagedApplyRetentionPolicyRequest), "/Webhooks/Messages/Retention", "DELETE", "Removes sent or permanently failed webhook messages older than the retention period", "");			
			
			// Need to add a AssemblyResolve handler so this plugin can find the REST API plugin (as it has it as a plugin reference).
			// temporary work-around for https://jiwa.atlassian.net/browse/DEV-9893
			AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, System.ResolveEventArgs args) { return AssemblyResolve(sender, args, Plugin); };
		}	
		
		public System.Reflection.Assembly AssemblyResolve(object sender, System.ResolveEventArgs args, JiwaFinancials.Jiwa.JiwaApplication.Plugin.Plugin Plugin)
		{
			// If the requested assembly is a reference to another plugin, then we need to attempt to resolve the assembly ourselves					
			foreach(JiwaApplication.Plugin.PluginReference pluginReference in Plugin.PluginReferenceCollection)
			{
				if (String.Format("{0}, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", pluginReference.Name) == args.Name)
				{
					return System.Reflection.Assembly.LoadFile(pluginReference.Plugin.RuntimeFileName);
				}
			}
			
			return null;
		}
		#endregion				
	}		
	
	#region "Requests"
	[ApiResponse(204, "Deleted OK")]
	[ApiResponse(401, "Not authenticated")]
	[ApiResponse(403, "Not authorised")]
	public class WebhooksMessagedApplyRetentionPolicyRequest
	{
	}
	#endregion
	
	#region "Services"
	[CompressResponse]
    public class WebhookServices : Service
    {
		public void Delete(WebhooksMessagedApplyRetentionPolicyRequest request)
        {		
			// Remove from database
			using(var db = RESTAPIPlugin.AppHost.GetDbConnection())
			{
                db.ExecuteSql(@"DELETE FROM SY_WebhookMessage 
										WHERE DATEDIFF(DAY, LastSavedDateTime, SYSUTCDATETIME()) &gt; @RetentionDays
										AND (Status = 1 OR Status = 3)",
                                  new { RetentionDays = WebHookRetentionRESTAPIPlugin.WebHookMessageRetentionDays });
				
				db.Close();
			}
			
			// Also remove any in-memory WebhookMessages in the API service.  We need to do this, because the API service won't know about our database deletion above.
			RESTAPIPlugin.WebhookMessages.RemoveAll(x =&gt; (DateTime.UtcNow - x.LastSavedDateTime).TotalDays &gt; WebHookRetentionRESTAPIPlugin.WebHookMessageRetentionDays &amp;&amp; (x.Status == 1 || x.Status == 3));				
        }
	}
	#endregion
}
</Code>
  <ExceptionPolicy>Abort</ExceptionPolicy>
  <Language>CSharp</Language>
  <ReferenceCollection>
    <Reference>
      <RecID>6dca9501-3f98-4b40-a4c0-716fed9e014e</RecID>
      <AssemblyFullName>JiwaApplication, Version=7.2.1.0, Culture=neutral, PublicKeyToken=e30ce81e37f29c8c</AssemblyFullName>
      <AssemblyName>JiwaApplication.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\JiwaApplication.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>533884ef-fc07-41e0-a77f-ee995ebd9523</RecID>
      <AssemblyFullName>mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</AssemblyFullName>
      <AssemblyName>mscorlib.dll</AssemblyName>
      <AssemblyLocation>C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>fa3198f1-3f7f-47a5-830b-c00023a2dbaf</RecID>
      <AssemblyFullName>System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</AssemblyFullName>
      <AssemblyName>System.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>303e229f-fb18-4894-b6f4-7ac060a94d9a</RecID>
      <AssemblyFullName>System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</AssemblyFullName>
      <AssemblyName>System.Data.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>f60faa51-849f-4977-97cc-dc2d552866d0</RecID>
      <AssemblyFullName>System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</AssemblyFullName>
      <AssemblyName>System.Runtime.Serialization.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Serialization\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Serialization.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>0629ab5b-e8f1-4df8-b603-502911b21f9f</RecID>
      <AssemblyFullName>System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</AssemblyFullName>
      <AssemblyName>System.Security.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Security\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Security.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>3c54dd10-da2e-49ab-a597-c70f39ef36dd</RecID>
      <AssemblyFullName>System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</AssemblyFullName>
      <AssemblyName>System.Core.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>b9d95434-51f9-4543-a6d4-eb26183a13b5</RecID>
      <AssemblyFullName>System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</AssemblyFullName>
      <AssemblyName>System.Net.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Net\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>f9651bf5-c9c2-424f-bc44-6f8c835bc384</RecID>
      <AssemblyFullName>System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</AssemblyFullName>
      <AssemblyName>System.Web.dll</AssemblyName>
      <AssemblyLocation>C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>2b8c8c16-cc21-4ee4-8d21-70972099264f</RecID>
      <AssemblyFullName>ServiceStack.Common, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.Common.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.Common.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>73ac9085-79b9-4e13-97eb-8bba1fb0e47f</RecID>
      <AssemblyFullName>ServiceStack, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>577ccb17-9bc0-4561-ad93-7a4f3eff2442</RecID>
      <AssemblyFullName>ServiceStack.Interfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.Interfaces.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.Interfaces.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>77385a75-128a-489d-a495-1f6f21a5caea</RecID>
      <AssemblyFullName>ServiceStack.Server, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.Server.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.Server.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>808ee200-cd85-455c-995c-7a535f00c64e</RecID>
      <AssemblyFullName>ServiceStack.Text, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.Text.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.Text.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>51aae69c-c83a-4284-8420-a6f857182671</RecID>
      <AssemblyFullName>ServiceStack.OrmLite.SqlServer, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.OrmLite.SqlServer.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.OrmLite.SqlServer.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>56a545fa-9e6f-4183-b7ad-ee96c2ffe074</RecID>
      <AssemblyFullName>JiwaServiceModel, Version=7.2.1.0, Culture=neutral, PublicKeyToken=e30ce81e37f29c8c</AssemblyFullName>
      <AssemblyName>JiwaServiceModel.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\JiwaServiceModel.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>bf232b07-763f-4905-87a7-c1f3df0a080e</RecID>
      <AssemblyFullName>JiwaODBC, Version=7.2.1.0, Culture=neutral, PublicKeyToken=e30ce81e37f29c8c</AssemblyFullName>
      <AssemblyName>JiwaODBC.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\JiwaODBC.dll</AssemblyLocation>
    </Reference>
    <Reference>
      <RecID>54c070d5-a0fe-4de0-a3eb-bf97e715a70b</RecID>
      <AssemblyFullName>ServiceStack.OrmLite, Version=5.0.0.0, Culture=neutral, PublicKeyToken=02c12cbda47e6587</AssemblyFullName>
      <AssemblyName>ServiceStack.OrmLite.dll</AssemblyName>
      <AssemblyLocation>C:\VSTS\Jiwa 7\07.02.00\Built Files\ServiceStack.OrmLite.dll</AssemblyLocation>
    </Reference>
  </ReferenceCollection>
  <SystemSettingCollection>
    <SystemSetting>
      <RecID>427c1a7877944ebeb4d2</RecID>
      <IDKey>WebHookMessageRetentionDays</IDKey>
      <Description>Number of days to retain and not permanently failed webhookmessages.  Messages and their responses older than this are deleted</Description>
      <DisplayOrder>1</DisplayOrder>
      <CellType>Integer</CellType>
      <Contents>30</Contents>
      <DisplayContents>30</DisplayContents>
    </SystemSetting>
  </SystemSettingCollection>
  <PluginReferenceCollection>
    <PluginReference>
      <RecID>cfabbc38-5172-408e-b6a1-4b69f339380e</RecID>
      <Plugin>
        <RecID xmlns="Entities.Plugin">fb0c1ea8-c560-41ef-b718-f0dc70ba89b9</RecID>
        <Name xmlns="Entities.Plugin">REST API</Name>
        <Description xmlns="Entities.Plugin">Provides a REST HTTP endpoint with some routes.</Description>
        <Author xmlns="Entities.Plugin">Jiwa Financials</Author>
        <IsEnabled xmlns="Entities.Plugin">false</IsEnabled>
        <ExecutionOrder xmlns="Entities.Plugin">0</ExecutionOrder>
      </Plugin>
    </PluginReference>
  </PluginReferenceCollection>
</JiwaDocument>