using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Domain.Entities.Developers; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Admin.Developers.OverrideRateLimit; internal sealed class Handler(IAppDbContext db) : ICommandHandler { public async Task Handle(Command request, CancellationToken ct) { if (request.LimitPerMinute <= 0 || request.LimitPerMinute > 100000) { return Result.Failure(Error.Problem("RateLimit.Invalid", "LimitPerMinute must be 1-100000.")); } var appExists = await db.ApiApplication.AnyAsync(c => c.ID == request.AppID, ct); if (!appExists) { return Result.Failure(Error.NotFound("App.NotFound", "App not found.")); } var existing = await db.ApiRateLimit .AsTracking() .FirstOrDefaultAsync(c => c.ApplicationID == request.AppID, ct); if (existing is null) { await db.ApiRateLimit.AddAsync(ApiRateLimit.Create(request.AppID, request.LimitPerMinute), ct); } else { existing.SetLimit(request.LimitPerMinute); } await db.SaveChangesAsync(ct); return Result.Success(); } }