Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified Convive/mvnw
100644 → 100755
Empty file.
4 changes: 2 additions & 2 deletions Convive/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
<description>Projeto Spring Boot Convive</description>

<properties>
<java.version>23</java.version>
<lombok.version>1.18.36</lombok.version>
<java.version>21</java.version>
<lombok.version>1.18.38</lombok.version>
<mockito.version>5.14.2</mockito.version>
<byte-buddy.version>1.15.10</byte-buddy.version>
</properties>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.EC6.Convive.Config;

import com.EC6.Convive.Model.Usuario;
import com.EC6.Convive.Security.CustomUserDetails;
import com.EC6.Convive.Service.UsuarioService;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;

/**
* Expõe o usuário autenticado no model das views, sempre recarregado do banco
* (inclui {@code fotoPerfil} atualizada após upload, que não reflete na sessão).
*/
@ControllerAdvice
public class AuthenticatedUserModelAdvice {

private final ObjectProvider<UsuarioService> usuarioServiceProvider;

public AuthenticatedUserModelAdvice(ObjectProvider<UsuarioService> usuarioServiceProvider) {
this.usuarioServiceProvider = usuarioServiceProvider;
}

@ModelAttribute("usuario")
public Usuario usuarioAutenticado(@AuthenticationPrincipal CustomUserDetails userDetails) {
if (userDetails == null) {
return null;
}
UsuarioService usuarioService = usuarioServiceProvider.getIfAvailable();
if (usuarioService == null) {
return null;
}
return usuarioService.getByEmail(userDetails.getUsername());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
import com.EC6.Convive.Security.CustomUserDetails;
import com.EC6.Convive.Service.MoradorService;
import com.EC6.Convive.Service.NotificacaoService;
import com.EC6.Convive.Util.PaginationConstants;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
Expand All @@ -31,12 +35,23 @@ public class AdvertenciaModeradorController {

@GetMapping("/nova")
public String formulario(@AuthenticationPrincipal CustomUserDetails userDetails, Model model) {
model.addAttribute("usuario", userDetails.getUsuario());
model.addAttribute("moradores", moradorService.listAll());
model.addAttribute("gravidades", GravidadeNotificacao.values());
return "moderador/novaAdvertencia";
}

@GetMapping("/moradores")
public String buscarMoradores(
@RequestParam(required = false) String q,
@RequestParam(defaultValue = "0") int page,
Model model) {
Pageable pageable = PageRequest.of(page, PaginationConstants.DEFAULT_PAGE_SIZE);
Page<Morador> moradoresPage = moradorService.findPaginatedAndFiltered(q, pageable);
model.addAttribute("moradores", moradoresPage.getContent());
model.addAttribute("hasMore", moradoresPage.hasNext());
model.addAttribute("paginaAtual", page);
return "moderador/novaAdvertencia :: moradorOpcoes";
}

@PostMapping("/nova")
public String salvar(@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam UUID moradorId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.EC6.Convive.Controller;

import com.EC6.Convive.Model.AreaComum;
import com.EC6.Convive.Model.StatusArea;
import com.EC6.Convive.Security.CustomUserDetails;
import com.EC6.Convive.Service.AreaComumService;
import com.EC6.Convive.Util.PaginationConstants;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
Expand All @@ -20,9 +23,16 @@ public class AreaComumModeradorController {
private final AreaComumService areaComumService;

@GetMapping
public String listar(@AuthenticationPrincipal CustomUserDetails userDetails, Model model) {
model.addAttribute("usuario", userDetails.getUsuario());
model.addAttribute("areas", areaComumService.listAll());
public String listar(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
Model model) {

Page<AreaComum> areaPage = areaComumService.findPaginated(page, size);

model.addAttribute("areaPage", areaPage);
model.addAttribute("areas", areaPage.getContent());
model.addAttribute("statusOptions", StatusArea.values());
return "moderador/areasComuns";
}
Expand Down Expand Up @@ -54,7 +64,7 @@ public String editar(@PathVariable UUID id,
if (capacidade < 1) {
throw new IllegalArgumentException("A capacidade deve ser de pelo menos 1 pessoa.");
}
var area = areaComumService.atualizar(id, nome, capacidade, statusArea);
AreaComum area = areaComumService.atualizar(id, nome, capacidade, statusArea);
attributes.addFlashAttribute("sucesso", "Área \"" + area.getNome() + "\" atualizada com sucesso!");
} catch (IllegalArgumentException e) {
attributes.addFlashAttribute("erro", e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.EC6.Convive.Security.CustomUserDetails;
import com.EC6.Convive.Service.ComunicadoService;
import com.EC6.Convive.Service.FileStorageService;
import com.EC6.Convive.Util.PaginationConstants;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand All @@ -34,11 +35,8 @@ public class ComunicadoController {
public String listarComunicados(@RequestParam(defaultValue = "0") int page,
@AuthenticationPrincipal CustomUserDetails userDetails , Model model) {

Usuario usuario = userDetails.getUsuario();

Page<Comunicado> comunicadosPage = comunicadoService.findPaginated(page, 10);
Page<Comunicado> comunicadosPage = comunicadoService.findPaginated(page, PaginationConstants.DEFAULT_PAGE_SIZE);

model.addAttribute("usuario", usuario);
model.addAttribute("comunicados", comunicadosPage.getContent());
model.addAttribute("paginaAtual", page);
model.addAttribute("totalPaginas", comunicadosPage.getTotalPages());
Expand Down Expand Up @@ -93,7 +91,7 @@ public String excluirComunicado(@RequestParam UUID id, org.springframework.web.s

@GetMapping("/mais")
public String carregarMais(@RequestParam(defaultValue = "1") int page, Model model) {
Page<Comunicado> comunicadosPage = comunicadoService.findPaginated(page, 10);
Page<Comunicado> comunicadosPage = comunicadoService.findPaginated(page, PaginationConstants.DEFAULT_PAGE_SIZE);
model.addAttribute("comunicados", comunicadosPage.getContent());

// O segredo está aqui: o Spring retornará apenas o fragmento 'listagemCards'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ public String dashboard(@RequestParam(required = false) String mes,
Model model) {
DashboardDataDto data = dashboardService.buildDashboard(mes);

model.addAttribute("usuario", userDetails.getUsuario());
model.addAttribute("dashboard", data);
model.addAttribute("chartOcorrencias", data.getChartOcorrenciasStatus());
model.addAttribute("chartReservas", data.getChartReservasPorArea());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import com.EC6.Convive.Model.*;
import com.EC6.Convive.Security.CustomUserDetails;
import com.EC6.Convive.Service.*;
import com.EC6.Convive.Util.PaginationConstants;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import com.EC6.Convive.Event.ReservaPendenteCriadaEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand Down Expand Up @@ -41,8 +43,8 @@ public class MoradorHomeController {
public String dashboardMorador(@AuthenticationPrincipal CustomUserDetails userDetails, Model model) {
Usuario usuario = usuarioService.getByEmail(userDetails.getUsername());

List<Comunicado> comunicados = comunicadoService.findAllOrderByDate();
List<Reserva> reservas = reservaService.listByUser(usuario.getId());
List<Comunicado> comunicados = comunicadoService.findTopPublished(PaginationConstants.HOME_PREVIEW_SIZE);
List<Reserva> reservas = reservaService.findTopByUser(usuario.getId(), PaginationConstants.HOME_PREVIEW_SIZE);

model.addAttribute("usuario", usuario);
model.addAttribute("comunicados", comunicados);
Expand All @@ -52,22 +54,41 @@ public String dashboardMorador(@AuthenticationPrincipal CustomUserDetails userDe
}

@GetMapping("/reservas")
public String listarReservasMorador(@AuthenticationPrincipal CustomUserDetails userDetails, Model model) {
public String listarReservasMorador(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam(defaultValue = "0") int page,
Model model) {
Usuario usuario = usuarioService.getByEmail(userDetails.getUsername());

List<Reserva> reservas = reservaService.listByUser(usuario.getId()).stream()
.sorted(Comparator.comparing(Reserva::getInicio, Comparator.nullsLast(Comparator.naturalOrder())))
Page<Reserva> reservasPage = reservaService.findPaginatedByUser(
usuario.getId(), page, PaginationConstants.DEFAULT_PAGE_SIZE);
List<AreaComum> areasComuns = areaComumService.listAll().stream()
.sorted(Comparator.comparing(AreaComum::getNome, Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER)))
.toList();
List<AreaComum> areasComuns = areaComumService.listAll();
boolean temAreaAtiva = areasComuns.stream().anyMatch(a -> a.getStatusArea() == StatusArea.ATIVA);

model.addAttribute("usuario", usuario);
model.addAttribute("reservas", reservas);
model.addAttribute("reservas", reservasPage.getContent());
model.addAttribute("paginaAtual", page);
model.addAttribute("totalPaginas", reservasPage.getTotalPages());
model.addAttribute("listaVazia", reservasPage.getTotalElements() == 0);
model.addAttribute("areasComuns", areasComuns);
model.addAttribute("temAreaAtiva", temAreaAtiva);
return "morador/reservas";
}

@GetMapping("/reservas/mais")
public String carregarMaisReservas(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam(defaultValue = "1") int page,
Model model) {
Usuario usuario = usuarioService.getByEmail(userDetails.getUsername());
Page<Reserva> reservasPage = reservaService.findPaginatedByUser(
usuario.getId(), page, PaginationConstants.DEFAULT_PAGE_SIZE);
model.addAttribute("reservas", reservasPage.getContent());
return "morador/reservas :: listagemReservasSource";
}

@PostMapping("/reservas")
public String criarReservaMorador(
@AuthenticationPrincipal CustomUserDetails userDetails,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,21 +86,26 @@ public String editarUsuario(
@RequestParam String nome,
@RequestParam String email,
@RequestParam(required = false) Integer apartamento,
@RequestParam(required = false) Boolean inadimplente,
RedirectAttributes redirectAttributes) {
try {
Usuario user = usuarioService.searchById(id);

boolean statusInadimplente = inadimplente != null && inadimplente;

if (user instanceof Morador) {
Morador m = (Morador) user;
m.setNome(nome);
m.setEmail(email);
m.setInadimplente(statusInadimplente);
if (apartamento != null) m.setApartamento(apartamento);
moradorService.update(id, m);
} else if (user instanceof Moderador) {
Moderador m = (Moderador) user;
m.setNome(nome);
m.setEmail(email);
m.setApartamento(apartamento);
m.setInadimplente(statusInadimplente);
moderadorService.update(id, m);
}
redirectAttributes.addFlashAttribute("sucesso", "Usuário atualizado com sucesso!");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package com.EC6.Convive.Controller;

import com.EC6.Convive.Model.Comunicado;
import com.EC6.Convive.Model.Notificacao;
import com.EC6.Convive.Model.Usuario;
import com.EC6.Convive.Security.CustomUserDetails;
import com.EC6.Convive.Service.NotificacaoService;
import com.EC6.Convive.Util.PaginationConstants;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequiredArgsConstructor
Expand All @@ -22,15 +22,32 @@ public class NotificacoesController {
private final NotificacaoService notificacaoService;

@GetMapping
public String listarNotificacoes(@AuthenticationPrincipal CustomUserDetails userDetails, Model model) {
public String listarNotificacoes(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam(defaultValue = "0") int page,
Model model) {

Usuario usuario = userDetails.getUsuario();
Page<Notificacao> notificacoesPage = notificacaoService.findPaginatedByUser(
usuario.getId(), page, PaginationConstants.DEFAULT_PAGE_SIZE);

List<Notificacao> notificacoes = notificacaoService.listAllByUserId(usuario.getId());

model.addAttribute("usuario", usuario);
model.addAttribute("notificacoes", notificacoes);
model.addAttribute("notificacoes", notificacoesPage.getContent());
model.addAttribute("paginaAtual", page);
model.addAttribute("totalPaginas", notificacoesPage.getTotalPages());
model.addAttribute("listaVazia", notificacoesPage.getTotalElements() == 0);
return "morador/notificacoes";
}

@GetMapping("/mais")
public String carregarMais(
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam(defaultValue = "1") int page,
Model model) {

Usuario usuario = userDetails.getUsuario();
Page<Notificacao> notificacoesPage = notificacaoService.findPaginatedByUser(
usuario.getId(), page, PaginationConstants.DEFAULT_PAGE_SIZE);
model.addAttribute("notificacoes", notificacoesPage.getContent());
return "morador/notificacoes :: listagemCards";
}
}
Loading
Loading