This commit is contained in:
@@ -128,7 +128,7 @@ namespace AyaNova.Api.Controllers
|
|||||||
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
||||||
if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType))
|
if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType))
|
||||||
return StatusCode(403, new ApiNotAuthorizedResponse());
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
var o = await biz.PutAsync(id, updatedObject);
|
var o = await biz.PutAsync(id, updatedObject);//In future may need to return entire object, for now just concurrency token
|
||||||
if (o == null)
|
if (o == null)
|
||||||
{
|
{
|
||||||
if (biz.Errors.Exists(m => m.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
|
if (biz.Errors.Exists(m => m.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
|
||||||
@@ -173,6 +173,12 @@ namespace AyaNova.Api.Controllers
|
|||||||
|
|
||||||
#endregion WorkOrderTopLevel routes
|
#endregion WorkOrderTopLevel routes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region WorkOrderItem
|
#region WorkOrderItem
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create WorkOrderItem
|
/// Create WorkOrderItem
|
||||||
@@ -209,7 +215,7 @@ namespace AyaNova.Api.Controllers
|
|||||||
if (!serverState.IsOpen)
|
if (!serverState.IsOpen)
|
||||||
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
||||||
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
||||||
if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType))
|
if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.WorkOrderItem))
|
||||||
return StatusCode(403, new ApiNotAuthorizedResponse());
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
return BadRequest(new ApiErrorResponse(ModelState));
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
@@ -221,46 +227,32 @@ namespace AyaNova.Api.Controllers
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// /// <summary>
|
/// <summary>
|
||||||
// /// Put (update) WorkOrderItem
|
/// Put (update) WorkOrderItem
|
||||||
// /// </summary>
|
/// (Descendent objects must be updated via their individual routes seperately)
|
||||||
// /// <param name="id"></param>
|
/// </summary>
|
||||||
// /// <param name="updatedObject"></param>
|
/// <param name="updatedObject">WorkOrderItem - top level only, no descendents</param>
|
||||||
// /// <returns></returns>
|
/// <returns>New concurrency token</returns>
|
||||||
// [HttpPut("items/{WorkOrderItemId}")]
|
[HttpPut("items/")]
|
||||||
// public async Task<IActionResult> PutWorkOrderItem([FromRoute] long id, [FromBody] WorkOrderItem updatedObject)
|
public async Task<IActionResult> PutWorkOrderItem([FromBody] dtWorkOrderItem updatedObject)
|
||||||
// {
|
{
|
||||||
// if (!serverState.IsOpen)
|
if (!serverState.IsOpen)
|
||||||
// return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
||||||
|
if (!ModelState.IsValid)
|
||||||
// if (!ModelState.IsValid)
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
// return BadRequest(new ApiErrorResponse(ModelState));
|
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
||||||
|
if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItem))
|
||||||
// //Instantiate the business object handler
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
// WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
var o = await biz.ItemPutAsync(updatedObject);//In future may need to return entire object, for now just concurrency token
|
||||||
|
if (o == null)
|
||||||
// var o = await biz.GetAsync(id, false);
|
{
|
||||||
// if (o == null)
|
if (biz.Errors.Exists(m => m.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
|
||||||
// return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
|
return StatusCode(409, new ApiErrorResponse(biz.Errors));
|
||||||
|
else
|
||||||
// if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType))
|
return BadRequest(new ApiErrorResponse(biz.Errors));
|
||||||
// return StatusCode(403, new ApiNotAuthorizedResponse());
|
}
|
||||||
|
return Ok(ApiOkResponse.Response(new { ConcurrencyToken = o.ConcurrencyToken }, true));
|
||||||
// // 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);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -318,6 +310,12 @@ namespace AyaNova.Api.Controllers
|
|||||||
|
|
||||||
#endregion workorderitem
|
#endregion workorderitem
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region WorkOrderItemLabor
|
#region WorkOrderItemLabor
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -336,7 +334,7 @@ namespace AyaNova.Api.Controllers
|
|||||||
return StatusCode(403, new ApiNotAuthorizedResponse());
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
return BadRequest(new ApiErrorResponse(ModelState));
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
WorkOrderItemLabor o = await biz.CreateLaborAsync(newObject);
|
WorkOrderItemLabor o = await biz.LaborCreateAsync(newObject);
|
||||||
if (o == null)
|
if (o == null)
|
||||||
return BadRequest(new ApiErrorResponse(biz.Errors));
|
return BadRequest(new ApiErrorResponse(biz.Errors));
|
||||||
else
|
else
|
||||||
@@ -359,16 +357,51 @@ namespace AyaNova.Api.Controllers
|
|||||||
return StatusCode(403, new ApiNotAuthorizedResponse());
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
return BadRequest(new ApiErrorResponse(ModelState));
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
var o = await biz.GetLaborAsync(WorkOrderItemLaborId);
|
var o = await biz.LaborGetAsync(WorkOrderItemLaborId);
|
||||||
if (o == null)
|
if (o == null)
|
||||||
return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
|
return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
|
||||||
return Ok(ApiOkResponse.Response(o, !Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemLabor)));
|
return Ok(ApiOkResponse.Response(o, !Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemLabor)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Put (update) WorkOrderItemLabor
|
||||||
|
/// (Descendent objects must be updated via their individual routes seperately)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="updatedObject">WorkOrderItemLabor - top level only, no descendents</param>
|
||||||
|
/// <returns>New concurrency token</returns>
|
||||||
|
[HttpPut("items/")]
|
||||||
|
public async Task<IActionResult> PutWorkOrderItemLabor([FromBody] WorkOrderItemLabor updatedObject)
|
||||||
|
{
|
||||||
|
if (!serverState.IsOpen)
|
||||||
|
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
|
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
||||||
|
if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemLabor))
|
||||||
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
|
var o = await biz.LaborPutAsync(updatedObject);//In future may need to return entire object, for now just concurrency token
|
||||||
|
if (o == null)
|
||||||
|
{
|
||||||
|
if (biz.Errors.Exists(m => m.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
|
||||||
|
return StatusCode(409, new ApiErrorResponse(biz.Errors));
|
||||||
|
else
|
||||||
|
return BadRequest(new ApiErrorResponse(biz.Errors));
|
||||||
|
}
|
||||||
|
return Ok(ApiOkResponse.Response(new { ConcurrencyToken = o.ConcurrencyToken }, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion WorkOrderItemLabor
|
#endregion WorkOrderItemLabor
|
||||||
|
|
||||||
#region WorkOrderItemPart
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region WorkOrderItemPart
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create WorkOrderItemPart
|
/// Create WorkOrderItemPart
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -414,6 +447,33 @@ namespace AyaNova.Api.Controllers
|
|||||||
return Ok(ApiOkResponse.Response(o, !Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemPart)));
|
return Ok(ApiOkResponse.Response(o, !Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemPart)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Put (update) WorkOrderItemPart
|
||||||
|
/// (Descendent objects must be updated via their individual routes seperately)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="updatedObject">WorkOrderItemPart - top level only, no descendents</param>
|
||||||
|
/// <returns>New concurrency token</returns>
|
||||||
|
[HttpPut("items/")]
|
||||||
|
public async Task<IActionResult> PutWorkOrderItemPart([FromBody] WorkOrderItemPart updatedObject)
|
||||||
|
{
|
||||||
|
if (!serverState.IsOpen)
|
||||||
|
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
|
WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext);
|
||||||
|
if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemPart))
|
||||||
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
|
var o = await biz.PartPutAsync(updatedObject);//In future may need to return entire object, for now just concurrency token
|
||||||
|
if (o == null)
|
||||||
|
{
|
||||||
|
if (biz.Errors.Exists(m => m.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
|
||||||
|
return StatusCode(409, new ApiErrorResponse(biz.Errors));
|
||||||
|
else
|
||||||
|
return BadRequest(new ApiErrorResponse(biz.Errors));
|
||||||
|
}
|
||||||
|
return Ok(ApiOkResponse.Response(new { ConcurrencyToken = o.ConcurrencyToken }, true));
|
||||||
|
}
|
||||||
|
|
||||||
#endregion WorkOrderItemPart
|
#endregion WorkOrderItemPart
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
|
|||||||
@@ -268,6 +268,12 @@ namespace AyaNova.Biz
|
|||||||
}
|
}
|
||||||
#endregion workorder level
|
#endregion workorder level
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region WorkOrderItem level
|
#region WorkOrderItem level
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//EXISTS
|
//EXISTS
|
||||||
@@ -321,6 +327,53 @@ namespace AyaNova.Biz
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//UPDATE
|
||||||
|
//
|
||||||
|
internal async Task<WorkOrderItem> ItemPutAsync(dtWorkOrderItem dtPutObject)
|
||||||
|
{
|
||||||
|
|
||||||
|
WorkOrderItem dbObject = await ct.WorkOrderItem.SingleOrDefaultAsync(m => m.Id == dtPutObject.Id);
|
||||||
|
if (dbObject == null)
|
||||||
|
{
|
||||||
|
AddError(ApiErrorCode.NOT_FOUND, "id");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make a snapshot of the original for validation but update the original to preserve workflow
|
||||||
|
WorkOrderItem SnapshotOfOriginalDBObj = new WorkOrderItem();
|
||||||
|
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
|
||||||
|
|
||||||
|
//Replace the db object with the PUT object
|
||||||
|
CopyObject.Copy(dtPutObject, dbObject, "Id");
|
||||||
|
|
||||||
|
dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags);
|
||||||
|
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
|
||||||
|
|
||||||
|
ct.Entry(dbObject).OriginalValues["ConcurrencyToken"] = dtPutObject.ConcurrencyToken;
|
||||||
|
await ItemValidateAsync(dbObject, SnapshotOfOriginalDBObj);
|
||||||
|
if (HasErrors)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ct.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
catch (DbUpdateConcurrencyException)
|
||||||
|
{
|
||||||
|
if (!await ItemExistsAsync(dtPutObject.Id))
|
||||||
|
AddError(ApiErrorCode.NOT_FOUND);
|
||||||
|
else
|
||||||
|
new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct);
|
||||||
|
await ItemSearchIndexAsync(dbObject, false);
|
||||||
|
await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
|
||||||
|
return dbObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//VALIDATION
|
//VALIDATION
|
||||||
//
|
//
|
||||||
@@ -380,6 +433,12 @@ namespace AyaNova.Biz
|
|||||||
}
|
}
|
||||||
#endregion work order item level
|
#endregion work order item level
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region WorkOrderItemLabor level
|
#region WorkOrderItemLabor level
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//EXISTS
|
//EXISTS
|
||||||
@@ -391,7 +450,7 @@ namespace AyaNova.Biz
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//CREATE
|
//CREATE
|
||||||
//
|
//
|
||||||
internal async Task<WorkOrderItemLabor> CreateLaborAsync(WorkOrderItemLabor newObject)
|
internal async Task<WorkOrderItemLabor> LaborCreateAsync(WorkOrderItemLabor newObject)
|
||||||
{
|
{
|
||||||
await LaborValidateAsync(newObject, null);
|
await LaborValidateAsync(newObject, null);
|
||||||
if (HasErrors)
|
if (HasErrors)
|
||||||
@@ -412,7 +471,7 @@ namespace AyaNova.Biz
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// GET
|
// GET
|
||||||
//
|
//
|
||||||
internal async Task<WorkOrderItemLabor> GetLaborAsync(long id, bool logTheGetEvent = true)
|
internal async Task<WorkOrderItemLabor> LaborGetAsync(long id, bool logTheGetEvent = true)
|
||||||
{
|
{
|
||||||
//Note: there could be rules checking here in future, i.e. can only get own workorder or something
|
//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
|
//if so, then need to implement AddError and in route handle Null return with Error check just like PUT route does now
|
||||||
@@ -427,6 +486,47 @@ namespace AyaNova.Biz
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//UPDATE
|
||||||
|
//
|
||||||
|
internal async Task<WorkOrderItemLabor> LaborPutAsync(WorkOrderItemLabor dtPutObject)
|
||||||
|
{
|
||||||
|
WorkOrderItemLabor dbObject = await ct.WorkOrderItemLabor.SingleOrDefaultAsync(m => m.Id == dtPutObject.Id);
|
||||||
|
if (dbObject == null)
|
||||||
|
{
|
||||||
|
AddError(ApiErrorCode.NOT_FOUND, "id");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make a snapshot of the original for validation but update the original to preserve workflow
|
||||||
|
WorkOrderItemLabor SnapshotOfOriginalDBObj = new WorkOrderItemLabor();
|
||||||
|
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
|
||||||
|
CopyObject.Copy(dtPutObject, dbObject, "Id");
|
||||||
|
|
||||||
|
dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags);
|
||||||
|
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
|
||||||
|
|
||||||
|
ct.Entry(dbObject).OriginalValues["ConcurrencyToken"] = dtPutObject.ConcurrencyToken;
|
||||||
|
await LaborValidateAsync(dbObject, SnapshotOfOriginalDBObj);
|
||||||
|
if (HasErrors) return null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ct.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
catch (DbUpdateConcurrencyException)
|
||||||
|
{
|
||||||
|
if (!await LaborExistsAsync(dtPutObject.Id))
|
||||||
|
AddError(ApiErrorCode.NOT_FOUND);
|
||||||
|
else
|
||||||
|
new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct);
|
||||||
|
await LaborSearchIndexAsync(dbObject, false);
|
||||||
|
await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
|
||||||
|
return dbObject;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//VALIDATION
|
//VALIDATION
|
||||||
//
|
//
|
||||||
@@ -485,6 +585,12 @@ namespace AyaNova.Biz
|
|||||||
}
|
}
|
||||||
#endregion work order item LABOR level
|
#endregion work order item LABOR level
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region WorkOrderItemPart level
|
#region WorkOrderItemPart level
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//EXISTS
|
//EXISTS
|
||||||
|
|||||||
Reference in New Issue
Block a user