Status: Concluído e implantado na AWS ✅
API RESTful construída com Java e Spring Boot para servir como o back-end de uma aplicação de portfólio pessoal. A API gere projetos, experiências profissionais e formação académica, com um sistema de autenticação seguro baseado em JWT.
Esta API serve o front-end que está no ar em: arthurfialho.com.br
A aplicação está totalmente containerizada e implantada na nuvem da AWS, seguindo práticas modernas de DevOps:
- API (Back-end): A aplicação Spring Boot é executada como um container Docker no AWS App Runner, que gere o build, o deploy e a escalabilidade.
- Base de Dados: Utiliza uma instância gerida de PostgreSQL no Amazon RDS, garantindo segurança, performance e backups.
- Envio de E-mails: O formulário de contacto utiliza o AWS SES (Simple Email Service) para um envio de e-mails fiável.
Categoria | Tecnologia |
---|---|
Linguagem & Core | Java 21, Spring Boot 3.x |
Web & API | Spring Web, Spring Security (JWT) |
Persistência | Spring Data JPA, Hibernate, PostgreSQL |
Build & Dependências | Maven |
Qualidade de Código | Lombok, MapStruct (Mapeamento manual) |
Containerização | Docker, Docker Compose |
Cloud & Deploy | AWS (App Runner, RDS, SES), Git & GitHub |
- JDK 21 ou superior
- Maven 3.6 ou superior
- Docker e Docker Compose (para a forma mais fácil de executar)
-
Clone o repositório:
git clone https://github.com/Arthur-Fialho/API-Java-Portfolio.git cd API-Java-Portfolio
-
Configure a Base de Dados:
- Tenha uma instância do PostgreSQL a rodar.
- Crie uma base de dados chamada
portfolio
. - Copie o ficheiro
src/main/resources/application.properties.example
parasrc/main/resources/application.properties
. - Altere as propriedades em
application.properties
com as suas credenciais:# Credenciais da Base de Dados spring.datasource.url=jdbc:postgresql://localhost:5432/portfolio spring.datasource.username=<seu-usuario-postgres> spring.datasource.password=<sua-senha-postgres> # Credenciais do Administrador Padrão admin.default.username=admin admin.default.password=<sua-senha-segura-para-o-admin> # Segredo do JWT api.security.token.secret=<seu-segredo-longo-e-aleatorio-para-jwt>
-
Execute a Aplicação:
./mvnw spring-boot:run
A API estará disponível em
http://localhost:8080
.
O projeto está pronto para ser executado com um único comando.
-
Configure as variáveis de ambiente:
- Na raiz do projeto, crie um ficheiro
.env
a partir do.env.example
. - Preencha as variáveis no ficheiro
.env
com os seus segredos.
- Na raiz do projeto, crie um ficheiro
-
Execute o Docker Compose:
docker-compose up --build
A API estará disponível em
http://localhost:8080
.
Clique para expandir a documentação da API
Todos os endpoints que manipulam dados (POST, PUT, DELETE) são protegidos e exigem um token JWT no cabeçalho Authorization: Bearer <seu-token>
.
POST /auth/login
: Realiza o login e retorna um token JWT.
GET /projects
: Lista todos os projetos, ordenados pordisplayOrder
.GET /projects/{id}
: Busca um projeto por ID.POST /projects
: (Protegido) Cria um novo projeto.PUT /projects/{id}
: (Protegido) Atualiza um projeto existente.DELETE /projects/{id}
: (Protegido) Deleta um projeto.
Exemplo de corpo para POST
ou PUT
de Projeto:
{
"title": "Nome do Projeto",
"description": "Descrição detalhada do que o projeto faz.",
"technologies": "Java, React, AWS",
"repositoryUrl": "[https://github.com/](https://github.com/)...",
"demoUrl": "[https://meuprojeto.com](https://meuprojeto.com)",
"displayOrder": 1
}
GET /experiences
: Lista todas as experiências.GET /experiences/{id}
: Busca uma experiência por ID.POST /experiences
: (Protegido) Cria uma nova experiência.PUT /experiences/{id}
: (Protegido) Atualiza uma experiência.DELETE /experiences/{id}
: (Protegido) Deleta uma experiência.
Exemplo de corpo para POST
ou PUT
de Experiência:
{
"title": "Engenheiro de Software",
"company": "Tech Corp",
"startDate": "2022-01-15",
"endDate": null,
"description": "Desenvolvimento de microserviços..."
}
GET /educations
: Lista todas as formações.GET /educations/{id}
: Busca uma formação por ID.POST /educations
: (Protegido) Cria uma nova formação.PUT /educations/{id}
: (Protegido) Atualiza uma formação.DELETE /educations/{id}
: (Protegido) Deleta uma formação.
Exemplo de corpo para POST
ou PUT
de Educação:
{
"institution": "Universidade da Tecnologia",
"course": "Engenharia de Software",
"startDate": "2018-02-01",
"endDate": "2021-12-10",
"description": "Foco em arquitetura de software..."
}
Arthur Fialho