API REST de um Jornal Online em ASP.NET Core.
Para que o projeto funcione corretamente, crie um arquivo chamado appsettings.json na raiz do projeto com o seguinte conteúdo:
{
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Host=databaseUri;Port=5432;Database=DabaseName;Username=postgres;Password=suasenhaaqui"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
Esta API permite o gerenciamento de notícias, categorias, usuários e comentários.
POST /api/user
Cria um novo usuário no sistema.
Body:
{
"name": "João",
"email": "[email protected]",
"password": "senha123",
"role": "admin"
}
Parâmetros:
name
(string, obrigatório): Nome do usuário (mínimo 1, máximo 255 caracteres).email
(string, obrigatório): E-mail do usuário (mínimo 1, máximo 100 caracteres, formato de e-mail).password
(string, obrigatório): Senha do usuário (mínimo 8 caracteres).role
(string, obrigatório): Papel do usuário (mínimo 4, máximo 6 caracteres).
Resposta:
200 OK
: Usuário criado com sucesso.409 Conflict
: Se nome ou e-mail já estiverem em uso.
POST /api/user/login
Autentica um usuário e retorna um token JWT.
Body:
{
"email": "[email protected]",
"password": "senha123"
}
Parâmetros:
email
(string, obrigatório): E-mail do usuário.password
(string, obrigatório): Senha do usuário.
Resposta:
-
201 Created
: Login bem-sucedido, retorna o token JWT.{ "token": "seu_token_jwt_aqui" }
-
401 Unauthorized
: Se e-mail ou senha estiverem incorretos.
GET /api/user/me
Retorna informações do usuário autenticado.
Headers:
Authorization: Bearer JWT_TOKEN
Resposta:
{
"name": "João",
"role": "admin",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
200 OK
: Informações do usuário autenticado.401 Unauthorized
: Se o token for inválido ou ausente.
PUT /api/user
Atualiza as informações de um usuário existente.
Body:
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Novo Nome",
"email": "[email protected]",
"password": "senhaAntiga",
"newPassword": "novaSenhaSegura",
"role": "editor"
}
Headers:
Authorization: Bearer JWT_TOKEN
Parâmetros:
id
(string, obrigatório): ID do usuário a ser editado (formato UUID).name
(string, opcional): Novo nome do usuário.role
(string, opcional): Novo papel do usuário.email
(string, opcional): Novo e-mail do usuário.password
(string, opcional): Senha atual do usuário.newPassword
(string, opcional): Nova senha do usuário.
Resposta:
200 OK
: Usuário editado com sucesso.400 Bad Request
: Se algo falhar na requisição.401 Unauthorized
: Se o token for inválido.
DELETE /api/user/{id}/inactive
Inativa um usuário pelo seu ID.
Parâmetros de Rota:
id
(string, obrigatório): ID do usuário a ser inativado (formato UUID).
Resposta:
200 OK
: Usuário inativado com sucesso.
POST /api/category
Cria uma nova categoria.
Body:
{
"name": "Esportes"
}
Parâmetros:
name
(string, obrigatório): Nome da categoria (mínimo 1, máximo 30 caracteres).
Resposta:
200 OK
: Categoria criada com sucesso.
GET /api/category
Lista todas as categorias.
Resposta:
200 OK
: Retorna uma lista de categorias.
GET /api/category/{id}/news
Retorna todas as notícias associadas a uma categoria específica.
Parâmetros de Rota:
id
(string, obrigatório): ID da categoria (formato UUID).
Resposta:
200 OK
: Retorna uma lista de notícias da categoria.
GET /api/category/{id}
Retorna uma categoria específica pelo seu ID.
Parâmetros de Rota:
id
(string, obrigatório): ID da categoria (formato UUID).
Resposta:
200 OK
: Retorna a categoria solicitada.
DELETE /api/category/{id}/inactive
Inativa uma categoria pelo seu ID.
Parâmetros de Rota:
id
(string, obrigatório): ID da categoria a ser inativada (formato UUID).
Resposta:
200 OK
: Categoria inativada com sucesso.
POST /api/news
Cria uma nova notícia.
Body:
{
"title": "Novo Título da Notícia",
"description": "Uma breve descrição da notícia.",
"thumbnail": "url_da_imagem.jpg",
"content": "Conteúdo completo da notícia aqui...",
"categoryId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Parâmetros:
title
(string, obrigatório): Título da notícia (mínimo 1, máximo 100 caracteres).description
(string, obrigatório): Descrição da notícia (mínimo 1, máximo 255 caracteres).thumbnail
(string, obrigatório): URL da imagem em miniatura (mínimo 1, máximo 255 caracteres).content
(string, obrigatório): Conteúdo da notícia (mínimo 1, máximo 2000 caracteres).categoryId
(string, obrigatório): ID da categoria à qual a notícia pertence (formato UUID).
Resposta:
200 OK
: Notícia criada com sucesso.
PUT /api/news
Atualiza as informações de uma notícia existente.
Body:
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"title": "Título Atualizado",
"description": "Descrição atualizada da notícia.",
"content": "Conteúdo revisado da notícia.",
"thumbnail": "nova_url_imagem.jpg",
"active": true,
"categoryId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Parâmetros:
id
(string, obrigatório): ID da notícia a ser editada (formato UUID).title
(string, opcional): Novo título da notícia.description
(string, opcional): Nova descrição da notícia.content
(string, opcional): Novo conteúdo da notícia.thumbnail
(string, opcional): Nova URL da imagem em miniatura.active
(boolean, opcional): Status de atividade da notícia.categoryId
(string, opcional): Novo ID da categoria.
Resposta:
200 OK
: Notícia editada com sucesso.
DELETE /api/news/{id}/inactive
Inativa uma notícia pelo seu ID.
Parâmetros de Rota:
id
(string, obrigatório): ID da notícia a ser inativada (formato UUID).
Resposta:
200 OK
: Notícia inativada com sucesso.
GET /api/news/recents
Retorna uma lista de notícias recentes.
Parâmetros de Consulta:
take
(integer, opcional): Número de notícias a serem retornadas (padrão: 10).skip
(integer, opcional): Número de notícias a serem puladas (padrão: 0).
Resposta:
{
"title": "Novas medidas são anunciadas para o setor educacional",
"description": "Governo apresenta pacote de investimentos para escolas públicas",
"thumbnail": "https://intrinseca.com.br/wp-content/uploads/2016/08/educa%C3%A7%C3%A3o_2-768x488.jpg",
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"active": true,
"createdAt": "2025-06-02T15:05:09.49138Z"
},
...
GET /api/news/{id}
Retorna uma notícia específica pelo seu ID.
Parâmetros de Rota:
id
(string, obrigatório): ID da notícia (formato UUID).
Resposta:
{
"title": "Novas medidas são anunciadas para o setor educacional",
"description": "Governo apresenta pacote de investimentos para escolas públicas",
"content": "O Ministério da Educação divulgou nesta segunda-feira um novo pacote de medidas que visa fortalecer a infraestrutura das escolas públicas em todo o país. Entre as ações previstas estão a construção de novas unidades, contratação de professores e modernização de equipamentos tecnológicos.",
"thumbnail": "https://intrinseca.com.br/wp-content/uploads/2016/08/educa%C3%A7%C3%A3o_2-768x488.jpg",
"category": {
"id": "55555555-5555-5555-5555-555555555555",
"name": "Economia"
},
"author": {
"name": "Danies",
"role": "user",
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"active": true,
"createdAt": "2025-06-02T15:05:09.49138Z",
"updatedAt": "2025-06-02T15:05:09.49138Z"
}
GET /api/news/title/{title}
Parâmetros de Rota:
title
(string, obrigatório): Título da notícia.
Retorna uma lista que correspondem a um título.
Resposta* Baseado no title medidas
{
"title": "Novas medidas são anunciadas para o setor educacional",
"description": "Governo apresenta pacote de investimentos para escolas públicas",
"thumbnail": "https://intrinseca.com.br/wp-content/uploads/2016/08/educa%C3%A7%C3%A3o_2-768x488.jpg",
"id": "3b5ccb2b-150b-4a85-a167-9eda414db3c1",
"active": true,
"createdAt": "2025-06-02T15:05:09.49138Z"
}
GET /api/news/{newsId}/comments
Retorna os comentários de uma notícia específica.
Parâmetros de Rota:
newsId
(string, obrigatório): ID da notícia (formato UUID).
Parâmetros de Consulta:
skip
(integer, opcional): Número de comentários a serem pulados (padrão: 0).take
(integer, opcional): Número de comentários a serem retornados (padrão: 10).
Resposta:
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"content": "Faiz U L MESMO UNGA BUNGA Lulistas",
"authorName": "Danies",
"replies": [
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"content": "Faiz U L MESMO UNGA BUNGA Resposta",
"authorName": "Daniek",
"replies": null,
"createdAt": "2025-06-10T00:47:28.0967Z",
"updatedAt": "2025-06-10T00:47:28.0967Z",
"likes": 0,
"disLikes": 0
}
],
"createdAt": "2025-06-03T21:49:47.430172Z",
"updatedAt": "2025-06-03T21:55:20.880794Z",
"likes": 1,
"disLikes": 0
},
POST /api/news/{newsId}/comments
Cria um novo comentário para uma notícia.
Parâmetros de Rota:
newsId
(string, obrigatório): ID da notícia (formato UUID).
Body:
{
"content": "Este é um comentário sobre a notícia."
}
Parâmetros:
content
(string, obrigatório): Conteúdo do comentário.
Resposta:
200 OK
: Comentário criado com sucesso.
POST /api/news/{newsId}/comments/{id}/replies
Cria uma resposta a um comentário existente em uma notícia.
Parâmetros de Rota:
newsId
(string, obrigatório): ID da notícia (formato UUID).id
(string, obrigatório): ID do comentário ao qual responder (formato UUID).
Body:
{
"content": "Esta é uma resposta ao comentário."
}
Parâmetros:
content
(string, obrigatório): Conteúdo da resposta.
Resposta:
200 OK
: Resposta criada com sucesso.
DELETE /api/news/{newsId}/comments/{id}/inactive
Inativa um comentário específico de uma notícia.
Parâmetros de Rota:
id
(string, obrigatório): ID do comentário a ser inativado (formato UUID).newsId
(string, obrigatório): ID da notícia à qual o comentário pertence.
Resposta:
200 OK
: Comentário inativado com sucesso.
POST /api/news/{newsId}/comments/{id}/like
Adiciona um "curtir" a um comentário.
Parâmetros de Rota:
id
(string, obrigatório): ID do comentário a ser curtido (formato UUID).newsId
(string, obrigatório): ID da notícia à qual o comentário pertence.
Resposta:
200 OK
: Curtida registrada com sucesso.
POST /api/news/{newsId}/comments/{id}/dislike
Adiciona um "não curtir" a um comentário.
Parâmetros de Rota:
id
(string, obrigatório): ID do comentário a ser descurtido (formato UUID).newsId
(string, obrigatório): ID da notícia à qual o comentário pertence.
Resposta:
200 OK
: Descurtida registrada com sucesso.
.
├── Modules/
│ ├── User/
│ │ ├── UserDto.cs
│ │ ├── UserModel.cs
│ │ ├── UserService.cs
│ │ ├── UserController.cs
│ │ └── UserModule.cs
│ ├── Auth/
│ │ ├── AuthModel.cs
│ │ ├── AuthSettings.cs
│ │ └── JwtStrategy.cs
│ ├── News/
│ │ ├── NewsDto.cs
| | ├── NewsModel.cs
│ │ ├── NewsModule.cs
│ │ ├── NewsService.cs
│ │ └── NewsController.cs
│ ├── Category/
| | ├── CategoryDto.cs
| | ├── CategoryModel.cs
│ │ ├── CategoryModule.cs
│ │ ├── CategoryService.cs
│ │ └── CategoryController.cs
│ └── Comments/
│ ├── CommentsDto.cs
| ├── CommentsModel.cs
│ ├── CommentsModule.cs
│ ├── CommentsService.cs
│ └── CommentsController.cs
├── appsettings.json
└── ... (outros arquivos do projeto)
- JWT (JSON Web Tokens): A autenticação é realizada via tokens JWT.
- Validade do Token: Os tokens têm uma validade de 30 minutos.
- Rotas Protegidas: Endpoints que exigem autenticação (ex:
/api/user/me
,/api/user
) necessitam de umBearer Token
no cabeçalhoAuthorization
. - Claims: As informações do usuário (claims) são extraídas diretamente do token JWT.
Para compilar e executar o projeto, utilize os seguintes comandos no terminal na raiz do projeto:
dotnet build
dotnet run
Ao realizar requisições para endpoints protegidos, inclua o cabeçalho Authorization
com o token JWT no formato Bearer {token}
:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Daniel Guirra
- Email: [email protected]
- Licença: Licença MIT