Files
Massenger/src/Massenger.Server/Controllers/UsersController.cs
2026-03-13 21:01:04 +03:00

48 lines
1.5 KiB
C#

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<ActionResult<UserSummaryDto>> 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<ActionResult<IReadOnlyList<UserSummaryDto>>> 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());
}
}