/// <summary>
        /// Umożliwia pobranie zarezerwwanych ofert użytkownika z bazy
        /// </summary>
        /// <param name="context">Kontekst bazy danych</param>
        /// <param name="username">Nazwa zalogowanego użytkownika</param>
        /// <returns>Zwraca listę zarezerwowanych ofert</returns>
        public static List <OfferViewModel> GetUserReservedOffers(IAccommodationContext context, string username)
        {
            try
            {
                List <Offer>          offerList          = new List <Offer>();
                List <OfferViewModel> offerViewModelList = new List <OfferViewModel>();

                User user = context.Users.FirstOrDefault(u => u.Username == username);
                offerList = context.Offers.Where(o => o.CustomerId == user.Id).Include(o => o.OfferInfo).Include(o => o.Room).ToList();

                foreach (var offer in offerList)
                {
                    offer.Room.Place         = context.Places.FirstOrDefault(p => p.Id == offer.Room.PlaceId);
                    offer.Room.Place.Address = context.Addresses.FirstOrDefault(a => a.Id == offer.Room.Place.AddressId);


                    offerViewModelList.Add(new OfferViewModel(offer));
                }

                return(offerViewModelList);
            }
            catch (Exception ex)
            {
                return(new List <OfferViewModel>());
            }
        }
 /// <summary>
 /// Zapisuje nowe dane użytkownika.
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="username">Nazwa użytkownika</param>
 /// <param name="model">Model z nowymi danymi</param>
 /// <returns>True, jeśli zapis się powiódł, false w przypadku błędu.</returns>
 public bool SaveUserData(IAccommodationContext context, string username, ChangeUserDataViewModel model)
 {
     try
     {
         var user = context.Users.FirstOrDefault(u => u.Username.Equals(username));
         if (user == null)
         {
             return(false);
         }
         var data = context.UserData.FirstOrDefault(ud => ud.Id == user.UserDataId);
         if (data == null)
         {
             return(false);
         }
         data.Email       = model.Email;
         data.CompanyName = model.CompanyName;
         data.FirstName   = model.FirstName;
         data.LastName    = model.LastName;
         context.SaveChanges();
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
        public static bool GiveUserMark(IAccommodationContext context, MarkViewModel model)
        {
            try
            {
                User            user  = context.Users.FirstOrDefault(u => u.Username == model.Username);
                HistoricalOffer offer = context.HistoricalOffers.FirstOrDefault(o => o.Id == model.ReservedOfferId);
                int             mark  = (int)model.mark;

                if (user.AverageMark == null || user.MarkCount == null)
                {
                    user.AverageMark = 0;
                    user.MarkCount   = 0;
                }

                user.AverageMark = (user.AverageMark * user.MarkCount + mark) / (user.MarkCount + 1);
                user.MarkCount  += 1;

                offer.IsMarked = true;
                context.SaveChanges();
                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
        /// <summary>
        /// Asynchronicznie zmienia hasło użytkownika.
        /// </summary>
        /// <param name="context">Kontekst bazy danych</param>
        /// <param name="username">Nazwa uzytkownika</param>
        /// <param name="model">Obiekt z hasłami uzytkownika</param>
        /// <returns>String z ewentualną przyczyną błędu (pusty, jeśli wszystko przebiegło pomyślnie).</returns>
        public async Task <string> ChangePasswordAsync(IAccommodationContext context, string username,
                                                       ChangePasswordViewModel model)
        {
            try
            {
                IUserAuthenticationService authenticationService = new UserAuthenticationService();
                var identity = await authenticationService.AuthenticateUserAsync(context, username, model.OldPassword);

                if (identity == null)
                {
                    return("Nieprawidłowe hasło dla użytkownika " + username);
                }
                IRegisterUser register = new UserRegister();
                User          newUser  = register.GetNewUser(username, model.NewPassword);
                User          user     = context.Users.FirstOrDefault(u => u.Username.Equals(username));
                if (user == null)
                {
                    return("Błąd! Nie odnaleziono użytkownika");
                }
                user.HashedPassword = newUser.HashedPassword;
                user.Salt           = newUser.Salt;
                context.SaveChanges();
                return(string.Empty);
            }
            catch (Exception)
            {
                return("Błąd!");
            }
        }
 /// <summary>
 /// Pobiera informacje o użytkowniku.
 /// </summary>
 /// <param name="context">Kontekst bazy danych z użytkownikami</param>
 /// <param name="username">Nazwa uzytkownika</param>
 /// <returns>Obiekt zawierający dane uzytkownika.</returns>
 public UserProfileViewModel GetInfoAboutUser(IAccommodationContext context, string username)
 {
     try
     {
         User user = context.Users.FirstOrDefault(u => u.Username.Equals(username));
         if (user == null)
         {
             return(null);
         }
         UserData data = context.UserData.FirstOrDefault(ud => ud.Id == user.UserDataId);
         if (data == null)
         {
             return(null);
         }
         UserProfileViewModel vm = new UserProfileViewModel()
         {
             Username    = user.Username,
             FirstName   = data.FirstName,
             LastName    = data.LastName,
             CompanyName = data.CompanyName,
             Email       = data.Email,
             Rank        = user.Rank.Name,
             AvarageMark = user.AverageMark != null?user.AverageMark?.ToString() : "Brak ocen"
         };
         return(vm);
     }
     catch (Exception)
     {
         return(null);
     }
 }
        public static List <UserMarksViewModel> GetUsersToMark(IAccommodationContext context, string username)
        {
            try
            {
                List <UserMarksViewModel> list = new List <UserMarksViewModel>();

                User user = context.Users.FirstOrDefault(u => u.Username == username);
                if (user == null)
                {
                    return(new List <UserMarksViewModel>());
                }

                var offersList = context.HistoricalOffers.Where(o => o.CustomerId == user.Id).Include(o => o.OfferInfo).Include(o => o.Room);

                foreach (var offer in offersList)
                {
                    if (!offer.IsMarked)
                    {
                        User  vendor = context.Users.FirstOrDefault(u => u.Id == offer.VendorId);
                        Place place  = context.Places.FirstOrDefault(x => x.Id == offer.Room.PlaceId);

                        list.Add(new UserMarksViewModel(offer, vendor));
                    }
                }
                return(list);
            }
            catch (Exception ex)
            {
                return(new List <UserMarksViewModel>());
            }
        }
        /// <summary>
        /// Usuwa ofertę o danym id z bazy
        /// </summary>
        /// <param name="context">Kontekst bazy danych</param>
        /// <param name="offerId">Id oferty</param>
        /// <param name="username">Nazwa użytkownika</param>
        /// <returns></returns>
        public static bool DeleteOfferById(IAccommodationContext context, int offerId, string username)
        {
            try
            {
                Offer offer = context.Offers.FirstOrDefault(x => x.Id == offerId);
                if (offer == null)
                {
                    return(false);
                }
                User user = context.Users.FirstOrDefault(u => u.Username == username);

                OfferInfo offerInfo = context.OfferInfo.FirstOrDefault(x => x.Id == offer.OfferInfoId);
                Room      room      = context.Rooms.FirstOrDefault(x => x.Id == offer.RoomId);
                Place     place     = context.Places.FirstOrDefault(x => x.Id == room.PlaceId);
                Address   address   = context.Addresses.FirstOrDefault(x => x.Id == place.AddressId);

                var ho = context.HistoricalOffers.FirstOrDefault(h => h.OriginalOfferId == offer.Id);
                if (ho != null)
                {
                    ho.OriginalOffer = null;
                }
                //usuń z bazy ofertę oraz jej dane

                context.Offers.Remove(offer);
                user?.MyOffers?.Remove(offer);
                context.SaveChanges();
                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
示例#8
0
        public IList <OfferViewModel> SearchByPlace(IAccommodationContext context, PlaceSearchingModel model)
        {
            ISearchingCriterion <Offer> criterion =
                OffersSearchingCriteriaFactory.CreatePlaceSearchingCriterion(model.PlaceName, model.CityName);

            return(Search(context, model.Username, new[] { criterion }, model.SortType, model.SortBy));
        }
示例#9
0
        public IList <OfferViewModel> SearchByPrice(IAccommodationContext context, PriceSearchingModel model)
        {
            ISearchingCriterion <Offer> criterion =
                OffersSearchingCriteriaFactory.CreatePriceSearchingCriterion(PriceFromString(model.MinimalPrice), PriceFromString(model.MaximalPrice));

            return(Search(context, model.Username, new[] { criterion }, model.SortType, model.SortBy));
        }
示例#10
0
        public IList <OfferViewModel> SearchByDate(IAccommodationContext context, DateSearchingModel model)
        {
            ISearchingCriterion <Offer> criterion =
                OffersSearchingCriteriaFactory.CreateDateSearchingCriterion(model.MinimalDate, model.MaximalDate,
                                                                            model.ShowPartiallyMatchingResults);

            return(Search(context, model.Username, new[] { criterion }, model.SortType, model.SortBy));
        }
示例#11
0
 public IList <OfferViewModel> SearchByMultipleCriteria(IAccommodationContext context, AdvancedSearchingModel model)
 {
     ISearchingCriterion <Offer>[] criteria = new[]
     {
         OffersSearchingCriteriaFactory.CreatePlaceSearchingCriterion(model.PlaceName, model.CityName),
         OffersSearchingCriteriaFactory.CreateDateSearchingCriterion(model.MinimalDate, model.MaximalDate),
         OffersSearchingCriteriaFactory.CreatePriceSearchingCriterion(PriceFromString(model.MinimalPrice), PriceFromString(model.MaximalPrice))
     };
     return(Search(context, model.Username, criteria, model.SortType, model.SortBy));
 }
        /// <summary>
        /// Umożliwia edycję oferty w bazie
        /// </summary>
        /// <param name="context">Kontekst bazy danych</param>
        /// <param name="model">Model z danymi oferty</param>
        /// <returns></returns>
        public static bool EditOffer(IAccommodationContext context, AddNewOfferViewModel model)
        {
            try
            {
                Offer offer = context.Offers.FirstOrDefault(x => x.Id == model.Id);
                if (offer == null)
                {
                    return(false);
                }

                HistoricalOffer ho = context.HistoricalOffers.FirstOrDefault(x => x.OriginalOfferId == offer.Id);

                OfferInfo newOfferInfo = new OfferInfo
                {
                    Description      = model.Description,
                    OfferEndTime     = model.EndDate,
                    OfferStartTime   = model.StartDate,
                    OfferPublishTime = DateTime.Now,
                    Price            = double.Parse(model.Price)
                };

                Address newAddress = new Address
                {
                    City        = model.City,
                    Street      = model.Street,
                    LocalNumber = model.LocalNumber,
                    PostalCode  = model.PostalCode,
                };

                Place newPlace = new Place
                {
                    Address   = newAddress,
                    PlaceName = model.AccommodationName,
                };

                Room newRoom = new Room
                {
                    Capacity = int.Parse(model.AvailiableVacanciesNumber),
                    Number   = model.RoomNumber,
                    Place    = newPlace,
                };

                ho.OfferInfo          = offer.OfferInfo = newOfferInfo;
                ho.Room               = offer.Room = newRoom;
                ho.Room.Place         = offer.Room.Place = newPlace;
                ho.Room.Place.Address = offer.Room.Place.Address = newAddress;

                context.SaveChanges();
                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
示例#13
0
        /// <summary>
        /// Waliduje nazwę użytkownika.
        /// </summary>
        /// <param name="context">Kontekst bazy danych</param>
        /// <param name="model">Model z danymi.</param>
        /// <returns>String z ewentualną przyczyną niepowodzenia.</returns>
        public async Task <string> ValidateUserAsync(IAccommodationContext context, RegisterViewModel model)
        {
            string errorMessage;
            bool   b = await _validator.ValidateUsernameAsync(context, model.Username);

            if (!b)
            {
                return("Nazwa użytkownika musi być unikalna. Proszę wybrać unikalną nazwę.");
            }
            return(!ValidateUserData(model, out errorMessage) ? errorMessage : string.Empty);
        }
示例#14
0
 /// <summary>
 /// Zapisuje użytkownika z jego danymi do bazy danych.
 /// </summary>
 /// <param name="context">Kontekst bazy danych.</param>
 /// <param name="user">Nazwa użytkownika</param>
 /// <param name="userdata">Dane osobowe użytkownika</param>
 /// <param name="address">Dane adresowe użytkownika</param>
 /// <returns>True jeśli operacja zakończyła się suksecem, w przeciwnym wypadklu false.</returns>
 public bool SaveUser(IAccommodationContext context, User user, UserData userdata, Address address)
 {
     try
     {
         user.UserData         = userdata;
         user.UserData.Address = address;
         user.Rank             = context.Ranks.FirstOrDefault(r => r.Name.Equals("Nowicjusz"));
         context.Users.Add(user);
         context.SaveChanges();
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
        private static double[] ThisYearReservedOffersPrices(IAccommodationContext context, User user, out int[] counts)
        {
            int year = DateTime.Now.Year;

            double[] prices = new double[12];
            counts = new int[12];
            var offers =
                context.HistoricalOffers.Where(o => o.CustomerId == user.Id)
                .Include(o => o.OfferInfo)
                .Where(o => o.OfferInfo.OfferStartTime.Year == year).ToList();

            foreach (var offer in offers)
            {
                int month = offer.OfferInfo.OfferStartTime.Month - 1;
                prices[month] = (prices[month] * counts[month] + offer.OfferInfo.Price) / (counts[month] + 1);
                counts[month]++;
            }
            return(prices);
        }
示例#16
0
 /// <summary>
 /// Zapisuje użytkownika do bazy danych.
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="model">Model z danymi.</param>
 public async Task SaveUserAsync(IAccommodationContext context, RegisterViewModel model)
 {
     User     user = _register.GetNewUser(model.Username, model.Password);
     UserData data = new UserData()
     {
         Email       = model.Email,
         CompanyName = model.CompanyName,
         FirstName   = model.FirstName,
         LastName    = model.LastName
     };
     Address address = new Address()
     {
         City        = model.City,
         Street      = model.Street,
         LocalNumber = model.LocalNumber,
         PostalCode  = model.PostalCode
     };
     await _register.SaveUserAsync(context, user, data, address);
 }
 /// <summary>
 /// Pobiera ofertę o danym id z bazy
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="offerId">id oferty</param>
 /// <returns></returns>
 public static AddNewOfferViewModel GetOfferById(IAccommodationContext context, int offerId)
 {
     try
     {
         Offer offer = context.Offers.Where(o => o.Id == offerId).Include(o => o.OfferInfo).Include(o => o.Room).First();
         if (offer == null)
         {
             return(null);
         }
         Place   place   = context.Places.FirstOrDefault(p => p.Id == offer.Room.PlaceId);
         Address address = context.Addresses.FirstOrDefault(a => a.Id == offer.Room.Place.AddressId);
         offer.Room.Place         = place;
         offer.Room.Place.Address = address;
         return(new AddNewOfferViewModel(offer));
     }
     catch (Exception ex)
     {
         return(null);
     }
 }
示例#18
0
        /// <summary>
        /// Wyszukuje oferty.
        /// </summary>
        /// <param name="context">Kontkst bazy danych</param>
        /// <param name="username">Nazwa użytkwnika</param>
        /// <param name="criteria">Kryteria wyszukiwania</param>
        /// <param name="sortBy">Po jakiej właściwości posortować wyniki</param>
        /// <param name="sortType">Porządek sortowania.</param>
        /// <returns>Lista z wynikami wyszukiwania.</returns>
        private IList <OfferViewModel> Search(IAccommodationContext context, string username,
                                              ISearchingCriterion <Offer>[] criteria, SortType sortType, SortBy sortBy)
        {
            if (string.IsNullOrEmpty(username))
            {
                return(null);
            }
            User u = context.Users.FirstOrDefault(us => us.Username.Equals(username));

            if (u == null)
            {
                return(null);
            }
            IQueryable <Offer> offers = context.Offers.Where(o => o.VendorId != u.Id).Where(o => !o.IsBooked);

            offers = criteria.Aggregate(offers, (current, criterion) => current.Where(criterion.SelectableExpression));
            offers = offers.Take(20).OrderBy(sortType, sortBy);
            offers = offers.Include(o => o.OfferInfo).Include(o => o.Room);
            return(offers.ToList().Select(offer => new OfferViewModel(offer)).ToList());
        }
        /// <summary>
        /// Umożliwia rezygnacje z oferty danemu użytkownikowi
        /// </summary>
        /// <param name="context">Kontekst bazy danych</param>
        /// <param name="offerId">Id oferty</param>
        /// <param name="username">Nazwa użytkownika</param>
        /// <returns></returns>
        public static bool ResignOffer(IAccommodationContext context, int offerId, string username)
        {
            try
            {
                Offer           offer           = context.Offers.FirstOrDefault(o => o.Id == offerId);
                HistoricalOffer historicalOffer = context.HistoricalOffers.FirstOrDefault(ho => ho.OriginalOfferId == offer.Id);
                User            customer        = context.Users.FirstOrDefault(u => u.Username.Equals(username));
                User            vendor          = context.Users.FirstOrDefault(x => x.Id == offer.VendorId);

                if (offer == null || customer == null)
                {
                    return(false);
                }
                if (!offer.IsBooked)
                {
                    return(false);
                }


                OfferInfo offerInfo    = context.OfferInfo.FirstOrDefault(o => o.Id == offer.OfferInfoId);
                UserData  customerData = context.UserData.FirstOrDefault(x => x.Id == customer.UserDataId);
                UserData  vendorData   = context.UserData.FirstOrDefault(x => x.Id == vendor.UserDataId);
                Room      room         = context.Rooms.FirstOrDefault(x => x.Id == offer.RoomId);
                Place     place        = context.Places.FirstOrDefault(x => x.Id == room.PlaceId);
                offer.IsBooked           = false;
                offer.Customer           = null;
                historicalOffer.IsBooked = false;
                historicalOffer.Customer = null;
                context.SaveChanges();

                //Wysłanie powiadomienia mailowego, ostatni parametr oznacza rezygnację
                EmailNotification.SendNotification(offerInfo, place, vendorData, customerData, room, false);
                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
 /// <summary>
 /// Gets users statistics
 /// </summary>
 /// <param name="context">Db context</param>
 /// <param name="username">Name of the user</param>
 /// <returns>Model filled with statistics</returns>
 public StatisticsViewModel GetUserStatistics(IAccommodationContext context, string username)
 {
     try
     {
         User user = context.Users.FirstOrDefault(u => u.Username.Equals(username));
         if (user == null)
         {
             return(null);
         }
         StatisticsViewModel model = new StatisticsViewModel();
         model.Username                 = username;
         model.Rank                     = user.Rank.Name;
         model.AllMyOffersCount         = context.HistoricalOffers.Count(o => o.VendorId == user.Id);
         model.AllMyReservedOffersCount = context.HistoricalOffers.Count(o => o.CustomerId == user.Id);
         model.MyOffersCountNow         = context.Offers.Count(o => o.VendorId == user.Id);
         model.MyReservedOffersCountNow = context.Offers.Count(o => o.CustomerId == user.Id);
         List <HistoricalOffer> myOffers =
             context.HistoricalOffers.Where(o => o.VendorId == user.Id).Include(o => o.OfferInfo).ToList();
         if (myOffers.Count > 0)
         {
             model.MyLessValuableOffer = myOffers.Min(o => o.OfferInfo.Price);
             model.MyMostValuableOffer = myOffers.Max(o => o.OfferInfo.Price);
         }
         int[] counts;
         model.ThisYearOffersPrices       = ThisYearOfferPrices(context, user, out counts);
         model.ThisYearOffersCountOnMonth = counts;
         int[] counts2;
         model.ThisYearReservedOffersPrices       = ThisYearReservedOffersPrices(context, user, out counts2);
         model.ThisYearReservedOffersCountOnMonth = counts2;
         return(model);
     }
     catch (Exception)
     {
         return(null);
     }
 }
 /// <summary>
 /// Asynchronously gets user statistics
 /// </summary>
 /// <param name="context">Db context</param>
 /// <param name="username">Name of the user</param>
 /// <returns>Model filled with statistics</returns>
 public async Task <StatisticsViewModel> GetUserStatisticsAsync(IAccommodationContext context, string username)
 {
     return(await Task.Run(() => GetUserStatistics(context, username)));
 }
 /// <summary>
 /// Asynchroniczna metoda do usuwania ofert
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="id">Id oferty do usunięcia</param>
 /// <param name="username">Nazwa użytkownika</param>
 /// <returns></returns>
 public static async Task <bool> DeleteOfferByIdAsync(IAccommodationContext context, int id, string username)
 {
     return(await Task.Run(() => DeleteOfferById(context, id, username)));
 }
 /// <summary>
 /// Asynchroniczna metoda wywołująca metodę do
 /// edycji ofert w bazie
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="model">Model z danymi oferty do edycji</param>
 /// <returns></returns>
 public static async Task <bool> EditOfferAsync(IAccommodationContext context, AddNewOfferViewModel model)
 {
     return(await Task.Run(() => EditOffer(context, model)));
 }
 /// <summary>
 /// Asynchroniczna metoda do rezygnacji z oferty
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="id">Id oferty</param>
 /// <param name="username"></param>
 /// <returns></returns>
 public async static Task <bool> ResignOfferAsync(IAccommodationContext context, int id, string username)
 {
     return(await Task.Run(() => ResignOffer(context, id, username)));
 }
示例#25
0
 public async Task <IList <OfferViewModel> > SearchByMultipleCriteriaAsync(IAccommodationContext context,
                                                                           AdvancedSearchingModel model)
 {
     return(await Task.Run(() => SearchByMultipleCriteria(context, model)));
 }
 public async static Task <List <UserMarksViewModel> > GetUsersToMarkAsync(IAccommodationContext context, string username)
 {
     return(await Task.Run(() => GetUsersToMark(context, username)));
 }
示例#27
0
 /// <summary>
 /// Asynchronicznie zapisuje użytkownika z jego danymi do bazy danych.
 /// </summary>
 /// <param name="context">Kontekst bazy danych.</param>
 /// <param name="user">Nazwa użytkownika</param>
 /// <param name="userdata">Dane osobowe użytkownika</param>
 /// <param name="address">Dane adresowe użytkownika</param>
 /// <returns>True jeśli operacja zakończyła się suksecem, w przeciwnym wypadklu false.</returns>
 public async Task <bool> SaveUserAsync(IAccommodationContext context, User user, UserData userdata, Address address)
 {
     return(await Task.Run(() => SaveUser(context, user, userdata, address)));
 }
 public async static Task <bool> GiveUserMarkAsync(IAccommodationContext context, MarkViewModel model)
 {
     return(await Task.Run(() => GiveUserMark(context, model)));
 }
示例#29
0
 public async Task <IList <OfferViewModel> > SearchByPriceAsync(IAccommodationContext context, PriceSearchingModel model)
 {
     return(await Task.Run(() => SearchByPrice(context, model)));
 }
 /// <summary>
 /// Asynchroniczna metoda wywołująca metodę
 /// do pobierania oferty o danym id
 /// </summary>
 /// <param name="context">Kontekst bazy danych</param>
 /// <param name="id">id oferty</param>
 /// <returns></returns>
 public static async Task <AddNewOfferViewModel> GetOfferByIdAsync(IAccommodationContext context, int id)
 {
     return(await Task.Run(() => GetOfferById(context, id)));
 }