/// <summary>Retorna uma quantidade de amigos próximos por ID.</summary> public IEnumerable <AmigoData> Post([FromBody] string token, [FromUri] int idAmigo, [FromUri] int quantidade) { // verifica token de acesso Shared.VerificarToken(token); // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // retorna ou cria cache de distancia IQueryable <Cache> cache = dados.Caches.Where(entry => entry.IdAmigo == idAmigo); if (cache == null || cache.Count() == 0) { Shared.CreateCache(dados, idAmigo); cache = dados.Caches.Where(entry => entry.IdAmigo == idAmigo); } // retorna dados cache = cache.OrderBy(entry => entry.Distancia); if (quantidade != -1) { cache = cache.Take(quantidade); } cache.ForEach(entry => entry.DestinoReference.Load()); // converte dados List <AmigoData> amigos = new List <AmigoData>(); foreach (Amigo entry in cache.Select(entry => entry.Destino)) { amigos.Add(entry.CopyProperties <AmigoData>()); } return(amigos); }
/// <summary>Apaga o log de cálculo de distâncias de um amigo.</summary> public static void ClearLog(DadosAmigos dados, int idAmigo) { // apaga log IQueryable <long> cache = dados.Caches.Where(entry => entry.IdAmigo == idAmigo || entry.IdDestino == idAmigo).Select(entry => entry.IdCache); IQueryable <Log> log = dados.Logs.Where(entry => cache.Contains(entry.IdCache)); log.ForEach(entry => dados.DeleteObject(entry)); }
/// <summary>Apaga o cache de cálculo de distâncias de um amigo.</summary> public static void ClearCache(DadosAmigos dados, int idAmigo) { // apaga log Shared.ClearLog(dados, idAmigo); // apaga cache IQueryable <Cache> cache = dados.Caches.Where(entry => entry.IdAmigo == idAmigo || entry.IdDestino == idAmigo); cache.ForEach(entry => dados.DeleteObject(entry)); }
/// <summary>Retorna o ID de um amigo por latitude/longitude.</summary> public static int GetId(decimal latitude, decimal longitude) { // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // retorna o amigo Amigo amigo = dados.Amigos.Where(entry => entry.Latitude == latitude && entry.Longitude == longitude).SingleOrDefault(); return(amigo == null ? 0 : amigo.IdAmigo); }
/// <summary>Retorna um amigo por latitude/longitude.</summary> public AmigoData Post([FromBody] string token, [FromUri] decimal latitude, [FromUri] decimal longitude) { // verifica token de acesso Shared.VerificarToken(token); // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // retorna o amigo return(dados.Amigos.Where(entry => entry.Latitude == latitude && entry.Longitude == longitude).SingleOrDefault().CopyProperties <AmigoData>()); }
/// <summary>Retorna um amigo por ID.</summary> public AmigoData Post([FromBody] string token, [FromUri] int idAmigo) { // verifica token de acesso Shared.VerificarToken(token); // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // retorna o amigo return(dados.Amigos.Where(entry => entry.IdAmigo == idAmigo).SingleOrDefault().CopyProperties <AmigoData>()); }
/// <summary>Cria ou altera um amigo.</summary> public void Put([FromBody] string token, [FromBody] AmigoData amigo) { // verifica token de acesso Shared.VerificarToken(token); // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // verifica se amigo ja existe Amigo entity = dados.Amigos.Where(entry => entry.IdAmigo == amigo.IdAmigo).SingleOrDefault(); // cria ou altera o amigo if (entity == null) { // adiciona amigo entity = amigo.CopyProperties <Amigo>(); dados.Amigos.AddObject(entity); //armazena alterações dados.SaveChanges(); // recria cache Shared.CreateCache(dados, entity.IdAmigo); } else { // verifica se a latitude/longitude mudou bool recriarCache = false; if (entity.Latitude != amigo.Latitude || entity.Longitude != amigo.Longitude) { recriarCache = true; } // altera atributos do amigo entity.Nome = amigo.Nome; entity.Local = amigo.Local; entity.Latitude = amigo.Latitude; entity.Longitude = amigo.Longitude; //armazena alterações dados.SaveChanges(); // recria cache if (recriarCache) { Shared.CreateCache(dados, entity.IdAmigo); } } }
/// <summary>Retorna a lista de amigos.</summary> public IEnumerable <AmigoData> Post([FromBody] string token) { // verifica token de acesso Shared.VerificarToken(token); // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // retorna a lista de amigo List <AmigoData> amigos = new List <AmigoData>(); foreach (Amigo entry in dados.Amigos) { amigos.Add(entry.CopyProperties <AmigoData>()); } return(amigos); }
/// <summary>Apaga um amigo.</summary> public void Delete([FromBody] string token, [FromUri] int idAmigo) { // verifica token de acesso Shared.VerificarToken(token); // inicializa contexto de dados DadosAmigos dados = new DadosAmigos(); // apaga cache Shared.ClearCache(dados, idAmigo); // apaga amigos IQueryable <Amigo> amigos = dados.Amigos.Where(entry => entry.IdAmigo == idAmigo); amigos.ForEach(entry => dados.DeleteObject(entry)); //armazena alterações dados.SaveChanges(); }
/// <summary>Cria o cache de cálculo de distâncias de um amigo.</summary> public static void CreateCache(DadosAmigos dados, int idAmigo) { // apaga cache Shared.ClearCache(dados, idAmigo); // retorna amigos List <Amigo> amigos = dados.Amigos.ToList(); Amigo amigo = amigos.Where(entry => entry.IdAmigo == idAmigo).SingleOrDefault(); // verifica se amigo existe if (amigo == null) { return; } // remove o amigo de origem da coleção amigos.Remove(amigo); // enumera amigos de destino amigos.ForEach(entry => { Utilities.CalculoDistancia calculo = Utilities.Distance((double)amigo.Latitude, (double)amigo.Longitude, (double)entry.Latitude, (double)entry.Longitude); // cria cache direto Cache cache = new Cache() { IdAmigo = entry.IdAmigo, IdDestino = idAmigo, Distancia = new Decimal(calculo.Kilometros) }; // cria log do cálculo cache.Log = new Log() { RadianosLatitudeOrigem = new Decimal(calculo.RadianosOrigem), RadianosLatitudeDestino = new Decimal(calculo.RadianosDestino), RadianosThetaLongitude = new Decimal(calculo.RadianosTheta), Seno = new Decimal(calculo.Seno), Coseno = new Decimal(calculo.Coseno), Angulo = new Decimal(calculo.Angulo), Milhas = new Decimal(calculo.Milhas), Kilometros = new decimal(calculo.Kilometros) }; // adiciona cache dados.Caches.AddObject(cache); // cria cache reverso cache = new Cache() { IdAmigo = idAmigo, IdDestino = entry.IdAmigo, Distancia = new Decimal(calculo.Kilometros) }; // cria log do cálculo cache.Log = new Log() { RadianosLatitudeOrigem = new Decimal(calculo.RadianosOrigem), RadianosLatitudeDestino = new Decimal(calculo.RadianosDestino), RadianosThetaLongitude = new Decimal(calculo.RadianosTheta), Seno = new Decimal(calculo.Seno), Coseno = new Decimal(calculo.Coseno), Angulo = new Decimal(calculo.Angulo), Milhas = new Decimal(calculo.Milhas), Kilometros = new decimal(calculo.Kilometros) }; // adiciona cache dados.Caches.AddObject(cache); }); //armazena alterações dados.SaveChanges(); }