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