ExpBoostService.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. using Application.Abstractions.Data;
  2. using Domain.Entities.Store.ValueObject;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Helpers;
  5. /// <summary>
  6. /// 경험치 부스터(ExpBooster) 활성 시 획득 XP 를 2배로. 모든 XP 지급처가 공유하는 공용 헬퍼.
  7. /// (현 시점 적용처: 출석. 향후 글/댓글 보상엔진 도입 시 동일 헬퍼 경유.)
  8. /// </summary>
  9. public static class ExpBoostService
  10. {
  11. public const int Multiplier = 2;
  12. public static async Task<bool> IsActiveAsync(IAppDbContext db, int memberID, DateTime nowUtc, CancellationToken ct)
  13. {
  14. var boosters = await db.MemberItem.AsNoTracking()
  15. .Where(x => x.MemberID == memberID && x.Kind == ItemKind.ExpBooster && x.UsedAt != null && x.RevokedAt == null)
  16. .Select(x => new { x.UsedAt, x.DurationDays })
  17. .ToListAsync(ct);
  18. return boosters.Any(b => b.UsedAt!.Value.AddDays(b.DurationDays) > nowUtc);
  19. }
  20. /// <summary>부스터 활성 시 baseExp × 2, 아니면 baseExp.</summary>
  21. public static async Task<int> ApplyAsync(IAppDbContext db, int memberID, int baseExp, DateTime nowUtc, CancellationToken ct)
  22. {
  23. if (baseExp <= 0)
  24. {
  25. return baseExp;
  26. }
  27. var active = await IsActiveAsync(db, memberID, nowUtc, ct);
  28. return active ? baseExp * Multiplier : baseExp;
  29. }
  30. }