示例#1
0
        /// <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);
        }
示例#2
0
文件: Shared.cs 项目: oasj/viavarejo
        /// <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));
        }
示例#3
0
文件: Shared.cs 项目: oasj/viavarejo
        /// <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));
        }
示例#4
0
文件: Shared.cs 项目: oasj/viavarejo
        /// <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);
        }
示例#5
0
        /// <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>());
        }
示例#6
0
        /// <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>());
        }
示例#7
0
        /// <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);
                }
            }
        }
示例#8
0
        /// <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);
        }
示例#9
0
        /// <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();
        }
示例#10
0
文件: Shared.cs 项目: oasj/viavarejo
        /// <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();
        }