< Summary

Information
Class: LGDXRobotCloud.API.Areas.Identity.Controllers.UserController
Assembly: LGDXRobotCloud.API
File(s): /builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Areas/Identity/Controllers/UserController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 47
Coverable lines: 47
Total lines: 106
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 4
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)0%2040%
GetUser()0%620%
UpdateUser()0%620%
UpdatePassword()0%620%
InitiateTwoFactor()0%620%
EnableTwoFactor()0%620%
ResetRecoveryCodes()0%620%
DisableTwoFactor()0%620%

File(s)

/builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Areas/Identity/Controllers/UserController.cs

#LineLine coverage
 1using System.Security.Claims;
 2using LGDXRobotCloud.API.Services.Identity;
 3using LGDXRobotCloud.Data.Models.Business.Administration;
 4using LGDXRobotCloud.Data.Models.Business.Identity;
 5using LGDXRobotCloud.Data.Models.DTOs.V1.Commands;
 6using LGDXRobotCloud.Data.Models.DTOs.V1.Requests;
 7using LGDXRobotCloud.Data.Models.DTOs.V1.Responses;
 8using LGDXRobotCloud.Utilities.Constants;
 9using Microsoft.AspNetCore.Authentication.JwtBearer;
 10using Microsoft.AspNetCore.Authorization;
 11using Microsoft.AspNetCore.Mvc;
 12
 13namespace LGDXRobotCloud.API.Areas.Identity.Controllers;
 14
 15[ApiController]
 16[Area("Identity")]
 17[Route("[area]/[controller]")]
 18[Authorize(AuthenticationSchemes = LgdxRobotCloudAuthenticationSchemes.ApiKeyOrCertificationScheme)]
 19[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
 020public sealed class UserController(
 021    IAuthService authService,
 022    ICurrentUserService currentUserService
 023  ) : ControllerBase
 24{
 025  private readonly IAuthService _authService = authService ?? throw new ArgumentNullException(nameof(authService));
 026  private readonly ICurrentUserService _currentUserService = currentUserService ?? throw new ArgumentNullException(nameo
 27
 28  [HttpGet("")]
 29  [ProducesResponseType(typeof(LgdxUserDto), StatusCodes.Status200OK)]
 30  [ProducesResponseType(StatusCodes.Status404NotFound)]
 31  public async Task<ActionResult<LgdxUserDto>> GetUser()
 032  {
 033    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 034    var user = await _currentUserService.GetUserAsync(userId!);
 035    return Ok(user.ToDto());
 036  }
 37
 38  [HttpPut("")]
 39  [ProducesResponseType(typeof(LgdxUserDto), StatusCodes.Status204NoContent)]
 40  [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
 41  [ProducesResponseType(StatusCodes.Status404NotFound)]
 42  public async Task<ActionResult> UpdateUser(LgdxUserUpdateDto lgdxUserUpdateDto)
 043  {
 044    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 045    await _currentUserService.UpdateUserAsync(userId!, lgdxUserUpdateDto.ToBusinessModel());
 046    return NoContent();
 047  }
 48
 49  [HttpPost("Password")]
 50  [ProducesResponseType(typeof(LgdxUserDto), StatusCodes.Status204NoContent)]
 51  [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
 52  [ProducesResponseType(StatusCodes.Status404NotFound)]
 53  public async Task<ActionResult> UpdatePassword(UpdatePasswordRequestDto updatePasswordRequestDto)
 054  {
 055    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 056    await _authService.UpdatePasswordAsync(userId!, updatePasswordRequestDto.ToBusinessModel());
 057    return NoContent();
 058  }
 59
 60  [HttpPost("2FA/Initiate")]
 61  [ProducesResponseType(typeof(InitiateTwoFactorResponseDto), StatusCodes.Status200OK)]
 62  [ProducesResponseType(StatusCodes.Status404NotFound)]
 63  public async Task<ActionResult<InitiateTwoFactorResponseDto>> InitiateTwoFactor()
 064  {
 065    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 066    var respond = await _currentUserService.InitiateTwoFactorAsync(userId!);
 067    return Ok(new InitiateTwoFactorResponseDto {
 068      SharedKey = respond
 069    });
 070  }
 71
 72  [HttpPost("2FA/Enable")]
 73  [ProducesResponseType(typeof(EnableTwoFactorRespondDto), StatusCodes.Status200OK)]
 74  [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
 75  [ProducesResponseType(StatusCodes.Status404NotFound)]
 76  public async Task<ActionResult<EnableTwoFactorRespondDto>> EnableTwoFactor(EnableTwoFactorRequestDto enableTwoFactorRe
 077  {
 078    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 079    var respond = await _currentUserService.EnableTwoFactorAsync(userId!, enableTwoFactorRequestDto.TwoFactorCode);
 080    return Ok(new EnableTwoFactorRespondDto {
 081      RecoveryCodes = respond
 082    });
 083  }
 84
 85  [HttpPost("2FA/Reset")]
 86  [ProducesResponseType(typeof(ResetRecoveryCodesRespondDto), StatusCodes.Status200OK)]
 87  [ProducesResponseType(StatusCodes.Status404NotFound)]
 88  public async Task<ActionResult<ResetRecoveryCodesRespondDto>> ResetRecoveryCodes()
 089  {
 090    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 091    var respond = await _currentUserService.ResetRecoveryCodesAsync(userId!);
 092    return Ok(new ResetRecoveryCodesRespondDto {
 093      RecoveryCodes = respond
 094    });
 095  }
 96
 97  [HttpPost("2FA/Disable")]
 98  [ProducesResponseType(StatusCodes.Status200OK)]
 99  [ProducesResponseType(StatusCodes.Status404NotFound)]
 100  public async Task<ActionResult> DisableTwoFactor()
 0101  {
 0102    var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
 0103    await _currentUserService.DisableTwoFactorAsync(userId!);
 0104    return Ok();
 0105  }
 106}