Este repositório faz parte do projeto Upcast, uma plataforma fictícia de podcasts, semelhante ao Spotify e que será utilizada pelo aplicativo web Upcast.
O objetivo principal da API é dar o poder ao usuário de consumir podcasts em forma de áudio, seguir programas, consultar categorias e criar sua lista de reprodução pessoal. Além disso, o usuário poderá personalizar perfis e programas com miniaturas. Caso deseja entrar em contato:
- E-mail: william.santos315@outlook.com
- Criar conta de usuário;
- Adicionar miniatura de usuário;
- Gerar autorização com JWT;
- Recuperação de conta com e-mail automático;
- Criar programas de podcasts;
- Adicionar miniatura de programa;
- Criar episódios;
- Enviar arquivos de áudio para episódios;
- Criar playlists e adicionar episódios a ela;
- Pesquisar usuários, programas, categorias, episódios e playlists;
- Encontrar categorias;
- Filtrar programas por categoria;
- Seguir programas;
- HATEOAS "_links".
Para o projeto ser executado, é necessário ter o NodeJS 10+ e MySQL Community 8+ instalados em sua máquina. E para usar o banco de dados, é necessário ter uma conta local.
Baixando o repositório
$ git clone https://github.com/willaug/upcast-api.git
$ cd upcast-api
Instalação de dependências
$ npm i
Informações sensíveis de banco de dados, e-mails, endereços, chave secreta JWT, período de expiração de autorização, caracteres aceitos em NanoID e porta são configuráveis e estão no arquivo .env na pasta raiz.
Através do Sequelize ORM é possível executar a criação de banco de dados, migrations e seed através de comandos no terminal. Para criar todo o ambiente necessário e adicionar o usuário principal:
$ npx sequelize db:create
$ npx sequelize db:migrate
$ npx sequelize db:seed:all
Para desenvolvimento (Com Nodemon):
$ npm run dev
Para produção:
$ npm run start
Para ter maior compatibilidade com diversos aplicativos, todas as respostas possuem códigos de status HTTP e respostas no formato JSON.
URL base padrão: http://127.0.0.1:3000 ou http://localhost:3000
- Obter pesquisa:
- Endpoint:
/search - Query:
query(Obrigatório) etype(Opcional) - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "users": [ { "uid": "UXfLYYE5BYsH2GwCY392", "username": "Upcast Official", "url_photo": "/images/users/default.svg" } ], "categories": [], "shows": [], "episodes": [], "playlists": [] }, "_links": [ { "href": "http://127.0.0.1:3000/search?query=up&type=all", "rel": "search_all", "method": "GET" }, { "href": "http://127.0.0.1:3000/search?query=up&type=users", "rel": "search_users", "method": "GET" }, { "href": "http://127.0.0.1:3000/search?query=up&type=categories", "rel": "search_categories", "method": "GET" }, { "href": "http://127.0.0.1:3000/search?query=up&type=shows", "rel": "search_shows", "method": "GET" }, { "href": "http://127.0.0.1:3000/search?query=up&type=episodes", "rel": "search_episodes", "method": "GET" }, { "href": "http://127.0.0.1:3000/search?query=up&type=playlists", "rel": "search_playlists", "method": "GET" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"É necessário digitar algo para buscar."ou
"Tipo de busca inválido." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Obter todos os usuários:
- Endpoint:
/users - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "uid": "S3G9QEqkiTKEdOj0p2ry", "username": "Autor anônimo", "url_photo": "/images/users/default.svg" }, { "uid": "UXfLYYE5BYsH2GwCY392", "username": "Upcast Official", "url_photo": "/images/users/default.svg" } ], "_links": [ { "href": "http://127.0.0.1:3000/users", "rel": "post_create_user", "method": "POST" } ] } - Status:
- Erro:
- Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Criar usuário:
- Endpoint:
/users - Método:
POST - Campos:
username, email, password - Sucesso:
- Status:
201; - Resposta:
{ "response": "Seja bem-vindo(a) Lorem Ipsum", "_links": [ { "href": "http://127.0.0.1:3000/users/GdizGlbWamHjTYRdbbOf", "rel": "get_user", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/GdizGlbWamHjTYRdbbOf/playlists", "rel": "get_user_playlists", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/GdizGlbWamHjTYRdbbOf/shows", "rel": "get_user_shows", "method": "GET" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
[ "É necessário possuir um nome de usuário", "É necessário possuir um e-mail válido", "Adicione uma senha de pelo menos 8 caracteres" ]
ou
"E-mail já existente!" -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Obter usuário específico:
- Endpoint:
/users/:uid - Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "uid": "UXfLYYE5BYsH2GwCY392", "username": "Upcast Official", "url_photo": "/images/users/default.svg", "createdAt": "2021-04-22T15:44:09.000Z" }, "_links": [ { "href": "http://127.0.0.1:3000/users", "rel": "get_all_users", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/UXfLYYE5BYsH2GwCY392/playlists", "rel": "get_user_playlists", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/UXfLYYE5BYsH2GwCY392/shows", "rel": "get_user_shows", "method": "GET" } ] } - Status:
- Erro:
- Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?" - Status:
404;- Resposta:
"Usuário não encontrado." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Obter programas de um usuário específico:
- Endpoint:
/users/:uid/shows - Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "uid": "UhPETxPfk1MYAMV80am6", "title": "MyCAST", "description": null, "url_photo": "/images/shows/default.svg" } ], "_links": [ { "href": "http://127.0.0.1:3000/users", "rel": "get_all_users", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/UXfLYYE5BYsH2GwCY392", "rel": "get_user", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/UXfLYYE5BYsH2GwCY392/playlists", "rel": "get_user_playlists", "method": "GET" } ] } - Status:
- Erro:
- Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?" - Status:
404;- Resposta:
"Usuário não encontrado." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Obter playlists de um usuário específico:
- Endpoint:
/users/:uid/playlists - Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "uid": "iRvHq06vbYkNXOA4gbTy", "title": "Ouvir enquanto trabalho" } ], "_links": [ { "href": "http://127.0.0.1:3000/users", "rel": "get_all_users", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/UXfLYYE5BYsH2GwCY392", "rel": "get_user", "method": "GET" }, { "href": "http://127.0.0.1:3000/users/UXfLYYE5BYsH2GwCY392/shows", "rel": "get_user_shows", "method": "GET" } ] } - Status:
- Erro:
- Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?" - Status:
404;- Resposta:
"Usuário não encontrado." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Autenticação:
- Endpoint:
/authenticate - Campos:
email, password - Método:
POST - Sucesso:
- Status:
200; - Resposta: (Token de JWT)
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJVWGZMWVlFNUJZc0gyR3dDWTM5MiIsImlhdCI6MTYxOTExOTE5NSwiZXhwIjoxNjE5MTM3MTk1fQ.CEnLitkav_hUCkshDDnAtqR0RtQNDNI_1slYEGghapw" - Status:
- Erro:
-
Status:
400;- Resposta:
[ "É necessário inserir um e-mail válido", "É necessário inserir uma senha de pelo menos 8 caracteres" ]
-
Status:
401;- Resposta:
"Usuário não encontrado. Que tal tentar novamente?"ou
"Senha inválida" -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Obter informações da conta:
- Endpoint:
/account - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "uid": "UXfLYYE5BYsH2GwCY392", "username": "Upcast Official", "url_photo": "/images/users/default.svg", "email": "contact@upcast.com", "createdAt": "2021-04-22T15:44:09.000Z", "updatedAt": "2021-04-22T19:28:11.000Z" }, "_links": [ { "href": "http://127.0.0.1:3000/account", "rel": "patch_update_account", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/account", "rel": "delete_account", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
401;- Resposta:
"É necessário estar autenticado para continuar." -
Status:
403;- Resposta:
"Sua autorização expirou, autentique-se novamente."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Alterar informações da conta:
-
Endpoint:
/account -
Campos:
username, email, photo (Upload), action, newPassword, confirmPassword, currentPassword(Opcionais) -
Método:
PATCH -
Sucesso:
- Status:
200; - Resposta:
{ "response": "Alterações concluídas com sucesso", "_links": [ { "href": "http://127.0.0.1:3000/account", "rel": "get_account", "method": "GET" }, { "href": "http://127.0.0.1:3000/account", "rel": "delete_account", "method": "DELETE" } ] }ou
{ "response": "Imagem adicionada com sucesso", "_links": [ { "href": "http://127.0.0.1:3000/account", "rel": "get_account", "method": "GET" }, { "href": "http://127.0.0.1:3000/account", "rel": "delete_account", "method": "DELETE" } ] } - Status:
-
Erro:
-
Status:
400;- Resposta:
[ "Redefina um nome de usuário com pelo menos 10 caracteres", "Para alterar o email, é necessário o novo ser um e-mail válido", "A nova senha deve ser de pelo menos 8 caracteres", "Para adicionar uma senha, é necessário confirmar a atual" ]
-
Status:
401;- Resposta:
"A senha atual informada está incorreta" -
Status:
403;- Resposta:
"Sua autorização expirou, autentique-se novamente."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
413;- Resposta:
"Envie uma imagem com até 2 MB" -
Status:
415;- Resposta:
"Apenas imagens em png, jpeg e jpg são suportadas" -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
-
-
Deletar conta:
- Endpoint:
/account - Método:
DELETE - Sucesso:
- Status:
200; - Resposta:
{ "response": "Sua conta foi deletada e não poderá ser recuperada. Até breve, Upcast Official!", "_links": [ { "href": "http://127.0.0.1:3000/account", "rel": "get_account", "method": "GET" }, { "href": "http://127.0.0.1:3000/account", "rel": "delete_account", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
403;- Resposta:
"Sua autorização expirou, autentique-se novamente."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Obter todas as categorias:
- Endpoint:
/categories - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "id": 1, "name": "Bate-papo e entrevista", "slug": "bate-papo-e-entrevista", "icon": "/images/categories/chat.svg" }, { "id": 2, "name": "Conteúdo adulto", "slug": "conteudo-adulto", "icon": "/images/categories/adult.svg" }, { "id": 3, "name": "Convívio e espiritualidade", "slug": "convivio-e-espiritualidade", "icon": "/images/categories/living.svg" }, { "id": 4, "name": "Educação e formação", "slug": "educacao-e-formacao", "icon": "/images/categories/education.svg" }, { "id": 5, "name": "Geral", "slug": "geral", "icon": "/images/categories/general.svg" }, { "id": 6, "name": "Infantil", "slug": "infantil", "icon": "/images/categories/kid.svg" }, { "id": 7, "name": "Notícia e informação", "slug": "noticia-e-informacao", "icon": "/images/categories/news.svg" }, { "id": 8, "name": "Saúde e bem-estar", "slug": "saude-e-bem-estar", "icon": "/images/categories/health.svg" } ] } - Status:
- Erro:
- Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Obter categoria específica:
- Endpoint:
/categories/:slug - Parâmetros:
slug - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "id": 1, "name": "Bate-papo e entrevista", "slug": "bate-papo-e-entrevista", "icon": "/images/categories/chat.svg" }, "_links": [ { "href": "http://127.0.0.1:3000/categories", "rel": "get_all_categories", "method": "GET" }, { "href": "http://127.0.0.1:3000/categories/bate-papo-e-entrevista/shows", "rel": "get_category_shows", "method": "GET" } ] } - Status:
- Erro:
- Status:
404;- Resposta:
"Categoria não encontrada." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Programas de categoria específica:
- Endpoint:
/categories/:slug/shows - Parâmetros:
slug - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "uid": "exFgjX9wZNcR06FjswCk", "title": "MyCAST", "url_photo": "/images/shows/default.svg", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "url_photo": "/images/users/default.svg", "username": "Lorem Ipsum" } } ], "_links": [ { "href": "http://127.0.0.1:3000/categories", "rel": "get_all_categories", "method": "GET" }, { "href": "http://127.0.0.1:3000/categories/bate-papo-e-entrevista", "rel": "get_category", "method": "GET" } ] } - Status:
- Erro:
- Status:
404;- Resposta:
"Categoria não encontrada." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Enviar pedido de recuperação:
- Endpoint:
/password-reset - Campos:
email - Método:
POST - Sucesso:
- Status:
201, - Resposta:
"Pedido de recuperação criado com sucesso, verifique seu e-mail." - Status:
- Erro:
- Status:
400- Resposta:
[ "É necessário possuir um e-mail válido" ] - Status:
403- Resposta:
"O e-mail informado não pertence a uma conta." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Verificar pedido de recuperação:
- Endpoint:
/password-reset/:uid - Parâmetros:
uid - Método:
GET - Sucesso:
- Status:
204, - Resposta:
Sem resposta
- Status:
- Erro:
-
Status:
400- Resposta:
"Token de recuperação de senha não encontrado." -
Status:
403- Resposta:
"Token de recuperação de senha já utilizado."ou
"Token de recuperação de senha expirado." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Adicionar nova senha:
- Endpoint:
/password-reset/:uid - Parâmetros:
uid - Campos:
password, confirmPassword - Método:
PATCH - Sucesso:
- Status:
200, - Resposta:
"Senha alterada com sucesso." - Status:
- Erro:
-
Status:
400- Resposta:
"Token de recuperação de senha não encontrado."ou
[ "Defina uma nova senha com pelo menos 8 caracteres", "A confirmação de senha deve ser igual a definição de nova senha" ]
-
Status:
403- Resposta:
"Token de recuperação de senha já utilizado."ou
"Token de recuperação de senha expirado." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Obter todos os programas:
- Endpoint:
/shows - Método:
GET - Sucesso:
- Status:
200, - Resposta:
{ "response": [ { "uid": "exFgjX9wZNcR06FjswCk", "title": "MyCAST", "url_photo": "/images/shows/default.svg", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "username": "Lorem Ipsum" }, "category": { "name": "Bate-papo e entrevista", "slug": "bate-papo-e-entrevista", "icon": "/images/categories/chat.svg" } }, { "uid": "Mkyew76RmodMBJ3a3dlD", "title": "Desenvolvimento de APIs", "url_photo": "/images/shows/default.svg", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "username": "Lorem Ipsum" }, "category": { "name": "Educação e formação", "slug": "educacao-e-formacao", "icon": "/images/categories/education.svg" } } ], "_links": [ { "href": "http://127.0.0.1:3000/shows", "rel": "post_create_show", "method": "POST" } ] } - Status:
- Erro:
- Status:
500; - Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?" - Status:
- Endpoint:
-
Criar programa:
- Endpoint:
/shows - Método:
POST - Campos:
title, category, description (Opcional) - Sucesso:
- Status:
201; - Resposta:
{ "response": "Programa criado com sucesso.", "_links": [ { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC", "rel": "get_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC", "rel": "patch_update_show", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC", "rel": "delete_show", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
[ "Adicione um título de, pelo menos, 3 caracteres", "É necessário adicionar uma categoria válida" ]
ou
"Categoria inexistente!" -
Status:
403;- Resposta:
"Sua autorização expirou, autentique-se novamente."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Obter programa específico:
- Endpoint:
/shows/:uid - Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "uid": "exFgjX9wZNcR06FjswCk", "title": "MyCAST", "url_photo": "/images/shows/default.svg", "description": null, "createdAt": "2021-04-24T03:39:27.000Z", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "username": "Lorem Ipsum", "url_photo": "/images/users/default.svg" }, "category": { "name": "Bate-papo e entrevista", "slug": "bate-papo-e-entrevista", "icon": "/images/categories/chat.svg" }, "episodes": [] }, "_links": [ { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "patch_update_show", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "delete_show", "method": "DELETE" } ] } - Status:
- Erro:
- Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?" - Status:
404;- Resposta:
"Programa não encontrado." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Alterar informações de um programa:
-
Endpoint:
/shows/:uid -
Parâmetro:
uid -
Campos:
title, description, photo (Upload), category(Opcionais) -
Método:
PATCH -
Sucesso:
- Status:
200; - Resposta:
{ "response": "Alterações concluídas com sucesso", "_links": [ { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "get_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "delete_show", "method": "DELETE" } ] }ou
{ "response": "Imagem adicionada com sucesso", "_links": [ { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "get_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "delete_show", "method": "DELETE" } ] } - Status:
-
Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
[ "Ao redefinir um título deve-se ter, pelo menos, 3 caracteres", "É necessário redefinir uma categoria válida" ]
ou
"A categoria escolhida não existe."ou
"Programa não encontrado." -
Status:
403;- Resposta:
"Você não tem permissão para alterar este programa."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
406;- Resposta:
"O programa não possui uma imagem definida" -
Status:
413;- Resposta:
"Envie uma imagem com até 2 MB" -
Status:
415;- Resposta:
"Apenas imagens em png, jpeg e jpg são suportadas" -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
-
-
Deletar um programa:
- Endpoint:
/shows/:uid - Parâmetro:
uid - Método:
DELETE - Sucesso:
- Status:
200; - Resposta:
{ "response": "O programa e seus episódios foram deletados e não poderão ser recuperados.", "_links": [ { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "get_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/exFgjX9wZNcR06FjswCk", "rel": "patch_update_show", "method": "PATCH" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
"Programa não encontrado." -
Status:
403;- Resposta:
"Você não tem permissão para alterar este programa."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Estou seguindo o programa?:
- Endpoint:
/shows/:uid/following- Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": false, "_links": [ { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/follow", "rel": "post_follow_show", "method": "POST" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/followers", "rel": "get_follower_count_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/follow", "rel": "delete_follow_show", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
"O programa não existe." -
Status:
403;- Resposta:
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Parâmetro:
- Endpoint:
-
Quantos seguidores o programa possui?:
- Endpoint:
/shows/:uid/followers- Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": 0, "_links": [ { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/follow", "rel": "post_follow_show", "method": "POST" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/following", "rel": "get_following_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/follow", "rel": "delete_follow_show", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
"O programa não existe." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Parâmetro:
- Endpoint:
-
Seguir programa:
- Endpoint:
/shows/:uid/follow- Parâmetro:
uid - Método:
POST - Sucesso:
- Status:
200; - Resposta:
{ "response": "Você começou a seguir este programa.", "_links": [ { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/follow", "rel": "delete_follow_show", "method": "DELETE" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/following", "rel": "get_following_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/followers", "rel": "get_follower_count_show", "method": "GET" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
"O programa que você quer seguir não existe." -
Status:
403;- Resposta:
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
406;- Resposta:
"Você já segue este programa." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Parâmetro:
- Endpoint:
-
Deixar de seguir programa:
- Endpoint:
/shows/:uid/follow- Parâmetro:
uid - Método:
DELETE - Sucesso:
- Status:
200; - Resposta:
{ "response": "Você deixou de seguir este programa.", "_links": [ { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/follow", "rel": "post_follow_show", "method": "POST" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/following", "rel": "get_following_show", "method": "GET" }, { "href": "http://127.0.0.1:3000/shows/LuGGHvnMQhb5C0FbN2pC/followers", "rel": "get_follower_count_show", "method": "GET" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
"O programa que você quer deixar de seguir não existe." -
Status:
403;- Resposta:
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
406;- Resposta:
"Você já segue este programa." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Parâmetro:
- Endpoint:
-
Obter todos os episódios:
- Endpoint:
/episodes - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "uid": "kjCSQ0qXdcDkuSX7EK6V", "title": "Episódio 2", "duration": "00:00:00", "show": { "uid": "LuGGHvnMQhb5C0FbN2pC", "title": "Conversa com desenvolvedores" } }, { "uid": "rgg0D1Hysal0LWtkzMDD", "title": "Episódio 1", "duration": "00:00:00", "show": { "uid": "LuGGHvnMQhb5C0FbN2pC", "title": "Conversa com desenvolvedores" } } ], "_links": [ { "href": "http://127.0.0.1:3000/episodes", "rel": "post_create_episode", "method": "POST" } ] }- Erro:
- Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Status:
- Endpoint:
-
Criar episódio:
- Endpoint:
/episodes - Método:
POST - Campos:
show, title, description - Sucesso:
- Status:
201; - Resposta:
{ "response": "Episódio criado.", "_links": [ { "href": "http://127.0.0.1:3000/episodes", "rel": "get_all_episodes", "method": "GET" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "get_episode", "method": "GET" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "update_episode", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "delete_episode", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
[ "É necessário adicionar um programa válido", "Adicione um título de, pelo menos, 5 caracteres" ]
ou
"Programa não encontrado." -
Status:
403;- Resposta:
"Você não tem permissão para alterar este programa."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Obter episódio específico:
- Endpoint:
/episodes/:uid - Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "uid": "kjCSQ0qXdcDkuSX7EK6V", "title": "Episódio 2", "description": null, "url_audio": "/audios/8KWBuMAKbiwfeUV1ve16.mp3", "duration": "00:04:26", "createdAt": "2021-04-24T14:06:48.000Z", "show": { "uid": "LuGGHvnMQhb5C0FbN2pC", "title": "Conversa com desenvolvedores", "url_photo": "/images/shows/default.svg" } }, "_links": [ { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "patch_update_episode", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "delete_episode", "method": "DELETE" } ] } - Status:
- Erro:
- Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?" - Status:
404;- Resposta:
"Episódio não encontrado." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Alterar informações de um episódio:
-
Endpoint:
/episodes/:uid -
Parâmetro:
uid -
Campos:
title, description, audio (Upload)(Opcionais) -
Método:
PATCH -
Sucesso:
- Status:
200; - Resposta:
{ "response": "Aúdio adicionado com sucesso.", "_links": [ { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "get_episode", "method": "GET" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "delete_episode", "method": "DELETE" } ] }ou
{ "response": "Alterações concluídas.", "_links": [ { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "get_episode", "method": "GET" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "delete_episode", "method": "DELETE" } ] } - Status:
-
Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
[ "É necessário adicionar um programa válido", "Adicione um título de, pelo menos, 5 caracteres" ]
ou
"O programa escolhido não existe."ou
"Episódio não encontrado." -
Status:
403;- Resposta:
"Você não tem permissão para alterar este episódio."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
415;- Resposta:
"Apenas alguns tipos de aúdio são suportados, são eles: mp3 (mpeg), mp4, ogg, flac e wav" -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
-
-
Deletar um episódio:
- Endpoint:
/episodes/:uid - Parâmetro:
uid - Método:
DELETE - Sucesso:
- Status:
200; - Resposta:
{ "response": "Episódio removido.", "_links": [ { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "get_episode", "method": "GET" }, { "href": "http://127.0.0.1:3000/episodes/kjCSQ0qXdcDkuSX7EK6V", "rel": "patch_update_episode", "method": "PATCH" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
"Episódio não encontrado." -
Status:
403;- Resposta:
"Você não tem permissão para alterar este episódio."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Obter todas as playlists:
- Endpoint:
/playlists - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": [ { "uid": "hoJIeKD1sMdwpJIqKZWE", "title": "Ouvir enquanto trabalho", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "username": "Lorem Ipsum", "url_photo": "/images/users/default.svg" } }, { "uid": "JKW1ND3DgKdHZaSCuGHt", "title": "Meus favoritos", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "username": "Lorem Ipsum", "url_photo": "/images/users/default.svg" } } ], "_links": [ { "href": "http://127.0.0.1:3000/playlists", "rel": "post_playlist", "method": "POST" } ] } - Status:
- Erro:
- Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Criar playlist:
- Endpoint:
/playlists - Método:
POST - Campos:
title - Sucesso:
- Status:
201; - Resposta:
{ "response": "Playlist criada.", "_links": [ { "href": "http://127.0.0.1:3000/playlists/JKW1ND3DgKdHZaSCuGHt", "rel": "get_playlist", "method": "GET" }, { "href": "http://127.0.0.1:3000/playlists/JKW1ND3DgKdHZaSCuGHt", "rel": "patch_update_playlist", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/playlists/JKW1ND3DgKdHZaSCuGHt", "rel": "delete_playlist", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
[ "Você deve adicionar um título." ] -
Status:
403;- Resposta:
"Sua autorização expirou, autentique-se novamente."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
-
- Endpoint:
-
Obter playlist específica:
- Endpoint:
/playlists/:uid - Parâmetro:
uid - Método:
GET - Sucesso:
- Status:
200; - Resposta:
{ "response": { "uid": "hoJIeKD1sMdwpJIqKZWE", "title": "Ouvir enquanto trabalho", "createdAt": "2021-04-24T15:43:24.000Z", "updatedAt": "2021-04-24T15:43:24.000Z", "author": { "uid": "DBIJkgb9mWGLEQayAgI7", "username": "Lorem Ipsum", "url_photo": "/images/users/default.svg" }, "episodes": [] }, "_links": [ { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE", "rel": "patch_update_playlist", "method": "PATCH" }, { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE", "rel": "delete_playlist", "method": "DELETE" } ] } - Status:
- Erro:
- Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?" - Status:
404;- Resposta:
"Playlist não encontrada." - Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"
- Status:
- Endpoint:
-
Alterar informações de uma playlist:
- Endpoint:
/playlists/:uid - Parâmetro:
uid - Campos:
title - Método:
PATCH - Sucesso:
- Status:
200; - Resposta:
{ "response": "Alteração concluída com sucesso.", "_links": [ { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE", "rel": "get_playlist", "method": "GET" }, { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE", "rel": "delete_playlist", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?"ou
[ "Você deve adicionar um título." ]ou
"Playlist não encontrada." -
Status:
403;- Resposta:
"Você não tem permissão para alterar esta playlist."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Adicionar um item na playlist:
- Endpoint:
/playlists/:uid/item - Parâmetro:
uid - Campos:
episode - Método:
POST - Sucesso:
- Status:
201; - Resposta:
{ "response": "Episódio adicionado na playlist com sucesso.", "_links": [ { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE/item/id", "rel": "delete_removeItem", "method": "DELETE" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"É necessário adicionar um episódio válido."ou
"Playlist não encontrada."ou
"O episódio que você quer adicionar não existe." -
Status:
403;- Resposta:
"Você não tem permissão para alterar esta playlist."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
406;- Resposta:
"Você já possui este episódio adicionado em sua playlist." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Remover um item na playlist:
- Endpoint:
/playlists/:uid/item/:id - Parâmetro:
uid, id - Método:
DELETE - Sucesso:
- Status:
200; - Resposta:
{ "response": "Episódio removido da playlist com sucesso.", "_links": [ { "href": "http://127.0.0.1:3000/playlists/iRvHq06vbYkNXOA4gbTy/item", "rel": "post_addItem", "method": "POST" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Playlist não encontrada."ou
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?'" -
Status:
403;- Resposta:
"Você não tem permissão para alterar esta playlist."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
406;- Resposta:
"O item mencionado não existe na playlist." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
-
Remover uma playlist:
- Endpoint:
/playlists/:uid - Parâmetro:
uid - Método:
DELETE - Sucesso:
- Status:
200; - Resposta:
{ "response": "Playlist deletada com sucesso.", "_links": [ { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE", "rel": "get_playlist", "method": "GET" }, { "href": "http://127.0.0.1:3000/playlists/hoJIeKD1sMdwpJIqKZWE", "rel": "patch_update_playlist", "method": "PATCH" } ] } - Status:
- Erro:
-
Status:
400;- Resposta:
"Playlist não encontrada."ou
"Desculpe, mas a sintaxe está incorreta. Que tal tentar novamente?'" -
Status:
403;- Resposta:
"Você não tem permissão para alterar esta playlist."ou
"Sua autorização é inválida, autentique-se."ou
"Sua autorização não pertence a nenhum usuário, autentique-se novamente." -
Status:
500;- Resposta:
"Desculpe, mas algum erro ocorreu. Que tal tentar novamente?"ou
"Ocorreu um erro na verificação de token. Tente novamente mais tarde."
-
- Endpoint:
- NodeJS - Servidor
- MySQL - Banco de dados
- ExpressJS - Framework NodeJS
- nodemon - Reinício automático de servidor
- standard - Formatador padrão de código Javascript
- sequelize-cli - Gerar ambiente para a manipulação de dados
- bcrypt - Hash de senhas
- CORS - Habilitar CORS no servidor ExpressJS
- dotEnv - Variáveis de ambiente
- dotEnv-expand - Variáveis em arquivos .env
- express-validator - Middleware de validação de campos
- get-audio-duration - Obter duração de arquivos de áudio
- jsonwebtoken - JWT para NodeJS
- moment - Biblioteca de manipulação de data e hora
- moment-duration-format - Manipulação de duração
- multer - Upload de arquivos
- mysql2 - Driver de MySQL para NodeJS
- nanoid - Gerador de códigos únicos, semelhantes ao UUID
- nodemailer - Enviar e-mails no NodeJS
- sequelize - ORM para MySQL
- sharp - Manipulação de imagens
- slugify - Transformar frases em slug (-)
