using System.Linq; using System.Threading.Tasks; using API.Data.Misc; using API.Entities; using API.Entities.Enums; using Microsoft.EntityFrameworkCore; namespace API.Extensions; public static class QueryableExtensions { public static IQueryable RestrictAgainstAgeRestriction(this IQueryable queryable, AgeRestriction restriction) { if (restriction.AgeRating == AgeRating.NotApplicable) return queryable; var q = queryable.Where(s => s.Metadata.AgeRating <= restriction.AgeRating); if (!restriction.IncludeUnknowns) { return q.Where(s => s.Metadata.AgeRating != AgeRating.Unknown); } return q; } public static IQueryable RestrictAgainstAgeRestriction(this IQueryable queryable, AgeRestriction restriction) { if (restriction.AgeRating == AgeRating.NotApplicable) return queryable; if (restriction.IncludeUnknowns) { return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating)); } return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating && sm.AgeRating > AgeRating.Unknown)); } public static IQueryable RestrictAgainstAgeRestriction(this IQueryable queryable, AgeRestriction restriction) { if (restriction.AgeRating == AgeRating.NotApplicable) return queryable; if (restriction.IncludeUnknowns) { return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating)); } return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating && sm.AgeRating > AgeRating.Unknown)); } public static IQueryable RestrictAgainstAgeRestriction(this IQueryable queryable, AgeRestriction restriction) { if (restriction.AgeRating == AgeRating.NotApplicable) return queryable; if (restriction.IncludeUnknowns) { return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating)); } return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating && sm.AgeRating > AgeRating.Unknown)); } public static IQueryable RestrictAgainstAgeRestriction(this IQueryable queryable, AgeRestriction restriction) { if (restriction.AgeRating == AgeRating.NotApplicable) return queryable; if (restriction.IncludeUnknowns) { return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating)); } return queryable.Where(c => c.SeriesMetadatas.All(sm => sm.AgeRating <= restriction.AgeRating && sm.AgeRating > AgeRating.Unknown)); } public static IQueryable RestrictAgainstAgeRestriction(this IQueryable queryable, AgeRestriction restriction) { if (restriction.AgeRating == AgeRating.NotApplicable) return queryable; var q = queryable.Where(rl => rl.AgeRating <= restriction.AgeRating); if (!restriction.IncludeUnknowns) { return q.Where(rl => rl.AgeRating != AgeRating.Unknown); } return q; } public static Task GetUserAgeRestriction(this DbSet queryable, int userId) { if (userId < 1) { return Task.FromResult(new AgeRestriction() { AgeRating = AgeRating.NotApplicable, IncludeUnknowns = true }); } return queryable .AsNoTracking() .Where(u => u.Id == userId) .Select(u => new AgeRestriction(){ AgeRating = u.AgeRestriction, IncludeUnknowns = u.AgeRestrictionIncludeUnknowns }) .SingleAsync(); } }