60 private readonly IMediator _mediator;
66 [HttpGet(
"{id:guid}")]
67 [ProducesResponseType(
typeof(
TaskDto), StatusCodes.Status200OK)]
68 [ProducesResponseType(
typeof(ProblemDetails), StatusCodes.Status404NotFound)]
69 public async Task<ActionResult<TaskDto>>
GetById(
71 CancellationToken cancellationToken)
73 var result = await _mediator.Send(
75 cancellationToken).ConfigureAwait(
false);
79 return Ok(result.Value);
82 return result.Errors.Any(error => error.Contains(
"not found", StringComparison.OrdinalIgnoreCase))
83 ? NotFound(CreateProblemDetails(result.Errors))
84 : BadRequest(CreateProblemDetails(result.Errors));
89 [ProducesResponseType(
typeof(Guid), StatusCodes.Status201Created)]
90 [ProducesResponseType(
typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
91 public async Task<ActionResult<Guid>>
Create(
93 CancellationToken cancellationToken)
102 var result = await _mediator.Send(command, cancellationToken).ConfigureAwait(
false);
104 if (result.IsSuccess)
106 return CreatedAtAction(
114 return BadRequest(CreateValidationProblemDetails(result.Errors));
117 [HttpPost(
"{id:guid}/complete")]
119 [ProducesResponseType(StatusCodes.Status204NoContent)]
120 [ProducesResponseType(
typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
123 CancellationToken cancellationToken)
125 var result = await _mediator.Send(
127 cancellationToken).ConfigureAwait(
false);
129 if (result.IsSuccess)
134 return BadRequest(CreateProblemDetails(result.Errors));
137 private static ProblemDetails CreateProblemDetails(IReadOnlyList<string> errors)
139 return new ProblemDetails {
140 Title =
"Request failed",
141 Detail =
string.Join(
"; ", errors),
142 Status = StatusCodes.Status400BadRequest
146 private static ValidationProblemDetails CreateValidationProblemDetails(
147 IReadOnlyList<string> errors)
149 return new ValidationProblemDetails(
153 Title =
"Validation failed",
154 Status = StatusCodes.Status400BadRequest
158 private static Guid GetUserId(ClaimsPrincipal user)
161 var candidateValues = user.Claims
163 c.Type == ClaimTypes.NameIdentifier ||
165 c.Type ==
"nameid" ||
169 .Select(c => c.Value);
171 foreach (var candidate
in candidateValues)
173 if (Guid.TryParse(candidate, out var parsedUserId))
179 throw new InvalidOperationException(
"The current user does not have a valid GUID user id claim.");