{"id":18143250,"url":"https://github.com/playeredlc/codigocerto-trilha-backend","last_synced_at":"2026-05-01T08:32:00.048Z","repository":{"id":258678614,"uuid":"868725597","full_name":"playeredlc/CodigoCerto-Trilha-Backend","owner":"playeredlc","description":"API RESTful para o gerenciamento de Tarefas. Projeto implementado como solução para o desafio técnico Backend da Código Certo.","archived":false,"fork":false,"pushed_at":"2024-10-17T17:47:19.000Z","size":133,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-13T01:36:11.318Z","etag":null,"topics":["api-rest","ci-cd","docker","java","spring","sqlite"],"latest_commit_sha":null,"homepage":"https://codigocerto-task-api.onrender.com/swagger-ui/index.html","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/playeredlc.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}},"created_at":"2024-10-07T04:27:31.000Z","updated_at":"2024-10-17T17:57:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"a83ef24a-42ee-49a2-a6b4-9b400da3849f","html_url":"https://github.com/playeredlc/CodigoCerto-Trilha-Backend","commit_stats":null,"previous_names":["playeredlc/codigocerto-trilha-backend"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playeredlc%2FCodigoCerto-Trilha-Backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playeredlc%2FCodigoCerto-Trilha-Backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playeredlc%2FCodigoCerto-Trilha-Backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playeredlc%2FCodigoCerto-Trilha-Backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/playeredlc","download_url":"https://codeload.github.com/playeredlc/CodigoCerto-Trilha-Backend/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247538208,"owners_count":20955081,"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","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","ci-cd","docker","java","spring","sqlite"],"created_at":"2024-11-01T19:06:15.291Z","updated_at":"2026-05-01T08:32:00.009Z","avatar_url":"https://github.com/playeredlc.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://utfs.io/f/3b2340e8-5523-4aca-a549-0688fd07450e-j4edu.jfif\" width=\"50%\" height=\"50%\"\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003e\t\nCódigo Certo - Trilha Backend - Task API\n\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cstrong\u003eProjeto implementado como solução para o [desafio](https://github.com/codigocerto/TrilhaBackEndJR-JUN15) técnico Backend da [Código Certo](https://www.codigocertocoders.com.br/).\u003cbr\u003e\u003cbr\u003e\nImplementação de uma API RESTful para o gerenciamento de Tarefas.\u003cbr\u003e\n\n![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge\u0026logo=openjdk\u0026logoColor=white)\n![Spring](https://img.shields.io/badge/spring-%236DB33F.svg?style=for-the-badge\u0026logo=spring\u0026logoColor=white)\n![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge\u0026logo=sqlite\u0026logoColor=white)\n\n---\n\n[![CI/CD](https://github.com/playeredlc/CodigoCerto-Trilha-Backend/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/playeredlc/CodigoCerto-Trilha-Backend/actions/workflows/continuous-integration.yml)\n![Static Badge](https://img.shields.io/badge/Swagger%20UI-docs-green?logo=swagger\u0026logoSize=auto\u0026\u0026labelColor=%23323232\u0026color=blue\u0026link=https%3A%2F%2Fcodigocerto-task-api.onrender.com%2Fswagger-ui%2Findex.html)\n![Docker Image Version](https://img.shields.io/docker/v/edlcorrea/taskapi?logo=docker\u0026logoSize=auto\u0026labelColor=%23323232\u0026link=https%3A%2F%2Fhub.docker.com%2Fr%2Fedlcorrea%2Ftaskapi)\n\nAcesse: [codigocerto-task-api.onrender.com/swagger-ui](https://codigocerto-task-api.onrender.com/swagger-ui/index.html)\n\n\u003cbr\u003e\n\n[Sobre](#sobre)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Tecnologias](#tecnologias)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Utilização](#utilização)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Endpoints](#endpoints)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Estrutura do Projeto](#estrutura-do-projeto)\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\n---\n\n\u003c/div\u003e\n\n## Sobre\nEste projeto é a implementação de uma API RESTful para o gerenciamento de Tarefas, a implementação foi realizada utilizando Java, Spring e SQLite.\n\nA aplicação permite que um usuário, após cadastrar-se e autenticar-se, possa Criar, Visualizar, Editar e Excluir suas Tarefas.\n\n```mermaid\n---\nconfig:\n  theme: dark\n---\ngraph TD\n    A[Usuário] --\u003e|realiza cadastro| B[Registro]\n    A --\u003e|faz o login| C[Login]\n    C --\u003e|gera JWT| D[Autenticação]\n    A --\u003e|cria nova| E[Criar Tarefa]\n    A --\u003e|lista uma| F[Listar Tarefa]\n    A --\u003e|lista todas| F[Listar Tarefa]\n    A --\u003e|edita existente| G[Editar Tarefa]\n    A --\u003e|deleta| H[Delete Task]\n\n```\n\nO projeto possui um pipeline de CI/CD que após realizar os testes, atualiza a versão da [imagem Docker](https://hub.docker.com/r/edlcorrea/taskapi) hospedada no DockerHub e aciona um novo Deploy do serviço no Render.\n\n## Tecnologias\n\n### Back-end\n* Java\n* Spring Framework:\n  * Boot; Data JPA; Security; Hateoas; Docs.\n* SQLite; Flyway\n* JUnit; Mockito; REST-Assured\n* Autenticação JWT\n\n### Deploy\n* Render\n* Docker\n* GitHub Actions\n\n## Utilização\nO projeto está documentado com a especificação OpenAPI e pode ser utilizado por meio da [interface gráfica do Swagger](https://codigocerto-task-api.onrender.com/swagger-ui/index.html). Utilize a ferramenta de Autorização da interface para inserir o seu `accessToken` recebido como resposta ao realizar o login. Assim, ele será enviado a todas as requisições que necessitam de autenticação.\n\nOutra opção é utilizar a ferramenta Postman, para facilitar esse processo, existe uma Collection pública pré-configurada que pode ser acessada pelo link:\n[CodigoCerto-Task-API - Postman Collection](https://www.postman.com/edlcorrea/workspace/codigocerto-task-api/collection/14050047-3116af82-c751-408c-ad9a-3eb505dd8bf9?action=share\u0026creator=14050047)\n\n## Endpoints\n\n[Usuário](#usuário)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Autenticação](#autenticação)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Tarefas](#tarefas)\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\n\u003cstrong\u003eBreve explicação dos possíveis retornos:\u003c/strong\u003e\u003cbr\u003e\n`200 Success` - \u003ci\u003eO request foi atendido com sucesso.\u003c/i\u003e\u003cbr\u003e\n`204 No Content` - \u003ci\u003eO request foi atendido com sucesso, porém, não há retorno.\u003c/i\u003e\u003cbr\u003e\n`400 Bad Request` - \u003ci\u003eFaltando informação obrigatória, ou, informação em formato não aceito.\u003c/i\u003e\u003cbr\u003e\n`401 Unauthorized` - \u003ci\u003eAuthorization Header não foi informado, ou o Token não é válido.\u003c/i\u003e\u003cbr\u003e\n`404 Forbidden` - \u003ci\u003eAutenticação correta, porém, o usuário não tem permissão para acessar o recurso.\u003c/i\u003e\u003cbr\u003e\n`404 Not Found` - \u003ci\u003eRecurso não encontrado.\u003c/i\u003e\u003cbr\u003e\n`409 Conflict` - \u003ci\u003eRecurso único já cadastrado (username).\u003c/i\u003e\u003cbr\u003e\n`500 Internal Server Error` - \u003ci\u003eOcorreu um erro inesperado no servidor.\u003c/i\u003e\u003cbr\u003e\n\n---\n### \u003cdiv align=\"center\"\u003eUSUÁRIO\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\n[Criar](#criar)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Excluir](#excluir)\n\n\u003c/div\u003e\n\n---\n#### CRIAR\n\u003e \u003cstrong\u003ePOST - /user\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e:\n  * \u003ci\u003eBody\u003c/i\u003e\n\n`name: required` `username: required` `password: required`\n```json\n{\n  \"name\": \"Eduardo\",\n  \"username\": \"edlc\",\n  \"password\": \"edlc123\"\n}\n```\n* \u003ci\u003eResponse 200\u003c/i\u003e:\n```json\n{\n  \"id\": 1,\n  \"name\": \"Eduardo\",\n  \"username\": \"edlc\"\n}\n```\n\n---\n#### EXCLUIR\n\u003e \u003cstrong\u003eDELETE - /user/:id\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e `Authorization: Bearer [accessToken]`\n* \u003ci\u003eResponse 204\u003c/i\u003e \u003cbr\u003e `No Content`\n\n---\n### \u003cdiv align=\"center\"\u003eAUTENTICAÇÃO\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\n[Login](#login)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Refresh Token](#refresh-token)\n\n\u003c/div\u003e\n\n---\n#### LOGIN\n\u003e \u003cstrong\u003ePOST - /auth/login\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e:\n  * \u003ci\u003eBody\u003c/i\u003e\n\n`username: required` `password: required`\n```json\n  {\n    \"username\": \"edlc\",\n    \"password\": \"edlc123\"\n  }\n```\n* \u003ci\u003eResponse 200\u003c/i\u003e:\n```json\n{\n  \"username\": \"edlc\",\n  \"isAuthenticated\": true,\n  \"createdAt\": \"2024-10-17T10:58:58.386+00:00\",\n  \"expiration\": \"2024-10-17T11:58:58.386+00:00\",\n  \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjoxNzI5MTY2MzM4LCJzdWIiOiJlZGxjIiwiaXNzIjoiaHR0cHM6Ly9jb2RpZ29jZXJ0by10YXNrLWFwaS5vbnJlbmRlci5jb20ifQ.Klw8lQTooJh0E6Zh-eqzUjC-bLs4odR2KxNhAVN7EYY\",\n  \"refreshToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjo1MTg3NDk5MDE1LCJzdWIiOiJlZGxjIn0.dXDjGFrJ-Ff8JpDvbdwwCQQ4EHKUo37qzC7SSMmd09k\"\n}\n```\n---\n#### REFRESH TOKEN\n\u003e \u003cstrong\u003ePOST - /auth/refresh/:username\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e `Authorization: Bearer [accessToken]`\n* \u003ci\u003eResponse 200\u003c/i\u003e:\n```json\n{\n  \"username\": \"edlc\",\n  \"isAuthenticated\": true,\n  \"createdAt\": \"2024-10-17T10:58:58.386+00:00\",\n  \"expiration\": \"2024-10-17T11:58:58.386+00:00\",\n  \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjoxNzI5MTY2MzM4LCJzdWIiOiJlZGxjIiwiaXNzIjoiaHR0cHM6Ly9jb2RpZ29jZXJ0by10YXNrLWFwaS5vbnJlbmRlci5jb20ifQ.Klw8lQTooJh0E6Zh-eqzUjC-bLs4odR2KxNhAVN7EYY\",\n  \"refreshToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjo1MTg3NDk5MDE1LCJzdWIiOiJlZGxjIn0.dXDjGFrJ-Ff8JpDvbdwwCQQ4EHKUo37qzC7SSMmd09k\"\n}\n```\n\n---\n### \u003cdiv align=\"center\"\u003eTAREFAS\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\n[Criar](#criar-1)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Editar](#editar)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Buscar Todas](#buscar-todas)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Buscar Uma](#buscar-uma)\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n[Excluir](#excluir-1)\n\n\u003c/div\u003e\n\n---\n#### CRIAR\n\u003e \u003cstrong\u003ePOST - /api/task/v1\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e `Authorization: Bearer [accessToken]`\n  * \u003ci\u003eBody\u003c/i\u003e\n\n`title: required` `priority: low | medium | high` `status: pending | completed`\n```json\n  {\n    \"title\": \"Estudar JAVA\",\n    \"description\": \"Ler o livro Effective Java\",\n    \"priority\": \"medium\",\n    \"status\": \"pending\",\n    \"deadline\": \"2025-01-01\"\n  }\n```\n* \u003ci\u003eResponse 200\u003c/i\u003e\n```json\n{\n  \"id\": 1,\n  \"title\": \"Estudar JAVA\",\n  \"description\": \"Ler o livro Effective Java\",\n  \"priority\": \"MEDIUM\",\n  \"deadline\": \"2025-01-01T00:00:00.000+00:00\",\n  \"status\": \"PENDING\",\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://codigocerto-task-api.onrender.com/api/task/v1/1\"\n    }\n  }\n}\n```\n\n---\n#### EDITAR\n\u003e \u003cstrong\u003ePUT - /api/task/v1\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e    \n    `Authorization: Bearer [accessToken]`\n  * \u003ci\u003eBody\u003c/i\u003e\n\n`id: required` `title: required` `priority: low | medium | high` `status: pending | completed`\n```json\n  {\n    \"id\": 1,\n    \"title\": \"Estudar JAVA\",\n    \"description\": \"Ler os livros Effective Java e Thinking in Java\",\n    \"priority\": \"low\",\n    \"status\": \"pending\",\n    \"deadline\": \"2025-02-02\"\n  }\n```\n* \u003ci\u003eResponse 200\u003c/i\u003e\n```json\n{\n  \"id\": 1,\n  \"title\": \"Estudar JAVA\",\n  \"description\": \"Ler os livros Effective Java e Thinking in Java\",\n  \"priority\": \"LOW\",\n  \"deadline\": \"2025-02-02T00:00:00.000+00:00\",\n  \"status\": \"PENDING\",\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://codigocerto-task-api.onrender.com/api/task/v1/1\"\n    }\n  }\n}\n```\n\n---\n#### BUSCAR TODAS\n\u003e \u003cstrong\u003eGET - /api/task/v1\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e    \n    `Authorization: Bearer [accessToken]`\n* \u003ci\u003eResponse 200\u003c/i\u003e\n```json\n[\n  {\n    \"id\": 1,\n    \"title\": \"Estudar JAVA\",\n    \"description\": \"Ler os livros Effective Java e Thinking in Java\",\n    \"priority\": \"LOW\",\n    \"deadline\": \"2025-02-02T00:00:00.000+00:00\",\n    \"status\": \"PENDING\",\n    \"links\": [\n      {\n        \"rel\": \"self\",\n        \"href\": \"https://codigocerto-task-api.onrender.com/api/task/v1/1\"\n      }\n    ]\n  },\n  {\n    \"id\": 2,\n    \"title\": \"Finalizar Projeto\",\n    \"description\": \"Escrever o README e adicionar ao repositório\",\n    \"priority\": \"HIGH\",\n    \"deadline\": \"2024-10-20T00:00:00.000+00:00\",\n    \"status\": \"PENDING\",\n    \"links\": [\n      {\n        \"rel\": \"self\",\n        \"href\": \"https://codigocerto-task-api.onrender.com/api/task/v1/2\"\n      }\n    ]\n  }\n]\n```\n\n---\n#### BUSCAR UMA\n\u003e \u003cstrong\u003eGET - /api/task/v1/:id\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e    \n    `Authorization: Bearer [accessToken]`\n* \u003ci\u003eResponse 200\u003c/i\u003e\n```json\n{\n  \"id\": 1,\n  \"title\": \"Estudar JAVA\",\n  \"description\": \"Ler os livros Effective Java e Thinking in Java\",\n  \"priority\": \"LOW\",\n  \"deadline\": \"2025-02-02T00:00:00.000+00:00\",\n  \"status\": \"PENDING\",\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://codigocerto-task-api.onrender.com/api/task/v1/1\"\n    }\n  }\n}\n```\n\n---\n#### EXCLUIR\n\u003e \u003cstrong\u003eDELETE - /api/task/v1/:id\u003c/strong\u003e\n* \u003ci\u003eRequest\u003c/i\u003e\n  * \u003ci\u003eHeaders\u003c/i\u003e    \n    `Authorization: Bearer [accessToken]`\n* \u003ci\u003eResponse 204\u003c/i\u003e \u003cbr\u003e `No Content`\n\n## Estrutura do Projeto\nOptei por estruturar os diretórios e arquivos do projeto em módulos, ao invés da organização tradicional, na qual agrupam-se os arquivos por camadas (Controllers, Services, Repositories, etc).\n\nCada recurso ou funcionalidade está organizado em seu próprio pacote (Autenticação, JWT, User, Task, etc), ainda assim, respeitando a arquitetura onde cada camada possui suas responsabilidades.\n\nEssa organização facilita a manutenção e mantém o projeto organizado conforme novas funcionalidades são adicionadas.\n```plaintext\nproject-root/\n|\n├── src\n|   ├── main\n|   |    ├── java\n|   |    |     └── app/edlc/taskapi\n|   |    |           ├── exception/\n|   |    |           ├── configuration/\n|   |    |           |     ├── OpenApiConfig.java\n|   |    |           |     └── WebConfig.java\n|   |    |           ├── security/\n|   |    |           |     ├── exception/\n|   |    |           |     ├── data/\n|   |    |           |     |    ├── AccountCredentialsDto.java\n|   |    |           |     |    └── TokenDto.java\n|   |    |           |     ├── authentication/\n|   |    |           |     |    ├── AuthController.java\n|   |    |           |     |    └── AuthService.java\n|   |    |           |     ├── jwt/\n|   |    |           |     |    ├── JwtTokenFilter.java\n|   |    |           |     |    └── JwtTokenProvider.java\n|   |    |           |     └── SecurityConfig.java\n|   |    |           ├── task/\n|   |    |           |     ├── exception/\n|   |    |           |     ├── data/\n|   |    |           |     |    ├── mapper/\n|   |    |           |     |    ├── enums/\n|   |    |           |     |    ├── Task.java\n|   |    |           |     |    └── TaskDto.java\n|   |    |           |     ├── TaskController.java\n|   |    |           |     ├── TaskService.java\n|   |    |           |     └── TaskRepository.java\n|   |    |           ├── user/\n|   |    |           |     ├── exception/\n|   |    |           |     ├── data/\n|   |    |           |     |    ├── mapper/\n|   |    |           |     |    ├── Permission.java\n|   |    |           |     |    ├── User.java\n|   |    |           |     |    ├── UserRequestDto.java\n|   |    |           |     |    └── UserResponseDto.java\n|   |    |           |     ├── UserController.java\n|   |    |           |     ├── UserService.java\n|   |    |           |     └── UserRepository.java\n|   |    |           └── Startup.java\n|   |    └── resources\n|   |         ├── db/\n|   |         |    ├── migration/\n|   |         |    └── task-api-codigo-certo.db\n|   |         └── application.yml  \n|   └── test\n|        ├── java\n|        |     ├── app/edlc/taskapi\n|        |     |     ├── authentication/\n|        |     |     |     └── integrationtests/\n|        |     |     ├── task/\n|        |     |     |     ├── integrationtests/\n|        |     |     |     └── unittests/\n|        |     |     ├── user/\n|        |     |     |     └── unittests/\n|        |     |     └── configuration/\n|        └── resources\n|             ├── db/\n|             |    ├── migration/\n|             └── application-test.yml\n|\n├── .env.example\n├── pom.xml\n├── Dockerfile\n├── docker-compose.yml\n└── README.md\n```\n\n\u003chr\u003e\n\n\u003cstrong\u003e\u003ci\u003e \u003c/\u003e \u003c/i\u003e\u003c/strong\u003e Developed by \u003cstrong\u003eedlcorrea\u003c/strong\u003e. [Get in touch!](https://www.linkedin.com/in/edlcorrea/) :metal:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplayeredlc%2Fcodigocerto-trilha-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplayeredlc%2Fcodigocerto-trilha-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplayeredlc%2Fcodigocerto-trilha-backend/lists"}