Skip to content

Commit

Permalink
Added support for delayed delete of dataElements (#98)
Browse files Browse the repository at this point in the history
  • Loading branch information
acn-sbuad authored Jun 15, 2022
1 parent 70e9429 commit 21eb17b
Show file tree
Hide file tree
Showing 10 changed files with 66 additions and 34 deletions.
6 changes: 3 additions & 3 deletions src/Altinn.App.Api/Altinn.App.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<OutputType>Library</OutputType>
<Version>5.2.0</Version>
<AssemblyVersion>5.2.0.0</AssemblyVersion>
<Version>5.3.0-alpha.1</Version>
<AssemblyVersion>5.3.0.0</AssemblyVersion>
<PackageId>Altinn.App.Api</PackageId>
<PackageTags>Altinn;Studio;App;Api;Controllers</PackageTags>
<Description>
Expand All @@ -24,7 +24,7 @@

<ItemGroup>
<PackageReference Include="Altinn.Common.PEP" Version="1.0.39" />
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.10.0" />
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.11.0" />
</ItemGroup>

<ItemGroup>
Expand Down
6 changes: 3 additions & 3 deletions src/Altinn.App.Api/Controllers/DataController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public async Task<ActionResult> Create(
return Forbid();
}

bool appLogic = dataTypeFromMetadata.AppLogic != null;
bool appLogic = dataTypeFromMetadata.AppLogic?.ClassRef != null;

Instance instance = await _instanceClient.GetInstance(app, org, instanceOwnerPartyId, instanceGuid);
if (instance == null)
Expand Down Expand Up @@ -453,7 +453,7 @@ private async Task<ActionResult> GetBinaryData(

private async Task<ActionResult> DeleteBinaryData(string org, string app, int instanceOwnerId, Guid instanceGuid, Guid dataGuid)
{
bool successfullyDeleted = await _dataClient.DeleteBinaryData(org, app, instanceOwnerId, instanceGuid, dataGuid);
bool successfullyDeleted = await _dataClient.DeleteData(org, app, instanceOwnerId, instanceGuid, dataGuid, false);

if (successfullyDeleted)
{
Expand All @@ -472,7 +472,7 @@ private async Task<ActionResult> DeleteBinaryData(string org, string app, int in
try
{
Application application = _appResourcesService.GetApplication();
appLogic = application.DataTypes.Where(e => e.Id == dataType).Select(e => e.AppLogic != null).First();
appLogic = application.DataTypes.Where(e => e.Id == dataType).Select(e => e.AppLogic?.ClassRef != null).First();
}
catch (Exception)
{
Expand Down
4 changes: 2 additions & 2 deletions src/Altinn.App.Api/Controllers/InstancesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ private async Task CopyDataFromSourceInstance(Application application, Instance
Guid sourceInstanceGuid = Guid.Parse(sourceSplit[1]);

List<DataType> dts = application.DataTypes
.Where(dt => dt.AppLogic != null)
.Where(dt => dt.AppLogic?.ClassRef != null)
.Where(dt => dt.TaskId != null && dt.TaskId.Equals(targetInstance.Process.CurrentTask.ElementId))
.ToList();
List<string> excludedDataTypes = application.CopyInstanceSettings.ExcludedDataTypes;
Expand Down Expand Up @@ -847,7 +847,7 @@ private async Task StorePrefillParts(Instance instance, Application appInfo, Lis
DataType dataType = appInfo.DataTypes.Find(d => d.Id == part.Name);

DataElement dataElement;
if (dataType.AppLogic != null)
if (dataType.AppLogic?.ClassRef != null)
{
_logger.LogInformation($"Storing part {part.Name}");

Expand Down
11 changes: 3 additions & 8 deletions src/Altinn.App.Api/Controllers/ProcessController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,19 @@
using Altinn.App.Core.Interface;
using Altinn.App.Core.Models;
using Altinn.App.PlatformServices.Helpers;
using Altinn.App.PlatformServices.Interface;
using Altinn.App.PlatformServices.Models;
using Altinn.App.Services.Configuration;
using Altinn.App.Services.Helpers;
using Altinn.App.Services.Interface;
using Altinn.App.Services.Models.Validation;

using Altinn.Authorization.ABAC.Xacml.JsonProfile;
using Altinn.Common.PEP.Helpers;
using Altinn.Common.PEP.Interfaces;
using Altinn.Platform.Storage.Interface.Enums;
using Altinn.Platform.Storage.Interface.Models;

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

using Newtonsoft.Json;

namespace Altinn.App.Api.Controllers
Expand Down Expand Up @@ -300,7 +295,7 @@ public async Task<ActionResult<ProcessState>> NextElement(

bool authorized = false;
if (processSequenceFlowType.Equals(ProcessSequenceFlowType.CompleteCurrentMoveToNext))
{
{
authorized = await AuthorizeAction(altinnTaskType, org, app, instanceOwnerPartyId, instanceGuid);
}
else
Expand Down Expand Up @@ -333,7 +328,7 @@ public async Task<ActionResult<ProcessState>> NextElement(
return ExceptionResponse(exception, "Process next failed.");
}
}

/// <summary>
/// Attemts to end the process by running next until an end event is reached.
/// Notice that process must have been started.
Expand Down
6 changes: 3 additions & 3 deletions src/Altinn.App.Common/Altinn.App.Common.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<OutputType>Library</OutputType>
<Version>5.2.0</Version>
<AssemblyVersion>5.2.0.0</AssemblyVersion>
<Version>5.3.0-alpha.1</Version>
<AssemblyVersion>5.3.0.0</AssemblyVersion>
<PackageId>Altinn.App.Common</PackageId>
<PackageTags>Altinn;Studio;App;Common</PackageTags>
<Description>
Expand Down Expand Up @@ -37,7 +37,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.10.0" />
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.11.0" />
</ItemGroup>

<PropertyGroup Condition="'$(Configuration)'=='Debug'">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<OutputType>Library</OutputType>
<Version>5.2.0</Version>
<AssemblyVersion>5.2.0.0</AssemblyVersion>
<Version>5.3.0-alpha.1</Version>
<AssemblyVersion>5.3.0.0</AssemblyVersion>
<PackageId>Altinn.App.PlatformServices</PackageId>
<PackageTags>Altinn;Studio;App;Services;Platform</PackageTags>
<Description>
Expand All @@ -31,7 +31,7 @@
<PackageReference Include="Altinn.Common.PEP" Version="1.0.39" />
<PackageReference Include="Altinn.Common.EFormidlingClient" Version="1.2.0" />
<PackageReference Include="Altinn.Platform.Models" Version="1.1.1" />
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.10.0" />
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.11.0" />
<PackageReference Include="HtmlAgilityPack" Version="1.11.42" />
<PackageReference Include="JWTCookieAuthentication" Version="2.4.2" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.20.0" />
Expand Down
33 changes: 25 additions & 8 deletions src/Altinn.App.PlatformServices/Implementation/AppBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;

using Altinn.App.Common.Models;
using Altinn.App.PlatformServices.Interface;
using Altinn.App.Services.Configuration;
Expand Down Expand Up @@ -32,7 +33,7 @@ public abstract class AppBase : IAltinnApp
private readonly Application _appMetadata;
private readonly IAppResources _resourceService;
private readonly ILogger<AppBase> _logger;
private readonly IEFormidlingClient _eFormidlingClient;
private readonly IEFormidlingClient _eFormidlingClient;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly AppSettings _appSettings;
private readonly IData _dataClient;
Expand All @@ -42,6 +43,9 @@ public abstract class AppBase : IAltinnApp
private readonly IAccessTokenGenerator _tokenGenerator;
private readonly PlatformSettings _platformSettings;

private readonly string _org;
private readonly string _app;

/// <summary>
/// Initialize a new instance of <see cref="AppBase"/> class with the given services.
/// </summary>
Expand Down Expand Up @@ -81,6 +85,9 @@ protected AppBase(
_eFormidlingClient = eFormidlingClient;
_tokenGenerator = tokenGenerator;
_platformSettings = platformSettings?.Value;

_org = _appMetadata.Org;
_app = _appMetadata.Id.Split("/")[1];
}

/// <inheritdoc />
Expand Down Expand Up @@ -234,9 +241,11 @@ public async Task OnEndProcessTask(string taskId, Instance instance)

List<DataType> dataTypesToLock = _appMetadata.DataTypes.FindAll(dt => dt.TaskId == taskId);

Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
foreach (DataType dataType in dataTypesToLock)
{
bool generatePdf = dataType.AppLogic != null && dataType.EnablePdfCreation;
bool generatePdf = dataType.AppLogic?.ClassRef != null && dataType.EnablePdfCreation;
bool autoDeleteDataElement = dataType.AppLogic?.AutoDeleteOnProcessEnd == true && !_appMetadata.AutoDeleteOnProcessEnd;

foreach (DataElement dataElement in instance.Data.FindAll(de => de.DataType == dataType.Id))
{
Expand All @@ -254,6 +263,17 @@ public async Task OnEndProcessTask(string taskId, Instance instance)
{
await updateData;
}

if (autoDeleteDataElement)
{
await _dataClient.DeleteData(
_org,
_app,
int.Parse(instance.InstanceOwner.PartyId),
instanceGuid,
Guid.Parse(dataElement.Id),
true);
}
}
}

Expand All @@ -271,8 +291,6 @@ public async Task OnEndProcessTask(string taskId, Instance instance)
if (_appMetadata.AutoDeleteOnProcessEnd)
{
int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);
Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);

await _instanceClient.DeleteInstance(instanceOwnerPartyId, instanceGuid, true);
}

Expand Down Expand Up @@ -377,11 +395,10 @@ private async Task SendInstanceData(Instance instance, Dictionary<string, string
continue;
}

bool appLogic = _appMetadata.DataTypes.Any(d => d.Id == dataElement.DataType && d.AppLogic != null);
bool appLogic = _appMetadata.DataTypes.Any(d => d.Id == dataElement.DataType && d.AppLogic?.ClassRef != null);

string fileName = appLogic ? $"{dataElement.DataType}.xml" : dataElement.Filename;

using Stream stream = await _dataClient.GetBinaryData(instance.Org, instance.AppId, instanceOwnerPartyId, instanceGuid, new Guid(dataElement.Id));
using Stream stream = await _dataClient.GetBinaryData(_org, _app, instanceOwnerPartyId, instanceGuid, new Guid(dataElement.Id));

bool successful = await _eFormidlingClient.UploadAttachment(stream, instanceGuid.ToString(), fileName, requestHeaders);

Expand Down Expand Up @@ -462,7 +479,7 @@ private async Task<StandardBusinessDocument> ConstructStandardBusinessDocument(s

private async Task SendEFormidlingShipment(Instance instance)
{
string accessToken = _tokenGenerator.GenerateAccessToken(_appMetadata.Org, _appMetadata.Id.Split("/")[1]);
string accessToken = _tokenGenerator.GenerateAccessToken(_org, _app);
string authzToken = JwtTokenUtil.GetTokenFromContext(_httpContextAccessor.HttpContext, _appSettings.RuntimeCookieName);

var requestHeaders = new Dictionary<string, string>
Expand Down
10 changes: 8 additions & 2 deletions src/Altinn.App.PlatformServices/Implementation/DataClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -242,9 +242,15 @@ private static void ExtractAttachments(List<DataElement> dataList, List<Attachme

/// <inheritdoc />
public async Task<bool> DeleteBinaryData(string org, string app, int instanceOwnerPartyId, Guid instanceGuid, Guid dataGuid)
{
return await DeleteData(org, app, instanceOwnerPartyId, instanceGuid, dataGuid, false);
}

/// <inheritdoc />
public async Task<bool> DeleteData(string org, string app, int instanceOwnerPartyId, Guid instanceGuid, Guid dataGuid, bool delayed)
{
string instanceIdentifier = $"{instanceOwnerPartyId}/{instanceGuid}";
string apiUrl = $"instances/{instanceIdentifier}/data/{dataGuid}";
string apiUrl = $"instances/{instanceIdentifier}/data/{dataGuid}?delayed={delayed}";
string token = JwtTokenUtil.GetTokenFromContext(_httpContextAccessor.HttpContext, _settings.RuntimeCookieName);

HttpResponseMessage response = await _client.DeleteAsync(token, apiUrl);
Expand All @@ -254,7 +260,7 @@ public async Task<bool> DeleteBinaryData(string org, string app, int instanceOwn
return true;
}

_logger.LogError($"Deleting form attachment {dataGuid} for instance {instanceGuid} failed with status code {response.StatusCode}");
_logger.LogError($"Deleting data element {dataGuid} for instance {instanceIdentifier} failed with status code {response.StatusCode}");
throw await PlatformHttpException.CreateAsync(response);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ public async Task<List<ValidationIssue>> ValidateDataElement(Instance instance,
messages.Add(message);
}

if (dataType.AppLogic != null)
if (dataType.AppLogic?.ClassRef != null)
{
Type modelType = _altinnApp.GetAppModelType(dataType.AppLogic.ClassRef);
Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
Expand Down
16 changes: 15 additions & 1 deletion src/Altinn.App.PlatformServices/Interface/IData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

using Altinn.App.Services.Models;
using Altinn.Platform.Storage.Interface.Models;

using Microsoft.AspNetCore.Http;

namespace Altinn.App.Services.Interface
Expand Down Expand Up @@ -89,8 +91,20 @@ public interface IData
/// <param name="instanceOwnerPartyId">The instance owner id</param>
/// <param name="instanceGuid">The instance id</param>
/// <param name="dataGuid">The attachment id</param>
[Obsolete("Use method DeleteData with delayed=false instead.")]
Task<bool> DeleteBinaryData(string org, string app, int instanceOwnerPartyId, Guid instanceGuid, Guid dataGuid);

/// <summary>
/// Method that removes a data elemen from disk/storage immediatly or marks it as deleted.
/// </summary>
/// <param name="org">Unique identifier of the organisation responsible for the app.</param>
/// <param name="app">Application identifier which is unique within an organisation.</param>
/// <param name="instanceOwnerPartyId">The instance owner id</param>
/// <param name="instanceGuid">The instance id</param>
/// <param name="dataGuid">The attachment id</param>
/// <param name="delayed">A boolean indicating whether or not the delete should be executed immediately or delayed</param>
Task<bool> DeleteData(string org, string app, int instanceOwnerPartyId, Guid instanceGuid, Guid dataGuid, bool delayed);

/// <summary>
/// Method that saves a form attachments to disk/storage and returns the new data element.
/// </summary>
Expand Down Expand Up @@ -123,7 +137,7 @@ public interface IData
/// <param name="stream">the stream to stream</param>
/// <returns></returns>
Task<DataElement> InsertBinaryData(string instanceId, string dataType, string contentType, string filename, Stream stream);

/// <summary>
/// Updates the data element metadata object.
/// </summary>
Expand Down

0 comments on commit 21eb17b

Please sign in to comment.