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 =