(
&self,
input: SubmitRequestApprovalInput,
ctx: &CallContext,
)
| 449 | } |
| 450 | |
| 451 | pub async fn submit_request_approval( |
| 452 | &self, |
| 453 | input: SubmitRequestApprovalInput, |
| 454 | ctx: &CallContext, |
| 455 | ) -> ServiceResult<Request> { |
| 456 | let approver = self.user_service.get_user_by_identity(&ctx.caller())?; |
| 457 | let request_id = HelperMapper::to_uuid(input.request_id)?; |
| 458 | let mut request = self.get_request(request_id.as_bytes())?; |
| 459 | |
| 460 | if !request.can_approve(&approver.id) { |
| 461 | Err(RequestError::ApprovalNotAllowed)? |
| 462 | } |
| 463 | |
| 464 | let approval_decision = input.decision.into(); |
| 465 | |
| 466 | request.add_approval(approver.id, approval_decision, input.reason)?; |
| 467 | |
| 468 | // Must happen after the approval is added to the request to ensure the approval is counted. |
| 469 | let maybe_evaluation = request.reevaluate().await?; |
| 470 | |
| 471 | self.request_repository |
| 472 | .save_modified(&mut request, next_time()); |
| 473 | |
| 474 | if let Some(evaluation) = maybe_evaluation { |
| 475 | self.evaluation_result_repository |
| 476 | .insert(request.id, evaluation); |
| 477 | } |
| 478 | |
| 479 | if request.status == RequestStatus::Rejected { |
| 480 | self.rejected_request_hook(&request).await; |
| 481 | } |
| 482 | |
| 483 | Ok(request) |
| 484 | } |
| 485 | |
| 486 | pub fn complete_request(&self, mut request: Request, request_completed_time: u64) { |
| 487 | request.status = RequestStatus::Completed { |
no test coverage detected