Handler.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Application.Helpers;
  4. using Domain.Entities.Developers;
  5. using Microsoft.EntityFrameworkCore;
  6. using SharedKernel.Results;
  7. namespace Application.Features.Api.Developers.Apps.RotateSecret;
  8. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result<Response>>
  9. {
  10. public async Task<Result<Response>> Handle(Command request, CancellationToken ct)
  11. {
  12. var app = await db.ApiApplication
  13. .Where(c => c.ID == request.AppID && c.OwnerMemberID == request.OwnerMemberID)
  14. .FirstOrDefaultAsync(ct);
  15. if (app is null)
  16. {
  17. return Result.Failure<Response>(Error.NotFound("App.NotFound", "App not found."));
  18. }
  19. var oldCreds = await db.ApiCredential
  20. .AsTracking()
  21. .Where(c => c.ApplicationID == app.ID && c.RevokedAt == null)
  22. .ToListAsync(ct);
  23. foreach (var c in oldCreds)
  24. {
  25. c.Revoke();
  26. }
  27. var newClientID = ApiTokenGenerator.GenerateClientID();
  28. var newSecret = ApiTokenGenerator.GenerateClientSecret();
  29. var credential = ApiCredential.Create(app.ID, newClientID, ApiTokenGenerator.Hash(newSecret), ApiTokenGenerator.Hint(newSecret));
  30. await db.ApiCredential.AddAsync(credential, ct);
  31. await db.SaveChangesAsync(ct);
  32. return Result.Success(new Response(newClientID, newSecret));
  33. }
  34. }