public async Task <IActionResult> UpdateWorkorderState([FromRoute] int id, [FromBody] UpdateStateDto newState) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var workorder = await _context.Workorders .Include(w => w.State) .FirstOrDefaultAsync(w => w.Id == id); if (id != workorder.Id || workorder == null) { return(NotFound(new { Error = "Workorder " + id + " not found" })); } // Get full state object var state = await _context.States.FirstOrDefaultAsync(s => s.Id == newState.NewStateId); if (newState.NewStateId != state.Id || state == null) { return(NotFound(new { Error = "State " + newState.NewStateId + " not found" })); } // TODO: Verify that it is a valid state for the active workflow // Get transition object inferred from current state id and the new state id var transition = await _context.Transitions.FirstOrDefaultAsync(t => t.CurrentStateId == workorder.State.Id && t.NextStateId == newState.NewStateId); // Verify that it is a valid transition if (transition == null) { // TODO: Create a better error object for situations like this // Perhaps include redirect url for GET Transitions return(Conflict(new { Error = "Invalid state transition" })); } // Update state workorder.State = state; _context.Entry(workorder).State = EntityState.Modified; // Add transition var transitionHistoryEntry = new TransitionHistory { Comment = newState.Comment, Timestamp = DateTime.Now, Workorder = workorder, Transition = transition }; _context.TransitionHistory.Add(transitionHistoryEntry); await _context.SaveChangesAsync(); //return GetPossibleWorkorderTransitions(id); return(NoContent()); }
public void UpdateStateDtoModelTests() { ValidatorStateDto state = new ValidatorStateDto(); UpdateStateDto ruf = new UpdateStateDto { ValidatorState = state }; ruf.ValidatorState.Should().Be(state); }