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 userManager ) : ControllerBase { [HttpPost("update_info")] public async Task UpdateUserInfoAsync(UserInfoModifyResponse r) { bool update = false; bool renew = false; // Modify content var u = (await userManager.GetUserAsync(HttpContext.User))!; if (r.NickName != u.NickName) { update = true; u.NickName = r.NickName; } if (r.Bio != u.Bio) { update = true; u.Bio = r.Bio; } if (r.Gender != (int) u.Gender) { update = true; u.Gender = (UserSex) r.Gender; } if (r.PublicEmail != u.PublicEmail) { 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 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 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> 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>> 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(payload)); } [HttpGet("delete")] public async Task 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 }; } }