Creates a new request adding the caller user as the requester. By default, the request has an expiration date of 7 days from the creation date.
(
&self,
input: CreateRequestInput,
ctx: &CallContext,
)
| 322 | /// |
| 323 | /// By default, the request has an expiration date of 7 days from the creation date. |
| 324 | pub async fn create_request( |
| 325 | &self, |
| 326 | input: CreateRequestInput, |
| 327 | ctx: &CallContext, |
| 328 | ) -> ServiceResult<Request> { |
| 329 | let requester = self.user_service.get_user_by_identity(&ctx.caller())?; |
| 330 | let mut request = RequestFactory::create_request(requester.id, input).await?; |
| 331 | |
| 332 | // Different request types may have different validation rules. |
| 333 | request.validate()?; |
| 334 | |
| 335 | // Insert the request into the repository before adding approvals so checks that depend on the |
| 336 | // request being in the repository pass. |
| 337 | self.request_repository |
| 338 | .insert(request.to_key(), request.to_owned()); |
| 339 | |
| 340 | if request.can_approve(&requester.id) { |
| 341 | request.add_approval(requester.id, RequestApprovalStatus::Approved, None)?; |
| 342 | } |
| 343 | |
| 344 | // When a request is created, it is immediately evaluated to determine its status. |
| 345 | // This is done because the request may be immediately rejected or approved based on the policies. |
| 346 | let maybe_evaluation = request.reevaluate().await?; |
| 347 | |
| 348 | self.request_repository |
| 349 | .insert(request.to_key(), request.to_owned()); |
| 350 | |
| 351 | if let Some(evaluation) = maybe_evaluation { |
| 352 | self.evaluation_result_repository |
| 353 | .insert(request.id, evaluation); |
| 354 | } |
| 355 | |
| 356 | if request.status == RequestStatus::Created { |
| 357 | self.created_request_hook(&request).await; |
| 358 | } else if request.status == RequestStatus::Rejected { |
| 359 | self.rejected_request_hook(&request).await; |
| 360 | } |
| 361 | |
| 362 | Ok(request) |
| 363 | } |
| 364 | |
| 365 | async fn rejected_request_hook(&self, request: &Request) { |
| 366 | self.notification_service |