public Boundary.Response.MashReferral UpdateMashReferral(UpdateMashReferral request, long referralId) { if (request.UpdateType == "UNASSIGN-WORKER") { return(_mashReferralGateway.UpdateReferral(request, referralId).ToResponse()); } var worker = request.WorkerId != null?_workerGateway.GetWorkerByWorkerId(request.WorkerId.Value) : _databaseGateway.GetWorkerByEmail(request.WorkerEmail)?.ToDomain(false); if (worker == null) { throw new WorkerNotFoundException($"Worker with email \"{request.WorkerEmail}\" not found"); } return(_mashReferralGateway.UpdateReferral(request, referralId).ToResponse()); }
public IActionResult UpdateMashReferral([FromBody] UpdateMashReferral request, long referralId) { var validator = new UpdateMashReferralValidator(); var validation = validator.Validate(request); if (!validation.IsValid) { return(BadRequest(validation.ToString())); } try { var updatedReferral = _mashReferralUseCase.UpdateMashReferral(request, referralId); return(Ok(updatedReferral)); } catch (Exception e) when( e is MashReferralNotFoundException || e is WorkerNotFoundException || e is MashReferralStageMismatchException) { return(BadRequest(e.Message)); } }
public MashReferral UpdateReferral(UpdateMashReferral request, long referralId) { var referral = _databaseContext.MashReferrals .Include(x => x.MashResidents) .Include(x => x.Worker) .FirstOrDefault(x => x.Id == referralId); if (referral == null) { throw new MashReferralNotFoundException($"MASH referral with id {referralId} not found"); } if (request.UpdateType.Equals("CONTACT-DECISION")) { if (!referral.Stage.Equals("CONTACT")) { throw new MashReferralStageMismatchException( $"Referral {referral.Id} is in stage '{referral.Stage}', this request requires the referral to be in stage 'CONTACT'"); } referral.ContactDecisionCreatedAt = _systemTime.Now; referral.ContactDecisionUrgentContactRequired = request.RequiresUrgentContact; referral.Stage = "INITIAL"; if (request.WorkerEmail != null) { referral.WorkerId = _databaseContext.Workers.FirstOrDefault(w => w.Email == request.WorkerEmail).Id; } else if (request.WorkerId != null) { referral.WorkerId = request.WorkerId; } } if (request.UpdateType.Equals("INITIAL-DECISION")) { if (!referral.Stage.Equals("INITIAL")) { throw new MashReferralStageMismatchException( $"Referral {referral.Id} is in stage '{referral.Stage}', this request requires the referral to be in stage 'INITIAL'"); } referral.InitialDecisionCreatedAt = _systemTime.Now; referral.InitialDecision = request.Decision; referral.InitialDecisionUrgentContactRequired = request.RequiresUrgentContact; referral.InitialDecisionReferralCategory = request.ReferralCategory; referral.Stage = "SCREENING"; } if (request.UpdateType.Equals("SCREENING-DECISION")) { if (!referral.Stage.Equals("SCREENING")) { throw new MashReferralStageMismatchException( $"Referral {referral.Id} is in stage '{referral.Stage}', this request requires the referral to be in stage 'SCREENING'"); } referral.ScreeningCreatedAt = _systemTime.Now; referral.ScreeningDecision = request.Decision; referral.ScreeningUrgentContactRequired = request.RequiresUrgentContact; referral.Stage = "FINAL"; } if (request.UpdateType.Equals("FINAL-DECISION")) { if (!referral.Stage.Equals("FINAL")) { throw new MashReferralStageMismatchException( $"Referral {referral.Id} is in stage '{referral.Stage}', this request requires the referral to be in stage 'FINAL'"); } referral.FinalDecisionCreatedAt = _systemTime.Now; referral.FinalDecision = request.Decision; referral.FinalDecisionUrgentContactRequired = request.RequiresUrgentContact; referral.FinalDecisionReferralCategory = request.ReferralCategory; referral.Stage = "POST-FINAL"; } if (request.UpdateType.Equals("ASSIGN-WORKER")) { if (request.WorkerId != null) { if (_databaseContext.Workers.Find(request.WorkerId) == null) { throw new WorkerNotFoundException($"Worker with id {request.WorkerId} not found"); } referral.WorkerId = request.WorkerId; } else { Worker worker = _databaseContext.Workers.FirstOrDefault(w => w.Email == request.WorkerEmail); if (worker == null) { throw new WorkerNotFoundException($"Worker with email {request.WorkerEmail} not found"); } referral.WorkerId = worker.Id; } } if (request.UpdateType.Equals("UNASSIGN-WORKER")) { referral.WorkerId = null; } _databaseContext.SaveChanges(); return(referral.ToDomain()); }