Ejemplo n.º 1
0
        /**
         * Add or update venue details in database
         */
        private void UpdateVenueDetails()
        {
            // Get all venues
            List <Venue> venues = _venueRepository.GetAllVenues();

            // Get only venues that don't have details
            List <Venue> venuesWithoutDetails = venues.Where(v => v.Address1 == null).ToList();

            foreach (var venue in venuesWithoutDetails)
            {
                // Venue owners have ability to manually update their venues, do not auto-update
                if (VenueHasOwner(venue))
                {
                    continue;
                }

                // Get Place details from Google API using GooglePlaceId
                PlaceDetailsResponse venueDetails = _placesApi.GetPlaceDetailsById(venue.GooglePlaceId);

                // Map response data to database model properties
                venue.Phone = venueDetails.Result.FormattedPhoneNumber;
                string streetAddress = null;
                foreach (var addressComponent in venueDetails.Result.AddressComponents)
                {
                    // Map Address from response to database model
                    var type = addressComponent.Types.FirstOrDefault();
                    switch (type)
                    {
                    case "street_number":
                        streetAddress += addressComponent.ShortName + " ";
                        break;

                    case "route":
                        streetAddress += addressComponent.ShortName;
                        break;

                    case "locality":
                        venue.City = addressComponent.ShortName;
                        break;

                    case "administrative_area_level_1":
                        venue.State = addressComponent.ShortName;
                        break;

                    case "postal_code":
                        venue.ZipCode = addressComponent.ShortName;
                        break;

                    default:
                        continue;
                    }

                    venue.Address1 = streetAddress;
                }

                // Update Venue entity
                _venueRepository.Edit(venue);

                // Map OpeningHours API response to BusinessHours entity
                if (venueDetails.Result.OpeningHours != null)
                {
                    // Initialize new BusinessHours entity using VenueID as foreign key
                    BusinessHours hours = new BusinessHours {
                        VenueId = venue.VenueId
                    };

                    foreach (var period in venueDetails.Result.OpeningHours.Periods)
                    {
                        hours.DayOfWeek = period.Open.Day;

                        string openTime = period.Open?.Time.Insert(2, ":");
                        if (!string.IsNullOrEmpty(openTime))
                        {
                            hours.OpenTime = DateTime.Parse(openTime).TimeOfDay;
                        }

                        string closeTime = period.Close?.Time.Insert(2, ":");
                        if (!string.IsNullOrEmpty(closeTime))
                        {
                            hours.CloseTime = DateTime.Parse(closeTime).TimeOfDay;
                        }

                        // Add BusinessHours entity
                        _businessHoursRepository.AddBusinessHours(hours);
                    }
                }

                // Map Review API response to Review database entity
                if (venueDetails.Result.Reviews != null)
                {
                    foreach (var review in venueDetails.Result.Reviews)
                    {
                        DateTime timestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

                        Review reviewEntity = new Review
                        {
                            IsGoogleReview = true,
                            GoogleAuthor   = review.AuthorName,
                            VenueId        = venue.VenueId,
                            Comments       = review.Text,
                            Rating         = review.Rating,

                            Timestamp = timestamp.AddSeconds(review.Time).ToLocalTime()
                        };

                        _reviewRepository.AddReview(reviewEntity);
                    }
                }

                // Map Location API response to Location database entity
                if (venueDetails.Result.Geometry != null)
                {
                    Location locationEntity = new Location
                    {
                        Latitude =
                            venueDetails.Result.Geometry.GeometryLocation.Latitude.ToString(CultureInfo.InvariantCulture),
                        Longitude =
                            venueDetails.Result.Geometry.GeometryLocation.Longitude.ToString(CultureInfo.InvariantCulture),
                        VenueId = venue.VenueId
                    };

                    // Add Location entity
                    _locationRepository.AddLocation(locationEntity);
                }
            }
        }