From d43a39905834f5c579e3cbf4c80e4565f9dc1331 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 7 May 2020 18:59:39 +0000 Subject: [PATCH] --- devdocs/todo.txt | 1 + .../Controllers/WorkOrderController.cs | 358 ++++++++---------- 2 files changed, 168 insertions(+), 191 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 2860a8fa..dee2172e 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -15,6 +15,7 @@ todo: check attachment NOTES property is actually supported todo: search tables in schema, I think there is a missing index here, need to look at the search query section again as it was changed several times from the original schema creation +todo: all api routes, re-arrange code in controller in this order POST (and postlike such as duplicate), GET, PUT, DELETE for consistency and logicality todo: all api route URI's sb lower case with dashes if necessary (use plural noun scheme) https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design#organize-the-api-around-resources diff --git a/server/AyaNova/Controllers/WorkOrderController.cs b/server/AyaNova/Controllers/WorkOrderController.cs index 6f973dfa..e6a500d9 100644 --- a/server/AyaNova/Controllers/WorkOrderController.cs +++ b/server/AyaNova/Controllers/WorkOrderController.cs @@ -42,6 +42,82 @@ namespace AyaNova.Api.Controllers #region WorkOrder top level routes + /// + /// Create Workorder + /// + /// + /// Automatically filled from route path, no need to specify in body + /// + [HttpPost] + public async Task PostWorkOrder([FromBody] WorkOrder inObj, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + //Instantiate the business object handler + WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); + + //If a user has change roles + if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + + //Create and validate + WorkOrder o = await biz.CreateAsync(inObj); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + + } + + + + //TODO: CreateFromTemplate(templateid) + //TODO: Createfromquote(quoteid) + //todo: createfrompm(pmid) + + + + + /// + /// Duplicate WorkOrder + /// + /// Create a duplicate of this items id + /// Automatically filled from route path, no need to specify in body + /// + [HttpPost("duplicate/{id}")] + public async Task DuplicateWorkOrder([FromRoute] long id, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + //Instantiate the business object handler + WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); + + //If a user has change roles + if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + + var oSrc = await biz.GetAsync(id, false); + if (oSrc == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + + //Create and validate + WorkOrder o = await biz.DuplicateAsync(oSrc); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + + } + + /// /// Get full WorkOrder object /// @@ -122,80 +198,7 @@ namespace AyaNova.Api.Controllers - /// - /// Create Workorder - /// - /// - /// Automatically filled from route path, no need to specify in body - /// - [HttpPost] - public async Task PostWorkOrder([FromBody] WorkOrder inObj, ApiVersion apiVersion) - { - if (!serverState.IsOpen) - return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - //Instantiate the business object handler - WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); - - //If a user has change roles - if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) - return StatusCode(403, new ApiNotAuthorizedResponse()); - - if (!ModelState.IsValid) - return BadRequest(new ApiErrorResponse(ModelState)); - - //Create and validate - WorkOrder o = await biz.CreateAsync(inObj); - if (o == null) - return BadRequest(new ApiErrorResponse(biz.Errors)); - else - return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - - } - - - - //TODO: CreateFromTemplate(templateid) - //TODO: Createfromquote(quoteid) - //todo: createfrompm(pmid) - - - - - /// - /// Duplicate WorkOrder - /// - /// Create a duplicate of this items id - /// Automatically filled from route path, no need to specify in body - /// - [HttpPost("duplicate/{id}")] - public async Task DuplicateWorkOrder([FromRoute] long id, ApiVersion apiVersion) - { - if (!serverState.IsOpen) - return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - //Instantiate the business object handler - WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); - - //If a user has change roles - if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) - return StatusCode(403, new ApiNotAuthorizedResponse()); - - if (!ModelState.IsValid) - return BadRequest(new ApiErrorResponse(ModelState)); - - var oSrc = await biz.GetAsync(id, false); - if (oSrc == null) - return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - //Create and validate - WorkOrder o = await biz.DuplicateAsync(oSrc); - if (o == null) - return BadRequest(new ApiErrorResponse(biz.Errors)); - else - return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - - } @@ -249,120 +252,6 @@ namespace AyaNova.Api.Controllers //GET PUT and DELETE on a collecdtion always mean the entire collection, POST is the outlier here - // /// - // /// Get full WorkOrder object - // /// - // /// - // /// A single WorkOrder - // [HttpGet("{id}")] - // public async Task GetWorkOrder([FromRoute] long id) - // { - // if (!serverState.IsOpen) - // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - // //Instantiate the business object handler - // WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); - - // //NOTE: This is the first check and often the only check but in some cases with some objects this will also need to check biz object rules - // if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) - // return StatusCode(403, new ApiNotAuthorizedResponse()); - - // if (!ModelState.IsValid) - // return BadRequest(new ApiErrorResponse(ModelState)); - - // var o = await biz.GetAsync(id); - // if (o == null) - // return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - // // NOTE: HERE would be the second check of biz rules before returning the object - // // in cases where there is also a business rule to affect retrieval on top of basic rights - - // return Ok(ApiOkResponse.Response(o, !Authorized.HasModifyRole(HttpContext.Items, biz.BizType))); - // } - - // //TODO: GET BY RELATIVE - // //get by descendent type and id - - - - - // /// - // /// Put (update) WorkOrder - // /// - // /// - // /// - // /// - // [HttpPut("{id}")] - // public async Task PutWorkOrder([FromRoute] long id, [FromBody] WorkOrder inObj) - // { - // if (!serverState.IsOpen) - // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - // if (!ModelState.IsValid) - // return BadRequest(new ApiErrorResponse(ModelState)); - - // //Instantiate the business object handler - // WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); - - // var o = await biz.GetAsync(id, false); - // if (o == null) - // return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - // if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType)) - // return StatusCode(403, new ApiNotAuthorizedResponse()); - - // try - // { - // if (!await biz.PutAsync(o, inObj)) - // return BadRequest(new ApiErrorResponse(biz.Errors)); - // } - // catch (DbUpdateConcurrencyException) - // { - // if (!await biz.ExistsAsync(id)) - // return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - // else - // return StatusCode(409, new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT)); - // } - // return Ok(ApiOkResponse.Response(new { ConcurrencyToken = o.ConcurrencyToken }, true)); - // } - - - - - // /// - // /// Post Workorder - // /// - // /// - // /// Automatically filled from route path, no need to specify in body - // /// - // [HttpPost] - // public async Task PostWorkOrder([FromBody] WorkOrder inObj, ApiVersion apiVersion) - // { - // if (!serverState.IsOpen) - // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - // //Instantiate the business object handler - // WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); - - // //If a user has change roles - // if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) - // return StatusCode(403, new ApiNotAuthorizedResponse()); - - // if (!ModelState.IsValid) - // return BadRequest(new ApiErrorResponse(ModelState)); - - // //Create and validate - // WorkOrder o = await biz.CreateAsync(inObj); - // if (o == null) - // return BadRequest(new ApiErrorResponse(biz.Errors)); - // else - // return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - - // } - - - - /// /// Create WorkOrderItem @@ -395,11 +284,92 @@ namespace AyaNova.Api.Controllers // return BadRequest(new ApiErrorResponse(biz.Errors)); // else // return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - return NoContent(); + return StatusCode(501); } + + /// + /// Get WorkOrderItem object + /// + /// + /// A single WorkOrderItem + [HttpGet("items/{WorkOrderItemId}")] + public async Task GetWorkOrderItem([FromRoute] long WorkOrderItemId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + //Instantiate the business object handler + WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); + + //NOTE: This is the first check and often the only check but in some cases with some objects this will also need to check biz object rules + if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + + // var o = await biz.GetAsync(id); + // if (o == null) + // return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + + // // NOTE: HERE would be the second check of biz rules before returning the object + // // in cases where there is also a business rule to affect retrieval on top of basic rights + + // return Ok(ApiOkResponse.Response(o, !Authorized.HasModifyRole(HttpContext.Items, biz.BizType))); + return StatusCode(501); + } + + + + /// + /// Put (update) WorkOrderItem + /// + /// + /// + /// + [HttpPut("items/{WorkOrderItemId}")] + public async Task PutWorkOrderItem([FromRoute] long id, [FromBody] WorkOrderItem updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + + //Instantiate the business object handler + WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); + + var o = await biz.GetAsync(id, false); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + + if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + + // try + // { + // if (!await biz.PutAsync(o, updatedObject)) + // return BadRequest(new ApiErrorResponse(biz.Errors)); + // } + // catch (DbUpdateConcurrencyException) + // { + // if (!await biz.ExistsAsync(id)) + // return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + // else + // return StatusCode(409, new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT)); + // } + // return Ok(ApiOkResponse.Response(new { ConcurrencyToken = o.ConcurrencyToken }, true)); + return StatusCode(501); + } + + + + + + /// /// Delete WorkOrderItem /// @@ -442,7 +412,9 @@ namespace AyaNova.Api.Controllers // if (!await biz.DeleteItemsAsync(o)) // return BadRequest(new ApiErrorResponse(biz.Errors)); - return NoContent(); + // return NoContent(); + + return StatusCode(501); } @@ -500,7 +472,9 @@ namespace AyaNova.Api.Controllers // if (!await biz.DeleteWorkOrderItemLaborAsync(woitemlabor))//may need more info, not sure // return BadRequest(new ApiErrorResponse(biz.Errors)); - return NoContent(); + //return NoContent(); + + return StatusCode(501); } #endregion WorkOrderItemLabor @@ -546,7 +520,9 @@ namespace AyaNova.Api.Controllers // if (!await biz.DeleteItemsAsync(o)) // return BadRequest(new ApiErrorResponse(biz.Errors)); - return NoContent(); + //return NoContent(); + + return StatusCode(501); } #endregion WorkOrderItemPart