diff --git a/server/AyaNova/Controllers/EnumListController.cs b/server/AyaNova/Controllers/EnumListController.cs index d6f05327..735e4769 100644 --- a/server/AyaNova/Controllers/EnumListController.cs +++ b/server/AyaNova/Controllers/EnumListController.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; @@ -52,12 +53,8 @@ namespace AyaNova.Api.Controllers public async Task GetList([FromRoute] string enumkey) { if (serverState.IsClosed) - return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - long TranslationId = UserTranslationIdFromContext.Id(HttpContext.Items); - - var ret = await GetEnumList(enumkey, TranslationId); - + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + var ret = await GetEnumList(enumkey, UserTranslationIdFromContext.Id(HttpContext.Items), UserRolesFromContext.Roles(HttpContext.Items)); return Ok(ApiOkResponse.Response(ret)); } @@ -95,7 +92,7 @@ namespace AyaNova.Api.Controllers - public static async Task> GetEnumList(string enumKey, long translationId) + public static async Task> GetEnumList(string enumKey, long translationId, AuthorizationRoles userRoles) { List TranslationKeysToFetch = new List(); @@ -116,7 +113,7 @@ namespace AyaNova.Api.Controllers } } - else if (keyNameInLowerCase == "core") + else if (keyNameInLowerCase == "coreall") { //core biz objects for UI facing purposes such as search form limit to object type etc var values = Enum.GetValues(typeof(AyaType)); @@ -147,6 +144,85 @@ namespace AyaNova.Api.Controllers } } } + else if (keyNameInLowerCase == "coreview")//all core objects user can read + { + + //core biz objects for UI facing purposes such as search form limit to object type etc + var rawvalues = Enum.GetValues(typeof(AyaType)); + + List allowedValues = new List(); + foreach (AyaType t in rawvalues) + { + if (Authorized.HasReadFullRole(userRoles, t)) + allowedValues.Add(t); + } + + foreach (AyaType t in allowedValues) + { + if (t.HasAttribute(typeof(CoreBizObjectAttribute))) + { + TranslationKeysToFetch.Add(t.ToString()); + } + } + var LT = await TranslationBiz.GetSubsetStaticAsync(TranslationKeysToFetch, translationId); + + foreach (AyaType t in allowedValues) + { + if (t.HasAttribute(typeof(CoreBizObjectAttribute))) + { + var tName = t.ToString(); + string name = string.Empty; + if (LT.ContainsKey(tName)) + { + name = LT[tName]; + } + else + { + name = tName; + } + ReturnList.Add(new NameIdItem() { Name = name, Id = (long)t }); + } + } + } + else if (keyNameInLowerCase == "coreedit")//all core objects current user can edit + { + //core biz objects for UI facing purposes such as search form limit to object type etc + var rawvalues = Enum.GetValues(typeof(AyaType)); + + List allowedValues = new List(); + foreach (AyaType t in rawvalues) + { + if (Authorized.HasModifyRole(userRoles, t)) + allowedValues.Add(t); + } + + foreach (AyaType t in allowedValues) + { + if (t.HasAttribute(typeof(CoreBizObjectAttribute))) + { + TranslationKeysToFetch.Add(t.ToString()); + } + } + var LT = await TranslationBiz.GetSubsetStaticAsync(TranslationKeysToFetch, translationId); + + foreach (AyaType t in allowedValues) + { + if (t.HasAttribute(typeof(CoreBizObjectAttribute))) + { + var tName = t.ToString(); + string name = string.Empty; + if (LT.ContainsKey(tName)) + { + name = LT[tName]; + } + else + { + name = tName; + } + ReturnList.Add(new NameIdItem() { Name = name, Id = (long)t }); + } + } + } else if (keyNameInLowerCase == StringUtil.TrimTypeName(typeof(AyaType).ToString()).ToLowerInvariant()) { //this is intended primarily for developers, not for UI facing so no need to localize or pretty it up @@ -459,9 +535,9 @@ namespace AyaNova.Api.Controllers ReturnList.Add(new NameIdItem() { Name = LT["ContractOverrideTypePriceDiscount"], Id = (long)ContractOverrideType.PriceDiscount }); ReturnList.Add(new NameIdItem() { Name = LT["ContractOverrideTypeMarkup"], Id = (long)ContractOverrideType.CostMarkup }); - //this is not a valid setting, not sure why it's there - // ReturnList.Add(new NameIdItem() { Name = "-", Id = (long)ContractOverrideType.NotSet }); - + //this is not a valid setting, not sure why it's there + // ReturnList.Add(new NameIdItem() { Name = "-", Id = (long)ContractOverrideType.NotSet }); + } //################################################################################################################# //################### NEW HERE DO NOT FORGET TO ADD TO LISTS AVAILABLE ABOVE AS WELL ############################## diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index 8d749b65..44527b32 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -494,7 +494,10 @@ MULTIPLE discount / markup ITEMS var orderedList = from id in batch join z in batchResults on id equals z.Id select z; //cache enum list - var ContractOverrideTypeEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(ContractOverrideType).ToString()), UserTranslationId); + var ContractOverrideTypeEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(ContractOverrideType).ToString()), + UserTranslationId, + CurrentUserRoles); //cache translations needed var PreTrans = await TranslationBiz.GetSubsetStaticAsync(new List { "TimeSpanDays", "TimeSpanHours", "TimeSpanMinutes", "TimeSpanSeconds" }, UserTranslationId); foreach (Contract w in orderedList) @@ -513,9 +516,14 @@ MULTIPLE discount / markup ITEMS private async Task PopulateVizFields(Contract o, List contractOverrideTypeEnumList = null, Dictionary preTrans = null) { if (contractOverrideTypeEnumList == null) - contractOverrideTypeEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(ContractOverrideType).ToString()), UserTranslationId); + contractOverrideTypeEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(ContractOverrideType).ToString()), + UserTranslationId, + CurrentUserRoles); if (preTrans == null) - await TranslationBiz.GetSubsetStaticAsync(new List { "TimeSpanDays", "TimeSpanHours", "TimeSpanMinutes", "TimeSpanSeconds" }, UserTranslationId); + await TranslationBiz.GetSubsetStaticAsync( + new List { "TimeSpanDays", "TimeSpanHours", "TimeSpanMinutes", "TimeSpanSeconds" }, + UserTranslationId); if (o.ResponseTime == TimeSpan.Zero) o.ResponseTimeViz = string.Empty; diff --git a/server/AyaNova/biz/CustomerServiceRequestBiz.cs b/server/AyaNova/biz/CustomerServiceRequestBiz.cs index 3df9022b..ff3e45db 100644 --- a/server/AyaNova/biz/CustomerServiceRequestBiz.cs +++ b/server/AyaNova/biz/CustomerServiceRequestBiz.cs @@ -333,8 +333,14 @@ namespace AyaNova.Biz //cache frequent viz data //usertypes - var CustomerServiceRequestStatusEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(CustomerServiceRequestStatus).ToString()), UserTranslationId); - var CustomerServiceRequestPriorityEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(CustomerServiceRequestPriority).ToString()), UserTranslationId); + var CustomerServiceRequestStatusEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(CustomerServiceRequestStatus).ToString()), + UserTranslationId, + CurrentUserRoles); + var CustomerServiceRequestPriorityEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(CustomerServiceRequestPriority).ToString()), + UserTranslationId, + CurrentUserRoles); foreach (CustomerServiceRequest w in orderedList) diff --git a/server/AyaNova/biz/PartInventoryBiz.cs b/server/AyaNova/biz/PartInventoryBiz.cs index 09e188ff..78845c61 100644 --- a/server/AyaNova/biz/PartInventoryBiz.cs +++ b/server/AyaNova/biz/PartInventoryBiz.cs @@ -277,7 +277,10 @@ namespace AyaNova.Biz var orderedList = from id in batch join z in batchResults on id equals z.Id select z; //cache frequent viz data - var AyaTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(AyaType).ToString()), UserTranslationId); + var AyaTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(AyaType).ToString()), + UserTranslationId, + CurrentUserRoles); using (var command = ct.Database.GetDbConnection().CreateCommand()) { ct.Database.OpenConnection(); diff --git a/server/AyaNova/biz/UserBiz.cs b/server/AyaNova/biz/UserBiz.cs index c114e637..74ff0954 100644 --- a/server/AyaNova/biz/UserBiz.cs +++ b/server/AyaNova/biz/UserBiz.cs @@ -887,7 +887,10 @@ namespace AyaNova.Biz //cache frequent viz data //usertypes - var UserTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(UserType).ToString()), UserTranslationId); + var UserTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(UserType).ToString()), + UserTranslationId, + CurrentUserRoles); //foreach (User w in orderedList) foreach (var w in orderedList) diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 591cbeb8..0de72376 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -368,7 +368,10 @@ namespace AyaNova.Biz //cache frequent viz data //usertypes - var UserTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList(StringUtil.TrimTypeName(typeof(UserType).ToString()), UserTranslationId); + var UserTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(UserType).ToString()), + UserTranslationId, + CurrentUserRoles); foreach (Widget w in orderedList) { diff --git a/server/AyaNova/generator/CoreJobNotify.cs b/server/AyaNova/generator/CoreJobNotify.cs index b717036a..801186c8 100644 --- a/server/AyaNova/generator/CoreJobNotify.cs +++ b/server/AyaNova/generator/CoreJobNotify.cs @@ -116,9 +116,11 @@ namespace AyaNova.Biz var usersNeedingTranslations = events.Where(z => z.NotifySubscription.DeliveryMethod != NotifyDeliveryMethod.App && z.User.Active).Select(z => z.NotifySubscription.UserId).ToList().Distinct(); foreach (long userid in usersNeedingTranslations) { - long transId = (await ct.UserOptions.SingleAsync(z => z.UserId == userid)).TranslationId; + var usr = await ct.User.AsNoTracking().Include(z => z.UserOptions).SingleAsync(z => z.Id == userid); + long transId = usr.UserOptions.TranslationId; + _UserTranslationIdCache.Add(userid, transId); - await CacheTranslations(transId); + await CacheTranslations(transId, usr.Roles); } //cache all translations of the word "Server" for server notifications _ServerTheWordTranslations = await TranslationBiz.GetAllTranslationsForKey("Server"); @@ -193,13 +195,21 @@ namespace AyaNova.Biz } //cache any translations required for email notification - private static async Task CacheTranslations(long translationId) + private static async Task CacheTranslations(long translationId, AuthorizationRoles roles) { if (!_NotifyEventTypeTransCache.ContainsKey(translationId)) - _NotifyEventTypeTransCache.Add(translationId, await AyaNova.Api.Controllers.EnumListController.GetEnumList("NotifyEventType", translationId)); + _NotifyEventTypeTransCache.Add(translationId, await AyaNova.Api.Controllers.EnumListController.GetEnumList( + "NotifyEventType", + translationId, + roles)); if (!_AyaTypeTypeTransCache.ContainsKey(translationId)) - _AyaTypeTypeTransCache.Add(translationId, await AyaNova.Api.Controllers.EnumListController.GetEnumList("AyaType", translationId)); + _AyaTypeTypeTransCache.Add( + translationId, + await AyaNova.Api.Controllers.EnumListController.GetEnumList( + "AyaType", + translationId, + roles)); }