Exemplo n.º 1
0
        // GET api/RelevantMarks
        public List <Mark> Get(double?longitude, double?latitude, double?proximityThreshhold)
        {
            List <Mark> relevantMarksByCategoryAndProximity = null;

            int relevantCategoriesCode = context.GetUserRelevantCateogiresCode(LoggedUserId);

            var relevantMarksByCategory = from mark in context.Marks
                                          where (relevantCategoriesCode & mark.CategoriesCode) != 0
                                          select mark;

            if (longitude.HasValue && latitude.HasValue)
            {
                if (!proximityThreshhold.HasValue)
                {
                    proximityThreshhold = k_DefaultProximityThreshhold;
                }

                relevantMarksByCategoryAndProximity = new List <Mark>();
                foreach (Mark mark in relevantMarksByCategory)
                {
                    Vector userPos = new Vector(longitude.Value, latitude.Value);
                    Vector markPos = new Vector(mark.Longitude, mark.Latitude);
                    if (markIsCloseEnough(userPos, markPos, proximityThreshhold.Value))
                    {
                        relevantMarksByCategoryAndProximity.Add(mark);
                    }
                }
            }
            else
            {
                relevantMarksByCategoryAndProximity = relevantMarksByCategory.ToList();
            }

            return(relevantMarksByCategoryAndProximity);
        }
Exemplo n.º 2
0
        // GET api/ClosestMark
        public async Task <Mark> Get(double?latitude, double?longitude)
        {
            Mark closestMark = null;

            if (latitude != null && longitude != null)
            {
                m_UserLatitude  = latitude.Value;
                m_UserLongitude = longitude.Value;
            }

            try
            {
                int relevantCategoriesCode = context.GetUserRelevantCateogiresCode(LoggedUserId);

                IEnumerable <string> seenMarksIds = from userMarkExperiences in context.UserMarkExperiences
                                                    where userMarkExperiences.UserId == LoggedUserId
                                                    select userMarkExperiences.MarkId;

                IEnumerable <Mark> unseenRelevantMarks = from mark in context.Marks
                                                         where (relevantCategoriesCode & mark.CategoriesCode) != 0 &&
                                                         !seenMarksIds.Contains(mark.Id)
                                                         select mark;

                if (unseenRelevantMarks.Count() != 0)
                {
                    closestMark = unseenRelevantMarks.OrderByDescending((mark) => distanceFromUserKm(mark)).Last();

                    double distanceFromClosestMark = distanceFromUserKm(closestMark);
                    if (distanceFromClosestMark > 0.04)
                    {
                        // Closest mark is too far
                        closestMark = null;
                    }

                    else
                    {
                        // Insert a UserMarkExperience to avoid notifying this user about this mark again
                        await context.InsertUserMarkExperience(LoggedUserId, closestMark.Id);
                    }
                }
            }

            catch (Exception e)
            {
                LogTools.LogException(e);
            }

            return(closestMark);
        }