From 7806e0df2647f5eb5bfbd2b25b7d34934d77704b Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 15 May 2020 20:53:44 +0000 Subject: [PATCH] --- devdocs/todo.txt | 1 + .../AyaNova/Controllers/SearchController.cs | 38 ++++++++++++------- server/AyaNova/biz/WorkOrderBiz.cs | 35 +++++++++++++++++ 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index b86f63f3..1df92034 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -53,6 +53,7 @@ todo: api / server landing page is shitty on a mobile todo: Log configuration into server log at startup? https://rockfish.ayanova.com/default.htm#!/rfcaseEdit/3523 log all config settings into server log on boot todo:aycontext clean up old block of weird definitions +todo: apiokresponse returns readonly value every time, but I check it anyway at the client and biz object itself doesn't set it I don't think, so...should it be removed? todo: Is there a log that records past jobs, how long can they be viewed? todo: Rename the link to AyaNova App on the server page to just "AyaNova" todo: translation cjkindex, no way to set this value currently diff --git a/server/AyaNova/Controllers/SearchController.cs b/server/AyaNova/Controllers/SearchController.cs index dbe6c960..c25ea9ac 100644 --- a/server/AyaNova/Controllers/SearchController.cs +++ b/server/AyaNova/Controllers/SearchController.cs @@ -101,17 +101,15 @@ namespace AyaNova.Api.Controllers - /// + /// /// Get the top level ancestor of provided type and id /// (e.g. find the WorkOrder principle for a WorkOrderItemPart object descendent) /// /// - /// - /// - /// - /// A search result excerpt of object + /// + /// A type and id of ancestor [HttpGet("ancestor/{ayaType}/{id}")] - public async Task GetAncestor([FromRoute] AyaType ayaType, [FromRoute] long id, [FromQuery] string phrase, [FromQuery] int max = 80) + public async Task GetAncestor([FromRoute] AyaType ayaType, [FromRoute] long id) { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -121,20 +119,34 @@ namespace AyaNova.Api.Controllers if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - if (id == 0) - return NotFound(); + if (id == 0) + return NotFound(); + switch (ayaType) + { + case AyaType.WorkOrderItem: + case AyaType.WorkOrderItemExpense: + case AyaType.WorkOrderItemLabor: + case AyaType.WorkOrderItemLoan: + case AyaType.WorkOrderItemPart: + case AyaType.WorkOrderItemPartRequest: + case AyaType.WorkOrderItemScheduledUser: + case AyaType.WorkOrderItemTask: + case AyaType.WorkOrderItemTravel: + return Ok(ApiOkResponse.Response(await WorkOrderBiz.GetAncestor(ayaType, id, ct), true)); + default: + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, "ayaType", "Only types with ancestors are valid")); -//pawn this off to biz object static methods as appropriate -//if not in this list of types then it has no ancestor so just return the same values back -//or, maybe just fail code so people don't think they should run every object through here when they want to open it foolishly / needlessly / ignorantely + } + + } // var res = await Search.GetInfoAsync(ct, UserTranslationIdFromContext.Id(HttpContext.Items), // UserRolesFromContext.Roles(HttpContext.Items), UserIdFromContext.Id(HttpContext.Items), phrase, max, ayaType, id); return Ok(ApiOkResponse.Response(res, true)); } - //------------ + //------------ - }//eoc +}//eoc }//eons \ No newline at end of file diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index ee782d5f..2bf777db 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -252,6 +252,41 @@ namespace AyaNova.Biz } + //////////////////////////////////////////////////////////////////////////////////////////////// + // GET ANCESTOR + // + internal static async Task GetAncestor(AyaType ayType, long id, AyContext ct) + { + //Note: there could be rules checking here in future, i.e. can only get own workorder or something + //if so, then need to implement AddError and in route handle Null return with Error check just like PUT route does now + + //https://docs.microsoft.com/en-us/ef/core/querying/related-data + //docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections + var ret = + await ct.WorkOrder + .Include(w => w.Items) + .ThenInclude(wi => wi.Expenses) + .Include(w => w.Items) + .ThenInclude(wi => wi.Labors) + .Include(w => w.Items) + .ThenInclude(wi => wi.Loans) + .Include(w => w.Items) + .ThenInclude(wi => wi.Parts) + .Include(w => w.Items) + .ThenInclude(wi => wi.PartRequests) + .Include(w => w.Items) + .ThenInclude(wi => wi.ScheduledUsers) + .Include(w => w.Items) + .ThenInclude(wi => wi.Tasks) + .Include(w => w.Items) + .ThenInclude(wi => wi.Travels) + .Include(w => w.Items) + .ThenInclude(wi => wi.Units) + .SingleOrDefaultAsync(m => m.Id == id); + + + + } private async Task WorkOrderSearchIndexAsync(WorkOrder obj, bool isNew) {