NB: This is the super duper simple first version of this "plugin"! GDPR made us all available that we need to maintain any data we collect, which includes form posts. Here's a simple method of automatically deleting any form posts older than X days.
Setup
Add the EpiserverFormsILM setting in web.config
<add key="EpiserverFormsILM" value="60"/>
Add the nuget package System.ValueTuple
Install-Package System.ValueTuple
Code
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using EPiServer.DataAbstraction;
using EPiServer.Forms.Core;
using EPiServer.Forms.Core.Data;
using EPiServer.Forms.Core.Models;
using EPiServer.PlugIn;
using EPiServer.Scheduler;
using EPiServer.ServiceLocation;
// Do whatever you want, www.herlitz.io
namespace Herlitz.Web.Business.AdminJobs
{
[ScheduledPlugIn(DisplayName = "Episerver Forms Cleanup", Description = "Better GDPR compliance for Episerver forms")]
public class EpiserverFormsILM : ScheduledJobBase
{
private bool _stopSignaled;
private Injected _formRepository;
private Injected _formDataRepository;
private Injected _languageBranchRepository;
public EpiserverFormsILM()
{
IsStoppable = true;
}
///
/// Called when a user clicks on Stop for a manually started job, or when ASP.NET shuts down.
///
public override void Stop()
{
_stopSignaled = true;
}
///
/// Called when a scheduled job executes
///
/// A status message to be stored in the database log and visible from admin mode
public override string Execute()
{
//Call OnStatusChanged to periodically notify progress of job for manually started jobs
OnStatusChanged($"Starting execution of {this.GetType()}");
if (_stopSignaled)
{
return "Stop of job was called";
}
var languages = _languageBranchRepository.Service.ListEnabled().Select(x => x.Culture.TwoLetterISOLanguageName).ToList();
// take all forms in all languages
var allForms = _formRepository.Service.GetFormsInfo(null);
List<(string, int, string)> submissionCount = new List<(string, int, string)>();
foreach (var form in allForms)
{
if (_stopSignaled)
{
submissionCount.Add(($"{form.Name}", 0, " The job was stopped"));
break;
}
foreach (var language in languages)
{
if (_stopSignaled)
{
break;
}
try
{
int episerverFormsILMperiod = -int.Parse(ConfigurationManager.AppSettings["EpiserverFormsILM"]);
var result = _formDataRepository.Service.GetSubmissionDataCount(
formIden: new FormIdentity(form.FormGuid, language),
beginDate: DateTime.MinValue,
endDate: DateTime.Now.AddDays(episerverFormsILMperiod),
finalizedOnly: true);
if (result > 0)
{
submissionCount.Add((form.Name, result, language));
var submissions = _formDataRepository.Service.GetSubmissionData(
formIden: new FormIdentity(form.FormGuid, language),
beginDate: DateTime.MinValue,
endDate: DateTime.Now.AddDays(episerverFormsILMperiod),
finalizedOnly: true);
_formDataRepository.Service.DeleteSubmissionData(
formIden: new FormIdentity(form.FormGuid, language),
submissionIds: submissions.Select(x => x.Id).ToArray());
}
}
catch (Exception ex)
{
// Let's get on with our lives
submissionCount.Add((form.Name, 0, $"{language}; {ex.Message}"));
}
}
}
// Output string
var output = "";
foreach (var value in submissionCount)
{
Console.WriteLine($"{value.Item1}: {value.Item2} - {value.Item3}");
output = output + $"{value.Item1}: {value.Item2} - {value.Item3}\n
";
}
return output;
}
}
}
Readme
Configure the scheduled job in the admin gui in episerver, the code will delete any form submissions older than X days and report any errors on doing so.
