DelphiniumVC
98 строк · 2.9 Кб
1using System.Security.Claims;
2using API.DTOs;
3using API.Services;
4using Domain;
5using Microsoft.AspNetCore.Authorization;
6using Microsoft.AspNetCore.Identity;
7using Microsoft.AspNetCore.Mvc;
8using Microsoft.EntityFrameworkCore;
9
10namespace API.Controllers
11{
12[ApiController]
13[Route("api/[controller]")]
14public class AccountController : ControllerBase
15{
16public UserManager<AppUser> _userManager;
17private readonly TokenService _tokenService;
18public AccountController(UserManager<AppUser> userManager, TokenService tokenService)
19{
20_tokenService = tokenService;
21_userManager = userManager;
22
23}
24
25[AllowAnonymous]
26[HttpPost("login")]
27public async Task<ActionResult<UserDto>> Login(LoginDto loginDto)
28{
29var user = await _userManager.Users.Include(p => p.Photos)
30.FirstOrDefaultAsync(x => x.Email == loginDto.Email);
31
32if (user == null) return Unauthorized();
33
34var result = await _userManager.CheckPasswordAsync(user, loginDto.Password);
35
36if (result)
37{
38return CreateUserObject(user);
39}
40
41return Unauthorized();
42}
43
44[AllowAnonymous]
45[HttpPost("register")]
46public async Task<ActionResult<UserDto>> Register(RegisterDto registerDto)
47{
48if (await _userManager.Users.AnyAsync(x => x.UserName == registerDto.Username))
49{
50ModelState.AddModelError("username","Username taken");
51return ValidationProblem();
52}
53
54if (await _userManager.Users.AnyAsync(x => x.Email == registerDto.Email))
55{
56ModelState.AddModelError("email","Email taken");
57return ValidationProblem();
58}
59
60var user = new AppUser
61{
62DisplayName = registerDto.DisplayName,
63Email = registerDto.Email,
64UserName = registerDto.Username
65};
66
67var result = await _userManager.CreateAsync(user, registerDto.Password);
68
69if (result.Succeeded)
70{
71return CreateUserObject(user);
72}
73
74return BadRequest(result.Errors);
75}
76
77[Authorize]
78[HttpGet]
79public async Task<ActionResult<UserDto>> GetCurrentUser()
80{
81var user = await _userManager.Users.Include(p => p.Photos)
82.FirstOrDefaultAsync(x => x.Email == User.FindFirstValue(ClaimTypes.Email));
83
84return CreateUserObject(user);
85}
86
87private UserDto CreateUserObject(AppUser user)
88{
89return new UserDto
90{
91DisplayName = user.DisplayName,
92Image = user?.Photos?.FirstOrDefault(x => x.IsMain)?.Url,
93Token = _tokenService.CreateToken(user),
94Username = user.UserName
95};
96}
97}
98}