{"id":28359023,"url":"https://github.com/danilomeneghel/prova-estapar","last_synced_at":"2026-04-15T16:03:16.724Z","repository":{"id":296788179,"uuid":"991614976","full_name":"danilomeneghel/prova-estapar","owner":"danilomeneghel","description":"Teste Desenvolvedor Java/Kotlin Backend","archived":false,"fork":false,"pushed_at":"2025-06-29T20:16:41.000Z","size":930,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-29T21:25:02.301Z","etag":null,"topics":["api-rest","docker-compose","gradle","kotlin","micronaut","postgresql","swagger-ui","webhook"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danilomeneghel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2025-05-27T22:36:41.000Z","updated_at":"2025-06-29T20:16:44.000Z","dependencies_parsed_at":"2025-06-02T12:04:18.581Z","dependency_job_id":"deb7f2f5-60c1-4dc8-8e71-90e39665f71a","html_url":"https://github.com/danilomeneghel/prova-estapar","commit_stats":null,"previous_names":["danilomeneghel/prova-estapar"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danilomeneghel/prova-estapar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danilomeneghel%2Fprova-estapar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danilomeneghel%2Fprova-estapar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danilomeneghel%2Fprova-estapar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danilomeneghel%2Fprova-estapar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danilomeneghel","download_url":"https://codeload.github.com/danilomeneghel/prova-estapar/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danilomeneghel%2Fprova-estapar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278940519,"owners_count":26072536,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["api-rest","docker-compose","gradle","kotlin","micronaut","postgresql","swagger-ui","webhook"],"created_at":"2025-05-28T09:08:56.758Z","updated_at":"2025-10-08T12:12:07.700Z","avatar_url":"https://github.com/danilomeneghel.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Teste Desenvolvedor Java/Kotlin Backend\n\nEste é o teste para Desevolvedor Java/Kotlin da Estapar.\n\nO objetivo é criar um sistema de gestão de estacionamentos, que controla o número de vagas em aberto, entrada, saida e faturamento do setor.\n\n## Requisitos Técnicos\n\n* Kotlin 1.9.10\n* Java JDK 21\n* Gradle 4.4.1\n* PostgreSql 16\n* Docker 28.0.1\n\n## Tecnologias Utilizadas\n\n* Framework Micronaut\n* Kotlin\n* Gradle\n* PostgreSql\n* Swagger-UI\n* Docker Compose\n\n## Instalação \n\n```\ngit clone https://github.com/danilomeneghel/prova-estapar.git\n\ncd prova-estapar\n```\n\n## Docker\n\nPara rodar o projeto via Docker, bastar executar o seguinte comando:\n\n```\ndocker compose up\n```\n\nAguarde baixar as dependências e carregar todo o projeto, esse processo é demorado.\nCaso conclua e não rode pela primeira vez, tente novamente executando o mesmo comando.\n\nPara encerrar tudo digite:\n\n```\ndocker compose down\n```\n\n## Gradle\n\nCaso não tenho o Docker instalado e queira rodar diretamente a aplicação, altere o arquivo application.xml com o Host e Credenciais do banco de dados PostgreSql que irá conectar.\n\nApós feito isso, execute o seguinte comando no terminal:\n\n```\n./gradlew clear run\n```\n\n## Testes\n\nPara realizar os testes, execute o seguinte comando no terminal:\n\n```\n./gradlew test\n```\n\n## Simulador\n\nVamos prover um docker com o simulador, ele sobe e após 2 segundos começa e enviar eventos de entradas e saidas \nde veículos da garagem.\nVamos modificar os parametros no nosso teste para avaliar como a sua aplicação se comporta. \n\nO Simulador pode ser rodado com:\n\n```\n docker run -d --network=\"host\" cfontes0estapar/garage-sim:1.0.0\n\n```\n\n## Requisitos Funcionais\n\nO sistema deve importar os dados geolocalizados de vagas e setores e armazenar em um banco de dados as informações.\nVagas podem ter metadados associados como preço, datas, horário de funcionamento e duração da estádia.\n\nCrie um sistema que gerência o uso e faturamento deste setor de estacionamento, não precisamos de UI por enquanto somente o backend e API REST, mas já será disponibilizada para uso na garagem piloto.\n\nOs dados da garagem são obtidos pelo endpoint de ```/garage``` e deve estar apto a receber por webhook entradas e saidas dos veículos por JSON com a API descrita abaixo.\n\nUma garagem é composta por uma cancela automática, utilizadas para entrar e sair e sensores de presença nas vagas que analisam a presença ou ausência de um veículo na vaga.\n\nApós uma chamada ao endpoint de dados ```/garage``` a garagem é aberta e o sistema é liberado para entrada e saída de veículos, veja que podemos ter mais de uma cancela automática no mesmo estacionamento ou por setor.\n\nMesmo para sensores de solo que podem ser acionados em conjunto se varios carros estacionarem ao mesmo tempo.\n\n## Regras de negócio\n\n### Regra de preço dinâmico.\n1. Com lotação menor que 25%, desconto de 10% no preço.\n2. Com lotação menor até 50%, desconto de 0% no preço.\n3. Com lotação menor até 75%, aumentar o preço em 10%.\n4. Com lotação menor até 100%, aumentar o preço em 25%.\n\n### Regra de lotação\nCom 100% de lotação fechar o setor e só permitir mais carros com a saida de um já estacionado.\n\n# API \n\n## Simulator Webhook API\nSua app deve aceitar conexões pelo url http://localhost:3003/webhook\n\n### Entrada na garagem\n\n**WEBHOOK - POST**\n```JSON\n{\n  \"license_plate\": \"ZUL0001\",\n  \"entry_time\": \"2025-01-01T12:00:00.000Z\",\n  \"event_type\": \"ENTRY\"\n}\n```\n\n------------------\n\n### Entrada na vaga\n\n**WEBHOOK - POST**\n```JSON\n{\n  \"license_plate\": \"ZUL0001\",\n  \"lat\": -23.561684,\n  \"lng\": -46.655981,\n  \"event_type\": \"PARKED\"\n}\n```\n\n------------------\n\n### Saida de garagem\n\n**WEBHOOK - POST**\n```JSON\n{\t\t\n  \"license_plate\": \"ZUL0001\",\n  \"exit_time\": \"2025-01-01T12:00:00.000Z\",\n  \"event_type\": \"EXIT\"\n}\n```\n\n## Simulator REST API\n\n### Garage config\n\n**GET**\n`/garage`\n\n```JSON\n{\n  \"garage\": [\n    {\n      \"sector\": \"A\",\n      \"basePrice\": 10.0,\n      \"max_capacity\": 100,\n      \"open_hour\": \"08:00\",\n      \"close_hour\": \"22:00\",\n      \"duration_limit_minutes\": 240\n    },\n    {\n      \"sector\": \"B\",\n      \"basePrice\": 4.0,\n      \"max_capacity\": 72,\n      \"open_hour\": \"05:00\",\n      \"close_hour\": \"18:00\",\n      \"duration_limit_minutes\": 120\n    }\n  ],\n  \"spots\": [\n    {\n      \"id\": 1,\n      \"sector\": \"A\",\n      \"lat\": -23.561684,\n      \"lng\": -46.655981\n    },\n    {\n      \"id\": 2,\n      \"sector\": \"B\",\n      \"lat\": -23.561674,\n      \"lng\": -46.655971\n    }\n  ]\n}\n```\n\n# API do Projeto a ser implementada\n\n## REST API\n\nA url base da API é http://localhost:3003/api\n\n### Consulta de Placa\n\n**POST**\n`/plate-status`\n```JSON\n{\n  \"license_plate\": \"ZUL0001\"\n}\n```\n\nResponse\n```JSON\n{\n  \"license_plate\": \"ZUL0001\",\n  \"price_until_now\": 0.00,\n  \"entry_time\": \"2025-01-01T12:00:00.000Z\", \n  \"time_parked\": \"2025-01-01T12:00:00.000Z\",\n  \"lat\": -23.561684,\n  \"lng\": -46.655981\n}\n```\n\n------------------\n\n### Consulta de Vaga\n\n**POST**\n`/spot-status`\n\nRequest\n```JSON\n{\n  \"lat\": -23.561684,\n  \"lng\": -46.655981\n}\n```\n\nResponse - 200\n```JSON\n{\n  \"ocupied\": false,\n  \"license_plate\": \"\",\n  \"price_until_now\": 0.00,\n  \"entry_time\": \"2025-01-01T12:00:00.000Z\",\n  \"time_parked\": \"2025-01-01T12:00:00.000Z\"\n}\n```\n\n### Consulta faturamento\n\n**POST**\n`/revenue`\n\nRequest\n```JSON\n{\n  \"date\": \"2025-01-01\",\n  \"sector\": \"A\"\n}\n```\n\nResponse\n```JSON\n{\n  \"amount\": 0.00,\n  \"currency\": \"BRL\",\n  \"timestamp\": \"2025-01-01T12:00:00.000Z\"\n}\n```\n\n## Swagger\n\nDocumentação da API RESTful:\u003cbr\u003e\n\nhttp://localhost:3003/swagger-ui\n\n\n## Screenshots\n\nWebHook \u003cbr\u003e\n![Screenshots](screenshots/screenshot01.png) \u003cbr\u003e\u003cbr\u003e\n\nSwagger-UI \u003cbr\u003e\n![Screenshots](screenshots/screenshot02.png) \u003cbr\u003e\u003cbr\u003e\n\nModelagem ER \u003cbr\u003e\n![Screenshots](screenshots/screenshot03.png) \u003cbr\u003e\u003cbr\u003e\n\nTestes Unitários \u003cbr\u003e\n![Screenshots](screenshots/screenshot04.png) \u003cbr\u003e\u003cbr\u003e\n\nAplicação Micronaut \u003cbr\u003e\n![Screenshots](screenshots/screenshot05.png) \u003cbr\u003e\u003cbr\u003e\n\n\n## Licença\n\nProjeto licenciado sob \u003ca href=\"LICENSE\"\u003eThe MIT License (MIT)\u003c/a\u003e.\u003cbr\u003e\u003cbr\u003e\n\n\nDesenvolvido por\u003cbr\u003e\nDanilo Meneghel\u003cbr\u003e\ndanilo.meneghel@gmail.com\u003cbr\u003e\nhttp://danilomeneghel.github.io/\u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanilomeneghel%2Fprova-estapar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanilomeneghel%2Fprova-estapar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanilomeneghel%2Fprova-estapar/lists"}