48 lines
1.5 KiB
C#
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());
|
|
}
|
|
}
|