{"id":21081942,"url":"https://github.com/tayron/servico-auto-complete","last_synced_at":"2026-04-29T20:34:37.578Z","repository":{"id":95258321,"uuid":"235082908","full_name":"tayron/servico-auto-complete","owner":"tayron","description":"Serviço para cadastro de vendas de produtos por lojas, onde haverá um serviço para cadastro das vendas via api, outro que exibe a timeline das compras e um último serviço capaz de sincronizar com outra api, buscando as compras já realizadas e trazendo para base de dados;","archived":false,"fork":false,"pushed_at":"2020-01-28T15:56:15.000Z","size":1002,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T04:38:19.361Z","etag":null,"topics":["autocomplete-search","container","docker","elasticsearch","mysql-database","php-pdo-mysql","php7","slim-framework"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tayron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-20T11:09:59.000Z","updated_at":"2022-02-12T08:23:13.000Z","dependencies_parsed_at":"2023-03-11T15:15:20.183Z","dependency_job_id":null,"html_url":"https://github.com/tayron/servico-auto-complete","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tayron/servico-auto-complete","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tayron%2Fservico-auto-complete","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tayron%2Fservico-auto-complete/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tayron%2Fservico-auto-complete/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tayron%2Fservico-auto-complete/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tayron","download_url":"https://codeload.github.com/tayron/servico-auto-complete/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tayron%2Fservico-auto-complete/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32443563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T20:22:27.477Z","status":"ssl_error","status_checked_at":"2026-04-29T20:22:26.507Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autocomplete-search","container","docker","elasticsearch","mysql-database","php-pdo-mysql","php7","slim-framework"],"created_at":"2024-11-19T20:11:37.475Z","updated_at":"2026-04-29T20:34:37.559Z","avatar_url":"https://github.com/tayron.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Serviço de Autocomplete\n\nServiço para cadastro de vendas de produtos por lojas, onde haverá um serviço para \ncadastro das vendas via api, outro que exibe a timeline das compras e um último serviço \ncapaz de sincronizar com outra api, buscando as compras já realizadas e trazendo para base de dados;\n\n##  Serviço de inserção de dados\n\nCompreende os serguintes serviços:\n- GET (http://172.22.0.5/sales/sincronizacao): **/sales/sincronizacao** serviço que consome api com dados das compras e repassa as informações a api (http://172.22.0.5/sales) para armazenamento dos dados, servindo como uma interface de comunicação, intermediando dois serviços destintos e que pode ser configurado em um cron para ser executado de tempos em tempos.\n\n-  POST (http://172.22.0.5/sales): **/sales** serviço que é usado para cadastrar vendas realizadas, pode ser informado para clientes que queiram se comunicar diretamente com a api ao invés de fornecer uma api com dados da compra.\n\n-  GET (http://172.22.0.5/sales/timeline): **/sales/timeline** serviço que é usado para recuperar todo histórico de vendas \npor ordem de compra do mais novo para o mais velho.\n\nOs serviços descritos acima rodam sobre um container PHP (autocomplete_sistema) que comunica com container do banco de dados MySQL (autocomplete_banco_dados) e grava os dados no serviço do Elasticsearch que se encontra no container (autocomplete_elasticsearch);\n\n## Serviço para consulta usado para criação de autocomplete\n\nComprende em uma única api: http://172.22.0.4/autocomplete?event=comprou (/autocomplete?event=comprou) onde após a query string (event=) pode ser passar o nome do evento da compra, podendo passar apenas parte do nome como co, com ou comprou-produto. O serviço só permitirá consulta de dados caso número de caracteres passados como parametros sejam maior que 1.\n\n##  Instalação\nDeve-se startar os container docker com comando \"docker-compose up --build -d\", os seguintes containers devem ser startados\n\n```\nCONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS              PORTS                    NAMES\n23a469569c1a        autocomplete_php_sistema                              \"docker-php-entrypoi…\"   3 seconds ago       Up 2 seconds        80/tcp, 9000/tcp         autocomplete_sistema\naeea1879a440        autocomplete_php_consulta                             \"docker-php-entrypoi…\"   5 minutes ago       Up 3 seconds        80/tcp, 9000/tcp         autocomplete_consulta_dados\nba6822ceb4ac        docker.elastic.co/elasticsearch/elasticsearch:6.5.4   \"/usr/local/bin/dock…\"   5 minutes ago       Up 3 seconds        9200/tcp, 9300/tcp       autocomplete_elasticsearch\n7dcc14529b46        mysql:5.6                                             \"docker-entrypoint.s…\"   2 days ago          Up 4 seconds        3306/tcp                 autocomplete_banco_dados\n\n```\n![Alt text](evidencias/portainer-containers.png?raw=true \"Containers da stack da aplicação\")\n\n\nDeve-se acessar o container do mysql \n```docker exec -it autocomplete_banco_dados bash```\n\nAcessar diretório database\n```cd /database \u0026 mysql -u root -p projeto \u003c script_criacao_banco.sql```\n\nSenha do banco de dados: root\n\n## Variavel de ambiente\nNos diretórios **sistema** e **microservico_autocomplete** deve-se alerar o arquivo ```.env``` com ip do container do elasticsearch, exemplo:\n\nLocal onde deve ser criado o arquivo .env:\n```\nmicroservico/.env\nmicroservico_autocomplete/.env\n```\n\nConteúdo do arquivo .env:\n\n```\nELASTICSEARCH_ADDRESS=172.22.0.3\nELASTICSEARCH_PORT=9200\n```\n\n## Testando aplicação\n### Inserindo dados através da api: POST http://172.22.0.5/sales enviando os dados como json\n![Alt text](evidencias/cadastro-evento-compras.png?raw=true \"Serviço cadastro de compra\")\n\n```\n{\n    \"events\": [\n        {\n            \"event\": \"comprou-produto\",\n            \"timestamp\": \"2016-09-22T13:57:32.2311892-03:00\",\n            \"custom_data\": [\n                {\n                    \"key\": \"product_name\",\n                    \"value\": \"Camisa Azul\"\n                },\n                {\n                    \"key\": \"transaction_id\",\n                    \"value\": \"3029384\"\n                },\n                {\n                    \"key\": \"product_price\",\n                    \"value\": 100\n                }\n            ]\n        },\n        {\n            \"event\": \"comprou\",\n            \"timestamp\": \"2016-09-22T13:57:31.2311892-03:00\",\n            \"revenue\": 250,\n            \"custom_data\": [\n                {\n                    \"key\": \"store_name\",\n                    \"value\": \"Patio Savassi\"\n                },\n                {\n                    \"key\": \"transaction_id\",\n                    \"value\": \"3029384\"\n                }\n            ]\n        },\n        {\n            \"event\": \"comprou-produto\",\n            \"timestamp\": \"2016-09-22T13:57:33.2311892-03:00\",\n            \"custom_data\": [\n                {\n                    \"key\": \"product_price\",\n                    \"value\": 150\n                },\n                {\n                    \"key\": \"transaction_id\",\n                    \"value\": \"3029384\"\n                },\n                {\n                    \"key\": \"product_name\",\n                    \"value\": \"Calça Rosa\"\n                }\n            ]\n        },\n        {\n            \"event\": \"comprou-produto\",\n            \"timestamp\": \"2016-10-02T11:37:35.2300892-03:00\",\n            \"custom_data\": [\n                {\n                    \"key\": \"transaction_id\",\n                    \"value\": \"3409340\"\n                },\n                {\n                    \"key\": \"product_name\",\n                    \"value\": \"Tenis Preto\"\n                },\n                {\n                    \"key\": \"product_price\",\n                    \"value\": 120\n                }\n            ]\n        },\n        {\n            \"event\": \"comprou\",\n            \"timestamp\": \"2016-10-02T11:37:31.2300892-03:00\",\n            \"revenue\": 120,\n            \"custom_data\": [\n                {\n                    \"key\": \"transaction_id\",\n                    \"value\": \"3409340\"\n                },\n                {\n                    \"key\": \"store_name\",\n                    \"value\": \"BH Shopping\"\n                }\n            ]\n        }\n    ]\n}\n```\n\nA saída deverá ser ```{\"flash\":{},\"message\":\"success\"}```\n\nRegistro inserido no banco de dados\n![Alt text](evidencias/cadastro-banco-dados.png?raw=true \"Registro no banco\")\n\n### Usando api de consulta usando filtro por evento: GET http://172.22.0.4/autocomplete?event=comprou-\n![Alt text](evidencias/cadastro-evento-compras_2.png?raw=true \"Consulta do registro\")\n\nA saída deverá ser \n```\n{\n    \"flash\": {},\n    \"message\": [\n        {\n            \"event\": \"comprou-produto\",\n            \"timestamp\": \"2016-09-22T13:57:33.2311892-03:00\",\n            \"product_price\": 150,\n            \"transaction_id\": 3029384,\n            \"product_name\": \"Calça Rosa\"\n        },\n        {\n            \"event\": \"comprou-produto\",\n            \"timestamp\": \"2016-10-02T11:37:35.2300892-03:00\",\n            \"product_price\": 120,\n            \"transaction_id\": 3409340,\n            \"product_name\": \"Tenis Preto\"\n        },\n        {\n            \"event\": \"comprou-produto\",\n            \"timestamp\": \"2016-09-22T13:57:32.2311892-03:00\",\n            \"product_price\": 100,\n            \"transaction_id\": 3029384,\n            \"product_name\": \"Camisa Azul\"\n        }\n    ]\n}\n```\n\n### Usando a API para recuperar pipeline GET http://172.22.0.5/sales/timeline\n\n![Alt text](evidencias/servico-timeline.png?raw=true \"Consulta da timeline\")\n\nA saída deverá ser\n```\n{\n    \"flash\": {},\n    \"message\": {\n        \"timeline\": [\n            {\n                \"timestamp\": \"2016-10-02 11:37:35\",\n                \"revenue\": \"120.00\",\n                \"transaction_id\": \"3409340\",\n                \"store_name\": \"BH Shopping\",\n                \"products\": [\n                    {\n                        \"name\": \"Tenis Preto\",\n                        \"price\": \"120.00\"\n                    }\n                ]\n            },\n            {\n                \"timestamp\": \"2016-09-22 13:57:33\",\n                \"revenue\": \"250.00\",\n                \"transaction_id\": \"3029384\",\n                \"store_name\": \"Patio Savassi\",\n                \"products\": [\n                    {\n                        \"name\": \"Camisa Azul\",\n                        \"price\": \"100.00\"\n                    },\n                    {\n                        \"name\": \"Calça Rosa\",\n                        \"price\": \"150.00\"\n                    }\n                ]\n            }\n        ]\n    }\n}\n```\n\n### URL para sincronização de informações onde se consulta dados de compra de uma outra api e cadastra localmente\nGET http://172.22.0.5/sales/sincronizacao\n\nA saída deverá ser\n```\n{\"flash\":{},\"message\":\"success\"}\n```\n\n\n## Considerações\nPara mais detalhes há um arquivo chamdao documentacao-api.json na raiz do projeto que trás mais detalhe de como fazer cada requisição. \n\nHá um diretório chamado evidência com alguns prints dos testes realizados, como print de tabela de banco, testes realizados na api com Postman. \n\n\n- Requisito de segurança como autenticação para se usar as apis não foram considerados nesta stack\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftayron%2Fservico-auto-complete","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftayron%2Fservico-auto-complete","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftayron%2Fservico-auto-complete/lists"}