diff --git a/src/main/java/fr/eni/enchere/bll/ArticleService.java b/src/main/java/fr/eni/enchere/bll/ArticleService.java index f87c72b..15bddee 100644 --- a/src/main/java/fr/eni/enchere/bll/ArticleService.java +++ b/src/main/java/fr/eni/enchere/bll/ArticleService.java @@ -13,7 +13,7 @@ public interface ArticleService { Article findArticleById(int id); int saveArticle(Article article); void deleteArticle(int id); - void updateArticle(int id); + int updateArticle(Article article); List
findArticleByTitle(String title); Page
searchArticlePageable(SearchArticleCritere critere, Pageable pageable); } diff --git a/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java b/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java index 7f22302..bacc1ba 100644 --- a/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java +++ b/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java @@ -38,8 +38,8 @@ public class ArticleServiceImpl implements ArticleService{ } @Override - public void updateArticle(int id) { - + public int updateArticle(Article article) { + return articleRepository.updateArticle(article); } @Override diff --git a/src/main/java/fr/eni/enchere/bll/RetraitService.java b/src/main/java/fr/eni/enchere/bll/RetraitService.java index 0015f0c..85084d2 100644 --- a/src/main/java/fr/eni/enchere/bll/RetraitService.java +++ b/src/main/java/fr/eni/enchere/bll/RetraitService.java @@ -3,6 +3,7 @@ package fr.eni.enchere.bll; import fr.eni.enchere.bo.Retrait; public interface RetraitService { - Retrait retraitByNumarticle(int id); + Retrait findByNumArticle(int id); void setRetrait(Retrait retrait); + void updateRetrait(Retrait retrait); } diff --git a/src/main/java/fr/eni/enchere/bll/RetraitServiceImpl.java b/src/main/java/fr/eni/enchere/bll/RetraitServiceImpl.java index 7b41b69..08b1d6e 100644 --- a/src/main/java/fr/eni/enchere/bll/RetraitServiceImpl.java +++ b/src/main/java/fr/eni/enchere/bll/RetraitServiceImpl.java @@ -14,12 +14,17 @@ public class RetraitServiceImpl implements RetraitService { } @Override - public Retrait retraitByNumarticle(int id) { - return null; + public Retrait findByNumArticle(int idArticle) { + return retraitRepository.findByNumArticle(idArticle); } @Override public void setRetrait(Retrait retrait) { retraitRepository.save(retrait); } + + @Override + public void updateRetrait(Retrait retrait) { + retraitRepository.update(retrait); + } } diff --git a/src/main/java/fr/eni/enchere/bo/Article.java b/src/main/java/fr/eni/enchere/bo/Article.java index 9719150..e3675be 100644 --- a/src/main/java/fr/eni/enchere/bo/Article.java +++ b/src/main/java/fr/eni/enchere/bo/Article.java @@ -17,11 +17,12 @@ public class Article { int Utilisateur; String pseudoUtilisateur; int numCategorie; + boolean isDelete; public Article() { } - public Article(int id, String nom, String desc, MultipartFile photo, Date dateDebutEnch, Date dateFinEnch, float prixInitial, float prixVente, int Utilisateur, String pseudoUtilisateur, int numCategorie) { + public Article(int id, String nom, String desc, MultipartFile photo, Date dateDebutEnch, Date dateFinEnch, float prixInitial, float prixVente, int Utilisateur, String pseudoUtilisateur, int numCategorie, boolean isDelete) { setId(id); setNom(nom); setDesc(desc); @@ -32,6 +33,7 @@ public class Article { setPrixVente(prixVente); setNoUtilisateur(Utilisateur); setNumCategorie(numCategorie); + setIsDelete(isDelete); } public int getId() { @@ -121,4 +123,12 @@ public class Article { public void setNumCategorie(int numCategorie) { this.numCategorie = numCategorie; } + + public boolean getIsDelete() { + return isDelete; + } + + public void setIsDelete(boolean delete) { + isDelete = delete; + } } diff --git a/src/main/java/fr/eni/enchere/controllers/ArticleController.java b/src/main/java/fr/eni/enchere/controllers/ArticleController.java index 9dcdab5..dc5f71f 100644 --- a/src/main/java/fr/eni/enchere/controllers/ArticleController.java +++ b/src/main/java/fr/eni/enchere/controllers/ArticleController.java @@ -6,6 +6,7 @@ import fr.eni.enchere.bo.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.core.Local; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -60,7 +61,7 @@ public class ArticleController { Article article = articleService.findArticleById(id); UserProfil user = userService.utilisateurById(article.getUtilisateur()); Categorie cate = categorieService.findCategorieById(article.getNumCategorie()); - Retrait retrait = retraitService.retraitByNumarticle(article.getId()); + Retrait retrait = retraitService.findByNumArticle(article.getId()); article.setPseudoUtilisateur(user.getPseudo()); List lastEnchere = this.enchereService.enchereByArticle(article.getId()); @@ -86,6 +87,11 @@ public class ArticleController { if (maxMontantEnchere.isPresent()) { model.addAttribute("maxEnchere", maxMontantEnchere.get()); } + if (article.getId() != 0) { + model.addAttribute("imagePath", "/images/articles/" + article.getId() + ".jpg"); + } else { + model.addAttribute("imagePath", "/images/articles/no-data.jpg"); + } List errors = (List) session.getAttribute("errors"); if (errors != null) { model.addAttribute("errors", errors); @@ -241,8 +247,7 @@ public class ArticleController { @GetMapping("/edit") public String edit(Model model, @RequestParam()int id) { Article article = this.articleService.findArticleById(id); - Retrait retrait = this.retraitService.retraitByNumarticle(id); - System.out.println(article.getNom()); + Retrait retrait = this.retraitService.findByNumArticle(id); model.addAttribute("article", article); model.addAttribute("retrait", retrait); @@ -250,4 +255,126 @@ public class ArticleController { return "editArticle"; } + @PostMapping("/edit") + public String edit(@ModelAttribute("article") Article article, + @ModelAttribute("retrait") Retrait retrait, + @RequestParam("dateDebut") String dateDebut, + @RequestParam("dateFin") String dateFin, + RedirectAttributes redirectAttributes) { + //Récupérer l'utilisateur pour set l'article + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username = authentication.getName(); + UserProfil userProfile = userService.utilisateurByName(username); + article.setNoUtilisateur(userProfile.getId()); + //Reste de l'article + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Date dDateDebut = null; + Date dDateFin = null; + try { + dDateDebut = format.parse(dateDebut); + dDateFin = format.parse(dateFin); + } catch (ParseException e) { + redirectAttributes.addAttribute("erreur", "La date de début n'est pas valide."); + redirectAttributes.addAttribute("erreur", "La date de fin n'est pas valide."); + } + article.setDateDebutEnch(dDateDebut); + article.setDateFinEnch(dDateFin); + //Vérification du formulaire + //Vérification du nom de l'article + String regex = "^[a-zA-Z0-9 ]*$"; + if (article.getNom().length() < 3){ + redirectAttributes.addAttribute("erreur", "Le nom de l'article doit contenir au moin 3 caractères."); + return "redirect:/article/edit?id="+article.getId(); + } + if (!Pattern.matches(regex, article.getNom())){ + redirectAttributes.addAttribute("erreur", "Le nom de l'article ne doit pas contenir de caractère speciaux."); + return "redirect:/article/edit?id="+article.getId(); + } + //Vérification description de l'article + if (article.getDesc().length() < 20){ + redirectAttributes.addAttribute("erreur", "La description de l'article doit contenir au moin 20 caractères."); + return "redirect:/article/edit?id="+article.getId(); + } + //Vérification de la photo + if (article.getPhoto() != null && !article.getPhoto().isEmpty()) { + if (article.getPhoto().getSize() > 5 * 1024 * 1024) { + redirectAttributes.addAttribute("erreur", "La photo ne doit pas faire plus de 5 Mo."); + return "redirect:/article/edit?id="+article.getId(); + } + if (!article.getPhoto().getOriginalFilename().toLowerCase().endsWith(".jpg")) { + redirectAttributes.addAttribute("erreur", "L'image doit avoir une extension .jpg."); + return "redirect:/article/edit?id="+article.getId(); + } + } + //Vérification du prix initial + if (article.getPrixInitial() > 2000000000 && article.getPrixInitial() < 0){ + redirectAttributes.addAttribute("erreur", "Le prix doit être compris entre 0 et 2 000 000 000 crédits."); + return "redirect:/article/edit?id="+article.getId(); + } + //Vérifier les dates + LocalDate dateDebutEnch = LocalDate.parse(dateDebut); + LocalDate dateActuelle = LocalDate.now(); + if (dateDebutEnch.isBefore(dateActuelle)) { + redirectAttributes.addAttribute("erreur", "La date de début d'enchère ne peux pas être infèrieur à la date du jour."); + return "redirect:/article/edit?id="+article.getId(); + } + LocalDate dateFinEnch = LocalDate.parse(dateFin); + LocalDate datePlusUnJour = LocalDate.now().plusDays(1); + if (dateFinEnch.isBefore(datePlusUnJour)) { + redirectAttributes.addAttribute("erreur", "La date de début d'enchère ne peux pas être infàrieur à la date du jour + 1."); + return "redirect:/article/edit?id="+article.getId(); + } + + //Vérification rue + if (!Pattern.matches("^[a-zA-Z0-9 ]+$", retrait.getRue())){ + redirectAttributes.addAttribute("erreur", "Le rue n'est pas valide."); + return "redirect:/article/edit?id="+article.getId(); + } + if (retrait.getRue().isEmpty()){ + redirectAttributes.addAttribute("erreur", "Entrer une rue."); + return "redirect:/article/edit?id="+article.getId(); + } + //Vérifier code postal et ville + if(Pattern.matches("^\\d{5}$", retrait.getCode_postale())){ + //Récupérer les villes en fonction du code postal + RestTemplate restTemplate = new RestTemplate(); + List villeCodePostal = new ArrayList<>(); // Initialisez la liste pour éviter les NullPointerException + String apiUrl = API_URL + retrait.getCode_postale(); + ResponseEntity response = restTemplate.getForEntity(apiUrl, JsonNode.class); // Désérialiser en JsonNode + if (response.getStatusCode().is2xxSuccessful()) { + JsonNode responseBody = response.getBody(); + if (responseBody.isArray()) { // Vérifiez si le corps de la réponse est un tableau JSON + for (JsonNode node : responseBody) { + String cityName = node.get("nomCommune").asText(); + villeCodePostal.add(cityName); + } + } else { + redirectAttributes.addAttribute("erreur", "Une erreur est survenue !"); + return "redirect:/article/edit?id="+article.getId(); + } + if (!villeCodePostal.contains(userProfile.getVille())) { + String showCity = String.join(", ", villeCodePostal); + redirectAttributes.addAttribute("erreur", "Essayer : " + showCity); + return "redirect:/article/edit?id="+article.getId(); + } + } else { + redirectAttributes.addAttribute("erreur", "La ville n'est pas valide."); + return "redirect:/article/edit?id="+article.getId(); + } + } else { + redirectAttributes.addAttribute("erreur", "Le code postal n'est pas valide."); + return "redirect:/article/edit?id="+article.getId(); + } + //Validation du formulaire + retrait.setNumArticle(articleService.updateArticle(article)); + retraitService.updateRetrait(retrait); + return "redirect:/accueil"; + } + + @PostMapping("/delete") + public String delte(@ModelAttribute("article") Article article) { + article.setIsDelete(true); + return ""; + } + } diff --git a/src/main/java/fr/eni/enchere/dal/ArticleRepository.java b/src/main/java/fr/eni/enchere/dal/ArticleRepository.java index 5d6c084..3f2d7a2 100644 --- a/src/main/java/fr/eni/enchere/dal/ArticleRepository.java +++ b/src/main/java/fr/eni/enchere/dal/ArticleRepository.java @@ -14,5 +14,5 @@ public interface ArticleRepository { List
findArticleByTitle(String title); int saveArticle(Article article); void deleteArticle(int id); - void updateArticle(int id); + int updateArticle(Article article); } diff --git a/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java b/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java index 016c4f4..350e8d0 100644 --- a/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java +++ b/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java @@ -54,6 +54,7 @@ public class ArticleRepositoryImpl implements ArticleRepository { article.setPrixVente(rs.getFloat("a.prix_vente")); article.setNoUtilisateur(rs.getInt("a.no_utilisateur")); article.setNumCategorie(rs.getInt("a.no_categorie")); + article.setIsDelete(rs.getBoolean("a.isDelete")); return article; } } @@ -84,7 +85,7 @@ public class ArticleRepositoryImpl implements ArticleRepository { @Override public List
findAllArticle() { - String sql = "SELECT * FROM ARTICLES_VENDUS a"; + String sql = "SELECT * FROM ARTICLES_VENDUS a WHERE a.isDelete = 0"; List
articles = jdbcTemplate.query(sql, new ArticleRowMapper()); return articles; } @@ -168,7 +169,6 @@ public class ArticleRepositoryImpl implements ArticleRepository { sql.append(")"); } - System.out.println(); // Compte le nombre total d'articles int totalCount = countArticlePageable(critere); @@ -278,7 +278,7 @@ public class ArticleRepositoryImpl implements ArticleRepository { @Override public List
findArticleByTitle(String title) { - String sql = "SELECT * FROM ARTICLES_VENDUS a WHERE nom_article LIKE ?"; + String sql = "SELECT * FROM ARTICLES_VENDUS a WHERE nom_article LIKE ? AND a.isDelete = 0"; List
articles = jdbcTemplate.query(sql, new ArticleRowMapper(), "%" + title + "%"); return articles; } @@ -334,7 +334,16 @@ public class ArticleRepositoryImpl implements ArticleRepository { } @Override - public void updateArticle(int id) { - + public int updateArticle(Article article) { + String sql = "UPDATE ARTICLES_VENDUS " + + "SET nom_article = ?, " + + "description = ?," + + "date_debut_encheres = ?," + + "date_fin_encheres = ?," + + "prix_initial = ?," + + "no_categorie = ? " + + "WHERE no_article = ?"; + jdbcTemplate.update(sql, article.getNom(), article.getDesc(), article.getDateDebutEnch(), article.getDateFinEnch(), article.getPrixInitial(), article.getNumCategorie(), article.getId()); + return article.getId(); } } diff --git a/src/main/java/fr/eni/enchere/dal/RetraitRepository.java b/src/main/java/fr/eni/enchere/dal/RetraitRepository.java index 84f575b..270ae57 100644 --- a/src/main/java/fr/eni/enchere/dal/RetraitRepository.java +++ b/src/main/java/fr/eni/enchere/dal/RetraitRepository.java @@ -4,5 +4,7 @@ import fr.eni.enchere.bo.Retrait; public interface RetraitRepository { Retrait findById(int id); + Retrait findByNumArticle(int idArticle); void save(Retrait retrait); + void update(Retrait retrait); } diff --git a/src/main/java/fr/eni/enchere/dal/RetraitRepositoryImpl.java b/src/main/java/fr/eni/enchere/dal/RetraitRepositoryImpl.java index fc0a9e7..aed96cf 100644 --- a/src/main/java/fr/eni/enchere/dal/RetraitRepositoryImpl.java +++ b/src/main/java/fr/eni/enchere/dal/RetraitRepositoryImpl.java @@ -3,12 +3,16 @@ package fr.eni.enchere.dal; import fr.eni.enchere.bo.Retrait; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import java.sql.ResultSet; +import java.sql.SQLException; + @Repository @Primary public class RetraitRepositoryImpl implements RetraitRepository { @@ -21,18 +25,41 @@ public class RetraitRepositoryImpl implements RetraitRepository { this.namedJdbcTemplate = namedJdbcTemplate; } + public class RetraitRowMapper implements RowMapper { + + @Override + public Retrait mapRow(ResultSet rs, int rowNum) throws SQLException { + Retrait retrait = new Retrait(); + retrait.setRue(rs.getString("rue")); + retrait.setVille(rs.getString("ville")); + retrait.setCode_postale(rs.getString("code_postal")); + retrait.setNumArticle(rs.getInt("no_article")); + return retrait; + } + } + @Override public Retrait findById(int id) { return null; } + @Override + public Retrait findByNumArticle(int numArticle) { + String sql = "select * from RETRAITS where no_article = ?"; + Retrait retrait = jdbcTemplate.queryForObject(sql, new RetraitRowMapper(), numArticle); + if (retrait == null) { + return null; + } else { + return retrait; + } + } + @Override public void save(Retrait retrait) { String sqlIsUpdate = "SELECT COUNT(*) FROM RETRAITS WHERE no_article = :numArticle"; MapSqlParameterSource parametersIsUpdate = new MapSqlParameterSource(); parametersIsUpdate.addValue("numArticle", retrait.getNumArticle()); int count = namedJdbcTemplate.queryForObject(sqlIsUpdate, parametersIsUpdate, Integer.class); - System.out.println(count); if (count > 0) { //Mettre à jour les informations @@ -47,4 +74,14 @@ public class RetraitRepositoryImpl implements RetraitRepository { namedJdbcTemplate.update(sql, parameters); } } + + @Override + public void update(Retrait retrait) { + String sql = "UPDATE RETRAITS " + + "SET rue = ?, " + + "code_postal = ?, " + + "ville = ? " + + "WHERE no_article = ?"; + jdbcTemplate.update(sql, retrait.getRue(), retrait.getCode_postale(), retrait.getVille(), retrait.getNumArticle()); + } } diff --git a/src/main/resources/i18n/messages_en.properties b/src/main/resources/i18n/messages_en.properties index a4ff0fb..310d937 100644 --- a/src/main/resources/i18n/messages_en.properties +++ b/src/main/resources/i18n/messages_en.properties @@ -117,3 +117,8 @@ article.details.label.amount = Amount article.details.button.bid = Bid article.details.address.unknown = Unknown address article.details.validation.amount.required = Bid amount is required. + +edit.article.title = Edit my article +edit.article.update = Edit +edit.article.back = Back +edit.article.delete = Cancel my article diff --git a/src/main/resources/i18n/messages_fr.properties b/src/main/resources/i18n/messages_fr.properties index 0b6ed9c..78629ca 100644 --- a/src/main/resources/i18n/messages_fr.properties +++ b/src/main/resources/i18n/messages_fr.properties @@ -122,4 +122,6 @@ article.details.validation.amount.required = Le montant de l'ench\u00E8re est re edit.article.title = Modifier mon article - +edit.article.update = Modifier +edit.article.back = Retour +edit.article.delete = Annuler vente \ No newline at end of file diff --git a/src/main/resources/static/images/articles/no-data.jpg b/src/main/resources/static/images/articles/no-data.jpg new file mode 100644 index 0000000..a3630c9 Binary files /dev/null and b/src/main/resources/static/images/articles/no-data.jpg differ diff --git a/src/main/resources/templates/accueil.html b/src/main/resources/templates/accueil.html index e4f81dc..0e07e3b 100644 --- a/src/main/resources/templates/accueil.html +++ b/src/main/resources/templates/accueil.html @@ -122,7 +122,7 @@
- Image de l'article + Image de l'article
diff --git a/src/main/resources/templates/article.html b/src/main/resources/templates/article.html index 680914d..13f5d29 100644 --- a/src/main/resources/templates/article.html +++ b/src/main/resources/templates/article.html @@ -39,6 +39,12 @@
+
+ + +
+ +
@@ -57,7 +63,10 @@ - +
+ + +

diff --git a/src/main/resources/templates/editArticle.html b/src/main/resources/templates/editArticle.html index 5423f26..246d7f1 100644 --- a/src/main/resources/templates/editArticle.html +++ b/src/main/resources/templates/editArticle.html @@ -7,17 +7,68 @@

-
+ +
- + +
+
- + + +
+ +
+ -
Veuillez sélectionner une catégorie.
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +

Retrait

+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + +