using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Massenger.Server.Data; using Massenger.Server.Infrastructure; using Massenger.Shared; namespace Massenger.Server.Controllers; [ApiController] [Authorize] [Route("api/[controller]")] public sealed class UsersController( MassengerDbContext dbContext, PresenceTracker presenceTracker) : ControllerBase { [HttpGet("me")] public async Task> GetMe(CancellationToken cancellationToken) { var userId = User.GetRequiredUserId(); var user = await dbContext.Users.SingleAsync(x => x.Id == userId, cancellationToken); return Ok(user.ToDto(presenceTracker)); } [HttpGet("search")] public async Task>> Search([FromQuery] string? q, CancellationToken cancellationToken) { var userId = User.GetRequiredUserId(); var query = q?.Trim(); var usersQuery = dbContext.Users.Where(x => x.Id != userId); if (!string.IsNullOrWhiteSpace(query)) { var normalized = query.ToUpperInvariant(); usersQuery = usersQuery.Where(x => x.NormalizedUsername.Contains(normalized) || EF.Functions.Like(x.DisplayName, $"%{query}%")); } var users = await usersQuery .OrderBy(x => x.DisplayName) .Take(25) .ToListAsync(cancellationToken); return Ok(users.Select(x => x.ToDto(presenceTracker)).ToList()); } }