Trybe Futebol Clube é uma aplicação web full stack desenvolvida em monorepo com o objetivo de registrar e organizar a pontuação em um campeonato de futebol fictício. Durante o desenvolvimento foi utilizado as seguintes tecnologias: TypeScript, ReactJs, ExpressJs, Nodemon, Sequelize, MySQL, ReactTestingLibrary, ReactRouterDom, Axios, Jest, Puppeteer, Mocha, Chai, Sinon, JsonWebToken, BcryptJs, Joi, TsNode, Docker.
- Aba de Classificação com listagem dos times associados ao torneio e seus respectivos status.
- Aba de Partidas com busca e filtragem dos dados atualizados de partidas finalizadas e em andamento.
- Acesso ao dashboard administrativo através do login, onde podem ser atualizados os dados de partidas em andamento.
1.29
ou superior. Veja aqui ou na documentação como instalá-lo. No primeiro artigo, você pode substituir onde está 1.26.0
por1.29.2
.
- Abra o terminal e faça um clone do repositório.
git clone git@github.com:hiagoisoppo/trybe-futebol-club.git
- Acesse a pasta clonada do repositório, e instale as dependências.
cd trybe-futebol-club
npm install
npm run install:apps
- Execute os serviços
frontend
,backend
edb
.
npm run compose:up
- Abra o navegador no endereço http://localhost:3000.
- Health check response:
{
"ok": true
}
- Response:
[
{
"id": 1,
"teamName": "Avaí/Kindermann"
},
{
"id": 2,
"teamName": "Bahia"
},
...
]
- Response:
{
"id": 2,
"teamName": "Bahia"
}
- Send Body:
{
"email": "admin@admin.com",
"password": "secret_admin"
}
- Response:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJBZG1pbiIsImlhdCI6MTcwNDMwNzY1MH0.c6nkn1AaCQsV8dESvGWWQuyXkMstHcjGW6toa51FODk"
}
- Send Header:
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJBZG1pbiIsImlhdCI6MTcwNDMwNzY1MH0.c6nkn1AaCQsV8dESvGWWQuyXkMstHcjGW6toa51FODk"
}
- Response:
{
"role": "admin"
}
- Response:
[
{
"id": 1,
"homeTeamId": 16,
"homeTeamGoals": 1,
"awayTeamId": 8,
"awayTeamGoals": 1,
"inProgress": false,
"homeTeam": {
"teamName": "São Paulo"
},
"awayTeam": {
"teamName": "Grêmio"
}
},
{
"id": 2,
"homeTeamId": 9,
"homeTeamGoals": 1,
"awayTeamId": 14,
"awayTeamGoals": 1,
"inProgress": false,
"homeTeam": {
"teamName": "Internacional"
},
"awayTeam": {
"teamName": "Santos"
}
},
...
]
- Send Header:
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJBZG1pbiIsImlhdCI6MTcwNDMwNzY1MH0.c6nkn1AaCQsV8dESvGWWQuyXkMstHcjGW6toa51FODk"
}
- Response:
{
"message": "Finished"
}
- Send Header:
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJBZG1pbiIsImlhdCI6MTcwNDMwNzY1MH0.c6nkn1AaCQsV8dESvGWWQuyXkMstHcjGW6toa51FODk"
}
- Send Body:
{
"homeTeamGoals": 3,
"awayTeamGoals": 1
}
- Response:
{
"id": 41,
"homeTeamId": 16,
"homeTeamGoals": 3,
"awayTeamId": 9,
"awayTeamGoals": 1,
"inProgress": true
}
- Send Header:
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJBZG1pbiIsImlhdCI6MTcwNDMwNzY1MH0.c6nkn1AaCQsV8dESvGWWQuyXkMstHcjGW6toa51FODk"
}
- Send Body:
{
"homeTeamId": 16, // O valor deve ser o id do time
"awayTeamId": 8, // O valor deve ser o id do time
"homeTeamGoals": 2,
"awayTeamGoals": 2
}
- Response:
{
"id": 49,
"homeTeamId": 16,
"homeTeamGoals": 2,
"awayTeamId": 8,
"awayTeamGoals": 2,
"inProgress": true
}
- Response:
[
{
"name": "Palmeiras",
"totalPoints": "13",
"totalGames": 5,
"totalVictories": "4",
"totalDraws": "1",
"totalLosses": "0",
"goalsFavor": "17",
"goalsOwn": "5",
"goalsBalance": "12",
"efficiency": "86.67"
},
{
"name": "Corinthians",
"totalPoints": "12",
"totalGames": 5,
"totalVictories": "4",
"totalDraws": "0",
"totalLosses": "1",
"goalsFavor": "12",
"goalsOwn": "3",
"goalsBalance": "9",
"efficiency": "80.00"
},
{
"name": "Santos",
"totalPoints": "11",
"totalGames": 5,
"totalVictories": "3",
"totalDraws": "2",
"totalLosses": "0",
"goalsFavor": "12",
"goalsOwn": "6",
"goalsBalance": "6",
"efficiency": "73.33"
},
...
]
- Response:
[
{
"name": "Santos",
"totalPoints": "9",
"totalGames": 3,
"totalVictories": "3",
"totalDraws": "0",
"totalLosses": "0",
"goalsFavor": "9",
"goalsOwn": "3",
"goalsBalance": "6",
"efficiency": "100.00"
},
{
"name": "Palmeiras",
"totalPoints": "7",
"totalGames": 3,
"totalVictories": "2",
"totalDraws": "1",
"totalLosses": "0",
"goalsFavor": "10",
"goalsOwn": "5",
"goalsBalance": "5",
"efficiency": "77.78"
},
{
"name": "São Paulo",
"totalPoints": "6",
"totalGames": 2,
"totalVictories": "2",
"totalDraws": "0",
"totalLosses": "0",
"goalsFavor": "6",
"goalsOwn": "1",
"goalsBalance": "5",
"efficiency": "100.00"
},
...
]
- Response:
[
{
"name": "Palmeiras",
"totalPoints": "6",
"totalGames": 2,
"totalVictories": "2",
"totalDraws": "0",
"totalLosses": "0",
"goalsFavor": "7",
"goalsOwn": "0",
"goalsBalance": "7",
"efficiency": "100.00"
},
{
"name": "Corinthians",
"totalPoints": "6",
"totalGames": 3,
"totalVictories": "2",
"totalDraws": "0",
"totalLosses": "1",
"goalsFavor": "6",
"goalsOwn": "2",
"goalsBalance": "4",
"efficiency": "66.67"
},
{
"name": "Internacional",
"totalPoints": "6",
"totalGames": 2,
"totalVictories": "2",
"totalDraws": "0",
"totalLosses": "0",
"goalsFavor": "3",
"goalsOwn": "0",
"goalsBalance": "3",
"efficiency": "100.00"
},
...
]