diff --git a/Directory.Build.props b/Directory.Build.props index b945e8251..2987a7c9e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ true + NU1901;NU1902;NU1903;NU1904 @@ -17,4 +18,4 @@ runtime; build; native; contentfiles; analyzers - \ No newline at end of file + diff --git a/global.json b/global.json new file mode 100644 index 000000000..fee645a7b --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "8.0.100", + "rollForward": "latestFeature", + "allowPrerelease": false + } +} diff --git a/src/Altinn.App.Api/Controllers/InstancesController.cs b/src/Altinn.App.Api/Controllers/InstancesController.cs index ff1539f0a..6e964895f 100644 --- a/src/Altinn.App.Api/Controllers/InstancesController.cs +++ b/src/Altinn.App.Api/Controllers/InstancesController.cs @@ -1,6 +1,6 @@ using System.Globalization; using System.Net; -using System.Text.Json; +using System.Text; using Altinn.App.Api.Extensions; using Altinn.App.Api.Helpers.Patch; using Altinn.App.Api.Helpers.RequestHandling; @@ -71,7 +71,7 @@ public class InstancesController : ControllerBase private readonly IHostEnvironment _env; private readonly ModelSerializationService _serializationService; private readonly InternalPatchService _patchService; - private static readonly JsonSerializerOptions _jsonSerializerOptionsWeb = new(JsonSerializerDefaults.Web); + private const long RequestSizeLimit = 2000 * 1024 * 1024; /// @@ -1244,10 +1244,7 @@ string action && instancePart.ContentType.Contains("application/json", StringComparison.Ordinal) ) { - return System.Text.Json.JsonSerializer.Deserialize( - instancePart.Bytes, - _jsonSerializerOptionsWeb - ); + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(instancePart.Bytes)); } } diff --git a/test/Altinn.App.Api.Tests/Controllers/InstancesController_PostNewInstance.cs b/test/Altinn.App.Api.Tests/Controllers/InstancesController_PostNewInstanceTests.cs similarity index 91% rename from test/Altinn.App.Api.Tests/Controllers/InstancesController_PostNewInstance.cs rename to test/Altinn.App.Api.Tests/Controllers/InstancesController_PostNewInstanceTests.cs index 9d8f91fb2..e931eff9b 100644 --- a/test/Altinn.App.Api.Tests/Controllers/InstancesController_PostNewInstance.cs +++ b/test/Altinn.App.Api.Tests/Controllers/InstancesController_PostNewInstanceTests.cs @@ -297,6 +297,51 @@ public async Task PostNewInstanceWithInstanceTemplate() TestData.DeleteInstanceAndData(org, app, instance.Id); } + [Fact] + public async Task PostNewInstanceWithInstanceTemplateString() + { + string org = "tdd"; + string app = "contributer-restriction"; + int instanceOwnerPartyId = 501337; + // Get an org token + // (to avoid issues with read status being set when initialized by normal users) + HttpClient client = GetRootedClient(org, app, 0, null, serviceOwnerOrg: org); + + using var content = new StringContent( + $$""" + { + "instanceOwner": { + "partyId": {{instanceOwnerPartyId}} + }, + "status": { + "readStatus": "UpdatedSinceLastReview", + "substatus": { + "label": "min label", + "description": "min beskrivelse" + } + } + } + """, + Encoding.UTF8, + "application/json" + ); + + var response = await client.PostAsync($"{org}/{app}/instances", content); + var responseContent = await response.Content.ReadAsStringAsync(); + OutputHelper.WriteLine(responseContent); + response.Should().HaveStatusCode(HttpStatusCode.Created); + var instance = JsonSerializer.Deserialize(responseContent, JsonSerializerOptions)!; + instance.Should().NotBeNull(); + instance.Id.Should().NotBeNullOrEmpty(); + instance.Status.Should().NotBeNull(); + instance.Status.ReadStatus.Should().Be(ReadStatus.UpdatedSinceLastReview); + instance.Status.Substatus.Should().NotBeNull(); + instance.Status.Substatus!.Label.Should().Be("min label"); + instance.Status.Substatus!.Description.Should().Be("min beskrivelse"); + + TestData.DeleteInstanceAndData(org, app, instance.Id); + } + [Fact] public async Task PostNewInstanceWithMissingTemplate() { diff --git a/test/Altinn.App.Api.Tests/CustomWebApplicationFactory.cs b/test/Altinn.App.Api.Tests/CustomWebApplicationFactory.cs index 4da6c0371..bd8c62a8f 100644 --- a/test/Altinn.App.Api.Tests/CustomWebApplicationFactory.cs +++ b/test/Altinn.App.Api.Tests/CustomWebApplicationFactory.cs @@ -98,10 +98,17 @@ public Task Invoke(HttpContext httpContext) } } - public HttpClient GetRootedClient(string org, string app, int userId, int? partyId, int authenticationLevel = 2) + public HttpClient GetRootedClient( + string org, + string app, + int userId, + int? partyId, + int authenticationLevel = 2, + string? serviceOwnerOrg = null + ) { var client = GetRootedClient(org, app); - string token = PrincipalUtil.GetToken(userId, partyId, authenticationLevel); + string token = PrincipalUtil.GetToken(userId, partyId, authenticationLevel, org: serviceOwnerOrg); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); return client; } diff --git a/test/Altinn.App.Api.Tests/Mocks/InstanceClientMockSi.cs b/test/Altinn.App.Api.Tests/Mocks/InstanceClientMockSi.cs index 4c2dc556d..fa4ca2b1f 100644 --- a/test/Altinn.App.Api.Tests/Mocks/InstanceClientMockSi.cs +++ b/test/Altinn.App.Api.Tests/Mocks/InstanceClientMockSi.cs @@ -21,26 +21,14 @@ public InstanceClientMockSi(ILogger logger, IHttpContextAccesso _httpContextAccessor = httpContextAccessor; } - public Task CreateInstance(string org, string app, Instance instanceTemplate) + public Task CreateInstance(string org, string app, Instance instance) { - string partyId = instanceTemplate.InstanceOwner.PartyId; + string partyId = instance.InstanceOwner.PartyId; Guid instanceGuid = Guid.NewGuid(); - - Instance instance = - new() - { - Id = $"{partyId}/{instanceGuid}", - AppId = $"{org}/{app}", - Org = org, - InstanceOwner = instanceTemplate.InstanceOwner, - Process = instanceTemplate.Process, - Data = new List(), - }; - - if (instanceTemplate.DataValues != null) - { - instance.DataValues = instanceTemplate.DataValues; - } + instance.Id = $"{partyId}/{instanceGuid}"; + instance.AppId = $"{org}/{app}"; + instance.Org = org; + instance.Data = new List(); string instancePath = GetInstancePath(app, org, int.Parse(partyId), instanceGuid); string directory =