using Foxchat.Core; using Foxchat.Core.Models; using Foxchat.Identity.Database; using Foxchat.Identity.Database.Models; using Foxchat.Identity.Middleware; using Foxchat.Identity.Utils; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; namespace Foxchat.Identity.Controllers; [ApiController] [ClientAuthenticate] [Route("/_fox/ident/users")] public class UsersController(ILogger logger, InstanceConfig config, IdentityContext db) : ControllerBase { [HttpGet("{id}")] public async Task GetUser(Ulid id) { var user = await db.Accounts.FirstOrDefaultAsync(a => a.Id == id); if (user == null) throw new ApiError.NotFound("User not found."); return Ok(new Users.User(user.Id.ToString(), user.Username, config.Domain, null)); } [HttpGet("@me")] [Authorize("identify")] public IActionResult GetMe() { var acct = HttpContext.GetAccountOrThrow(); var token = HttpContext.GetToken()!; var showEmail = token.Scopes.ExpandScopes().Contains("email"); return Ok(new MeUser( acct.Id, acct.Username, acct.Role, null, showEmail ? acct.Email : null )); } public record MeUser( Ulid Id, string Username, Account.AccountRole Role, string? AvatarUrl, [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] string? Email ); }