Skip to content

Commit 53c45a4

Browse files
authored
Add resource to domain (#281)
* Re-wrote names to resource instead of service to match naming elsewhere * Follow-up * Setup interfaces for resource rights * Setup application layer with new authorization * Fixed sql scripts * Implemented ResourceRightsRepository
1 parent b478489 commit 53c45a4

File tree

51 files changed

+687
-504
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+687
-504
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1-
INSERT INTO broker.service_owner (service_owner_id_pk, service_owner_name, file_time_to_live)
1+
INSERT INTO broker.resource_owner (resource_owner_id_pk, resource_owner_name, file_time_to_live)
22
VALUES ('0192:991825827', 'Digitaliseringsdirektoratet Avd Oslo', '1 Days');
33

4-
INSERT INTO broker.storage_provider (storage_provider_id_pk, service_owner_id_fk, created, storage_provider_type, resource_name)
4+
INSERT INTO broker.storage_provider (storage_provider_id_pk, resource_owner_id_fk, created, storage_provider_type, resource_name)
55
VALUES (DEFAULT, '0192:991825827', NOW(), 'Altinn3Azure', 'dummy-value');
66

7-
INSERT INTO broker.service (service_id_pk, created, client_id, organization_number, service_owner_id_fk)
8-
VALUES (DEFAULT, NOW(), '00000000-0000-0000-0000-000000000000', '0192:991825827', '0192:991825827');
7+
INSERT INTO broker.resource (resource_id_pk, created, organization_number, resource_owner_id_fk)
8+
VALUES ('resource-1', NOW(), '0192:991825827', '0192:991825827');
99

10-
INSERT INTO broker.service (service_id_pk, created, client_id, organization_number, service_owner_id_fk)
11-
VALUES (DEFAULT, NOW(), '11111111-1111-1111-1111-111111111111', '0192:991825832', '0192:991825827');
10+
INSERT INTO broker.user (client_id_pk, organization_number)
11+
VALUES ('00000000-0000-0000-0000-000000000000', '0192:991825827');
12+
13+
INSERT INTO broker.user_right (resource_id_fk, user_id_fk, user_right_description_id_fk)
14+
VALUES ('resource-1', '00000000-0000-0000-0000-000000000000', 1);
15+
16+
INSERT INTO broker.user (client_id_pk, organization_number)
17+
VALUES ('11111111-1111-1111-1111-111111111111', '0192:991825832');
18+
19+
INSERT INTO broker.user_right (resource_id_fk, user_id_fk, user_right_description_id_fk)
20+
VALUES ('resource-1', '11111111-1111-1111-1111-111111111111', 0);

Test/Altinn.Broker.Tests/Factories/FileInitializeExtTestFactory.cs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ internal static class FileInitializeExtTestFactory
55
{
66
internal static FileInitalizeExt BasicFile() => new FileInitalizeExt()
77
{
8+
ResourceId = "resource-1",
89
Checksum = null,
910
FileName = "input.txt",
1011
PropertyList = [],

Test/Altinn.Broker.Tests/FileControllerTests.cs

+17-12
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ public async Task Search_SearchFileWith_From_To_Success()
137137
{
138138
// Arrange
139139
DateTimeOffset dateTimeFrom = DateTime.Now.AddMinutes(-2);
140-
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", FileInitializeExtTestFactory.BasicFile());
140+
var file = FileInitializeExtTestFactory.BasicFile();
141+
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", file);
141142
Assert.True(initializeFileResponse.IsSuccessStatusCode, await initializeFileResponse.Content.ReadAsStringAsync());
142143
DateTimeOffset dateTimeTo = DateTime.Now.AddMinutes(2);
143144
var fileId = await initializeFileResponse.Content.ReadAsStringAsync();
@@ -153,7 +154,7 @@ public async Task Search_SearchFileWith_From_To_Success()
153154
var uploadedFile = await _senderClient.GetFromJsonAsync<FileOverviewExt>($"broker/api/v1/file/{fileId}", _responseSerializerOptions);
154155

155156
// Act
156-
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?from={dateTimeFrom.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&to={dateTimeTo.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}");
157+
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?resourceId={file.ResourceId}&from={dateTimeFrom.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&to={dateTimeTo.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}");
157158
string contentstring = await searchResult.Content.ReadAsStringAsync();
158159

159160
// Assert
@@ -166,7 +167,8 @@ public async Task Search_SearchFileWith_From_To_Status_Success()
166167
// Arrange
167168
string status = "Published";
168169
DateTimeOffset dateTimeFrom = DateTime.Now.AddMinutes(-2);
169-
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", FileInitializeExtTestFactory.BasicFile());
170+
var file = FileInitializeExtTestFactory.BasicFile();
171+
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", file);
170172
Assert.True(initializeFileResponse.IsSuccessStatusCode, await initializeFileResponse.Content.ReadAsStringAsync());
171173
DateTimeOffset dateTimeTo = DateTime.Now.AddMinutes(2);
172174
var fileId = await initializeFileResponse.Content.ReadAsStringAsync();
@@ -182,7 +184,7 @@ public async Task Search_SearchFileWith_From_To_Status_Success()
182184
var uploadedFile = await _senderClient.GetFromJsonAsync<FileOverviewExt>($"broker/api/v1/file/{fileId}", _responseSerializerOptions);
183185

184186
// Act
185-
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?from={dateTimeFrom.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&to={dateTimeTo.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&status={status}");
187+
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?resourceId={file.ResourceId}&from={dateTimeFrom.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&to={dateTimeTo.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&status={status}");
186188
string contentstring = await searchResult.Content.ReadAsStringAsync();
187189

188190
// Assert
@@ -195,7 +197,8 @@ public async Task Search_SearchFileWith_From_Status_Success()
195197
// Arrange
196198
string status = "Published";
197199
DateTimeOffset dateTimeFrom = DateTime.Now.AddMinutes(-2);
198-
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", FileInitializeExtTestFactory.BasicFile());
200+
var file = FileInitializeExtTestFactory.BasicFile();
201+
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", file);
199202
Assert.True(initializeFileResponse.IsSuccessStatusCode, await initializeFileResponse.Content.ReadAsStringAsync());
200203
DateTimeOffset dateTimeTo = DateTime.Now.AddMinutes(2);
201204
var fileId = await initializeFileResponse.Content.ReadAsStringAsync();
@@ -211,7 +214,7 @@ public async Task Search_SearchFileWith_From_Status_Success()
211214
var uploadedFile = await _senderClient.GetFromJsonAsync<FileOverviewExt>($"broker/api/v1/file/{fileId}", _responseSerializerOptions);
212215

213216
// Act
214-
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?from={dateTimeFrom.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&status={status}");
217+
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?resourceId={file.ResourceId}&from={dateTimeFrom.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&status={status}");
215218
string contentstring = await searchResult.Content.ReadAsStringAsync();
216219

217220
// Assert
@@ -224,7 +227,8 @@ public async Task Search_SearchFileWith_To_Status_Success()
224227
// Arrange
225228
string status = "Published";
226229
DateTimeOffset dateTimeFrom = DateTime.Now.AddMinutes(-2);
227-
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", FileInitializeExtTestFactory.BasicFile());
230+
var file = FileInitializeExtTestFactory.BasicFile();
231+
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", file);
228232
Assert.True(initializeFileResponse.IsSuccessStatusCode, await initializeFileResponse.Content.ReadAsStringAsync());
229233
DateTimeOffset dateTimeTo = DateTime.Now.AddMinutes(2);
230234
var fileId = await initializeFileResponse.Content.ReadAsStringAsync();
@@ -240,7 +244,7 @@ public async Task Search_SearchFileWith_To_Status_Success()
240244
var uploadedFile = await _senderClient.GetFromJsonAsync<FileOverviewExt>($"broker/api/v1/file/{fileId}", _responseSerializerOptions);
241245

242246
// Act
243-
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?to={dateTimeTo.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&status={status}");
247+
var searchResult = await _senderClient.GetAsync($"broker/api/v1/file?resourceId={file.ResourceId}&to={dateTimeTo.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)}&status={status}");
244248
string contentstring = await searchResult.Content.ReadAsStringAsync();
245249

246250
// Assert
@@ -253,7 +257,8 @@ public async Task Search_SearchFileWith_RecipientStatus_Success()
253257
// Arrange
254258
string status = "Published";
255259
string recipientStatus = "Initialized";
256-
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", FileInitializeExtTestFactory.BasicFile());
260+
var file = FileInitializeExtTestFactory.BasicFile();
261+
var initializeFileResponse = await _senderClient.PostAsJsonAsync("broker/api/v1/file", file);
257262
var fileId = await initializeFileResponse.Content.ReadAsStringAsync();
258263
var initializedFile = await _senderClient.GetFromJsonAsync<FileOverviewExt>($"broker/api/v1/file/{fileId}", _responseSerializerOptions);
259264
Assert.NotNull(initializedFile);
@@ -267,7 +272,7 @@ public async Task Search_SearchFileWith_RecipientStatus_Success()
267272
var uploadedFile = await _senderClient.GetFromJsonAsync<FileOverviewExt>($"broker/api/v1/file/{fileId}", _responseSerializerOptions);
268273

269274
// Act
270-
var searchResult = await _recipientClient.GetAsync($"broker/api/v1/file?status={status}&recipientStatus={recipientStatus}");
275+
var searchResult = await _recipientClient.GetAsync($"broker/api/v1/file?resourceId={file.ResourceId}&status={status}&recipientStatus={recipientStatus}");
271276
string contentstring = await searchResult.Content.ReadAsStringAsync();
272277

273278
// Assert
@@ -304,12 +309,12 @@ public async Task Search_SearchFileWith_RecipientStatus_NotFound()
304309
}
305310

306311
[Fact]
307-
public async Task SendFile_UsingUnregisteredService_Fails()
312+
public async Task SendFile_UsingUnregisteredUser_Fails()
308313
{
309314
var initializeFileResponse = await _unregisteredClient.PostAsJsonAsync("broker/api/v1/file", FileInitializeExtTestFactory.BasicFile());
310315
Assert.False(initializeFileResponse.IsSuccessStatusCode);
311316
var parsedError = await initializeFileResponse.Content.ReadFromJsonAsync<ProblemDetails>();
312317
Assert.NotNull(parsedError);
313-
Assert.Equal(Errors.ServiceNotConfigured.Message, parsedError.Detail);
318+
Assert.Equal(Errors.NoAccessToResource.Message, parsedError.Detail);
314319
}
315320
}

src/Altinn.Broker.Application/ConfirmDownloadCommand/ConfirmDownloadCommandHandler.cs

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Altinn.Broker.Application;
22
using Altinn.Broker.Application.ConfirmDownloadCommand;
33
using Altinn.Broker.Application.DeleteFileCommand;
4-
using Altinn.Broker.Application.DownloadFileQuery;
54
using Altinn.Broker.Core.Application;
65
using Altinn.Broker.Core.Domain.Enums;
76
using Altinn.Broker.Core.Repositories;
@@ -14,36 +13,36 @@
1413

1514
public class ConfirmDownloadCommandHandler : IHandler<ConfirmDownloadCommandRequest, Task>
1615
{
17-
private readonly IServiceOwnerRepository _serviceOwnerRepository;
16+
private readonly IResourceOwnerRepository _resourceOwnerRepository;
1817
private readonly IFileRepository _fileRepository;
1918
private readonly IFileStatusRepository _fileStatusRepository;
2019
private readonly IActorFileStatusRepository _actorFileStatusRepository;
21-
private readonly IServiceRepository _serviceRepository;
20+
private readonly IResourceRightsRepository _resourceRightsRepository;
2221
private readonly IBackgroundJobClient _backgroundJobClient;
2322
private readonly ILogger<ConfirmDownloadCommandHandler> _logger;
2423

25-
public ConfirmDownloadCommandHandler(IServiceOwnerRepository serviceOwnerRepository, IFileRepository fileRepository, IFileStatusRepository fileStatusRepository, IActorFileStatusRepository actorFileStatusRepository, IServiceRepository serviceRepository, IBackgroundJobClient backgroundJobClient, ILogger<ConfirmDownloadCommandHandler> logger)
24+
public ConfirmDownloadCommandHandler(IResourceOwnerRepository resourceOwnerRepository, IFileRepository fileRepository, IFileStatusRepository fileStatusRepository, IActorFileStatusRepository actorFileStatusRepository, IResourceRightsRepository resourceRightsRepository, IBackgroundJobClient backgroundJobClient, ILogger<ConfirmDownloadCommandHandler> logger)
2625
{
27-
_serviceOwnerRepository = serviceOwnerRepository;
26+
_resourceOwnerRepository = resourceOwnerRepository;
2827
_fileRepository = fileRepository;
2928
_fileStatusRepository = fileStatusRepository;
3029
_actorFileStatusRepository = actorFileStatusRepository;
31-
_serviceRepository = serviceRepository;
30+
_resourceRightsRepository = resourceRightsRepository;
3231
_backgroundJobClient = backgroundJobClient;
3332
_logger = logger;
3433
}
3534
public async Task<OneOf<Task, Error>> Process(ConfirmDownloadCommandRequest request)
3635
{
37-
var service = await _serviceRepository.GetService(request.Token.ClientId);
38-
if (service is null)
39-
{
40-
return Errors.ServiceNotConfigured;
41-
};
4236
var file = await _fileRepository.GetFile(request.FileId);
4337
if (file is null)
4438
{
4539
return Errors.FileNotFound;
4640
}
41+
var hasAccess = await _resourceRightsRepository.CheckUserAccess(file.ResourceId, request.Token.ClientId, ResourceAccessLevel.Read);
42+
if (!hasAccess)
43+
{
44+
return Errors.FileNotFound;
45+
};
4746
if (!file.RecipientCurrentStatuses.Any(actorEvent => actorEvent.Actor.ActorExternalId == request.Token.Consumer))
4847
{
4948
return Errors.FileNotFound;

src/Altinn.Broker.Application/DeleteFileCommand/DeleteFileCommandHandler.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ public class DeleteFileCommandHandler : IHandler<Guid, Task>
1010
{
1111
private readonly IFileRepository _fileRepository;
1212
private readonly IFileStatusRepository _fileStatusRepository;
13-
private readonly IServiceOwnerRepository _serviceOwnerRepository;
14-
private readonly IServiceRepository _serviceRepository;
13+
private readonly IResourceOwnerRepository _resourceOwnerRepository;
14+
private readonly IResourceRepository _resourceRepository;
1515
private readonly IBrokerStorageService _brokerStorageService;
1616
private readonly ILogger<DeleteFileCommandHandler> _logger;
1717

18-
public DeleteFileCommandHandler(IFileRepository fileRepository, IFileStatusRepository fileStatusRepository, IServiceOwnerRepository serviceOwnerRepository, IBrokerStorageService brokerStorageService, ILogger<DeleteFileCommandHandler> logger)
18+
public DeleteFileCommandHandler(IFileRepository fileRepository, IFileStatusRepository fileStatusRepository, IResourceOwnerRepository resourceOwnerRepository, IBrokerStorageService brokerStorageService, ILogger<DeleteFileCommandHandler> logger)
1919
{
2020
_fileRepository = fileRepository;
2121
_fileStatusRepository = fileStatusRepository;
22-
_serviceOwnerRepository = serviceOwnerRepository;
22+
_resourceOwnerRepository = resourceOwnerRepository;
2323
_brokerStorageService = brokerStorageService;
2424
_logger = logger;
2525
}
@@ -32,23 +32,23 @@ public async Task<OneOf<Task, Error>> Process(Guid fileId)
3232
{
3333
return Errors.FileNotFound;
3434
}
35-
var service = await _serviceRepository.GetService(file.ServiceId);
35+
var service = await _resourceRepository.GetResource(file.ResourceId);
3636
if (service is null)
3737
{
38-
return Errors.ServiceNotConfigured;
38+
return Errors.ResourceNotConfigured;
3939
};
40-
var serviceOwner = await _serviceOwnerRepository.GetServiceOwner(service.ServiceOwnerId);
41-
if (serviceOwner is null)
40+
var resourceOwner = await _resourceOwnerRepository.GetResourceOwner(service.ResourceOwnerId);
41+
if (resourceOwner is null)
4242
{
43-
return Errors.ServiceOwnerNotConfigured;
43+
return Errors.ResourceOwnerNotConfigured;
4444
}
4545
if (file.FileStatus >= Core.Domain.Enums.FileStatus.Deleted)
4646
{
4747
_logger.LogInformation("File has already been set to deleted");
4848
}
4949

5050
await _fileStatusRepository.InsertFileStatus(fileId, Core.Domain.Enums.FileStatus.Deleted);
51-
await _brokerStorageService.DeleteFile(serviceOwner, file);
51+
await _brokerStorageService.DeleteFile(resourceOwner, file);
5252
var recipientsWhoHaveNotDownloaded = file.RecipientCurrentStatuses.Where(latestStatus => latestStatus.Status <= Core.Domain.Enums.ActorFileStatus.DownloadConfirmed).ToList();
5353
foreach (var recipient in recipientsWhoHaveNotDownloaded)
5454
{

0 commit comments

Comments
 (0)