Webiant Logo Webiant Logo
  1. No results found.

    Try your search with a different keyword or use * as a wildcard.

FilterLevelValueService.cs

using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.FilterLevels;
using Nop.Core.Domain.Localization;
using Nop.Data;
using Nop.Services.Catalog;
using Nop.Services.Security;
using Nop.Services.Stores;

namespace Nop.Services.FilterLevels;

/// 
/// Filter level value service
/// 
public partial class FilterLevelValueService : IFilterLevelValueService
{
    #region Fields

    protected readonly FilterLevelSettings _filterLevelSettings;
    protected readonly IAclService _aclService;
    protected readonly IRepository _filterLevelValueRepository;
    protected readonly IRepository _filterLevelValueProductMappingRepository;
    protected readonly IRepository _localizedPropertyRepository;
    protected readonly IRepository _productRepository;
    protected readonly IStoreMappingService _storeMappingService;
    protected readonly IWorkContext _workContext;

    #endregion

    #region Ctor

    public FilterLevelValueService(FilterLevelSettings filterLevelSettings,
        IAclService aclService,
        IRepository filterLevelValueRepository,
        IRepository filterLevelValueProductMappingRepository,
        IRepository localizedPropertyRepository,
        IRepository productRepository,
        IStoreMappingService storeMappingService,
        IWorkContext workContext)
    {
        _filterLevelSettings = filterLevelSettings;
        _aclService = aclService;
        _filterLevelValueRepository = filterLevelValueRepository;
        _filterLevelValueProductMappingRepository = filterLevelValueProductMappingRepository;
        _localizedPropertyRepository = localizedPropertyRepository;
        _productRepository = productRepository;
        _storeMappingService = storeMappingService;
        _workContext = workContext;
    }

    #endregion

    #region Methods

    /// 
    /// Check if filter levels are disabled
    /// 
    /// 
    /// Tuple of booleans indicating if filter levels 1, 2, and 3 are disabled
    /// 
    public virtual (bool filterLevel1, bool filterLevel2, bool filterLevel3) IsFilterLevelDisabled()
    {
        var filterLevelEnumDisabled = _filterLevelSettings.FilterLevelEnumDisabled;

        return (filterLevelEnumDisabled.Contains((int)FilterLevelEnum.FilterLevel1),
                filterLevelEnumDisabled.Contains((int)FilterLevelEnum.FilterLevel2),
                filterLevelEnumDisabled.Contains((int)FilterLevelEnum.FilterLevel3));
    }

    /// 
    /// Gets filter level values
    /// 
    /// Filter level 1 value
    /// Filter level 2 value
    /// Filter level 3 value
    /// Page index
    /// Page size
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level value list model
    /// 
    public virtual async Task> GetAllFilterLevelValuesAsync(string filterLevel1Value = null, string filterLevel2Value = null, string filterLevel3Value = null, int pageIndex = 0, int pageSize = int.MaxValue)
    {
        var (filterLevel1Disabled, filterLevel2Disabled, filterLevel3Disabled) = IsFilterLevelDisabled();

        return await _filterLevelValueRepository.GetAllPagedAsync(query =>
        {
            //filter by filter level 1 value
            if (!string.IsNullOrEmpty(filterLevel1Value) && filterLevel1Value != "0" && !filterLevel1Disabled)
                query = query.Where(pc => pc.FilterLevel1Value == filterLevel1Value);

            //filter by filter level 2 value
            if (!string.IsNullOrEmpty(filterLevel2Value) && filterLevel2Value != "0" && !filterLevel2Disabled)
                query = query.Where(pc => pc.FilterLevel2Value == filterLevel2Value);

            //filter by filter level 3 value
            if (!string.IsNullOrEmpty(filterLevel3Value) && filterLevel3Value != "0" && !filterLevel3Disabled)
                query = query.Where(pc => pc.FilterLevel3Value == filterLevel3Value);

            query = query
                .OrderBy(flv => flv.FilterLevel1Value)
                .ThenBy(flv => flv.FilterLevel2Value)
                .ThenBy(flv => flv.FilterLevel3Value);

            return query;
        }, pageIndex, pageSize);
    }

    /// 
    /// Inserts Filter level value
    /// 
    /// Filter level value
    /// A task that represents the asynchronous operation
    public virtual async Task InsertFilterLevelValueAsync(FilterLevelValue filterLevelValue)
    {
        await _filterLevelValueRepository.InsertAsync(filterLevelValue);
    }

    /// 
    /// Gets a filter level value
    /// 
    /// Filter level value identifier
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level value
    /// 
    public virtual async Task GetFilterLevelValueByIdAsync(int filterLevelValueId)
    {
        return await _filterLevelValueRepository.GetByIdAsync(filterLevelValueId);
    }

    /// 
    /// Gets filter level values by product identifier
    /// 
    /// Product identifier
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level values
    /// 
    public virtual async Task> GetFilterLevelValuesByProductIdAsync(int productId)
    {
        var query = from flv_map in _filterLevelValueProductMappingRepository.Table
                    join flv in _filterLevelValueRepository.Table on flv_map.FilterLevelValueId equals flv.Id
                    where flv_map.ProductId == productId
                    orderby flv.Id
                    select flv;

        return await  query.ToListAsync();
    }

    /// 
    /// Gets filter level values by identifier
    /// 
    /// Filter level value identifiers
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level values
    /// 
    public virtual async Task> GetFilterLevelValuesByIdsAsync(int[] filterLevelValueIds)
    {
        return await _filterLevelValueRepository.GetByIdsAsync(filterLevelValueIds, includeDeleted: false);
    }

    /// 
    /// Updates the filter level value
    /// 
    /// Filter level value
    /// A task that represents the asynchronous operation
    public virtual async Task UpdateFilterLevelValueAsync(FilterLevelValue filterLevelValue)
    {
        ArgumentNullException.ThrowIfNull(filterLevelValue);

        await _filterLevelValueRepository.UpdateAsync(filterLevelValue);
    }

    /// 
    /// Delete filter level value
    /// 
    /// Filter level value
    /// A task that represents the asynchronous operation
    public virtual async Task DeleteFilterLevelValueAsync(FilterLevelValue filterLevelValue)
    {
        await _filterLevelValueRepository.DeleteAsync(filterLevelValue);
    }

    /// 
    /// Delete filter level values
    /// 
    /// Filter level values
    /// A task that represents the asynchronous operation
    public virtual async Task DeleteFilterLevelValuesAsync(IList filterLevelValues)
    {
        ArgumentNullException.ThrowIfNull(filterLevelValues);

        await _filterLevelValueRepository.DeleteAsync(filterLevelValues);
    }

    #region Mapping

    /// 
    /// Gets products collection by filter level value identifier
    /// 
    /// Filter level value identifier
    /// Page index
    /// Page size
    /// Store identifier; 0 to load all records
    /// Order by
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the products collection
    /// 
    public virtual async Task> GetProductsByFilterLevelValueIdAsync(int filterLevelValueId,
        int pageIndex = 0, 
        int pageSize = int.MaxValue,
        int storeId = 0,
        ProductSortingEnum orderBy = ProductSortingEnum.Position)
    {
        if (filterLevelValueId == 0)
            return new PagedList(new List(), pageIndex, pageSize);

        var customer = await _workContext.GetCurrentCustomerAsync();

        var query = from pc in _filterLevelValueProductMappingRepository.Table
                    join p in _productRepository.Table on pc.ProductId equals p.Id
                    where pc.FilterLevelValueId == filterLevelValueId && !p.Deleted && p.Published && p.VisibleIndividually
                    orderby pc.Id
                    select p;

        //apply store mapping constraints
        query = await _storeMappingService.ApplyStoreMapping(query, storeId);

        //apply ACL constraints
        query = await _aclService.ApplyAcl(query, customer);

        return await query.OrderBy(_localizedPropertyRepository, await _workContext.GetWorkingLanguageAsync(), orderBy).ToPagedListAsync(pageIndex, pageSize);
    }

    /// 
    /// Gets filter level value product mapping collection
    /// 
    /// Filter level value identifier
    /// Page index
    /// Page size
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level value product mapping collection
    /// 
    public virtual async Task> GetFilterLevelValueProductsByFilterLevelValueIdAsync(int filterLevelValueId,
        int pageIndex = 0, int pageSize = int.MaxValue)
    {
        if (filterLevelValueId == 0)
            return new PagedList(new List(), pageIndex, pageSize);

        var query = from pc in _filterLevelValueProductMappingRepository.Table
                    join p in _productRepository.Table on pc.ProductId equals p.Id
                    where pc.FilterLevelValueId == filterLevelValueId && !p.Deleted
                    orderby pc.Id
                    select pc;

        return await query.ToPagedListAsync(pageIndex, pageSize);
    }

    /// 
    /// Gets a filter level value product mapping
    /// 
    /// Filter level value product mapping identifier
    /// Page index
    /// Page size
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level value product mapping
    /// 
    public virtual async Task GetFilterLevelValueProductByIdAsync(int filterLevelValueProductId)
    {
        return await _filterLevelValueProductMappingRepository.GetByIdAsync(filterLevelValueProductId);
    }

    /// 
    /// Deletes a filter level value product mapping
    /// 
    /// Filter level value product mapping
    /// A task that represents the asynchronous operation
    public virtual async Task DeleteFilterLevelValueProductAsync(FilterLevelValueProductMapping filterLevelValueProduct)
    {
        await _filterLevelValueProductMappingRepository.DeleteAsync(filterLevelValueProduct);
    }

    /// 
    /// Inserts a filter level value product mapping
    /// 
    /// Filter level value product mapping
    /// A task that represents the asynchronous operation
    public virtual async Task InsertProductFilterLevelValueAsync(FilterLevelValueProductMapping filterLevelValueProduct)
    {
        await _filterLevelValueProductMappingRepository.InsertAsync(filterLevelValueProduct);
    }

    #endregion

    #endregion
}