GetApartmentByIdAsync(string apartmentId, CancellationToken cancellationToken = default(CancellationToken))
        {
            Guid id = Guid.Parse(apartmentId);

            try
            {
                var apartment = await _db.Apartments.Where(_ => _.Id == id)
                                .Include(_ => _.Address.Country).Include(_ => _.Address)
                                .AsNoTracking().FirstOrDefaultAsync(cancellationToken);

                if (apartment is null)
                {
                    return((Result <ApartmentSearchView>) Result <ApartmentSearchView>
                           .NotOk <ApartmentSearchView>(null, "Apartment is not exist"));
                }

                ApartmentSearchView view = new ApartmentSearchView()
                {
                    Apartment = _mapper.Map <ApartmentSearchDTO>(apartment),

                    Address = _mapper.Map <AddressSearchDTO>(apartment.Address),

                    Country = _mapper.Map <CountrySearchDTO>(apartment.Address.Country)
                };

                return((Result <ApartmentSearchView>) Result <ApartmentSearchView>
                       .Ok(view));
            }
            catch (ArgumentNullException ex)
            {
                return((Result <ApartmentSearchView>) Result <ApartmentSearchView>
                       .Fail <ApartmentSearchView>($"Source is null. {ex.Message}"));
            }
        }
        GetAllApartmentsAsync(PagedRequest <SearchParameters> request, CancellationToken cancellationToken = default(CancellationToken))
        {
            IQueryable <Apartment> apartments = _db.Apartments.Where(_ => _.IsOpen == true);

            if (!string.IsNullOrEmpty(request.Data.CountryId) && Guid.TryParse(request.Data.CountryId, out var _))
            {
                Guid id = Guid.Parse(request.Data.CountryId);

                apartments = apartments.Where(_ => _.Address.CountryId == id);
            }

            if (!string.IsNullOrEmpty(request.Data.CityName))
            {
                apartments = apartments.Where(_ => _.Address.City.Contains(request.Data.CityName));
            }

            if (request.Data.RoomsFrom > 0)
            {
                apartments = apartments.Where(_ => _.NumberOfRooms >= request.Data.RoomsFrom);
            }

            if (request.Data.RoomsTill > 0 && request.Data.RoomsTill >= request.Data.RoomsFrom)
            {
                apartments = apartments.Where(_ => _.NumberOfRooms <= request.Data.RoomsTill);
            }

            if (request.Data.PriceFrom > 0)
            {
                apartments = apartments.Where(_ => _.Price >= request.Data.PriceFrom);
            }

            if (request.Data.PriceTill > 0 && request.Data.PriceTill >= request.Data.PriceFrom)
            {
                apartments = apartments.Where(_ => _.Price <= request.Data.PriceTill);
            }

            if (request.Data.NeedDates != null && request.Data.NeedDates.Any())
            {
                foreach (var item in request.Data.NeedDates)
                {
                    apartments = apartments.Where(_ => _.Dates.Where(_ => _.Date == item.Date).FirstOrDefault() == null);
                }
            }

            try
            {
                var count = await apartments.CountAsync();

                var searchResult = await apartments.Include(_ => _.Address.Country)
                                   .Include(_ => _.Address)
                                   .Skip((request.PageNumber - 1) * request.PageSize)
                                   .Take(request.PageSize)
                                   .AsNoTracking().ToListAsync(cancellationToken);

                List <ApartmentSearchView> result = new List <ApartmentSearchView>();

                foreach (var apartment in searchResult)
                {
                    ApartmentSearchView view = new ApartmentSearchView()
                    {
                        Apartment = _mapper.Map <ApartmentSearchDTO>(apartment),

                        Address = _mapper.Map <AddressSearchDTO>(apartment.Address),

                        Country = _mapper.Map <CountrySearchDTO>(apartment.Address.Country)
                    };

                    result.Add(view);
                }

                PagedResponse <ApartmentSearchView> response
                    = new PagedResponse <ApartmentSearchView>(_mapper.Map <IEnumerable <ApartmentSearchView> >(result),
                                                              count,
                                                              request.PageNumber,
                                                              request.PageSize);

                return((Result <PagedResponse <ApartmentSearchView> >) Result <PagedResponse <ApartmentSearchView> >
                       .Ok(response));
            }
            catch (ArgumentNullException ex)
            {
                return((Result <PagedResponse <ApartmentSearchView> >) Result <PagedResponse <ApartmentSearchView> >
                       .Fail <PagedResponse <ApartmentSearchView> >($"Source is null. {ex.Message}"));
            }
        }