{"id":19776740,"url":"https://github.com/hiagoisoppo/trybets","last_synced_at":"2026-05-14T17:07:08.953Z","repository":{"id":241031786,"uuid":"804026695","full_name":"hiagoisoppo/trybets","owner":"hiagoisoppo","description":"Uma RestAPI, desenvolvida em ASP.NET com o objetivo de gerenciar uma casa de apostas, através de um CRUD em microsserviços.","archived":false,"fork":false,"pushed_at":"2024-05-22T02:10:50.000Z","size":8362,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-28T12:09:00.446Z","etag":null,"topics":["asp-net","asp-net-core","asp-net-mvc","authentication","csharp","dotnet","dotnet-core","efcore","entity-framework-core","jwt-bearer-tokens","xunit"],"latest_commit_sha":null,"homepage":"","language":"C#","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/hiagoisoppo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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-05-21T20:15:09.000Z","updated_at":"2024-05-22T02:10:54.000Z","dependencies_parsed_at":"2024-05-22T03:35:55.756Z","dependency_job_id":null,"html_url":"https://github.com/hiagoisoppo/trybets","commit_stats":null,"previous_names":["hiagoisoppo/trybets"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hiagoisoppo/trybets","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiagoisoppo%2Ftrybets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiagoisoppo%2Ftrybets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiagoisoppo%2Ftrybets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiagoisoppo%2Ftrybets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hiagoisoppo","download_url":"https://codeload.github.com/hiagoisoppo/trybets/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiagoisoppo%2Ftrybets/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33034791,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"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":["asp-net","asp-net-core","asp-net-mvc","authentication","csharp","dotnet","dotnet-core","efcore","entity-framework-core","jwt-bearer-tokens","xunit"],"created_at":"2024-11-12T05:21:36.332Z","updated_at":"2026-05-14T17:07:08.922Z","avatar_url":"https://github.com/hiagoisoppo.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"/public/Preview.png\" alt=\"Application Preview\" /\u003e\n\n# TryBets\n\n![Static Badge](https://img.shields.io/badge/Csharp-purple)\n![Static Badge](https://img.shields.io/badge/.Net-4.2.0-green)\n![Static Badge](https://img.shields.io/badge/ASP.NetMvc-6.0-blue)\n![Static Badge](https://img.shields.io/badge/JwtBearer-6.0-white)\n![Static Badge](https://img.shields.io/badge/EFCore-7.0.4-yellow)\n![Static Badge](https://img.shields.io/badge/Swashbuckle-6.2.3-purple)\n![Static Badge](https://img.shields.io/badge/SqlServer-7.0.4-blue)\n\n\n## Descrição:\nA Trybets é uma RestAPI, desenvolvida em ASP.NET com o objetivo de gerenciar uma casa de apostas, através de um CRUD em microsserviços, e armazenar todas informações em um banco de dados com segurança e validações necessarias. Durante o desenvolvimento foi utilizado as seguintes tecnologias: .NET Core, ASP.NET Core Mvc, JWT Authentication, C#, Entity Framework Core, xUnit, Microsoft SQL Server e Docker.\n  \n## Funcionalidades:\n- Endpoints que serão conectados ao banco de dados seguindo princípios REST.\n- Gerenciamento de times e partidas.\n- Controle de usuários através de validação JWT.\n- Gerenciamento de apostas, individuais por usuário.\n- Controle dinâmico das chances de vitória (odd).\n\n## Como acessar com Docker\n  **:warning: Docker Compose `1.29`, Entity Framewok CLI `8.0.3` ou versões superiores**\n\n  - Abra o terminal e faça um clone do repositório.\n  ```bash\n    git clone git@github.com:hiagoisoppo/trybets.git\n  ```\n - Acesse a pasta clonada do repositório.\n  ```bash\n    cd trybets\n  ```\n  - Execute o conjunto de microsserviços.\n  ```bash\n    docker-compose up -d --build\n  ```\n  - Acesse a pasta do app em monolito e execute as migrações e seeder.\n  ```bash\n    cd src/TryBets\n    dotnet ef migrations add Master\n    dotnet ef database update\n    dotnet ef migrations add Seeder\n    dotnet ef database update\n  ```\n  - Agora vá em “Usando solicitações HTTP para testar a API”.\n\n## Usando solicitações HTTP para testar a API\n   - Acesse uma plataforma de sua preferência para fazer solicitações HTTP, como [ThunderClient](https://www.thunderclient.com/) ou [Insomnia](https://insomnia.rest/).\n   - Importe o arquivo de solicitação HTTP válido para sua plataforma da pasta `requestCollection`.\n   - Agora você pode testar esta API.\n\n## ASP.NET RestAPI - Endpoints\n### `GET` /team\nRota utilizada para obter a lista de times.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e(em branco)\u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e200\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n[\n    {\n        \"teamId\": 1,\n        \"teamName\": \"Sharks\"\n    }, /*...*/\n]\n            \u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n### `GET` /match/{finished}\nRota utilizada para obter a lista de partidas. Parâmetro {finished} varia entre `true` e `false` para listar partidas finalizadas ou não.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e(em branco)\u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e200\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n    [\n        {\n            \"matchId\": 1,\n            \"matchDate\": \"2023-07-23T15:00:00\",\n            \"matchTeamAId\": 1,\n            \"matchTeamBId\": 8,\n            \"teamAName\": \"Sharks\",\n            \"teamBName\": \"Bulls\",\n            \"matchTeamAOdds\": \"3,33\",\n            \"matchTeamBOdds\": \"1,43\",\n            \"matchFinished\": true,\n            \"matchWinnerId\": 1\n        }, /*...*/\n    ]\n            \u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\n### `POST` /user/signup\nRota utilizada para cadastrar uma nova pessoa usuária. Ao cadastrar com sucesso, retorna um token. Não permitido adicionar duas pessoas usuárias com o mesmo e-mail.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n        \u003cth\u003eObservações\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"Name\": \"Isabel Santos\",\n   \"Email\": \"isabel.santos@trybets.com\",\n   \"Password\": \"123456\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e201\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"token\": \"eyJhbG...\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"Name\": \"Isabel Santos\",\n   \"Email\": \"isabel.santos@trybets.com\",\n   \"Password\": \"123456\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"message\": \"E-mail already used\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso o e-mail da pessoa usuária já tenha sido cadastrado no banco de dados.\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n### `POST` /user/login\nRota utilizada para realizar o login de uma pessoa usuária.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n        \u003cth\u003eObservações\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"Email\": \"isabel.santos@trybets.com\",\n   \"Password\": \"123456\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e200\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"token\": \"eyJhbG...\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"Email\": \"isabel.santos@trybets.com\",\n   \"Password\": \"1234567\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"message\": \"Authentication failed\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso a pessoa usuária não tenha os dados autenticados ou não informe algum dos parâmetros corretamente.\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n### `POST` /bet\nRota utilizada para realizar uma nova aposta\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n        \u003cth\u003eObservações\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"MatchId\": 5,\n   \"TeamId\":  2,\n   \"BetValue\": 550.65\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e201\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"betId\": 1,\n   \"matchId\": 5,\n   \"teamId\": 2,\n   \"betValue\": 550.65,\n   \"matchDate\": \"2024-03-15T14:00:00\",\n   \"teamName\": \"Eagles\",\n   \"email\": \"isabel.santos@trybets.com\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"MatchId\": 5,\n   \"TeamId\":  2,\n   \"BetValue\": 550.65\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e401\u003c/td\u003e\n        \u003ctd\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso o token não tenha sido informado ou esteja errado\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"MatchId\": 5,\n   \"TeamId\":  6,\n   \"BetValue\": 550.65\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n    \"message\": \"Team is not in this match\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso o time não esteja na partida correta\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"MatchId\": 5,\n   \"TeamId\":  60,\n   \"BetValue\": 550.65\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n    \"message\": \"Team not founded\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso o time não exista\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"MatchId\": 50,\n   \"TeamId\":  6,\n   \"BetValue\": 550.65\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n    \"message\": \"Match not founded\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso a partida não exista\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"MatchId\": 1,\n   \"TeamId\":  6,\n   \"BetValue\": 550.65\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n    \"message\": \"Match finished\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso a partida já tenha sido finalizada\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n### `GET` /bet/{BetId}\nRota utilizada para visualizar uma aposta criada. Uma aposta só pode ser visualizada pela pessoa que a criou.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n        \u003cth\u003eObservações\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e200\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n   \"betId\": 1,\n   \"matchId\": 5,\n   \"teamId\": 2,\n   \"betValue\": 550.65,\n   \"matchDate\": \"2024-03-15T14:00:00\",\n   \"teamName\": \"Eagles\",\n   \"email\": \"isabel.santos@trybets.com\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            (Indiferente)\n        \u003c/td\u003e\n        \u003ctd\u003eCaso a aposta não pertencer à pessoa usuária do token.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eSim\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n             \u003cpre lang=\"json\"\u003e\n{\n   \"message\": \"Bet not founded\"\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso a aposta não exista.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e401\u003c/td\u003e\n        \u003ctd\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eCaso não seja informado um token.\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n### `PATCH` /odds/{matchId}/{teamId}/{BetValue}\nRota utilizada para atualizar o valor apostado em um time e em uma partida. O retorno da requisição seguirá a model `Match` sem necessitar realizar nenhuma operação de tratamento de dados, já que este microsserviço só será acessado pelo microsserviço `TryBets.Bet`.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eRequest\u003c/th\u003e\n        \u003cth\u003eToken?\u003c/th\u003e\n        \u003cth\u003eStatus\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n        \u003cth\u003eObservações\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e(em branco)\u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e200\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cpre lang=\"json\"\u003e\n{\n\t\"matchId\": 1,\n\t\"matchDate\": \"2024-03-17T14:00:00\",\n\t\"matchTeamAId\": 5,\n\t\"matchTeamBId\": 6,\n\t\"matchTeamAValue\": 300.00,\n\t\"matchTeamBValue\": 1501.50,\n\t\"matchFinished\": false,\n\t\"matchWinnerId\": null,\n\t\"matchTeamA\": null,\n\t\"matchTeamB\": null,\n\t\"bets\": null\n}\n            \u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003e(em branco)\u003c/td\u003e\n        \u003ctd\u003eNão\u003c/td\u003e\n        \u003ctd\u003e400\u003c/td\u003e\n        \u003ctd\u003e\n            (indiferente)\n        \u003c/td\u003e\n        \u003ctd\u003eQualquer tipo de erro que impeça a atualização\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhiagoisoppo%2Ftrybets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhiagoisoppo%2Ftrybets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhiagoisoppo%2Ftrybets/lists"}