Neste desafio você deve desenvolver uma API para o controle de envio de pacotes utilizando o .NET Core 6 Minimal APIs.
$ dotnet restore
$ dotnet run
Essa rota deve retornar uma lista com todos os pacotes armazenados no Banco de Dados.
- Rota deve retornar apenas o pacote com o mesmo
id
. - Caso não exista pacotes com o mesmo
id
, rota deve retornar status 404. - Retorno de Erro na rota deve ser padronizado.
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Usuário deve ter privilégio de
User
ou superior para utilizar esta rota.
Essa rota deve receber um id referente a um pacote pelos Parâmetros de Rota e retornar os detalhes de um pacote do Banco de Dados que contenha o mesmo id. Os detalhes retornados devem conter o pacote relacionado.
- Rota deve retornar apenas os detalhes com o mesmo
id
. - Detalhes devem conter o pacote no objeto de saída.
- Caso não exista detalhes com o mesmo
id
, rota deve retornar status 404. - Retorno de Erro na rota deve ser padronizado.
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Usuário deve ter privilégio de
User
ou superior para utilizar esta rota.
Essa rota deve receber os parâmetros recipient
, houseNumber
e zipcode
no corpo da requisição em formato JSON para realizar a criação de um Pacote no Banco de Dados e seus Detalhes.
{
"recipient": "Andre Sampaio",
"zipcode": "18080320",
"houseNumber": 200
}
- Rota deve receber os parâmetros
recipient
,houseNumber
ezipcode
no corpo da requisição. - Parâmetros recebidos devem ser validados.
-
recipient
deve ter no mínimo 3 caracteres. -
houseNumber
não pode ser nulo. -
zipcode
não pode ser vazio ou nulo. -
zipcode
deve ser um CEP válido sem caracteres especiais.
-
- Parâmetros incorretos devem retornar status 400.
- Retorno de Erro na rota deve ser padronizado.
- Devem ser criados um Pacote e Detalhes utilizando os dados recebidos.
- Pacote e Detalhes devem estar relacionados no Banco de Dados.
- Status de Pacote deve iniciar como
waiting
- Detalhes
deliveredAt
ewithdrawAt
devem iniciar comonull
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Usuário deve ter privilégio de
User
ou superior para utilizar esta rota. -
createdBy
deve ter o nome armazenado no Token do usuário. -
userId
deve ter o nome armazenado no Token do usuário.
Essa rota deve receber um id
nos Parâmetros de Rota da requisição e realizar a atualização do Status de um Pacote com o mesmo id
.
- Rota deve retornar apenas o Pacote após atualização.
- O Status deve ser atualizado para o próximo valor de
enum
.- A Rota não pode atualizar o Status para
misplaced
- A Rota não pode atualizar o Status para
- Detalhes
deliveredAt
ewithdrawAt
devem ser atualizados conforme a atualização de Status. - Caso não exista pacote com o mesmo
id
, rota deve retornar status 404. - Retorno de Erro na rota deve ser padronizado.
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Apenas o criador do pacote pode atualiza-lo.
- Usuários com privilégio
Admin
podem atualizar qualquer pacote.
Essa rota deve receber um id
nos Parâmetros de Rota da requisição e realizar a atualização do Status de um Pacote com o mesmo id
para perdido.
- Rota deve retornar apenas o Pacote após atualização.
- O Status deve ser atualizado para o valor de
misplaced
. - Caso não exista pacote com o mesmo
id
, rota deve retornar status 404. - Retorno de Erro na rota deve ser padronizado.
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Apenas o criador do pacote pode atualiza-lo.
- Usuários com privilégio
Admin
podem atualizar qualquer pacote.
Essa rota deve receber um id
nos Parâmetros de Rota da requisição e realizar a exclusão de um Pacote com o mesmo id
.
- Rota deve retornar apenas status 204 na resposta, sem corpo.
- Pacote e Detalhes relacionados devem ser excluídos do Banco de Dados.
- Caso não exista pacote com o mesmo
id
, rota deve retornar status 404. - Retorno de Erro na rota deve ser padronizado.
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Apenas o criador do pacote pode excluí-lo.
- Usuários com privilégio
Admin
podem atualizar qualquer pacote.
Modelo de Pacote no Banco de dados
public record Package
{
public Guid id { get; init; }
public string createdBy { get; init; } = default!;
public Guid userId { get; init; }
public DateTime updatedAt { get; set; }
public Status status { get; set; }
public Details Details { get; init; } = default!;
}
Modelo de Detalhes no Banco de dados
public record Details
{
public Guid id { get; init; }
public string recipient { get; init; } = default!;
public string zipcode { get; init; } = default!;
public Int32 houseNumber { get; init; }
public Nullable<DateTime> postedAt { get; set; }
public Nullable<DateTime> withdrawnAt { get; set; }
public Nullable<DateTime> deliveredAt { get; set; }
public Guid packageId { get; init; }
public Package Package { get; init; } = default!;
}
Modelo de Status
public enum Status
{
waiting = 1,
transporting = 2,
delivered = 3,
misplaced = 4,
}
Os exercícios bônus são feitos para se desafiar em relação aos aprendizados do curso, a entrega não é obrigatório.
Essa rota deve retornar as estatísticas em relação aos status de pacotes do Banco de Dados.
- Rota deve retornar uma lista com a somatória de cada status no banco de dados.
- Rota deve ser autenticada utilizando JWT.
- Apenas usuários autenticados pode utilizar esta rota.
- Usuários com privilégio
User
ou superior podem utilizar esta rota.
[
{
"status": 3,
"count": 1
},
{
"status": 2,
"count": 3
}
]
Esse desafio deve ser entregue a partir da plataforma Edx, enviado em formato de repositório de código, plataforma de edição de código online ou zip. Lembre-se de manter o arquivo público antes de compartilhar com o instrutor.
Feito com 💜 por Andre Sampaio