Portlet de gerenciamento de tarefas desenvolvido para o Desafio SEA, construido sobre Liferay 7.4.3.112-ga112 com arquitetura MVC Portlet e persistencia gerada pelo Service Builder.
- Visao geral
- Funcionalidades
- Arquitetura
- Pre-requisitos
- Instalacao e execucao
- Build e deploy dos modulos
- Como adicionar o portlet
- Testes
- Observacoes importantes
Aplicacao de todo list rodando como portlet no Liferay. Cada usuario possui seu proprio espaco isolado de tarefas, com suporte a categorias, subtarefas, comentarios, filtros e historico de exclusao logica.
Stack principal: Java 17, Liferay 7.4.3.112, Gradle, MySQL 8, JSP, Bootstrap
- Criacao, edicao e exclusao logica de tarefas
- Marcacao de tarefas como concluidas
- Categorias por usuario
- Subtarefas vinculadas a cada tarefa
- Comentarios por tarefa
- Isolamento de dados por usuario
- Validacoes de seguranca nas operacoes de escrita
O projeto segue o formato de Liferay Workspace com tres modulos OSGi:
DesafioSEA/
|-- modules/
| |-- todo-list-api/ # Interfaces, modelos e utilitarios
| |-- todo-list-service/ # Regras de negocio e persistencia
| `-- todo-list-web/ # Portlet MVC, JSPs e commands
|-- docker-compose.yml
|-- build.gradle
|-- settings.gradle
`-- README.md
Fluxo principal:
JSP
-> MVCActionCommand
-> LocalServiceImpl
-> Persistence / Service Builder
-> MySQL
Para rodar o projeto localmente, um novo usuario precisa de:
- Docker Desktop
- JDK 17 instalado
- Git
- Internet na primeira execucao do Gradle Wrapper
O projeto usa o gradlew incluido no repositorio, entao nao e necessario instalar Gradle manualmente.
git clone <url-do-repositorio>
cd DesafioSEACopie o arquivo de exemplo:
cp .env.example .envNo Windows PowerShell:
Copy-Item .env.example .envOs valores padrao do arquivo de exemplo ja sao suficientes para desenvolvimento local.
docker compose up -dIsso sobe:
todolist-liferayemhttp://localhost:8080mysql-todolistna porta3306
Opcionalmente acompanhe os logs:
docker compose logs -f liferayEspere a inicializacao terminar antes de fazer o deploy dos modulos.
Importante: apenas subir o Docker nao faz o portlet aparecer.
O container do Liferay nao compila os modulos Java automaticamente. Depois que os containers estiverem no ar, e obrigatorio publicar os bundles OSGi do projeto.
Da raiz do projeto, execute:
./gradlew dockerDeployAllNo Windows PowerShell:
.\gradlew.bat dockerDeployAllEsse comando envia os tres modulos necessarios para o container:
todo-list-apitodo-list-servicetodo-list-web
Sem isso, o Liferay pode exibir mensagens como:
This portlet could not be found. Please redeploy it or remove it from the page.
# Build completo
./gradlew build
# Testes do modulo service
./gradlew :modules:todo-list-service:test
# Deploy apenas do modulo web
./gradlew :modules:todo-list-web:dockerCopyDeployNo fluxo normal, prefira sempre dockerDeployAll.
Depois do deploy:
- Acesse
http://localhost:8080 - Crie uma conta ou faca login
- Entre em uma pagina editavel
- Abra o painel de widgets
- Busque por Todo List
- Arraste o portlet para a pagina
Se a pagina tiver uma instancia antiga quebrada, remova o bloco com erro e adicione o portlet novamente apos o deploy.
Os testes unitarios estao no modulo todo-list-service e usam JUnit 4 e Mockito.
./gradlew :modules:todo-list-service:testNo Windows PowerShell:
.\gradlew.bat :modules:todo-list-service:test- O primeiro boot do Liferay pode demorar varios minutos.
- O compose deste projeto desabilita sample data e aumenta a janela do healthcheck para evitar
unhealthydurante a carga inicial. - O portlet depende dos bundles
api,serviceeweb; deploy parcial pode fazer o widget sumir do menu do Liferay. - Se voce alterar codigo de modulo, rode novamente
dockerDeployAll. - As tabelas do banco sao criadas automaticamente no primeiro deploy dos modulos.
Para um usuario novo, o fluxo correto e:
Copy-Item .env.example .env
docker compose up -d
.\gradlew.bat dockerDeployAll