yavsc/src/Api/Controllers/accounting/AccountController.cs

201 lines
6.8 KiB
C#
Raw Normal View History

2023-03-19 17:57:55 +00:00
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
2016-11-04 12:18:15 +01:00
using System.Security.Claims;
2023-03-20 19:38:50 +00:00
using Microsoft.EntityFrameworkCore;
using Yavsc.Models;
using Yavsc.Models.Account;
using Yavsc.ViewModels.Account;
using Yavsc.Helpers;
using Yavsc.Abstract.Identity;
2025-02-08 20:06:24 +00:00
using System.Diagnostics;
2016-05-17 18:22:18 +02:00
namespace Yavsc.WebApi.Controllers
{
2025-02-09 16:57:10 +00:00
[Route("~/api/account")]
[Authorize("ApiScope")]
2016-05-17 18:22:18 +02:00
public class ApiAccountController : Controller
{
private UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
2020-10-09 19:35:39 +01:00
readonly ApplicationDbContext _dbContext;
private readonly ILogger _logger;
2016-05-17 18:22:18 +02:00
public ApiAccountController(UserManager<ApplicationUser> userManager,
2025-02-09 16:57:10 +00:00
SignInManager<ApplicationUser> signInManager,
RoleManager<IdentityRole> roleManager,
ILoggerFactory loggerFactory, ApplicationDbContext dbContext)
2016-05-17 18:22:18 +02:00
{
UserManager = userManager;
2025-02-09 16:57:10 +00:00
this.roleManager = roleManager;
2016-05-17 18:22:18 +02:00
_signInManager = signInManager;
2025-02-12 20:41:14 +00:00
_logger = loggerFactory.CreateLogger(nameof(ApiAccountController));
2018-01-15 14:09:19 +01:00
_dbContext = dbContext;
2016-05-17 18:22:18 +02:00
}
public UserManager<ApplicationUser> UserManager
{
get
{
return _userManager;
}
private set
{
_userManager = value;
}
}
2025-02-09 16:57:10 +00:00
private readonly RoleManager<IdentityRole> roleManager;
2016-05-17 18:22:18 +02:00
// POST api/Account/ChangePassword
2025-02-09 16:57:10 +00:00
public async Task<IActionResult> ChangePassword(ChangePasswordBindingModel model)
2016-05-17 18:22:18 +02:00
{
if (!ModelState.IsValid)
{
return new BadRequestObjectResult(ModelState);
}
var user = await _userManager.FindByIdAsync(User.GetUserId());
if (user == null || !(await _userManager.IsEmailConfirmedAsync(user))) {
IdentityResult result = await UserManager.ChangePasswordAsync(user, model.OldPassword,
model.NewPassword);
if (!result.Succeeded)
{
2016-09-23 12:25:34 +02:00
AddErrors("NewPassword",result);
2016-05-17 18:22:18 +02:00
return new BadRequestObjectResult(ModelState);
}
}
return Ok();
}
// POST api/Account/SetPassword
2025-02-08 21:58:23 +00:00
2016-05-17 18:22:18 +02:00
public async Task<IActionResult> SetPassword(SetPasswordBindingModel model)
{
if (!ModelState.IsValid)
{
return new BadRequestObjectResult(ModelState);
}
var user = await _userManager.FindByIdAsync(User.GetUserId());
if (user == null || !(await _userManager.IsEmailConfirmedAsync(user))) {
IdentityResult result = await UserManager.AddPasswordAsync(user, model.NewPassword);
if (!result.Succeeded)
{
2016-09-23 12:25:34 +02:00
AddErrors ("NewPassword",result);
2016-05-17 18:22:18 +02:00
return new BadRequestObjectResult(ModelState);
}
}
return Ok();
}
// POST api/Account/Register
[AllowAnonymous]
2019-10-08 23:41:19 +01:00
public async Task<IActionResult> Register(RegisterModel model)
2016-05-17 18:22:18 +02:00
{
if (!ModelState.IsValid)
{
return new BadRequestObjectResult(ModelState);
}
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
2016-09-23 12:25:34 +02:00
AddErrors ("Register",result);
2016-05-17 18:22:18 +02:00
return new BadRequestObjectResult(ModelState);
}
await _signInManager.SignInAsync(user, isPersistent: false);
return Ok();
}
2016-09-23 12:25:34 +02:00
private void AddErrors(string key, IdentityResult result)
2016-05-17 18:22:18 +02:00
{
foreach (var error in result.Errors)
{
2016-09-23 12:25:34 +02:00
ModelState.AddModelError(key, error.Description);
2016-05-17 18:22:18 +02:00
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
UserManager.Dispose();
}
base.Dispose(disposing);
}
2025-02-09 16:57:10 +00:00
[HttpGet("me")]
public async Task<IActionResult> Me()
2016-06-10 03:00:24 +02:00
{
2016-06-13 13:33:32 +02:00
if (User==null)
return new BadRequestObjectResult(
new { error = "user not found" });
2025-02-09 16:57:10 +00:00
var uid = User.GetUserId();
2018-01-15 14:09:19 +01:00
var userData = await _dbContext.Users
.Include(u=>u.PostalAddress)
.Include(u=>u.AccountBalance)
.FirstAsync(u=>u.Id == uid);
2018-07-21 16:15:54 +02:00
var user = new Yavsc.Models.Auth.Me(userData.Id, userData.UserName, userData.Email,
userData.Avatar ,
userData.PostalAddress, userData.DedicatedGoogleCalendar );
2018-01-15 14:09:19 +01:00
2025-02-09 16:57:10 +00:00
var userRoles = _dbContext.UserRoles.Where(u=>u.UserId == uid).Select(r => r.RoleId).ToArray();
2018-01-15 14:09:19 +01:00
2025-02-09 16:57:10 +00:00
IdentityRole [] roles = _dbContext.Roles.Where(r=>userRoles.Contains(r.Id)).ToArray();
2018-01-15 14:09:19 +01:00
user.Roles = roles.Select(r=>r.Name).ToArray();
2016-06-25 21:05:28 +02:00
return Ok(user);
2016-06-10 03:00:24 +02:00
}
2016-11-30 16:44:29 +01:00
2025-02-12 20:41:14 +00:00
[HttpGet("myhost")]
2019-07-21 02:39:57 +02:00
public IActionResult MyHost ()
2017-02-01 03:50:44 +01:00
{
2019-07-21 02:39:57 +02:00
return Ok(new { host = Request.ForHost() });
2017-02-01 03:50:44 +01:00
}
2016-12-01 17:34:29 +01:00
/// <summary>
/// Actually only updates the user's name.
/// </summary>
/// <param name="me">MyUpdate containing the new user name </param>
/// <returns>Ok when all is ok.</returns>
2025-02-12 20:41:14 +00:00
[HttpPut("me")]
public async Task<IActionResult> UpdateMe(UserInfo me)
2016-09-23 12:25:34 +02:00
{
2016-12-01 17:34:29 +01:00
if (!ModelState.IsValid) return new BadRequestObjectResult(
new { error = "Specify some valid user update request." });
2016-09-23 12:25:34 +02:00
var user = await _userManager.FindByIdAsync(User.GetUserId());
2016-12-01 17:34:29 +01:00
var result = await _userManager.SetUserNameAsync(user, me.UserName);
if (result.Succeeded)
return Ok();
else return new BadRequestObjectResult(result);
2016-09-23 12:25:34 +02:00
}
2016-12-01 17:34:29 +01:00
/// <summary>
/// Updates the avatar
/// </summary>
/// <returns></returns>
2025-02-08 21:58:23 +00:00
[HttpPost("~/api/setavatar")]
2016-11-30 16:44:29 +01:00
public async Task<IActionResult> SetAvatar()
{
var root = User.InitPostToFileSystem(null);
var user = await _userManager.FindByIdAsync(User.GetUserId());
if (Request.Form.Files.Count!=1)
return new BadRequestResult();
2016-12-01 17:34:29 +01:00
var info = user.ReceiveAvatar(Request.Form.Files[0]);
2016-11-30 16:44:29 +01:00
await _userManager.UpdateAsync(user);
return Ok(info);
}
2025-02-15 18:40:22 +00:00
[HttpGet("identity")]
public async Task<IActionResult> Identity()
{
return Json(User.Claims.Select(c=>new {c.Type, c.Value}));
}
2016-05-17 18:22:18 +02:00
}
}