Skip to content

Commit 407e1a5

Browse files
committed
Añadido ver activo y desactivos de reviews y los 2 botones de activar y desactivar las reviews
1 parent 5e95f5d commit 407e1a5

4 files changed

Lines changed: 70 additions & 15 deletions

File tree

src/main/java/com/demo/config/SecurityConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,13 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
5858
//requestMatchers("/reviews/new/**").authenticated() con esta , sería como poner los 2 news de arriba con * y sin él
5959
.requestMatchers(HttpMethod.GET, "/reviews/edit/*").authenticated()
6060
.requestMatchers(HttpMethod.GET, "/reviews/desactivate/*").hasRole("ADMIN") //Falta crear disable
61+
//Para proteger las reviews activadas y desactivadas
62+
.requestMatchers(HttpMethod.GET, "/reviews/desactivated").hasRole("ADMIN")
63+
.requestMatchers(HttpMethod.GET, "/reviews/activate/*").hasRole("ADMIN")
64+
//esto es para permitir que cualquiera pueda ver las reviews
6165
.requestMatchers(HttpMethod.GET, "/reviews/*").permitAll()
6266

67+
6368
//Rutas Purchase(Compra)
6469
.requestMatchers(HttpMethod.GET, "/purchase-lines").authenticated()
6570
.requestMatchers(HttpMethod.GET, "/purchases").authenticated()

src/main/java/com/demo/controller/ReviewController.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public ReviewController(ReviewRepository reviewRepository){
3737
public String reviewsList(Model model, @AuthenticationPrincipal User user) {
3838
// model.addAttribute("reviewsproductos", reviewRepository.findAll()); para que no se sobreescriba con el filtro de que una review esté activa
3939
model.addAttribute("reviewsproductos", reviewRepository.findByActiveTrueOrderByCreatedAtDesc());
40+
model.addAttribute("currentPath", "/reviews-productos");
4041
model.addAttribute("currentUser", user);
4142
return "reviews/reviewsList";
4243
}
@@ -95,6 +96,26 @@ public String desactivateReviews(@PathVariable Long id, RedirectAttributes ra) {
9596
ra.addFlashAttribute("message", "Opinión desactivada correctamente.");
9697
return "redirect:/reviews-productos";
9798
}
99+
@GetMapping("reviews/activate/{id}")
100+
public String activateReviews(@PathVariable Long id, RedirectAttributes ra) {
101+
Review review = reviewRepository.findById(id).orElseThrow();
102+
review.setActive(true);
103+
reviewRepository.save(review);
104+
ra.addFlashAttribute("message", "Opinión reactivada correctamente.");
105+
// Redirige a la lista de desactivadas para que el Admin siga gestionando
106+
return "redirect:/reviews/desactivated";
107+
}
108+
// Esto es para
109+
@GetMapping("/reviews/desactivated")
110+
public String listDesactivatedReviews(Model model, @AuthenticationPrincipal User user) {
111+
// Usamos el método que ya tienes en tu repositorio
112+
model.addAttribute("reviewsproductos", reviewRepository.findByActiveFalseOrderByCreatedAtDesc());
113+
model.addAttribute("currentPath", "/reviews/desactivated");
114+
model.addAttribute("currentUser", user);
115+
116+
// Reutilizamos la misma vista que ya tienes
117+
return "reviews/reviewsList";
118+
}
98119

99120
//Recibir datos , Guardar DB
100121
@PostMapping("/reviews")

src/main/java/com/demo/repository/ReviewRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface ReviewRepository extends JpaRepository<Review,Long> {
1515

1616
List<Review> findByProduct_IdOrderByRatingDesc(Long id);
1717
List<Review> findByActiveTrueOrderByCreatedAtDesc();
18-
18+
List<Review> findByActiveFalseOrderByCreatedAtDesc();
1919

2020
long countByUser_Id(Long id);
2121
List<Review> findByUser_Id(Long id);

src/main/resources/templates/reviews/reviewsList.html

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,30 @@
1414
</div>
1515

1616
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-4">
17-
<h1 class="section-title h2 mb-0">Opiniones de clientes</h1>
18-
<a sec:authorize="isAuthenticated()" th:href="@{/reviews/new}"
19-
class="btn btn-success">
20-
<i class="fa-solid fa-plus me-1"></i> Nueva opinión
21-
</a>
17+
<h1 class="section-title h2 mb-0">
18+
<span th:text="${currentPath == '/reviews/desactivated'} ? 'Opiniones Desactivadas' : 'Opiniones de clientes'"></span>
19+
</h1>
20+
21+
<div class="d-flex gap-2">
22+
<a sec:authorize="isAuthenticated()" th:href="@{/reviews/new}"
23+
class="btn btn-success">
24+
<i class="fa-solid fa-plus me-1"></i> Nueva opinión
25+
</a>
26+
27+
<a sec:authorize="hasRole('ADMIN')"
28+
th:if="${currentPath != '/reviews/desactivated'}"
29+
th:href="@{/reviews/desactivated}"
30+
class="btn btn-outline-secondary">
31+
<i class="fa-solid fa-eye-slash me-1"></i> Ver desactivadas
32+
</a>
33+
34+
<a sec:authorize="hasRole('ADMIN')"
35+
th:if="${currentPath == '/reviews/desactivated'}"
36+
th:href="@{/reviews-productos}"
37+
class="btn btn-outline-primary">
38+
<i class="fa-solid fa-eye me-1"></i> Ver activas
39+
</a>
40+
</div>
2241
</div>
2342

2443
<div th:if="${#lists.isEmpty(reviewsproductos)}" class="empty-state text-center py-5">
@@ -91,15 +110,25 @@ <h5 class="mb-1" th:text="${review.title}">Título</h5>
91110
class="btn btn-sm btn-outline-secondary">
92111
<i class="fa-solid fa-pen me-1"></i> Editar
93112
</a>
94-
<a sec:authorize="hasRole('ADMIN')" th:href="@{/reviews/desactivate/{id}(id=${review.id})}"
95-
class="btn btn-sm btn-outline-danger"
96-
data-bs-toggle="modal"
97-
data-bs-target="#userActionModal"
98-
th:attr="data-url=@{/reviews/desactivate/{id}(id=${review.id})}"
99-
data-action="desactivar"
100-
data-name="esta opinión">
101-
<i class="fa-solid fa-trash me-1"></i> Desactivar
102-
</a>
113+
<div sec:authorize="hasRole('ADMIN')">
114+
<a th:if="${review.active}"
115+
href="#"
116+
class="btn btn-sm btn-outline-danger"
117+
data-bs-toggle="modal"
118+
data-bs-target="#userActionModal"
119+
th:attr="data-url=@{/reviews/desactivate/{id}(id=${review.id})}, data-action='desactivar', data-name='esta opinión'">
120+
<i class="fa-solid fa-trash me-1"></i> Desactivar
121+
</a>
122+
123+
<a th:unless="${review.active}"
124+
href="#"
125+
class="btn btn-sm btn-outline-success"
126+
data-bs-toggle="modal"
127+
data-bs-target="#userActionModal"
128+
th:attr="data-url=@{/reviews/activate/{id}(id=${review.id})}, data-action='activar', data-name='esta opinión'">
129+
<i class="fa-solid fa-check me-1"></i> Activar
130+
</a>
131+
</div>
103132
</div>
104133
</div>
105134
</div>

0 commit comments

Comments
 (0)