This commit is contained in:
2020-05-08 14:42:09 +00:00
parent b3d762a250
commit fadd2338dd
3 changed files with 62 additions and 53 deletions

View File

@@ -42,13 +42,13 @@ namespace AyaNova.Api.Controllers
#region WorkOrder top level routes #region WorkOrder top level routes
/// <summary> /// <summary>
/// Create WorkOrder "header" /// Create WorkOrder
/// </summary> /// </summary>
/// <param name="newObject">WorkOrder top level only, no descendents are evaluated</param> /// <param name="newObject">WorkOrder - top level only, no descendents</param>
/// <param name="apiVersion">From route path</param> /// <param name="apiVersion">From route path</param>
/// <returns>WorkOrder "header" object</returns> /// <returns>WorkOrder</returns>
[HttpPost] [HttpPost]
public async Task<IActionResult> PostWorkOrder([FromBody] WorkOrder newObject, ApiVersion apiVersion) public async Task<IActionResult> PostWorkOrder([FromBody] dtWorkOrder newObject, ApiVersion apiVersion)
{ {
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));
@@ -71,7 +71,7 @@ namespace AyaNova.Api.Controllers
/// </summary> /// </summary>
/// <param name="id">Source object id</param> /// <param name="id">Source object id</param>
/// <param name="apiVersion">From route path</param> /// <param name="apiVersion">From route path</param>
/// <returns>Full WorkOrder object including all descendents</returns> /// <returns>WorkOrder</returns>
[HttpPost("duplicate/{id}")] [HttpPost("duplicate/{id}")]
public async Task<IActionResult> DuplicateWorkOrder([FromRoute] long id, ApiVersion apiVersion) public async Task<IActionResult> DuplicateWorkOrder([FromRoute] long id, ApiVersion apiVersion)
{ {
@@ -91,10 +91,10 @@ namespace AyaNova.Api.Controllers
/// <summary> /// <summary>
/// Get full WorkOrder object /// Get WorkOrder
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name="id"></param>
/// <returns>Entire WorkOrder object including all descendents</returns> /// <returns>WorkOrder</returns>
[HttpGet("{id}")] [HttpGet("{id}")]
public async Task<IActionResult> GetWorkOrder([FromRoute] long id) public async Task<IActionResult> GetWorkOrder([FromRoute] long id)
{ {
@@ -112,16 +112,14 @@ namespace AyaNova.Api.Controllers
/// <summary> /// <summary>
/// Put (update) WorkOrder /// Put (update) WorkOrder
/// This route does not evaluate nor update nor return the entire WorkOrder object graph /// (Descendent objects must be updated via their individual routes seperately)
/// only the "header" or top level
/// Descendent objects must be updated via their individual routes seperately
/// </summary> /// </summary>
/// <param name="id">WorkOrder id</param> /// <param name="id">WorkOrder id</param>
/// <param name="updatedObject">WorkOrder top level only, no descendents are evaluated</param> /// <param name="updatedObject">WorkOrder - top level only, no descendents</param>
/// <returns>New concurrency token</returns> /// <returns>New concurrency token</returns>
[HttpPut("{id}")] [HttpPut("{id}")]
public async Task<IActionResult> PutWorkOrder([FromRoute] long id, [FromBody] WorkOrder updatedObject) public async Task<IActionResult> PutWorkOrder([FromRoute] long id, [FromBody] dtWorkOrder 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));

View File

@@ -43,8 +43,10 @@ namespace AyaNova.Biz
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE //CREATE
// //
internal async Task<WorkOrder> CreateAsync(WorkOrder newObject) internal async Task<WorkOrder> CreateAsync(dtWorkOrder dtNewObject)
{ {
WorkOrder newObject = new WorkOrder();
CopyObject.Copy(dtNewObject, newObject);
await ValidateAsync(newObject, null); await ValidateAsync(newObject, null);
if (HasErrors) if (HasErrors)
return null; return null;
@@ -116,12 +118,8 @@ namespace AyaNova.Biz
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE //UPDATE
// //
internal async Task<WorkOrder> PutAsync(long id, WorkOrder putObj) internal async Task<WorkOrder> PutAsync(long id, dtWorkOrder dtPutObject)
{ {
//TODO: THIS IS ALL WRONG, NEEDS TO HANDLE DESCENDENTS WITH TAGS AND SUCH
//IDEALLY IT SHOULD CALL THE OTHER METHODS TO HANDLE THEM INDIVIDUALLY
//OR...SHOULD IT ONLY EVER HANDLE THE TOP LEVEL....hmmm....
//I guess it would work if it traversed the input workorder and did each bit individually
WorkOrder dbObject = await GetAsync(id, false); WorkOrder dbObject = await GetAsync(id, false);
if (dbObject == null) if (dbObject == null)
@@ -135,22 +133,18 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
//Replace the db object with the PUT object //Replace the db object with the PUT object
CopyObject.Copy(putObj, dbObject, "Id,Serial"); CopyObject.Copy(dtPutObject, dbObject, "Id,Serial");
//if user has rights then change it, otherwise just ignore it and do the rest //if user has rights then change it, otherwise just ignore it and do the rest
if (SnapshotOfOriginalDBObj.Serial != putObj.Serial && Authorized.HasAnyRole(CurrentUserRoles, RolesAllowedToChangeSerial)) if (SnapshotOfOriginalDBObj.Serial != dtPutObject.Serial && Authorized.HasAnyRole(CurrentUserRoles, RolesAllowedToChangeSerial))
{ {
dbObject.Serial = putObj.Serial; dbObject.Serial = dtPutObject.Serial;
} }
dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
//Set "original" value of concurrency token to input token ct.Entry(dbObject).OriginalValues["ConcurrencyToken"] = dtPutObject.ConcurrencyToken;
//this will allow EF to check it out
ct.Entry(dbObject).OriginalValues["ConcurrencyToken"] = putObj.ConcurrencyToken;
await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); await ValidateAsync(dbObject, SnapshotOfOriginalDBObj);
if (HasErrors) if (HasErrors)
return null; return null;
@@ -199,21 +193,22 @@ namespace AyaNova.Biz
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//DELETE //DELETE
// //
internal async Task<bool> DeleteAsync(WorkOrder dbObj) internal async Task<bool> DeleteAsync(long workorderId)
{ {
WorkOrder dbObject = await GetAsync(workorderId);
// NOT REQUIRED NOW BUT IF IN FUTURE ValidateCanDelete(dbObj); ValidateCanDelete(dbObject);
if (HasErrors) if (HasErrors)
return false; return false;
ct.WorkOrder.Remove(dbObj); ct.WorkOrder.Remove(dbObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Serial.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Serial.ToString(), ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType);
await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
return true; return true;
} }
@@ -265,10 +260,10 @@ namespace AyaNova.Biz
//Can delete? //Can delete?
// private void ValidateCanDelete(WorkOrder inObj) private void ValidateCanDelete(WorkOrder dbObject)
// { {
// //whatever needs to be check to delete this object //whatever needs to be check to delete this object
// } }
#endregion workorder level #endregion workorder level
#region WorkOrderItem level #region WorkOrderItem level
@@ -515,7 +510,7 @@ namespace AyaNova.Biz
} }
} }
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
// GET // GET
// //
internal async Task<WorkOrderItemPart> GetPartAsync(long id, bool logTheGetEvent = true) internal async Task<WorkOrderItemPart> GetPartAsync(long id, bool logTheGetEvent = true)

View File

@@ -5,11 +5,38 @@ using Newtonsoft.Json;
namespace AyaNova.Models namespace AyaNova.Models
{ {
//NOTE: Any non required field (nullable in DB) sb nullable here, i.e. decimal? not decimal,
//otherwise the server will call it an invalid record if the field isn't sent from client //Data transfer no child collections
public class dtWorkOrder
{
public dtWorkOrder()
{
Tags = new List<string>();
}
public long Id { get; set; }
public uint ConcurrencyToken { get; set; }
[Required]
public uint Serial { get; set; }
public bool Active { get; set; }
public string Notes { get; set; }
public string Wiki { get; set; }
public string CustomFields { get; set; }
public List<string> Tags { get; set; }
}//eoc
public class WorkOrder public class WorkOrder
{ {
public WorkOrder()
{
Tags = new List<string>();
//dependents
WorkorderItems = new List<WorkOrderItem>();
}
public long Id { get; set; } public long Id { get; set; }
public uint ConcurrencyToken { get; set; } public uint ConcurrencyToken { get; set; }
@@ -24,20 +51,9 @@ namespace AyaNova.Models
//dependents //dependents
public List<WorkOrderItem> WorkorderItems { get; set; } public List<WorkOrderItem> WorkorderItems { get; set; }
public WorkOrder()
{
Tags = new List<string>();
WorkorderItems = new List<WorkOrderItem>();
}
//Not persisted business properties
// //NOTE: this could be a common class applied to everything for common biz rule stuff
// //i.e. specific rights in situations based on rules, like candelete, canedit etc
// [NotMapped] // [NotMapped]
// public string OP { get; set; }//Patch operation value, e.g. "add", "remove", "replace" // public string NotPersistedExample { get; set; }
}//eoc }//eoc
}//eons }//eons