Esse projeto é uma API para o jogo da tabuada do professor Glécio Raimundo da escola profissional de Aracati.
-
Clone o repositório
git clone https://github.com/luizlealdev/tabuada-glecio-api
-
Instale as dependências:
npm install
-
Crie um arquivo chamado .env e coloque as seguintes infmações
DATABASE_URL='mysql://user:password@databaseurl:0000/database?sslmode=require' JWT_SECRET='xxxxxxxxxxxxxxxxxxxxxxxx' JWT_TEMP_SECRET='yyyyyyyyyyyyyyyyyyyyyyy' JWT_EXPIRES_IN='15d' EMAILJS_PUBLIC_KEY='xxxxxxxxxxxxxxxxxx' EMAILJS_PRIVATE_KEY='yyyyyyyyyyyyyyyy' SITE_URL='http://localhost:3000'
-
Rode as migrações do banco de dados:
npx prisma migrate dev
Cria um novo usuário
- Request
{
"avatar_id": 1,
"name": "Glécio Raimundo",
"course_id": 1,
"email": "glecio@prof.ce.gov.br",
"password": "123456"
}
- Response
{
"status_code": 201,
"message": "Usuário criado com sucesso.",
"data": {
"user": {
"id": 7,
"name": "Glécio Raimundo",
"course_id": 1,
"course": {
"name": "Informática"
},
"avatar_id": 1,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_1.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_1.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_1.webp"
},
"is_admin": false
},
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjcsImVtYWlsIjoiZ2zDqWNpb0Bwcm9mLmNlLmdvdi5iciIsImlhdCI6MTczNTE0NzI4OSwiZXhwIjoxNzM2NDQzMjg5fQ.Nlx64JgXFTvX34yahIYCoVGY_6yqu8B7InYmgwFxL4g"
}
}
Autentica um usuário e retorna um token JWT
- Request
{
"email": "glecio@prof.ce.gov.br",
"password": "123456"
}
- Response
{
"status_code": 200,
"message": "Usuário logado com sucesso.",
"data": {
"user": {
"id": 7,
"name": "Glécio Raimundo",
"course_id": 1,
"course": {
"name": "Informática"
},
"avatar_id": 1,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_1.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_1.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_1.webp"
},
"is_admin": false
},
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjcsImVtYWlsIjoiZ2zDqWNpb0Bwcm9mLmNlLmdvdi5iciIsImlhdCI6MTczNTE0NzM2NCwiZXhwIjoxNzM2NDQzMzY0fQ.gUSMlRdCvYcdSNpDpIVJHO6IfPqRb65dMowAWDKJKso"
}
}
Envia um e-mail que será usada para resetar a senha do usuário
- Request
{
"email": "glecio@prof.ce.gov.br",
}
- Response
{
"status_code": 200,
"message": "E-mail enviado com sucesso. Verifique sua caixa de entrada."
}
Recebe a nova senha do usuário e muda ela no banco de dados
- Headers
Authorization: Bearer {token}
Note
O token JWT usado nesta requisição é um token temporário (5 minutos) que é enviado no link do botão do e-mail do usuário, como mostado abaixo.
https://tabuadadoglecio.vercel.app/password-reset/confirm/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjQsImVtYWlsIjoiY29udGF0ZXN0ZXNlaWxhMTJAZ21haWwuY29tIiwiaWF0IjoxNzM1MTQ5ODY5LCJleHAiOjE3MzUxNTAxNjl9.dF6FCotMzxR32giSgfp5ptbld4rJxEvvDOCJhOIV2mA
Tip
No front-end, mantenha as rotas para redefinir a senha do usuário como /reset-password/request
para a solicitação e /reset-password/confirm
para o envio da nova senha.
- Request
{
"new_password": "glecio-3.1415",
}
- Response
{
"status_code": 200,
"message": "Senha resetada com sucesso."
}
Pega as informações de um usuário específico
- Headers
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Informações do usuário consultadas com sucesso.",
"data": {
"id": 1,
"name": "Glécio Raimundo",
"max_score": 0,
"created_at": "2024-12-25T17:21:28.278Z",
"is_admin": false,
"course": {
"id": 1,
"name": "Informática"
},
"avatar": {
"id": 1,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_1.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_1.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_1.webp"
}
}
}
Edita as informações públicas do usuário
- Headers
Authorization: Bearer {token}
- Request
{
"name": "Glécio Prof",
"avatar_id": 10,
"course_id": 2
}
- Response
{
"status_code": 200,
"message": "Informações do usuário atualizadas com sucesso.",
"data": {
"id": 7,
"name": "Glécio Prof",
"course": {
"id": 2,
"name": "Enfermagem"
},
"avatar": {
"id": 10,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_10.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_10.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_10.webp"
}
}
}
Edita a senha do usuário
- Headers
Authorization: Bearer {token}
- Request
{
"old_password": "123456",
"new_password": "654321"
}
- Response
{
"status_code": 200,
"message": "Senha do usuário atualizada com sucesso."
}
Retorna a lista de todos os avatares
- Response
{
"status_code": 200,
"message": "Avatares listados com sucesso.",
"data": [
{
"id": 1,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_1.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_1.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_1.webp"
},
{
"id": 2,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_2.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_2.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_2.webp"
},
{
"id": 3,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_3.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_3.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_3.webp"
},
{
"id": 4,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_4.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_4.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_4.webp"
},
{
"id": 5,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_5.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_5.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_5.webp"
}
//... //
]
}
Retorna as informações de um avatar específico
- Headers
(Opcional, envie o token na requisição caso o usuário tenha acesso de Admin)
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Avatar buscado com sucesso.",
"data": [
{
"id": 1,
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_1.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_1.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_1.webp"
}
]
}
Retorna a imagem do avatar
- Response
Tip
Os tamanhos disponíveis (:size) são 128
, 256
e default
.
Retorna a lista de todos os cursos/turmas
- Headers
(Opcional, envie o token na requisição caso o usuário tenha acesso de Admin)
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Cursos listados com sucesso.",
"data": [
{
"id": 1,
"name": "Informática",
"is_special": false,
"is_active": true
},
{
"id": 2,
"name": "Enfermagem",
"is_special": false,
"is_active": true
},
{
"id": 2,
"name": "Sist. Energia Renovável",
"is_special": false,
"is_active": true
},
{
"id": 2,
"name": "Guia de Turismo",
"is_special": false,
"is_active": true
},
//...//
]
}
Retorna as informações de um curso/turma específica
- Headers
(Opcional, envie o token na requisição caso o usuário tenha acesso de Admin)
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Curso buscado com sucesso.",
"data": [
{
"id": 15,
"name": "Informática 3",
"is_special": false,
"is_active": true
}
]
}
Cria uma nova entry nos rankings
- Headers
Authorization: Bearer {token}
- Request
{
"score": 50
}
- Response
{
"status_code": 201,
"message": "Entrada no ranking criada com sucesso.",
"data": {
"score": 30,
"user_id": 1
}
}
Retorna a lista de todas os dados do ranking normal ordenados de forma decrescente
- Headers
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Entradas do ranking listada com sucesso.",
"data": [
{
"id": 2,
"score": 24,
"user": {
"id": 4,
"name": "Hiago",
"course_id": 1,
"course": {
"name": "Informática"
},
"avatar_id": 30,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_30.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_30.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_30.webp"
}
}
},
{
"id": 2,
"score": 53,
"user": {
"id": 6,
"name": "Mateus Ferreira",
"course_id": 1,
"course": {
"name": "Informática"
},
"avatar_id": 23,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_23.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_23.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_23.webp"
}
}
},
{
"id": 3,
"score": 30,
"user": {
"id": 1,
"name": "Glécio Prof",
"course_id": 2,
"course": {
"name": "Enfermagem"
},
"avatar_id": 10,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_10.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_10.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_10.webp"
}
}
}
]
}
Retorna a lista de todos os dados do ranking global ordenados de forma decrescente
- Headers
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Entradas do ranking listada com sucesso.",
"data": [
{
"id": 2,
"score": 24,
"user": {
"id": 4,
"name": "Hiago",
"course_id": 1,
"course": {
"name": "Informática"
},
"avatar_id": 30,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_30.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_30.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_30.webp"
}
}
},
{
"id": 2,
"score": 53,
"user": {
"id": 6,
"name": "Mateus Ferreira",
"course_id": 1,
"course": {
"name": "Informática"
},
"avatar_id": 23,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_23.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_23.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_23.webp"
}
}
},
{
"id": 3,
"score": 30,
"user": {
"id": 1,
"name": "Glécio Prof",
"course_id": 2,
"course": {
"name": "Enfermagem"
},
"avatar_id": 10,
"avatar": {
"path_default": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/default/avatar_10.webp",
"path_256px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/256/avatar_10.webp",
"path_128px": "https://raw.githubusercontent.com/luizlealdev/tabuada-glecio-api/refs/heads/master/uploads/images/avatars/128/avatar_10.webp"
}
}
}
]
}
Limpa o ranking normal
Warning
Apenas usuários com acesso de Admin podem fazer essa ação
- Headers
Authorization: Bearer {token}
- Response
{
"status_code": 200,
"message": "Entradas no ranking deletadas com sucesso."
}
Projeto sob Licença MIT