using Application.Abstractions.Data; using Domain.Entities.Developers; using Domain.Entities.Developers.ValueObject; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.EntityFrameworkCore; namespace Admin.Pages.Developers.Apps; public class DetailModel(IMediator mediator, IAppDbContext db) : PageModel { [BindProperty(SupportsGet = true)] public int ID { get; set; } public ApiApplication? App { get; set; } public List Credentials { get; set; } = []; public List Scopes { get; set; } = []; public int? RateLimitOverride { get; set; } [BindProperty] public int LimitPerMinute { get; set; } public async Task OnGetAsync(CancellationToken ct) { App = await db.ApiApplication .Include(c => c.Owner) .FirstOrDefaultAsync(c => c.ID == ID, ct); if (App is null) { return NotFound(); } Credentials = await db.ApiCredential .Where(c => c.ApplicationID == ID) .OrderByDescending(c => c.CreatedAt) .ToListAsync(ct); Scopes = await db.ApiApplicationScope .Where(c => c.ApplicationID == ID) .Select(c => c.Scope) .ToListAsync(ct); RateLimitOverride = await db.ApiRateLimit .Where(c => c.ApplicationID == ID) .Select(c => (int?)c.LimitPerMinute) .FirstOrDefaultAsync(ct); LimitPerMinute = RateLimitOverride ?? 60; return Page(); } public async Task OnPostApproveAsync(CancellationToken ct) { try { await mediator.Send(new Application.Features.Admin.Developers.ApproveApp.Command([ID]), ct); TempData["SuccessMessage"] = "앱이 승인되었습니다."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Developers/Apps/Detail", new { ID }); } public async Task OnPostSuspendAsync(CancellationToken ct) { try { await mediator.Send(new Application.Features.Admin.Developers.SuspendApp.Command([ID]), ct); TempData["SuccessMessage"] = "앱이 정지되었습니다."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Developers/Apps/Detail", new { ID }); } public async Task OnPostOverrideRateLimitAsync(CancellationToken ct) { var result = await mediator.Send(new Application.Features.Admin.Developers.OverrideRateLimit.Command(ID, LimitPerMinute), ct); if (result.IsSuccess) { TempData["SuccessMessage"] = $"Rate limit 를 {LimitPerMinute}/min 으로 설정했습니다."; } else { TempData["ErrorMessages"] = result.Error.Description; } return RedirectToPage("/Developers/Apps/Detail", new { ID }); } }