-
Notifications
You must be signed in to change notification settings - Fork 581
Expand file tree
/
Copy pathCreateReindexRequestHandler.cs
More file actions
102 lines (89 loc) · 5.33 KB
/
CreateReindexRequestHandler.cs
File metadata and controls
102 lines (89 loc) · 5.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// -------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
// -------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using EnsureThat;
using MediatR;
using Microsoft.Extensions.Options;
using Microsoft.Health.Core.Features.Security.Authorization;
using Microsoft.Health.Fhir.Core.Configs;
using Microsoft.Health.Fhir.Core.Exceptions;
using Microsoft.Health.Fhir.Core.Features.Definition;
using Microsoft.Health.Fhir.Core.Features.Operations.Reindex.Models;
using Microsoft.Health.Fhir.Core.Features.Search.Parameters;
using Microsoft.Health.Fhir.Core.Features.Security;
using Microsoft.Health.Fhir.Core.Messages.Reindex;
using Microsoft.Health.Fhir.Core.Models;
namespace Microsoft.Health.Fhir.Core.Features.Operations.Reindex
{
public class CreateReindexRequestHandler : IRequestHandler<CreateReindexRequest, CreateReindexResponse>
{
private readonly IFhirOperationDataStore _fhirOperationDataStore;
private readonly IAuthorizationService<DataActions> _authorizationService;
private readonly ReindexJobConfiguration _reindexJobConfiguration;
private readonly ISearchParameterDefinitionManager _searchParameterDefinitionManager;
private readonly ISearchParameterOperations _searchParameterOperations;
public CreateReindexRequestHandler(
IFhirOperationDataStore fhirOperationDataStore,
IAuthorizationService<DataActions> authorizationService,
IOptions<ReindexJobConfiguration> reindexJobConfiguration,
ISearchParameterDefinitionManager searchParameterDefinitionManager,
ISearchParameterOperations searchParameterOperations)
{
EnsureArg.IsNotNull(fhirOperationDataStore, nameof(fhirOperationDataStore));
EnsureArg.IsNotNull(authorizationService, nameof(authorizationService));
EnsureArg.IsNotNull(reindexJobConfiguration, nameof(reindexJobConfiguration));
EnsureArg.IsNotNull(searchParameterDefinitionManager, nameof(searchParameterDefinitionManager));
EnsureArg.IsNotNull(searchParameterOperations, nameof(searchParameterOperations));
_fhirOperationDataStore = fhirOperationDataStore;
_authorizationService = authorizationService;
_reindexJobConfiguration = reindexJobConfiguration.Value;
_searchParameterDefinitionManager = searchParameterDefinitionManager;
_searchParameterOperations = searchParameterOperations;
}
public async Task<CreateReindexResponse> Handle(CreateReindexRequest request, CancellationToken cancellationToken)
{
EnsureArg.IsNotNull(request, nameof(request));
if (await _authorizationService.CheckAccess(DataActions.Reindex, cancellationToken) != DataActions.Reindex)
{
throw new UnauthorizedFhirActionException();
}
// Check for active reindex jobs - but don't block, instead signal for updates
(var activeReindexJobs, var reindexJobId) = await _fhirOperationDataStore.CheckActiveReindexJobsAsync(cancellationToken);
if (activeReindexJobs)
{
// Return the existing job information instead of creating a new one
var existingJob = await _fhirOperationDataStore.GetReindexJobByIdAsync(reindexJobId, cancellationToken);
return new CreateReindexResponse(existingJob);
}
// What this handles is the scenario where a user is effectively forcing a reindex to run by passing
// in a parameter of targetSearchParameterTypes. From those we can identify the base resource types.
var searchParameterResourceTypes = new HashSet<string>();
if (request.TargetSearchParameterTypes.Any())
{
foreach (var searchParameterUrl in request.TargetSearchParameterTypes)
{
SearchParameterInfo searchParameterInfo = _searchParameterDefinitionManager.GetSearchParameter(searchParameterUrl);
if (searchParameterInfo == null)
{
throw new RequestNotValidException(Core.Resources.SearchParameterByDefinitionUriNotSupported, searchParameterUrl);
}
searchParameterResourceTypes.UnionWith(searchParameterInfo.BaseResourceTypes);
}
}
var jobRecord = new ReindexJobRecord(
request.TargetResourceTypes,
request.TargetSearchParameterTypes,
searchParameterResourceTypes,
request.MaximumResourcesPerQuery ?? _reindexJobConfiguration.MaximumNumberOfResourcesPerQuery,
request.MaximumResourcesPerWrite ?? _reindexJobConfiguration.MaximumNumberOfResourcesPerWrite,
request.QueryDelayIntervalInMilliseconds ?? _reindexJobConfiguration.QueryDelayIntervalInMilliseconds);
var outcome = await _fhirOperationDataStore.CreateReindexJobAsync(jobRecord, cancellationToken);
return new CreateReindexResponse(outcome);
}
}
}