From 4cc3ee7be5affe0fb3f9cd3f7b16d0d520efa49d Mon Sep 17 00:00:00 2001 From: Meik Date: Fri, 26 Jun 2026 12:25:14 +0200 Subject: [PATCH] fix: guard Matrix42 optional service resolution --- F4SDM42WebApi/F4SDM42WebApiController.cs | 57 ++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/F4SDM42WebApi/F4SDM42WebApiController.cs b/F4SDM42WebApi/F4SDM42WebApiController.cs index f6a3770..f3c8f9f 100644 --- a/F4SDM42WebApi/F4SDM42WebApiController.cs +++ b/F4SDM42WebApi/F4SDM42WebApiController.cs @@ -46,12 +46,57 @@ namespace C4IT.F4SD public F4SDM42WebApiController(IDependencyResolver resolver) { defaultInstance = this; - _entityDataService = resolver?.TryGet(); - _journalService = resolver?.TryGet(); _globalConfigurationProvider = GlobalConfigurationProvider.Instance; _f4stHelperService = new F4SDHelperService(); - _userProfile = resolver?.TryGet(); EnsureInitialized(); + _entityDataService = ResolveOptional(resolver); + _journalService = ResolveOptional(resolver); + _userProfile = ResolveOptional(resolver); + } + + private static T ResolveOptional(IDependencyResolver resolver) where T : class + { + if (resolver == null) + return null; + + try + { + if (!resolver.IsRegistered()) + return null; + } + catch + { + } + + try + { + return resolver.TryGet(); + } + 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 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 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));