{"id":20739868,"url":"https://github.com/ecureuill/rpgbattle","last_synced_at":"2025-09-14T18:52:12.254Z","repository":{"id":194879287,"uuid":"689398498","full_name":"ecureuill/rpgbattle","owner":"ecureuill","description":"API REST de sistema de batalhas RPG por turnos","archived":false,"fork":false,"pushed_at":"2023-09-14T20:52:45.000Z","size":219,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-25T03:38:24.957Z","etag":null,"topics":["java","postgresql","rest","restful","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","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/ecureuill.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}},"created_at":"2023-09-09T17:18:38.000Z","updated_at":"2025-06-30T13:34:55.000Z","dependencies_parsed_at":"2023-09-15T14:44:14.584Z","dependency_job_id":"8f92ba84-2dda-4955-9e60-1aa0a06c7714","html_url":"https://github.com/ecureuill/rpgbattle","commit_stats":null,"previous_names":["ecureuill/rpgbattle"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ecureuill/rpgbattle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecureuill%2Frpgbattle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecureuill%2Frpgbattle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecureuill%2Frpgbattle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecureuill%2Frpgbattle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ecureuill","download_url":"https://codeload.github.com/ecureuill/rpgbattle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecureuill%2Frpgbattle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275152361,"owners_count":25414447,"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-09-14T02:00:10.474Z","response_time":75,"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":["java","postgresql","rest","restful","springboot"],"created_at":"2024-11-17T06:26:28.317Z","updated_at":"2025-09-14T18:52:12.200Z","avatar_url":"https://github.com/ecureuill.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \n# ⚔️ RPG Battle API ⚔️\n\n![Docker](https://img.shields.io/badge/-Docker-000?\u0026logo=Docker)\n![Linux](https://img.shields.io/badge/-Linux-000?\u0026logo=Linux)\n![Spring](https://img.shields.io/badge/-Spring-000?\u0026logo=Spring)\n![Postgresql](https://img.shields.io/badge/-Postgresql-000?\u0026logo=Postgresql)\n![Git](https://img.shields.io/badge/Git-000?\u0026logo=Git)\n![VSCode](https://img.shields.io/badge/VSCode-000?\u0026logo=visualstudiocode)\n\n\u003c/div\u003e\n\n## Sobre o Projeto\n\nEste projeto é uma API REST desenvolvida como parte de um desafio back-end da empresa Avanade. A API é um sistema de batalhas RPG por turnos, onde os jogadores podem criar batalhas, selecionar personagens, determinar a iniciativa e realizar os turnos.\n\n![image](https://github.com/ecureuill/rpgbattle-api/assets/993369/a954479d-ec99-4bdf-a6ea-4b90152e964f)\n## Sobre a mecânica do jogo\n\n- Criação de Batalha: os jogadores devem criar uma batalha, informando os dois oponentes.\n- Seleção de personagens: Os jogadores devem escolher seus personagens antes da iniciativa ser determinada.\n- Iniciativa: A batalha começa com um teste de dados para determinar o jogador que tem a iniciativa.\n- Turno de ataque: O jogador rola um dado e o valor é somado aos atributos de força e agilidade do personagem para determinar o poder de ataque.\n- Turno de defesa: O jogador oponente rola um dado e o valor é somado aos atributos de defesa e agilidade do personagem para determinar a capacidade de defesa.\n- Ataque x Defesa: O sistema verifica se o poder de ataque é maior que a capacidade de defesa. Se for, um Turno de dano é habilitado, caso contrário o turno se encerra e um novo é iniciado.\n- Turno de dano: O jogador atacante rola os dados e o valor é somado ao atributo de força do personagem. O dano, então, é subtraído dos pontos de vida do personagem do oponente.\n- Fim da batalha: A batalha termina quando um dos jogadores perde todos os pontos de vida do seu personagem.\n\n## Tecnologias Utilizadas\nEste projeto utiliza as seguintes tecnologias:\n- Linguagem: Java 17\n- Gerenciador de Depências: Maven 3.3.1\n- Framework: Spring Boot\n- Documentação: SpringDoc\n- Database: Postgresql\n- Ambiente de Desenvolvimento: Docker\n- Editor: VS Code\n\nO uso do Spring Boot facilita a criação de APIs REST, enquanto o SpringDoc fornece uma documentação automatizada da API. O PostgreSQL foi escolhido como banco de dados devido ao requisito do desafio. O Docker é utilizado para criar um ambiente de desenvolvimento isolado e replicável. O VS Code foi utilizado por sua facilidade em desenvolver em um container docker.\n\n## Funcionalidades\nA API oferece funcionalidades que  permitem aos jogadores interagir com o sistema criando personagens, participando de batalhas e acompanhando o progresso do jogo.\n\n- **Criação de Usuário**: permite criar um novo usuário no sistema.\n- **CRUD de Personagens**: permite criar, editar, consultar e excluir personages do jogo.\n- **Criação de Batalha**: permite criar uma nova batalha entre dois jogadores\n- **Seleção de personagens**: permite e selecionar personagens que participarão de uma batalha\n- **Batalhar**\n  - **Iniciativa**: permite determinar a ordem do turno dos jogadores\n  - **Disputar o turno**: permite realizar ataques, defesas e danos em uma batalha\n- **Consulta de batalhas**: permite aos usuários obter informações sobre todas as batalhas registradas no sistema ou sobre uma batalha específica.\n- **Consulta de Log**: permite obter o registro de eventos e ações ocorridos durante uma batalha.\n\n## Instalação e execução\nPara utilizar o projeto, siga as instruções abaixo:\n\n1. **Pré-requisitos**: Certifique-se de ter o Java JDK 17 e o Maven instalados em sua máquina.\n\n1. **Clone do repositório**: Faça um clone deste repositório em sua máquina local.\n\n1. **Instalação das dependências**: Navegue até o diretório raiz do projeto e execute o comando `mvn install` para instalar as dependências necessárias.\n\n1. **Configuração do banco de dados**: O projeto utiliza um banco de dados PostgreSQL. Certifique-se de ter o PostgreSQL instalado em sua máquina e crie um banco de dados vazio para ser utilizado pelo projeto.\n\n1. **Configuração das variáveis de ambiente**: Crie um arquivo `.env` na raiz do projeto e defina as seguintes variáveis de ambiente:\n\n    ```\n    DATABASE_URL=jdbc:postgresql://localhost:5432/nome_do_banco\n    DATABASE_USERNAME=seu_usuario\n    DATABASE_PASSWORD=sua_senha\n    ```\n\n    Substitua `nome_do_banco`, `seu_usuario` e `sua_senha` pelos valores correspondentes ao seu ambiente.\n\n1. **Execução do projeto**: Execute o comando `mvn spring-boot:run` para iniciar a aplicação.\n\n1. **Acesso à API**: A API estará disponível em http://localhost:8080. Você pode utilizar um cliente de API, como o Postman, para testar os endpoints, ou a interface Swagger-UI em http://localhost:8080/swagger-ui/index.html.\n\n## Endpoints\nA API possui os seguintes endpoints:\n\n- **POST** `/characters`: Cria um novo personagem\n- **GET** `/characters`: Retorna informações sobre todos os personagens\n- **GET** `/characters/{specie}`: Retorna informações sobre um personagem específico.\n- **PUT** `/characters/{specie}`: Atualiza informações sobre um personagem específico.\n- **DELETE** `/characters/{specie}`: Exclui um personagem específico.\n- **POST** `/battles`: Cria uma nova batalha.\n- **POST** `/battles/{battleId}/{player}`: Seleciona um personagem para a batalha.\n- **POST** `/battles/{battleId}/Initiative`: Determina a iniciativa da batalha.\n- **POST** `/battles/{battleId}/turns`: Avança os turnos da batalha.\n- **GET** `/battles`: Retorna informações sobre todas as batalhas.\n- **GET** `/battles/{battelId}`: Retorna informações sobre uma batalha específica.\n- **GET** `/logs/{battleId}`: Retorna informações completa sobre uma batalha específica, incluindo todos turnos realizados.\n- **GET** `/users/`: Retorna a lista de usuários cadastrados\n- **POST** `users`: Crie um usuário\n\n### Exemplos de comandos \nA seguir, estão exemplos de comandos para utilizar as funcionalidades principais da API.\n \nA ***Documentação completa*** da API, incluindo detalhes sobre todos os endpoints, pode ser acessada em [swager-ui](http://localhost:8080).\n\n- **Criar um usuário**\n  ```json\n  POST /users\n  Body:\n  {\n    \"username\": \"Nome do Usuário\",\n    \"email\": \"usuario@example.com\",\n    \"password\": \"12345678\"\n  }\n  ```\n- **Criar um personagem**\n  ```json\n  POST /characters\n  Body:\n  {\n    \"type\": \"HERO ou MONSTER\",\n    \"specie\": \"nome do personagem\",\n    \"life\": 20,\n    \"strength\": 7,\n    \"defence\": 4,\n    \"agility\": 4,\n    \"dice\": \"2d6\"\n  }\n  ```\n- **Criar uma nova batalha**\n  ```json\n  POST /battles\n  Body:\n  {\n    \"playerOne\": \"username do jogador 1\",\n    \"playerTwo\": \"username do jogador 2\"\n  }\n  ```\n- **Selecionar personagens para a batalha**\n\n  ```json\n  POST /battles/{battleId}/{playerId}\n  Body:\n  {\n    \"specie\": \"nome do personagem\"\n  }\n  ```\n- **Avançar os turnos da batalha**\n  ```\n  POST /battles/{battleId}/turns\n  ```\n\n## O desenvolvimento\nA abordagem DDD foi adotada para garantir que o sistema seja modelado de acordo com as regras e conceitos do domínio do jogo.\nFoi adotada uma linguagem ubíqua para nomear as classes e métodos de acordo com os termos do domínio do jogo, como `Character`, `Battle`, `Player`, `Dice`, entre outros.\n\n### Estrutura do projeto\n- **domain**: Este pacote contém as classes que representam o domínio do jogo. Aqui estão as entidades principais, como Character e Battle, bem como as regras de negócio relacionadas à batalha.\n- **application**: Este pacote contém as classes que implementam a lógica de aplicação, como a inicialização da batalha, a execução dos turnos e o cálculo do resultado.\n- **infrastructure**: Este pacote contém as classes responsáveis pela persistência de dados ou por qualquer integração externa necessária.\n\n### Padrões de Projetos Utilizados\nForam aplicados os seguintes padrões de projetos:\n\n#### State\n\nO padrão de projeto State foi utilizado para gerenciar o comportamento do objeto `Battle` de acordo com seu estado interno. O objeto `Battle` pode ter diferentes estados, cada um representado por uma implementação da interface `BattleState`. Através do método `setNextState`, o estado do objeto `Battle` é alterado para o próximo estado, modificando assim seu comportamento. Isso permite uma melhor organização e flexibilidade no gerenciamento das transições de estado e comportamento do objeto `Battle`.\n\n#### Chain of Responsability\nA combinação dos padrões de projeto Chain of Responsability e State foi realizado para que cada estado saiba qual é o próximo e poder passar a responsabilidade para ele.\n\n#### Strategy\nComo resultado da implementação do padrão de projeto State, cada estado precisaria sobrescrever métodos que não seriam utiliados, violando o SOLID.\nO padrão Strategy foi utilizado em combinação com o padrão State para encapsular cada método em uma interface específica, implementada apenas pelo estado que realmente precisam.\n\n#### Singleton\nO padrão de projeto Singleton foi utilizado para que a mesma instãncia da classe `Random` seja utilizada pelo método `roll` da classe `Dice` que é compartilhado durante a iniciativa e os turnos. Isso garante que os lancamentos dos dados terão uma sequência consistente de números aleatórios.\n\n## Contribuindo\nSe você deseja contribuir para o desenvolvimento deste projeto, siga as etapas abaixo:\n\n1. Faça um fork deste repositório.\n1. Crie uma branch com sua nova feature: `git checkout -b minha-feature`\n1. Commit suas alterações: `git commit -m 'Adicionando nova feature'`\n1. Faça push para a branch: `git push origin minha-feature`\n1. Abra uma Pull Request.\n\n## Licença\nEste projeto está licenciado sob a Licença MIT.\n\n## Contato\nEm caso de dúvidas ou sugestões, entre em contato:\n\n [![Gmail Badge](https://img.shields.io/badge/-Gmail-c14438?style=flat-square\u0026logo=Gmail\u0026logoColor=white\u0026link=mailto:logika.sciuro@gmail.com)](mailto:logika.sciuro@gmail.com) [![Linkedln](https://img.shields.io/badge/LinkedIn-0077B5?style=flat-square\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/camillasilva)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecureuill%2Frpgbattle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fecureuill%2Frpgbattle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecureuill%2Frpgbattle/lists"}