diff --git a/server/AyaNova/Controllers/WorkOrderController.cs b/server/AyaNova/Controllers/WorkOrderController.cs index 0fc17211..124cf59b 100644 --- a/server/AyaNova/Controllers/WorkOrderController.cs +++ b/server/AyaNova/Controllers/WorkOrderController.cs @@ -42,13 +42,13 @@ namespace AyaNova.Api.Controllers #region WorkOrder top level routes /// - /// Create WorkOrder "header" + /// Create WorkOrder /// - /// WorkOrder top level only, no descendents are evaluated + /// WorkOrder - top level only, no descendents /// From route path - /// WorkOrder "header" object + /// WorkOrder [HttpPost] - public async Task PostWorkOrder([FromBody] WorkOrder newObject, ApiVersion apiVersion) + public async Task PostWorkOrder([FromBody] dtWorkOrder newObject, ApiVersion apiVersion) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -71,7 +71,7 @@ namespace AyaNova.Api.Controllers /// /// Source object id /// From route path - /// Full WorkOrder object including all descendents + /// WorkOrder [HttpPost("duplicate/{id}")] public async Task DuplicateWorkOrder([FromRoute] long id, ApiVersion apiVersion) { @@ -91,10 +91,10 @@ namespace AyaNova.Api.Controllers /// - /// Get full WorkOrder object + /// Get WorkOrder /// /// - /// Entire WorkOrder object including all descendents + /// WorkOrder [HttpGet("{id}")] public async Task GetWorkOrder([FromRoute] long id) { @@ -112,16 +112,14 @@ namespace AyaNova.Api.Controllers /// - /// Put (update) WorkOrder - /// This route does not evaluate nor update nor return the entire WorkOrder object graph - /// only the "header" or top level - /// Descendent objects must be updated via their individual routes seperately + /// Put (update) WorkOrder + /// (Descendent objects must be updated via their individual routes seperately) /// /// WorkOrder id - /// WorkOrder top level only, no descendents are evaluated + /// WorkOrder - top level only, no descendents /// New concurrency token [HttpPut("{id}")] - public async Task PutWorkOrder([FromRoute] long id, [FromBody] WorkOrder updatedObject) + public async Task PutWorkOrder([FromRoute] long id, [FromBody] dtWorkOrder updatedObject) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index cdfdc672..e6e63bf1 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -43,8 +43,10 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //CREATE // - internal async Task CreateAsync(WorkOrder newObject) + internal async Task CreateAsync(dtWorkOrder dtNewObject) { + WorkOrder newObject = new WorkOrder(); + CopyObject.Copy(dtNewObject, newObject); await ValidateAsync(newObject, null); if (HasErrors) return null; @@ -116,12 +118,8 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //UPDATE // - internal async Task PutAsync(long id, WorkOrder putObj) + internal async Task 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); if (dbObject == null) @@ -135,22 +133,18 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); //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 (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.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); - //Set "original" value of concurrency token to input token - //this will allow EF to check it out - ct.Entry(dbObject).OriginalValues["ConcurrencyToken"] = putObj.ConcurrencyToken; - - + ct.Entry(dbObject).OriginalValues["ConcurrencyToken"] = dtPutObject.ConcurrencyToken; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); if (HasErrors) return null; @@ -199,21 +193,22 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //DELETE // - internal async Task DeleteAsync(WorkOrder dbObj) + internal async Task DeleteAsync(long workorderId) { + WorkOrder dbObject = await GetAsync(workorderId); - // NOT REQUIRED NOW BUT IF IN FUTURE ValidateCanDelete(dbObj); + ValidateCanDelete(dbObject); if (HasErrors) return false; - ct.WorkOrder.Remove(dbObj); + ct.WorkOrder.Remove(dbObject); await ct.SaveChangesAsync(); //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Serial.ToString(), ct); - await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); + await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Serial.ToString(), ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); + await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -265,10 +260,10 @@ namespace AyaNova.Biz //Can delete? - // private void ValidateCanDelete(WorkOrder inObj) - // { - // //whatever needs to be check to delete this object - // } + private void ValidateCanDelete(WorkOrder dbObject) + { + //whatever needs to be check to delete this object + } #endregion workorder level #region WorkOrderItem level @@ -515,7 +510,7 @@ namespace AyaNova.Biz } } - //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// // GET // internal async Task GetPartAsync(long id, bool logTheGetEvent = true) diff --git a/server/AyaNova/models/WorkOrder.cs b/server/AyaNova/models/WorkOrder.cs index 808f5888..cabb0582 100644 --- a/server/AyaNova/models/WorkOrder.cs +++ b/server/AyaNova/models/WorkOrder.cs @@ -5,11 +5,38 @@ using Newtonsoft.Json; 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(); + } + + 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 Tags { get; set; } + + }//eoc + public class WorkOrder { + public WorkOrder() + { + Tags = new List(); + + //dependents + WorkorderItems = new List(); + } + public long Id { get; set; } public uint ConcurrencyToken { get; set; } @@ -24,20 +51,9 @@ namespace AyaNova.Models //dependents public List WorkorderItems { get; set; } - public WorkOrder() - { - Tags = new List(); - WorkorderItems = new List(); - } - - //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] - // public string OP { get; set; }//Patch operation value, e.g. "add", "remove", "replace" - - + // public string NotPersistedExample { get; set; } }//eoc }//eons