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