This commit is contained in:
jleroy
2024-05-02 13:44:46 +02:00
22 changed files with 4969 additions and 90 deletions

View File

@@ -17,4 +17,5 @@ public interface ArticleService {
int updateArticle(Article article);
List<Article> findArticleByTitle(String title);
Page<Article> searchArticlePageable(SearchArticleCritere critere, Pageable pageable);
void setSellPrice(int id, float sellPrice);
}

View File

@@ -47,6 +47,11 @@ public class ArticleServiceImpl implements ArticleService{
return articleRepository.updateArticle(article);
}
@Override
public void setSellPrice(int id, float sellPrice) {
this.articleRepository.setSellPrice(id, sellPrice);
}
@Override
public List<Article> findArticleByTitle(String title) {
return articleRepository.findArticleByTitle(title);

View File

@@ -5,9 +5,8 @@ import fr.eni.enchere.bo.Enchere;
import java.util.List;
public interface EnchereService {
Enchere enchereByUserAndArticle(int idUser, int idArticle);
List<Enchere> enchereByUser(int idUser);
List<Enchere> enchereByArticle(int idArticle);
void setEnchere(Enchere enchere);
void delete(int id);
void deleteEnchere(int id);
}

View File

@@ -15,11 +15,6 @@ public class EnchereServiceImpl implements EnchereService{
this.enchereRepository = enchereRepository;
}
@Override
public Enchere enchereByUserAndArticle(int idUser, int idArticle) {
return enchereRepository.findByIdUserAndIdArticle(idUser, idArticle);
}
@Override
public List<Enchere> enchereByUser(int idUser) {
return enchereRepository.findByIdUser(idUser);
@@ -36,7 +31,7 @@ public class EnchereServiceImpl implements EnchereService{
}
@Override
public void delete(int id) {
enchereRepository.deleteArticle(id);
public void deleteEnchere(int id) {
this.enchereRepository.delete(id);
}
}

View File

@@ -14,7 +14,8 @@ public class Enchere {
public Enchere(){}
public Enchere(int noUtilisateur, int noArticle, String pseudoUtilisateur, Date dateEnchere, float montantEnchere, boolean isDelete) {
public Enchere(boolean isDelete, int id, int noUtilisateur, int noArticle, String pseudoUtilisateur, Date dateEnchere, float montantEnchere ) {
setId(id);
setNoUtilisateur(noUtilisateur);
setPseudoUtilisateur(pseudoUtilisateur);
setNoArticle(noArticle);

View File

@@ -5,6 +5,7 @@ import fr.eni.enchere.bo.Article;
import fr.eni.enchere.bo.SearchArticleCritere;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +16,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@@ -25,7 +27,6 @@ import java.util.Locale;
@Controller
@SessionAttributes({"searchTitle", "searchCategory", "venteOptions", "achatOptions", "typeTransaction"})
public class AccueilController {
@Autowired
@@ -43,21 +44,27 @@ public class AccueilController {
this.fileService = fileService;
}
@GetMapping({"/", "/enchere"})
public String viewAccueil(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails,
@RequestParam(required = false) String searchTitle, @RequestParam(required = false) Integer searchCategory,
@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "6") int size, Model model,
@RequestParam(value = "venteOption", required = false) String[] venteOptions,
@RequestParam(value = "achatOption", required = false) String[] achatOptions,
@RequestParam(required = false) String typeTransaction) {
HttpSession session) {
logger.error("test du logger");
model.addAttribute("categories", categorieService.findAllCategories());
model.addAttribute("requestURI", request.getRequestURI());
// Récupérer les critères de recherche de la session
String searchTitle = (String) session.getAttribute("searchTitle");
Integer searchCategory = (Integer) session.getAttribute("searchCategory");
String[] venteOptions = (String[]) session.getAttribute("venteOptions");
String[] achatOptions = (String[]) session.getAttribute("achatOptions");
String typeTransaction = (String) session.getAttribute("typeTransaction");
model.addAttribute("SessionTypeTransaction", typeTransaction);
model.addAttribute("sessionVenteOptions", venteOptions);
model.addAttribute("sessionAchatOptions", achatOptions);
// Utiliser les valeurs des critères de recherche dans votre logique métier
SearchArticleCritere critere = new SearchArticleCritere();
critere.setNoCategorie(searchCategory);
critere.setTitle(searchTitle);
if(userDetails != null) {
if (userDetails != null) {
critere.setNoVendeur(userService.utilisateurByName(userDetails.getUsername()).getId());
}
critere.setVenteOptions(venteOptions);
@@ -76,23 +83,29 @@ public class AccueilController {
model.addAttribute("currentPage", currentPage);
model.addAttribute("critere", critere);
model.addAttribute("totalPages", articlePage.getTotalPages());
model.addAttribute("categories", categorieService.findAllCategories());
model.addAttribute("requestURI", request.getRequestURI());
return "accueil";
}
@PostMapping("/enchere")
public String handleSearch(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails, @RequestParam(required = false) String searchTitle, @RequestParam(required = false) Integer searchCategory, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "6") int size, Model model, @RequestParam(value = "venteOption", required = false) String[] venteOptions, @RequestParam(value = "achatOption", required = false) String[] achatOptions, @RequestParam(required = false) String typeTransaction) {
public String handleSearch(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails,
@RequestParam(required = false) String searchTitle, @RequestParam(required = false) Integer searchCategory,
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "6") int size, Model model,
@RequestParam(value = "venteOption", required = false) String[] venteOptions,
@RequestParam(value = "achatOption", required = false) String[] achatOptions,
@RequestParam(required = false) String typeTransaction, HttpSession session) {
// Mettre à jour la catégorie dans la session
model.addAttribute("searchCategory", searchCategory);
// Mettre à jour les critères de recherche dans la session
session.setAttribute("searchCategory", searchCategory);
session.setAttribute("searchTitle", searchTitle);
session.setAttribute("venteOptions", venteOptions);
session.setAttribute("achatOptions", achatOptions);
session.setAttribute("typeTransaction", typeTransaction);
model.addAttribute("searchTitle", searchTitle);
model.addAttribute("venteOptions", venteOptions);
model.addAttribute("achatOptions", achatOptions);
model.addAttribute("typeTransaction", typeTransaction);
return viewAccueil(request, userDetails, searchTitle, searchCategory, page, size, model, venteOptions, achatOptions, typeTransaction);
// Rediriger vers la page d'accueil
return "redirect:/enchere";
}

View File

@@ -77,7 +77,7 @@ public class AdminController {
//Annuler les enchères en cours
List<Enchere> userEnchere = enchereService.enchereByUser(id);
for (Enchere enchere : userEnchere) {
enchereService.delete(enchere.getId());
enchereService.deleteEnchere(enchere.getId());
}
return "redirect:/admin";
}
@@ -96,7 +96,7 @@ public class AdminController {
//Annuler les enchères en cours
List<Enchere> userEnchere = enchereService.enchereByUser(id);
for (Enchere enchere : userEnchere) {
enchereService.delete(enchere.getId());
enchereService.deleteEnchere(enchere.getId());
}
}
return "redirect:/admin";

View File

@@ -80,7 +80,7 @@ public class ArticleController {
.map(Enchere::getPseudoUtilisateur);
model.addAttribute("encheres", lastEnchere);
model.addAttribute("maxEncherePseudo", pseudoMaxEnchere.orElse(""));
model.addAttribute("maxEncherePseudo", pseudoMaxEnchere.orElse(null));
model.addAttribute("isArticleCurrentUser", isArticleCurrentUser);
model.addAttribute("article", article);
model.addAttribute("username", user);

View File

@@ -20,6 +20,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Controller()
@RequestMapping("/enchere")
@@ -62,15 +63,19 @@ public class EnchereController {
}
//Empeche l'enchère si les crédits du user sont inférieur au prix initial de l'article
float userCredit = this.userService.utilisateurByName(authentication.getName()).getCredit();
if (userCredit < encherePrice) {
UserProfil userCredit = this.userService.utilisateurByName(authentication.getName());
List<Enchere> encheres = this.enchereService.enchereByUser(userCredit.getId());
double encheresSum = encheres.stream()
.mapToDouble(ench -> ench.getMontantEnchere()) // Mappez chaque enchère à son montant
.sum();
if ((userCredit.getCredit() - encheresSum) < encherePrice) {
result.rejectValue("montantEnchere", "error.enchere", "Vous ne pouvez pas enchérir si vous n'avez pas les fonds suffisant");
}
Optional<String> pseudoMaxEnchere = lastEnchere.stream()
.max(Comparator.comparing(Enchere::getMontantEnchere)) // Comparaison basée sur le montant d'enchère
.map(Enchere::getPseudoUtilisateur);
if (pseudoMaxEnchere.get().equals(authentication.getName())) {
if (pseudoMaxEnchere.isPresent() && pseudoMaxEnchere.get().equals(authentication.getName())) {
result.rejectValue("montantEnchere", "error.enchere", "Vous ne pouvez pas enchèrir sur votre propre offre");
}
@@ -80,9 +85,38 @@ public class EnchereController {
}
this.enchereService.setEnchere(enchere);
float newCredit = userCredit - enchere.getMontantEnchere();
this.userService.setCredit(newCredit, this.userService.utilisateurByName(authentication.getName()).getId());
return "redirect:/article/show?id=" + articleId;
}
@PostMapping("/enchereDone")
public String enchereDone(@RequestParam("id") int id) {
List<Enchere> listEncheres = this.enchereService.enchereByArticle(id);
List<Enchere> encheres = listEncheres.stream()
.sorted(Comparator.comparing(Enchere::getMontantEnchere).reversed())
.collect(Collectors.toList());
Optional<String> pseudoMaxEnchere = encheres.stream()
.max(Comparator.comparing(Enchere::getMontantEnchere)) // Comparaison basée sur le montant d'enchère
.map(Enchere::getPseudoUtilisateur);
UserProfil user = this.userService.utilisateurByName(pseudoMaxEnchere.get());
Optional<Float> maxMontantEnchere = listEncheres.stream()
.map(Enchere::getMontantEnchere) // Récupère seulement les montants d'enchère
.max(Float::compareTo);
//setCredit user.
float userCredit = user.getCredit();
float newCredit = userCredit - maxMontantEnchere.get();
this.userService.setCredit(newCredit, user.getId());
//Delete enchere
for (Enchere ench : listEncheres) {
this.enchereService.deleteEnchere(ench.getId());
}
//Delete article
this.articleService.setSellPrice(id, maxMontantEnchere.get());
return "redirect:/enchere";
}
}

View File

@@ -16,4 +16,5 @@ public interface ArticleRepository {
int saveArticle(Article article);
void deleteArticle(int id);
int updateArticle(Article article);
void setSellPrice(int id, float sellPrice);
}

View File

@@ -356,4 +356,10 @@ public class ArticleRepositoryImpl implements ArticleRepository {
jdbcTemplate.update(sql, article.getNom(), article.getDesc(), article.getDateDebutEnch(), article.getDateFinEnch(), article.getPrixInitial(), article.getNumCategorie(), article.getId());
return article.getId();
}
@Override
public void setSellPrice(int id, float price) {
String sql = "UPDATE ARTICLES_VENDUS SET prix_vente = ?, isDelete = 1 WHERE no_article = ?";
jdbcTemplate.update(sql, price, id);
}
}

View File

@@ -5,9 +5,8 @@ import fr.eni.enchere.bo.Enchere;
import java.util.List;
public interface EnchereRepository {
Enchere findByIdUserAndIdArticle(int idUser, int idArticle);
List<Enchere> findByIdUser(int idUser);
List<Enchere> findByIdArticle(int idArticle);
void save(Enchere enchere);
void deleteArticle(int idArticle);
void delete(int id);
}

View File

@@ -29,6 +29,7 @@ public class EnchereRepositoryImpl implements EnchereRepository {
@Override
public Enchere mapRow(ResultSet rs, int rowNum) throws SQLException {
Enchere enchere = new Enchere();
enchere.setId(rs.getInt("id"));
enchere.setNoUtilisateur(rs.getInt("no_utilisateur"));
enchere.setNoArticle(rs.getInt("no_article"));
enchere.setMontantEnchere(rs.getInt("montant_enchere"));
@@ -39,11 +40,6 @@ public class EnchereRepositoryImpl implements EnchereRepository {
}
}
@Override
public Enchere findByIdUserAndIdArticle(int idUser, int idArticle) {
return null;
}
@Override
public List<Enchere> findByIdUser(int idUser) {
String sql = "SELECT * FROM ENCHERES WHERE no_utilisateur = ? AND isDelete = 0";
@@ -51,6 +47,12 @@ public class EnchereRepositoryImpl implements EnchereRepository {
return encheres;
}
@Override
public void delete(int id) {
String sql = "UPDATE ENCHERES SET isDelete = 1 WHERE id = ?";
jdbcTemplate.update(sql, id);
}
@Override
public List<Enchere> findByIdArticle(int idArticle) {
String sql = "SELECT * FROM ENCHERES WHERE no_article = ? AND isDelete = 0";
@@ -67,10 +69,4 @@ public class EnchereRepositoryImpl implements EnchereRepository {
enchere.setId(keyHolder.getKey().intValue());
}
}
@Override
public void deleteArticle(int idArticle) {
String sql = "UPDATE ENCHERES SET isDelete = 1 WHERE id = ?";
jdbcTemplate.update(sql, idArticle);
}
}

View File

@@ -1,6 +1,8 @@
package fr.eni.enchere.interceptor;
import fr.eni.enchere.bll.EnchereService;
import fr.eni.enchere.bll.UserService;
import fr.eni.enchere.bo.Enchere;
import fr.eni.enchere.bo.UserProfil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -11,14 +13,18 @@ import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Component
public class UserInterceptor implements HandlerInterceptor {
private final UserService userService;
private final EnchereService enchereService;
@Autowired
public UserInterceptor(UserService userService) {
public UserInterceptor(UserService userService, EnchereService enchereService) {
this.userService = userService;
this.enchereService = enchereService;
}
@Override
@@ -27,8 +33,13 @@ public class UserInterceptor implements HandlerInterceptor {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated() && !authentication.getName().equals("anonymousUser")) {
UserProfil user = this.userService.utilisateurByName(authentication.getName());
List<Enchere> enchere = this.enchereService.enchereByUser(user.getId());
double encheresSum = enchere.stream()
.mapToDouble(ench -> ench.getMontantEnchere()) // Mappez chaque enchère à son montant
.sum();
if (modelAndView != null && modelAndView.getViewName() != null && !modelAndView.getViewName().startsWith("redirect:")) {
modelAndView.addObject("user", user);
modelAndView.addObject("enchereUser", encheresSum);
}
}
}