DelphiniumVC

Форк
0
/
AccountController.cs 
98 строк · 2.9 Кб
1
using System.Security.Claims;
2
using API.DTOs;
3
using API.Services;
4
using Domain;
5
using Microsoft.AspNetCore.Authorization;
6
using Microsoft.AspNetCore.Identity;
7
using Microsoft.AspNetCore.Mvc;
8
using Microsoft.EntityFrameworkCore;
9

10
namespace API.Controllers
11
{
12
    [ApiController]
13
    [Route("api/[controller]")]
14
    public class AccountController : ControllerBase
15
    {
16
        public UserManager<AppUser> _userManager;
17
        private readonly TokenService _tokenService;
18
        public AccountController(UserManager<AppUser> userManager, TokenService tokenService)
19
        {
20
            _tokenService = tokenService;
21
            _userManager = userManager;
22
            
23
        }
24

25
        [AllowAnonymous]
26
        [HttpPost("login")]
27
        public async Task<ActionResult<UserDto>> Login(LoginDto loginDto)
28
        {
29
            var user = await _userManager.Users.Include(p => p.Photos)
30
                .FirstOrDefaultAsync(x => x.Email == loginDto.Email);
31

32
            if (user == null) return Unauthorized();
33

34
            var result = await _userManager.CheckPasswordAsync(user, loginDto.Password);
35

36
            if (result)
37
            {
38
                return CreateUserObject(user);
39
            }
40

41
            return Unauthorized();
42
        }
43

44
        [AllowAnonymous]
45
        [HttpPost("register")]
46
        public async Task<ActionResult<UserDto>> Register(RegisterDto registerDto)
47
        {
48
            if (await _userManager.Users.AnyAsync(x => x.UserName == registerDto.Username))
49
            {
50
                ModelState.AddModelError("username","Username taken");
51
                return ValidationProblem();
52
            }
53

54
            if (await _userManager.Users.AnyAsync(x => x.Email == registerDto.Email))
55
            {
56
                ModelState.AddModelError("email","Email taken");
57
                return ValidationProblem();
58
            }
59

60
            var user = new AppUser
61
            {
62
                DisplayName = registerDto.DisplayName,
63
                Email = registerDto.Email,
64
                UserName = registerDto.Username
65
            };
66

67
            var result = await _userManager.CreateAsync(user, registerDto.Password);
68

69
            if (result.Succeeded)
70
            {
71
                  return CreateUserObject(user);
72
            }
73

74
            return BadRequest(result.Errors);
75
        }
76

77
        [Authorize]
78
        [HttpGet]
79
        public async Task<ActionResult<UserDto>> GetCurrentUser()
80
        {
81
            var user = await _userManager.Users.Include(p => p.Photos)
82
                .FirstOrDefaultAsync(x => x.Email == User.FindFirstValue(ClaimTypes.Email));
83

84
            return CreateUserObject(user);
85
        }
86

87
        private UserDto CreateUserObject(AppUser user)
88
        {
89
            return new UserDto
90
            {
91
                DisplayName = user.DisplayName,
92
                Image = user?.Photos?.FirstOrDefault(x => x.IsMain)?.Url,
93
                Token = _tokenService.CreateToken(user),
94
                Username = user.UserName
95
            };
96
        }
97
    }
98
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.