using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using QMax.Api.Data; using QMax.Api.Data.Entities; using QMax.Api.Infrastructure.Auth; namespace QMax.Api.Controllers; [ApiController] [Authorize] [Route("api/push")] public sealed class PushController(QMaxDbContext db) : ControllerBase { public sealed record RegisterPushDeviceRequest(string FirebaseToken, string Platform); [HttpPost("devices")] public async Task Register(RegisterPushDeviceRequest request, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(request.FirebaseToken)) { return BadRequest("firebaseToken is required."); } var userId = User.GetUserId(); var device = await db.PushDevices.FirstOrDefaultAsync(x => x.FirebaseToken == request.FirebaseToken, cancellationToken); if (device is null) { device = new PushDevice { FirebaseToken = request.FirebaseToken }; db.PushDevices.Add(device); } device.UserId = userId; device.Platform = string.IsNullOrWhiteSpace(request.Platform) ? "android" : request.Platform; device.UpdatedAt = DateTimeOffset.UtcNow; await db.SaveChangesAsync(cancellationToken); return NoContent(); } [HttpDelete("devices/{id:guid}")] public async Task Delete(Guid id, CancellationToken cancellationToken) { var userId = User.GetUserId(); var device = await db.PushDevices.FirstOrDefaultAsync(x => x.Id == id && x.UserId == userId, cancellationToken); if (device is null) { return NotFound(); } db.PushDevices.Remove(device); await db.SaveChangesAsync(cancellationToken); return NoContent(); } }