1
0

135 lines
4.4 KiB
C#

using Flawless.Communication.Request;
using Flawless.Communication.Response;
using Flawless.Communication.Shared;
using Flawless.Server.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace Flawless.Server.Controllers;
[ApiController, Authorize, Route("api/user")]
public class UserController(
UserManager<AppUser> userManager
) : ControllerBase
{
[HttpPost("update_info")]
public async Task<IActionResult> UpdateUserInfoAsync(UserInfoModifyResponse r)
{
bool update = false;
bool renew = false;
// Modify content
var u = (await userManager.GetUserAsync(HttpContext.User))!;
if (r.NickName != null)
{
update = true;
u.NickName = r.NickName;
}
if (r.Bio != null)
{
update = true;
u.Bio = r.Bio;
}
if (r.Gender != null)
{
update = true;
u.Gender = r.Gender ?? UserSex.Unset;
}
if (r.PublicEmail != null)
{
update = true;
u.PublicEmail = r.PublicEmail ?? false;
}
if (renew) u.RenewSecurityStamp();
if (update || renew) await userManager.UpdateAsync(u);
return Ok();
}
[HttpPost("update_email")]
public async Task<IActionResult> UpdateEmailAsync(UserContactModifyResponse r)
{
if (string.IsNullOrWhiteSpace(r.Email))
return BadRequest(new FailedResponse("No valid email address provided!"));
var u = (await userManager.GetUserAsync(HttpContext.User))!;
var result = await userManager.SetEmailAsync(u, r.Email);
if (!result.Succeeded) return BadRequest(new FailedResponse(result.Errors));
return Ok();
}
[HttpPost("update_phone")]
public async Task<IActionResult> UpdatePhoneAsync(UserContactModifyResponse r)
{
if (string.IsNullOrWhiteSpace(r.Phone))
return BadRequest(new FailedResponse("No valid phone number provided!"));
var u = (await userManager.GetUserAsync(HttpContext.User))!;
var result = await userManager.SetPhoneNumberAsync(u, r.Phone);
if (!result.Succeeded) return BadRequest(new FailedResponse(result.Errors));
return Ok();
}
[HttpGet("get_info")]
public async Task<ActionResult<UserInfoResponse>> GetUserInfoAsync([FromQuery] string username)
{
var self = (await userManager.GetUserAsync(HttpContext.User))!;
if (string.IsNullOrWhiteSpace(username)) return Ok(GetUserInfoInternal(self, self));
var u = await userManager.FindByNameAsync(username);
if (u == null) return BadRequest(new FailedResponse("User is not existed!"));
return Ok(GetUserInfoInternal(u, self));
}
[HttpGet("query_info")]
public async Task<ActionResult<ListingResponse<UserInfoResponse>>> QueryUserInfoAsync([FromQuery] string keyword)
{
var payload = await userManager.Users
.Where(u => u.UserName!.Contains(keyword) || (u.NickName != null && u.NickName.Contains(keyword)))
.Select(u => GetUserInfoInternal(u, null))
.ToArrayAsync();
// Return self as default
return Ok(new ListingResponse<UserInfoResponse>(payload));
}
[HttpGet("delete")]
public async Task<IActionResult> DeleteUserAsync()
{
var self = (await userManager.GetUserAsync(HttpContext.User))!;
await userManager.DeleteAsync(self);
return Ok();
}
private UserInfoResponse GetUserInfoInternal(AppUser queryUser, AppUser? currentUser)
{
var authorized = queryUser.Id == currentUser?.Id;
return new UserInfoResponse
{
Authorized = authorized,
Username = queryUser.UserName,
CreatedAt = queryUser.CreatedOn,
Bio = queryUser.Bio,
Gender = queryUser.Gender,
NickName = queryUser.NickName,
PublicEmail = authorized ? queryUser.PublicEmail : null,
Email = queryUser.PublicEmail || authorized ? queryUser.Email : null,
Phone = authorized ? queryUser.PhoneNumber : null,
IsAdmin = queryUser.Admin,
IsActive = queryUser.LockoutEnabled
};
}
}