Из первых сырых решений — постобработчик, который выбрасывает премиум-данные, если у пользователя закончилась подписка.
Все контроллеры отвечают двумя наборами данных:
[SubscriptionFilter("Premium")]
[HttpGet("data")]
public IActionResult GetData()
{
var baseData = GetBaseData();
var premiumData = GetPremiumData();
return Ok(new { Base = baseData, Premium = premiumData });
}
На постобработке убираем лишнее после проверки подписки:
public class SubscriptionFilterAttribute : ResultFilterAttribute
{
private readonly string _requiredLevel;
public SubscriptionFilterAttribute(string requiredLevel)
{
_requiredLevel = requiredLevel;
}
public override void OnActionExecuted(ActionExecutedContext context)
{
var user = context.HttpContext.User;
if (user.HasSubscription)
{
return context.Result;
}
else
{
return new { Base = context.Result.Base };
}
}
}
Но у этого подхода есть понятный минус в том, что мы как бы делаем двойную работу, которая вообще не нужна.
Можно ещё скомбинировать подход – сделать предфильтр, который поймёт, нужно ли применять поиск по премиум-функциям, а потом постфильтр. А сам хэндлер, который всё это будет обрабатывать, обозначить IPremiumFunctionHandler, который будет заставлять реализовывать два разных варианта работы.
Поначалу я, конечно, это всё сделаю попроще на ифчиках. Но, короче, хотел поделиться, вдруг тут есть кто решал похожую проблему и знает, что да как)