fix: guard Matrix42 optional service resolution
This commit is contained in:
@@ -46,12 +46,57 @@ namespace C4IT.F4SD
|
||||
public F4SDM42WebApiController(IDependencyResolver resolver)
|
||||
{
|
||||
defaultInstance = this;
|
||||
_entityDataService = resolver?.TryGet<IEntityDataService>();
|
||||
_journalService = resolver?.TryGet<IJournalService>();
|
||||
_globalConfigurationProvider = GlobalConfigurationProvider.Instance;
|
||||
_f4stHelperService = new F4SDHelperService();
|
||||
_userProfile = resolver?.TryGet<IPandoraUserProfile>();
|
||||
EnsureInitialized();
|
||||
_entityDataService = ResolveOptional<IEntityDataService>(resolver);
|
||||
_journalService = ResolveOptional<IJournalService>(resolver);
|
||||
_userProfile = ResolveOptional<IPandoraUserProfile>(resolver);
|
||||
}
|
||||
|
||||
private static T ResolveOptional<T>(IDependencyResolver resolver) where T : class
|
||||
{
|
||||
if (resolver == null)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
if (!resolver.IsRegistered<T>())
|
||||
return null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return resolver.TryGet<T>();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogOptionalDependencyFailure(typeof(T), ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void LogOptionalDependencyFailure(Type dependencyType, Exception exception)
|
||||
{
|
||||
try
|
||||
{
|
||||
LogEntry($"Matrix42 dependency '{dependencyType.FullName}' could not be resolved.", LogLevels.Warning);
|
||||
LogException(exception);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private HttpResponseMessage CreateMissingDependencyResponse(Type dependencyType)
|
||||
{
|
||||
return HttpResponseExtensions.CreateResponse(
|
||||
Request,
|
||||
HttpStatusCode.ServiceUnavailable,
|
||||
$"Matrix42 dependency '{dependencyType.FullName}' is not registered for this extension context.");
|
||||
}
|
||||
|
||||
private static readonly object initLock = new object();
|
||||
@@ -278,6 +323,9 @@ namespace C4IT.F4SD
|
||||
public async Task<HttpResponseMessage> getPickup(string name, [FromUri] EntityEnumerationVisibilityMode mode = EntityEnumerationVisibilityMode.None, [FromUri] Int32 group = -1)
|
||||
{
|
||||
await Task.Delay(0);
|
||||
if (_entityDataService == null)
|
||||
return CreateMissingDependencyResponse(typeof(IEntityDataService));
|
||||
|
||||
EntityEnumeration enumerationTemp = _entityDataService.GetEnumeration(name, mode);
|
||||
var vals = enumerationTemp.Values;
|
||||
|
||||
@@ -304,6 +352,9 @@ namespace C4IT.F4SD
|
||||
[Route("getMyRoleMemberships"), HttpGet]
|
||||
public async Task<HttpResponseMessage> getMyRoleMemberships()
|
||||
{
|
||||
if (_userProfile == null)
|
||||
return CreateMissingDependencyResponse(typeof(IPandoraUserProfile));
|
||||
|
||||
var User = _userProfile.GetInteractiveUserInfo();
|
||||
var filter = AsqlHelper.BuildInCondition("ID", new Guid[] { User.Id });
|
||||
return HttpResponseExtensions.CreateResponse(Request, HttpStatusCode.OK, await _f4stHelperService.UserPermissionsInfo(filter));
|
||||
|
||||
Reference in New Issue
Block a user