Welcome to the navigation

Incididunt ad est sunt occaecat nulla quis voluptate sint in do enim id sit velit dolore dolor elit, exercitation nostrud fugiat qui ut labore ullamco. Tempor dolor fugiat consequat, ad ipsum exercitation sint excepteur ut culpa ea in elit, in consectetur minim veniam, aute irure eu laboris ex do adipisicing

Yeah, this will be replaced... But please enjoy the search!

Episerver Forms Cleanup for GDPR

Categories Tags

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.