diff --git a/server/AyaNova/Controllers/ExportController.cs b/server/AyaNova/Controllers/ExportController.cs index d3543717..f7a4f0d7 100644 --- a/server/AyaNova/Controllers/ExportController.cs +++ b/server/AyaNova/Controllers/ExportController.cs @@ -58,8 +58,8 @@ namespace AyaNova.Api.Controllers if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - if (selectedRequest.IsEmpty) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelection is required")); + if (selectedRequest == null) + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelectedRequest is required")); if (!Authorized.HasReadFullRole(HttpContext.Items, selectedRequest.ObjectType)) return StatusCode(403, new ApiNotAuthorizedResponse()); @@ -70,9 +70,16 @@ namespace AyaNova.Api.Controllers if (format != "csv" && format != "json") return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, null, "format not valid, must be 'csv' or 'json'")); - await selectedRequest.RehydrateIdList(ct, UserRolesFromContext.Roles(HttpContext.Items), log, UserIdFromContext.Id(HttpContext.Items)); + + //Rehydrate id list if necessary if (selectedRequest.SelectedRowIds.Length == 0) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "List of ids")); + selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList( + selectedRequest, + ct, + UserRolesFromContext.Roles(HttpContext.Items), + log, + UserIdFromContext.Id(HttpContext.Items), + UserTranslationIdFromContext.Id(HttpContext.Items)); log.LogDebug($"Instantiating biz object handler for {selectedRequest.ObjectType}"); diff --git a/server/AyaNova/Controllers/JobOperationsController.cs b/server/AyaNova/Controllers/JobOperationsController.cs index 73671683..14ee100a 100644 --- a/server/AyaNova/Controllers/JobOperationsController.cs +++ b/server/AyaNova/Controllers/JobOperationsController.cs @@ -203,17 +203,22 @@ namespace AyaNova.Api.Controllers if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - if (selectedRequest.IsEmpty) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelection is required")); + if (selectedRequest == null) + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelectedRequest is required")); if (!Authorized.HasDeleteRole(HttpContext.Items, selectedRequest.ObjectType)) return StatusCode(403, new ApiNotAuthorizedResponse()); - - await selectedRequest.RehydrateIdList(ct, UserRolesFromContext.Roles(HttpContext.Items), log, UserIdFromContext.Id(HttpContext.Items)); + //Rehydrate id list if necessary if (selectedRequest.SelectedRowIds.Length == 0) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "List of ids")); + selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList( + selectedRequest, + ct, + UserRolesFromContext.Roles(HttpContext.Items), + log, + UserIdFromContext.Id(HttpContext.Items), + UserTranslationIdFromContext.Id(HttpContext.Items)); var JobName = $"LT:BatchDeleteJob - LT:{selectedRequest.ObjectType} ({selectedRequest.SelectedRowIds.LongLength}) LT:User {UserNameFromContext.Name(HttpContext.Items)}"; JObject o = JObject.FromObject(new diff --git a/server/AyaNova/Controllers/ReportController.cs b/server/AyaNova/Controllers/ReportController.cs index af6036a3..3ef3973c 100644 --- a/server/AyaNova/Controllers/ReportController.cs +++ b/server/AyaNova/Controllers/ReportController.cs @@ -196,32 +196,7 @@ namespace AyaNova.Api.Controllers ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - - - // //------------------------------- - // var UserRoles = UserRolesFromContext.Roles(HttpContext.Items); - // var UserId = UserIdFromContext.Id(HttpContext.Items); - // DataListSavedColumnViewBiz viewbiz = DataListSavedColumnViewBiz.GetBiz(ct, HttpContext); - // var SavedView = await viewbiz.GetAsync(UserId, selectedRequest.DataListKey, true); - - // DataListSavedFilter SavedFilter = null; - // if (selectedRequest.FilterId != 0) - // { - // DataListSavedFilterBiz filterbiz = DataListSavedFilterBiz.GetBiz(ct, HttpContext); - // SavedFilter = await filterbiz.GetAsync(selectedRequest.FilterId, false); - // } - // var DataList = DataListFactory.GetAyaDataList(selectedRequest.DataListKey); - // if (DataList == null) - // return BadRequest(new ApiErrorResponse(ApiErrorCode.NOT_FOUND, "DataListKey", $"DataList \"{selectedRequest.DataListKey}\" specified does not exist")); - - // //check rights - // if (!UserRoles.HasAnyFlags(DataList.AllowedRoles)) - // return StatusCode(403, new ApiNotAuthorizedResponse()); - - // //hydrate the saved view and filter - // DataListSelectedProcessingOptions dataListSelectedOptions = new DataListSelectedProcessingOptions(selectedRequest, DataList, SavedView, SavedFilter, UserId, UserRoles); - // //------------------------ - + var reportData = await biz.GetReportData(selectedRequest); if (reportData == null) diff --git a/server/AyaNova/Controllers/TagController.cs b/server/AyaNova/Controllers/TagController.cs index 67abfe33..e9a9fa18 100644 --- a/server/AyaNova/Controllers/TagController.cs +++ b/server/AyaNova/Controllers/TagController.cs @@ -91,7 +91,7 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); if (selectedRequest.IsEmpty) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelection is required")); + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelectedRequest is required")); if (!selectedRequest.ObjectType.HasAttribute(typeof(CoreBizObjectAttribute))) return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Not a taggable object type")); @@ -103,9 +103,15 @@ namespace AyaNova.Api.Controllers if (string.IsNullOrWhiteSpace(tag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "tag required")); - await selectedRequest.RehydrateIdList(ct, UserRolesFromContext.Roles(HttpContext.Items), log, UserIdFromContext.Id(HttpContext.Items)); + //Rehydrate id list if necessary if (selectedRequest.SelectedRowIds.Length == 0) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "List of ids")); + selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList( + selectedRequest, + ct, + UserRolesFromContext.Roles(HttpContext.Items), + log, + UserIdFromContext.Id(HttpContext.Items), + UserTranslationIdFromContext.Id(HttpContext.Items)); var JobName = $"LT:BatchJob LT:Add LT:Tag \"{tag}\" LT:{selectedRequest.ObjectType} ({selectedRequest.SelectedRowIds.LongLength}) LT:User {UserNameFromContext.Name(HttpContext.Items)}"; JObject o = JObject.FromObject(new @@ -181,7 +187,7 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); if (selectedRequest.IsEmpty) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelection is required")); + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelectedRequest is required")); if (!selectedRequest.ObjectType.HasAttribute(typeof(CoreBizObjectAttribute))) return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Not a taggable object type")); @@ -192,10 +198,15 @@ namespace AyaNova.Api.Controllers if (string.IsNullOrWhiteSpace(tag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "tag")); - await selectedRequest.RehydrateIdList(ct, UserRolesFromContext.Roles(HttpContext.Items), log, UserIdFromContext.Id(HttpContext.Items)); + //Rehydrate id list if necessary if (selectedRequest.SelectedRowIds.Length == 0) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "List of ids")); - + selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList( + selectedRequest, + ct, + UserRolesFromContext.Roles(HttpContext.Items), + log, + UserIdFromContext.Id(HttpContext.Items), + UserTranslationIdFromContext.Id(HttpContext.Items)); var JobName = $"LT:BatchJob LT:Remove LT:Tag \"{tag}\" LT:{selectedRequest.ObjectType} ({selectedRequest.SelectedRowIds.LongLength}) LT:User {UserNameFromContext.Name(HttpContext.Items)}"; JObject o = JObject.FromObject(new @@ -263,20 +274,20 @@ namespace AyaNova.Api.Controllers /// /// /// - /// + /// /// Job Id [HttpPost("batch-replace/{fromTag}")] - public async Task BatchReplace([FromRoute] string fromTag, [FromQuery] string toTag, [FromBody] DataListSelectedRequest dataListSelection) + public async Task BatchReplace([FromRoute] string fromTag, [FromQuery] string toTag, [FromBody] DataListSelectedRequest selectedRequest) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - if (dataListSelection.IsEmpty) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelection is required")); - if (!dataListSelection.ObjectType.HasAttribute(typeof(CoreBizObjectAttribute))) + if (selectedRequest.IsEmpty) + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "DataListSelectedRequest is required")); + if (!selectedRequest.ObjectType.HasAttribute(typeof(CoreBizObjectAttribute))) return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Not a taggable object type")); - if (!Authorized.HasModifyRole(HttpContext.Items, dataListSelection.ObjectType)) + if (!Authorized.HasModifyRole(HttpContext.Items, selectedRequest.ObjectType)) return StatusCode(403, new ApiNotAuthorizedResponse()); fromTag = TagBiz.NormalizeTag(fromTag); if (string.IsNullOrWhiteSpace(fromTag)) @@ -284,20 +295,27 @@ namespace AyaNova.Api.Controllers toTag = TagBiz.NormalizeTag(toTag); if (string.IsNullOrWhiteSpace(toTag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "toTag")); - await dataListSelection.RehydrateIdList(ct, UserRolesFromContext.Roles(HttpContext.Items), log, UserIdFromContext.Id(HttpContext.Items)); - if (dataListSelection.SelectedRowIds.Length == 0) - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, null, "List of ids")); + + //Rehydrate id list if necessary + if (selectedRequest.SelectedRowIds.Length == 0) + selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList( + selectedRequest, + ct, + UserRolesFromContext.Roles(HttpContext.Items), + log, + UserIdFromContext.Id(HttpContext.Items), + UserTranslationIdFromContext.Id(HttpContext.Items)); - var JobName = $"LT:BatchJob LT:Replace LT:Tag \"{fromTag}\" -> LT:Tag \"{toTag}\" LT:{dataListSelection.ObjectType} ({dataListSelection.SelectedRowIds.LongLength}) LT:User {UserNameFromContext.Name(HttpContext.Items)}"; + var JobName = $"LT:BatchJob LT:Replace LT:Tag \"{fromTag}\" -> LT:Tag \"{toTag}\" LT:{selectedRequest.ObjectType} ({selectedRequest.SelectedRowIds.LongLength}) LT:User {UserNameFromContext.Name(HttpContext.Items)}"; JObject o = JObject.FromObject(new { - idList = dataListSelection.SelectedRowIds, + idList = selectedRequest.SelectedRowIds, tag = fromTag, toTag = toTag }); OpsJob j = new OpsJob(); - j.ObjectType = dataListSelection.ObjectType; + j.ObjectType = selectedRequest.ObjectType; j.Name = JobName; j.JobType = JobType.BatchCoreObjectOperation; j.SubType = JobSubType.TagReplace; diff --git a/server/AyaNova/DataList/DataListFetcher.cs b/server/AyaNova/DataList/DataListFetcher.cs index f78cfe41..d8127c06 100644 --- a/server/AyaNova/DataList/DataListFetcher.cs +++ b/server/AyaNova/DataList/DataListFetcher.cs @@ -238,53 +238,53 @@ namespace AyaNova.DataList // internal static async Task GetIdListResponseAsync(AyContext ct, DataListSelectedProcessingOptions dataListSelectionOptions,IDataListProcessing DataList, AuthorizationRoles userRoles, ILogger log, long userId) { - // var DataList = DataListFactory.GetAyaDataList(dataListSelectionOptions.DataListKey); - // //was the name not found as a list? - // if (DataList == null) - // throw new System.ArgumentOutOfRangeException($"DataList \"{dataListSelectionOptions.DataListKey}\" specified does not exist"); + // // var DataList = DataListFactory.GetAyaDataList(dataListSelectionOptions.DataListKey); + // // //was the name not found as a list? + // // if (DataList == null) + // // throw new System.ArgumentOutOfRangeException($"DataList \"{dataListSelectionOptions.DataListKey}\" specified does not exist"); - //check rights - if (!userRoles.HasAnyFlags(DataList.AllowedRoles)) - throw new System.UnauthorizedAccessException("User roles insufficient for this datalist"); + // //check rights + // if (!userRoles.HasAnyFlags(DataList.AllowedRoles)) + // throw new System.UnauthorizedAccessException("User roles insufficient for this datalist"); - // //do we need to default the listView? - // if (string.IsNullOrWhiteSpace(listView)) - // listView = DataList.DefaultListView; + // // //do we need to default the listView? + // // if (string.IsNullOrWhiteSpace(listView)) + // // listView = DataList.DefaultListView; - DataList.SetListOptionDefaultsIfNecessary(dataListSelectionOptions); + // DataList.SetListOptionDefaultsIfNecessary(dataListSelectionOptions); - // //parse the list view - // var ListViewArray = JArray.Parse(listView); + // // //parse the list view + // // var ListViewArray = JArray.Parse(listView); - // //Hard coded extra criteria from server end - // if (DataList is IAyaDataListServerCriteria) - // { - // var ServerCriteriaListView = JArray.Parse(((IAyaDataListServerCriteria)DataList).DataListServerCriteria(await ct.User.AsNoTracking().FirstOrDefaultAsync(z => z.Id == userId), ct)); - // foreach (JToken jt in ServerCriteriaListView) - // ListViewArray.Add(jt); - // } + // // //Hard coded extra criteria from server end + // // if (DataList is IAyaDataListServerCriteria) + // // { + // // var ServerCriteriaListView = JArray.Parse(((IAyaDataListServerCriteria)DataList).DataListServerCriteria(await ct.User.AsNoTracking().FirstOrDefaultAsync(z => z.Id == userId), ct)); + // // foreach (JToken jt in ServerCriteriaListView) + // // ListViewArray.Add(jt); + // // } - //STATIC filter options from server - List StaticServerFilterOptions = null; - if (DataList is IDataListInternalCriteria) - StaticServerFilterOptions = ((IDataListInternalCriteria)DataList).DataListInternalCriteria(userId, userRoles, dataListSelectionOptions); + // //STATIC filter options from server + // List StaticServerFilterOptions = null; + // if (DataList is IDataListInternalCriteria) + // StaticServerFilterOptions = ((IDataListInternalCriteria)DataList).DataListInternalCriteria(userId, userRoles, dataListSelectionOptions); - //Add the internal filters into the listoptions existing filters - //NOTE: There is currently no overlap between internal filtered columns and filters coming from the client - foreach (DataListFilterOption dfo in StaticServerFilterOptions) - dataListSelectionOptions.Filter.Add(dfo); + // //Add the internal filters into the listoptions existing filters + // //NOTE: There is currently no overlap between internal filtered columns and filters coming from the client + // foreach (DataListFilterOption dfo in StaticServerFilterOptions) + // dataListSelectionOptions.Filter.Add(dfo); - // //Hard coded extra criteria from Client end - // //parse and combine any additional listview hard coded from Client UI - // var MetaListViewArray = JArray.Parse(metaListView ?? "[]"); - // foreach (JToken jt in MetaListViewArray) - // ListViewArray.Add(jt); + // // //Hard coded extra criteria from Client end + // // //parse and combine any additional listview hard coded from Client UI + // // var MetaListViewArray = JArray.Parse(metaListView ?? "[]"); + // // foreach (JToken jt in MetaListViewArray) + // // ListViewArray.Add(jt); - // //Get the field key names in a list from the listview - // List ListViewFieldList = DataList.GetFieldListFromListView(ListViewArray); + // // //Get the field key names in a list from the listview + // // List ListViewFieldList = DataList.GetFieldListFromListView(ListViewArray); //BUILD THE QUERY //SELECT FRAGMENT COLUMNS FROM TEMPLATE diff --git a/server/AyaNova/biz/ReportBiz.cs b/server/AyaNova/biz/ReportBiz.cs index f517b34a..5a41316c 100644 --- a/server/AyaNova/biz/ReportBiz.cs +++ b/server/AyaNova/biz/ReportBiz.cs @@ -344,9 +344,7 @@ namespace AyaNova.Biz } //Do we need to rehydrate the ID List from a DataList? - // if (dataListSelection.SelectedRowIds.Length == 0) - // dataListSelection.SelectedRowIds = await AyaNova.DataList.DataListFetcher.GetIdListResponseAsync(dataListSelection.DataListKey, dataListSelection.ListView, dataListSelection.MetaView, ct, effectiveRoles, log, UserId); - if(selectedRequest.SelectedRowIds.Length==0) + if (selectedRequest.SelectedRowIds.Length == 0) selectedRequest.SelectedRowIds = await DataListSelectedProcessingOptions.RehydrateIdList(selectedRequest, ct, effectiveRoles, log, UserId, UserTranslationId); @@ -405,7 +403,7 @@ namespace AyaNova.Biz // ListView = reportParam.ListView, // MetaView = reportParam.MetaView // }); - var ReportData= await GetReportData(reportParam); + var ReportData = await GetReportData(reportParam); //initialization log.LogDebug("Initializing report system"); @@ -557,8 +555,8 @@ namespace AyaNova.Biz } //Report meta data - // var reportMeta = $"{{Id:{report.Id},Name:`{report.Name}`,Notes:`{report.Notes}`,ObjectType:`{report.ObjectType}`,CustomFieldsDefinition:{CustomFieldsTemplate},DataListKey:`{reportParam.DataListKey}`,ListView:`{reportParam.ListView}`,SelectedRowIds: `{string.Join(",", reportParam.SelectedRowIds)}`}}"; - //removed listview as it no longer exists and I don't think there's any useful purpose to it in the report javascript at this time + // var reportMeta = $"{{Id:{report.Id},Name:`{report.Name}`,Notes:`{report.Notes}`,ObjectType:`{report.ObjectType}`,CustomFieldsDefinition:{CustomFieldsTemplate},DataListKey:`{reportParam.DataListKey}`,ListView:`{reportParam.ListView}`,SelectedRowIds: `{string.Join(",", reportParam.SelectedRowIds)}`}}"; + //removed listview as it no longer exists and I don't think there's any useful purpose to it in the report javascript at this time var reportMeta = $"{{Id:{report.Id},Name:`{report.Name}`,Notes:`{report.Notes}`,ObjectType:`{report.ObjectType}`,CustomFieldsDefinition:{CustomFieldsTemplate},DataListKey:`{reportParam.DataListKey}`,SelectedRowIds: `{string.Join(",", reportParam.SelectedRowIds)}`}}"; diff --git a/server/AyaNova/models/DataListReportProcessingOptions.cs b/server/AyaNova/models/DataListReportProcessingOptions.cs index d1f830e6..f80518f0 100644 --- a/server/AyaNova/models/DataListReportProcessingOptions.cs +++ b/server/AyaNova/models/DataListReportProcessingOptions.cs @@ -1,10 +1,15 @@ using AyaNova.Biz; +using AyaNova.DataList; using Newtonsoft.Json.Linq; namespace AyaNova.Models { public class DataListReportProcessingOptions : DataListSelectedProcessingOptions { + internal DataListReportProcessingOptions(DataListSelectedRequest request, IDataListProcessing dataList, DataListSavedColumnView savedView, DataListSavedFilter savedFilter, long userId, AuthorizationRoles userRoles) : base(request, dataList, savedView, savedFilter, userId, userRoles) + { + } + public long ReportId { get; set; } public JToken ClientMeta { get; set; }//meta JSON data passed from client, not part of biz object data //public long[] SelectedRowIds { get; set; }