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