Skip to content

Commit

Permalink
Merge branch 'main' into summary2-taskid-event-handling
Browse files Browse the repository at this point in the history
  • Loading branch information
ErlingHauan authored Oct 3, 2024
2 parents e3cb1a7 + 01e4fce commit b0ab8a1
Show file tree
Hide file tree
Showing 186 changed files with 4,768 additions and 4,798 deletions.
14 changes: 12 additions & 2 deletions backend/src/Designer/Controllers/AppDevelopmentController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class AppDevelopmentController : Controller
private readonly IAltinnGitRepositoryFactory _altinnGitRepositoryFactory;
private readonly ApplicationInsightsSettings _applicationInsightsSettings;
private readonly IMediator _mediator;
private readonly IUserRequestsSynchronizationService _userRequestsSynchronizationService;


/// <summary>
Expand All @@ -45,14 +46,17 @@ public class AppDevelopmentController : Controller
/// <param name="sourceControl">The source control service.</param>
/// <param name="altinnGitRepositoryFactory"></param>
/// <param name="applicationInsightsSettings">An <see cref="ApplicationInsightsSettings"/></param>
public AppDevelopmentController(IAppDevelopmentService appDevelopmentService, IRepository repositoryService, ISourceControl sourceControl, IAltinnGitRepositoryFactory altinnGitRepositoryFactory, ApplicationInsightsSettings applicationInsightsSettings, IMediator mediator)
/// <param name="mediator"></param>
/// <param name="userRequestsSynchronizationService">An <see cref="IUserRequestsSynchronizationService"/> used to control parallel execution of user requests.</param>
public AppDevelopmentController(IAppDevelopmentService appDevelopmentService, IRepository repositoryService, ISourceControl sourceControl, IAltinnGitRepositoryFactory altinnGitRepositoryFactory, ApplicationInsightsSettings applicationInsightsSettings, IMediator mediator, IUserRequestsSynchronizationService userRequestsSynchronizationService)
{
_appDevelopmentService = appDevelopmentService;
_repository = repositoryService;
_sourceControl = sourceControl;
_altinnGitRepositoryFactory = altinnGitRepositoryFactory;
_applicationInsightsSettings = applicationInsightsSettings;
_mediator = mediator;
_userRequestsSynchronizationService = userRequestsSynchronizationService;
}

/// <summary>
Expand Down Expand Up @@ -213,9 +217,11 @@ public ActionResult UpdateFormLayoutName(string org, string app, [FromQuery] str
[Route("layout-settings")]
public async Task<ActionResult> SaveLayoutSettings(string org, string app, [FromQuery] string layoutSetName, [FromBody] JsonNode layoutSettings, CancellationToken cancellationToken)
{
string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext);
SemaphoreSlim semaphore = _userRequestsSynchronizationService.GetRequestsSemaphore(org, app, developer);
await semaphore.WaitAsync();
try
{
string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext);
var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer);
await _appDevelopmentService.SaveLayoutSettings(editingContext, layoutSettings, layoutSetName, cancellationToken);
return Ok();
Expand All @@ -224,6 +230,10 @@ public async Task<ActionResult> SaveLayoutSettings(string org, string app, [From
{
return NotFound(exception.Message);
}
finally
{
semaphore.Release();
}
}

/// <summary>
Expand Down
4 changes: 2 additions & 2 deletions backend/src/Designer/Controllers/PreviewController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,7 @@ private static ApplicationMetadata SetMockDataTypeIfMissing(ApplicationMetadata
LayoutSets layoutSetsWithMockedDataTypesIfMissing = AddDataTypesToReturnedLayoutSetsIfMissing(layoutSets);
layoutSetsWithMockedDataTypesIfMissing.Sets.ForEach(set =>
{
if (set.Tasks[0] == Constants.General.CustomReceiptId)
if (set.Tasks?[0] == Constants.General.CustomReceiptId)
{
return;
}
Expand All @@ -1043,7 +1043,7 @@ private static ApplicationMetadata SetMockDataTypeIfMissing(ApplicationMetadata
{
ClassRef = $"Altinn.App.Models.model.{set.DataType}"
},
TaskId = set.Tasks[0]
TaskId = set.Tasks?[0]
});
}
});
Expand Down
23 changes: 18 additions & 5 deletions backend/src/Designer/Controllers/ResourceAdminController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -344,17 +344,30 @@ public async Task<ActionResult> ImportResource(string org, string serviceCode, i
[HttpGet]
[Authorize(Policy = AltinnPolicy.MustHaveGiteaPublishResourcePermission)]
[Route("designer/api/{org}/resources/altinn2/delegationcount/{serviceCode}/{serviceEdition}/{env}")]
public async Task<DelegationCountOverview> GetDelegationCount(string serviceCode, int serviceEdition, string env)
public async Task<ActionResult> GetDelegationCount(string org, string serviceCode, int serviceEdition, string env)
{
return await _resourceRegistry.GetDelegationCount(serviceCode, serviceEdition, env);
ServiceResource resource = await _resourceRegistry.GetServiceResourceFromService(serviceCode, serviceEdition, env.ToLower());
if (resource?.HasCompetentAuthority == null || !resource.HasCompetentAuthority.Orgcode.Equals(org, StringComparison.InvariantCultureIgnoreCase))
{
return new UnauthorizedResult();
}

DelegationCountOverview overview = await _resourceRegistry.GetDelegationCount(serviceCode, serviceEdition, env);
return Ok(overview);
}

[HttpPost]
[Authorize(Policy = AltinnPolicy.MustHaveGiteaPublishResourcePermission)]
[Route("designer/api/{org}/resources/altinn2/exportdelegations/{env}")]
public async Task<ActionResult> ExportDelegations([FromBody] ExportDelegationsRequestBE delegationRequest, string environment)
[Route("designer/api/{org}/resources/altinn2/delegationmigration/{env}")]
public async Task<ActionResult> MigrateDelegations([FromBody] ExportDelegationsRequestBE delegationRequest, string org, string env)
{
return await _resourceRegistry.StartMigrateDelegations(delegationRequest, environment);
ServiceResource resource = await _resourceRegistry.GetServiceResourceFromService(delegationRequest.ServiceCode, delegationRequest.ServiceEditionCode, env.ToLower());
if (resource?.HasCompetentAuthority == null || !resource.HasCompetentAuthority.Orgcode.Equals(org, StringComparison.InvariantCultureIgnoreCase))
{
return new UnauthorizedResult();
}

return await _resourceRegistry.StartMigrateDelegations(delegationRequest, env);
}

[HttpGet]
Expand Down
6 changes: 3 additions & 3 deletions backend/src/Designer/Models/ExportDelegationsRequestBE.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class ExportDelegationsRequestBE
/// Gets or sets the ServiceCode for identifying service
/// </summary>
[Required]
public string ServiceCode { get; set; }
public required string ServiceCode { get; set; }

/// <summary>
/// Gets or sets the ServiceEditionCode for identifying service
Expand All @@ -24,12 +24,12 @@ public class ExportDelegationsRequestBE
/// Gets or sets the resourceId
/// </summary>
[Required]
public string ResourceId { get; set; }
public required string ResourceId { get; set; }

/// <summary>
/// Gets or sets the time and date for when to include in delegationExport-batch
/// </summary>
[Required]
public DateTime DateTimeForExport { get; set; }
public required DateTimeOffset DateTimeForExport { get; set; }
}
}
5 changes: 5 additions & 0 deletions backend/src/Designer/Models/LayoutSets.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@ public class LayoutSetConfig
[CanBeNull] public string DataType { get; set; }

[JsonPropertyName("tasks")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<string> Tasks { get; set; }

[JsonPropertyName("type")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Type { get; set; }

[JsonExtensionData]
public IDictionary<string, object?> UnknownProperties { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ public async Task<LayoutSets> AddLayoutSet(AltinnRepoEditingContext altinnRepoEd
{
throw new NonUniqueLayoutSetIdException($"Layout set name, {newLayoutSet.Id}, already exists.");
}
if (layoutSets.Sets.Exists(set => set.Tasks[0] == newLayoutSet.Tasks[0]))
if (newLayoutSet.Tasks != null && layoutSets.Sets.Exists(set => set.Tasks[0] == newLayoutSet.Tasks[0]))
{
throw new NonUniqueTaskForLayoutSetException($"Layout set with task, {newLayoutSet.Tasks[0]}, already exists.");
}
Expand Down
12 changes: 7 additions & 5 deletions backend/src/Designer/Services/Implementation/PreviewService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,16 @@ public async Task<List<string>> GetTasksForAllLayoutSets(string org, string app,
List<string> tasks = [];
if (layoutSets?.Sets is { Count: > 0 })
{
foreach (LayoutSetConfig layoutSet in layoutSets.Sets.Where(ls => !tasks.Contains(ls.Tasks[0])))
foreach (LayoutSetConfig layoutSet in layoutSets.Sets.Where(ls => !tasks.Contains(ls.Tasks?[0])))
{
if (layoutSet.Tasks[0] == Constants.General.CustomReceiptId)
if (layoutSet.Tasks?[0] == Constants.General.CustomReceiptId)
{
continue;
}

tasks.Add(layoutSet.Tasks[0]);
if (layoutSet.Tasks != null)
{
tasks.Add(layoutSet.Tasks[0]);
}
}
}
return tasks;
Expand All @@ -121,7 +123,7 @@ public async Task<string> GetTaskForLayoutSetName(string org, string app, string
if (!string.IsNullOrEmpty(layoutSetName))
{
LayoutSets layoutSets = await altinnAppGitRepository.GetLayoutSetsFile(cancellationToken);
task = layoutSets?.Sets?.Find(element => element.Id == layoutSetName).Tasks[0];
task = layoutSets?.Sets?.Find(element => element.Id == layoutSetName).Tasks?[0];
}
return task;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public async Task<string> GetTaskTypeFromProcessDefinition(AltinnRepoEditingCont
XmlSerializer serializer = new XmlSerializer(typeof(Definitions));
Definitions? definitions = (Definitions?)serializer.Deserialize(processDefinitionStream);
LayoutSetConfig layoutSet = await _appDevelopmentService.GetLayoutSetConfig(altinnRepoEditingContext, layoutSetId);
string taskId = layoutSet.Tasks.First();
string taskId = layoutSet.Tasks?.First();
ProcessTask? task = definitions?.Process.Tasks.FirstOrDefault(task => task.Id == taskId);
return task?.ExtensionElements?.TaskExtension?.TaskType ?? string.Empty;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
using Altinn.Studio.Designer.Models;
using Altinn.Studio.Designer.Models.Dto;
using Altinn.Studio.Designer.Services.Interfaces;
using Altinn.Studio.Designer.TypedHttpClients.Altinn2DelegationMigration;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

Expand All @@ -34,15 +33,14 @@ public class ResourceRegistryService : IResourceRegistry
private readonly PlatformSettings _platformSettings;
private readonly ResourceRegistryIntegrationSettings _resourceRegistrySettings;
private readonly ResourceRegistryMaskinportenIntegrationSettings _maskinportenIntegrationSettings;
private readonly IAltinn2DelegationMigrationClient _altinn2DelegationMigrationClient;
private readonly JsonSerializerOptions _serializerOptions = new JsonSerializerOptions() { PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase, WriteIndented = true };

public ResourceRegistryService()
{

}

public ResourceRegistryService(HttpClient httpClient, IHttpClientFactory httpClientFactory, IMaskinportenService maskinportenService, IClientDefinition maskinPortenClientDefinition, PlatformSettings platformSettings, IOptions<ResourceRegistryIntegrationSettings> resourceRegistryEnvironment, IOptions<ResourceRegistryMaskinportenIntegrationSettings> maskinportenIntegrationSettings, IAltinn2DelegationMigrationClient altinn2DelegationMigrationClient)
public ResourceRegistryService(HttpClient httpClient, IHttpClientFactory httpClientFactory, IMaskinportenService maskinportenService, IClientDefinition maskinPortenClientDefinition, PlatformSettings platformSettings, IOptions<ResourceRegistryIntegrationSettings> resourceRegistryEnvironment, IOptions<ResourceRegistryMaskinportenIntegrationSettings> maskinportenIntegrationSettings)
{
_httpClient = httpClient;
_httpClientFactory = httpClientFactory;
Expand All @@ -51,7 +49,6 @@ public ResourceRegistryService(HttpClient httpClient, IHttpClientFactory httpCli
_platformSettings = platformSettings;
_resourceRegistrySettings = resourceRegistryEnvironment.Value;
_maskinportenIntegrationSettings = maskinportenIntegrationSettings.Value;
_altinn2DelegationMigrationClient = altinn2DelegationMigrationClient;
}

public async Task<ActionResult> PublishServiceResource(ServiceResource serviceResource, string env, string policyPath = null)
Expand Down Expand Up @@ -301,13 +298,53 @@ public async Task<XacmlPolicy> GetXacmlPolicy(string serviceCode, int serviceEdi

public async Task<DelegationCountOverview> GetDelegationCount(string serviceCode, int serviceEditionCode, string environment)
{
return await _altinn2DelegationMigrationClient.GetNumberOfDelegations(serviceCode, serviceEditionCode, environment);
_maskinportenClientDefinition.ClientSettings = GetMaskinportenIntegrationSettings(environment);
TokenResponse tokenResponse = await GetBearerTokenFromMaskinporten();

string resourceRegisterUrl = GetResourceRegistryBaseUrl(environment);
string url = $"{resourceRegisterUrl}/resourceregistry/api/v1/altinn2export/delegationcount/?serviceCode={serviceCode}&serviceEditionCode={serviceEditionCode}";

using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResponse.AccessToken);

using HttpResponseMessage response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();

return await response.Content.ReadAsAsync<DelegationCountOverview>();
}

public async Task<ActionResult> StartMigrateDelegations(ExportDelegationsRequestBE delegationRequest, string environment)
{
// TODO
_maskinportenClientDefinition.ClientSettings = GetMaskinportenIntegrationSettings(environment);
TokenResponse tokenResponse = await GetBearerTokenFromMaskinporten();

string resourceRegisterUrl = GetResourceRegistryBaseUrl(environment);

// set service expired
string setServiceEditionExpiredUrl = $"{resourceRegisterUrl}/resourceregistry/api/v1/altinn2export/setserviceeditionexpired?externalServiceCode={delegationRequest.ServiceCode}&externalServiceEditionCode={delegationRequest.ServiceEditionCode}";

using HttpRequestMessage setServiceEditionExpiredRequest = new HttpRequestMessage(HttpMethod.Get, setServiceEditionExpiredUrl);
setServiceEditionExpiredRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResponse.AccessToken);

using HttpResponseMessage setServiceEditionExpiredResponse = await _httpClient.SendAsync(setServiceEditionExpiredRequest);
setServiceEditionExpiredResponse.EnsureSuccessStatusCode();

// set batch start time
string migrateDelegationsUrl = $"{resourceRegisterUrl}/resourceregistry/api/v1/altinn2export/exportdelegations";
delegationRequest.DateTimeForExport = DateTimeOffset.UtcNow.AddMinutes(10); // set batch start time 10 minutes from now
string serializedContent = JsonSerializer.Serialize(delegationRequest, _serializerOptions);
using HttpRequestMessage migrateDelegationsRequest = new HttpRequestMessage()
{
RequestUri = new Uri(migrateDelegationsUrl),
Method = HttpMethod.Post,
Content = new StringContent(serializedContent, Encoding.UTF8, "application/json"),
};
migrateDelegationsRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResponse.AccessToken);

using HttpResponseMessage migrateDelegationsResponse = await _httpClient.SendAsync(migrateDelegationsRequest);
migrateDelegationsResponse.EnsureSuccessStatusCode();

return new StatusCodeResult(201);
return new StatusCodeResult(202);
}

// RRR
Expand Down

This file was deleted.

This file was deleted.

Loading

0 comments on commit b0ab8a1

Please sign in to comment.