// 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); }
// 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); }