Files
ENI-enchere/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java
Parpaillax ad3223f172 merge
2024-05-02 12:05:55 +02:00

366 lines
16 KiB
Java

package fr.eni.enchere.dal;
import fr.eni.enchere.bll.UserService;
import fr.eni.enchere.bo.Article;
import fr.eni.enchere.bo.SearchArticleCritere;
import fr.eni.enchere.bo.UserProfil;
import fr.eni.enchere.controllers.AccueilController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
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 org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@Repository
@Primary
public class ArticleRepositoryImpl implements ArticleRepository {
private static final String UPLOAD_DIR = "src/main/resources/static/images/articles";
private static final Logger logger = LoggerFactory.getLogger(ArticleRepositoryImpl.class);
private JdbcTemplate jdbcTemplate;
private NamedParameterJdbcTemplate namedJdbcTemplate;
private UserService userService;
private class ArticleRowMapper implements RowMapper<Article> {
@Override
public Article mapRow(ResultSet rs, int rowNum) throws SQLException {
Article article = new Article();
article.setId(rs.getInt("a.no_article"));
article.setNom(rs.getString("a.nom_article"));
article.setDesc(rs.getString("a.description"));
article.setDateDebutEnch(rs.getDate("a.date_debut_encheres"));
article.setDateFinEnch(rs.getDate("a.date_fin_encheres"));
article.setPrixInitial(rs.getFloat("a.prix_initial"));
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;
}
}
private class HomeArticleRowMapper implements RowMapper<Article> {
@Override
public Article mapRow(ResultSet rs, int rowNum) throws SQLException {
Article article = new Article();
article.setId(rs.getInt("a.no_article"));
article.setNom(rs.getString("a.nom_article"));
article.setDesc(rs.getString("a.description"));
article.setDateDebutEnch(rs.getDate("a.date_debut_encheres"));
article.setDateFinEnch(rs.getDate("a.date_fin_encheres"));
article.setPrixInitial(rs.getFloat("a.prix_initial"));
article.setPrixVente(rs.getFloat("a.prix_vente"));
article.setNoUtilisateur(rs.getInt("u.no_utilisateur"));
article.setPseudoUtilisateur(rs.getString("u.pseudo"));
article.setNumCategorie(rs.getInt("a.no_categorie"));
return article;
}
}
public ArticleRepositoryImpl(JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedJdbcTemplate, UserService userService) {
this.jdbcTemplate = jdbcTemplate;
this.namedJdbcTemplate = namedJdbcTemplate;
this.userService = userService;
}
@Override
public List<Article> findAllArticle() {
String sql = "SELECT * FROM ARTICLES_VENDUS a WHERE a.isDelete = 0";
List<Article> articles = jdbcTemplate.query(sql, new ArticleRowMapper());
return articles;
}
@Override
public List<Article> findByUser(int id) {
String sql = "SELECT * FROM ARTICLES_VENDUS WHERE no_utilisateur = ? AND isDelete = 0";
List<Article> articles = jdbcTemplate.query(sql, new ArticleRowMapper(), id);
return articles;
}
@Override
public Page<Article> searchArticlePageable(SearchArticleCritere critere, Pageable pageable) {
StringBuilder sql = new StringBuilder("SELECT DISTINCT a.*, u.* FROM ARTICLES_VENDUS a ");
sql.append("JOIN UTILISATEURS u ON a.no_utilisateur = u.no_utilisateur ");
sql.append("LEFT JOIN ENCHERES e ON a.no_article = e.no_article ");
sql.append("WHERE 1 = 1 AND a.isDelete = 0");
List<Object> params = new ArrayList<>();
if (critere.getNoCategorie() != null) {
sql.append(" AND a.no_categorie = ?");
params.add(critere.getNoCategorie());
}
if (critere.getTitle() != null && !critere.getTitle().isEmpty()) {
sql.append(" AND a.nom_article LIKE ?");
params.add('%' + critere.getTitle() + '%');
}
if (critere.getVenteOptions() != null && critere.getVenteOptions().length > 0) {
sql.append(" AND (");
boolean isFirstCondition = true;
for (String option : critere.getVenteOptions()) {
if (option.equals("venteEnCours")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) ");
isFirstCondition = false;
}
if (option.equals("ventesNonDebutees")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_debut_encheres > NOW()) ");
isFirstCondition = false;
}
if (option.equals("ventesTerminees")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_fin_encheres < NOW()) ");
isFirstCondition = false;
}
}
sql.append(") AND a.no_utilisateur = ?");
params.add(critere.getNoVendeur());
}
if (critere.getAchatOptions() != null && critere.getAchatOptions().length > 0) {
sql.append(" AND (");
boolean isFirstCondition = true;
for (String option : critere.getAchatOptions()) {
if (option.equals("encheresOuvertes")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) ");
isFirstCondition = false;
}
if (option.equals("enchereEnCours")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (e.no_utilisateur = ? AND a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) ");
isFirstCondition = false;
params.add(critere.getNoVendeur());
}
if (option.equals("enchereRemportees")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (e.no_utilisateur = ? AND e.montant_enchere = (SELECT MAX(montant_enchere) FROM ENCHERES WHERE no_article = a.no_article)) ");
isFirstCondition = false;
params.add(critere.getNoVendeur());
}
}
sql.append(")");
}
// Compte le nombre total d'articles
int totalCount = countArticlePageable(critere);
// Ajoute la pagination à la requête SQL
sql.append(" LIMIT ? OFFSET ?");
params.add(pageable.getPageSize());
params.add(pageable.getOffset());
// Exécute la requête paginée
List<Article> articles = jdbcTemplate.query(sql.toString(), new HomeArticleRowMapper(), params.toArray());
// Crée une Page<Article> à partir des résultats et des informations de pagination
return new PageImpl<>(articles, pageable, totalCount);
}
public int countArticlePageable(SearchArticleCritere critere) {
StringBuilder sql = new StringBuilder("SELECT COUNT(a.no_article) FROM ARTICLES_VENDUS a ");
sql.append("JOIN UTILISATEURS u ON a.no_utilisateur = u.no_utilisateur ");
sql.append("LEFT JOIN ENCHERES e ON a.no_article = e.no_article ");
sql.append("WHERE 1 = 1 AND a.isDelete = 0");
List<Object> params = new ArrayList<>();
if (critere.getNoCategorie() != null) {
sql.append(" AND a.no_categorie = ?");
params.add(critere.getNoCategorie());
}
if (critere.getTitle() != null && !critere.getTitle().isEmpty()) {
sql.append(" AND a.nom_article LIKE ?");
params.add('%' + critere.getTitle() + '%');
}
if (critere.getVenteOptions() != null && critere.getVenteOptions().length > 0) {
sql.append(" AND (");
boolean isFirstCondition = true;
for (String option : critere.getVenteOptions()) {
if (option.equals("venteEnCours")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) ");
isFirstCondition = false;
}
if (option.equals("ventesNonDebutees")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_debut_encheres > NOW()) ");
isFirstCondition = false;
}
if (option.equals("ventesTerminees")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_fin_encheres < NOW()) ");
isFirstCondition = false;
}
}
sql.append(") AND a.no_utilisateur = ?");
params.add(critere.getNoVendeur());
}
if (critere.getAchatOptions() != null && critere.getAchatOptions().length > 0) {
sql.append(" AND (");
boolean isFirstCondition = true;
for (String option : critere.getAchatOptions()) {
if (option.equals("encheresOuvertes")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) ");
isFirstCondition = false;
}
if (option.equals("enchereEnCours")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (e.no_utilisateur = ? AND a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) ");
isFirstCondition = false;
params.add(critere.getNoVendeur());
}
if (option.equals("enchereRemportees")) {
if (!isFirstCondition) {
sql.append(" OR ");
}
sql.append(" (e.no_utilisateur = ? AND e.montant_enchere = (SELECT MAX(montant_enchere) FROM ENCHERES WHERE no_article = a.no_article)) ");
isFirstCondition = false;
params.add(critere.getNoVendeur());
}
}
sql.append(")");
}
// Exécute la requête paginée
int articles = jdbcTemplate.queryForObject(sql.toString(), Integer.class, params.toArray());
// Retourne le nombre d'articles
return articles;
}
@Override
public Article findArticleById(int id) {
String sql = "SELECT * FROM ARTICLES_VENDUS a WHERE a.no_article = ?";
Article article = jdbcTemplate.queryForObject(sql, new ArticleRowMapper(), id);
return article;
}
@Override
public List<Article> findArticleByTitle(String title) {
String sql = "SELECT * FROM ARTICLES_VENDUS a WHERE nom_article LIKE ? AND a.isDelete = 0";
List<Article> articles = jdbcTemplate.query(sql, new ArticleRowMapper(), "%" + title + "%");
return articles;
}
@Override
public int saveArticle(Article article) {
if (article.getId() == 0) {
//Nouvel article
String sql = "INSERT INTO ARTICLES_VENDUS (nom_article, description, date_debut_encheres, date_fin_encheres, prix_initial, prix_vente, no_utilisateur, no_categorie, isDelete) " +
"VALUES (:nom_article, :description, :date_debut_encheres, :date_fin_encheres, :prix_initial, null, :no_utilisateur, :no_categorie, 0)";
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("nom_article", article.getNom());
parameters.addValue("description", article.getDesc());
parameters.addValue("date_debut_encheres", article.getDateDebutEnch());
parameters.addValue("date_fin_encheres", article.getDateFinEnch());
parameters.addValue("prix_initial", article.getPrixInitial());
parameters.addValue("no_utilisateur", article.getUtilisateur());
parameters.addValue("no_categorie", article.getNumCategorie());
KeyHolder keyHolder = new GeneratedKeyHolder();
namedJdbcTemplate.update(sql, parameters, keyHolder, new String[] {"no_article"});
if (keyHolder.getKey() != null) {
article.setId(keyHolder.getKey().intValue());
}
//Enregistrement du fichier
MultipartFile file = article.getPhoto();
if (file != null && !file.isEmpty()) {
try {
// Renommer le fichier avec l'ID de l'article
String newFileName = article.getId() + ".jpg";
// Chemin du dossier de destination
Path uploadPath = Paths.get(UPLOAD_DIR);
// Créer le dossier s'il n'existe pas
Files.createDirectories(uploadPath);
// Chemin complet du fichier de destination
Path filePath = uploadPath.resolve(newFileName);
// Copier le fichier dans le dossier de destination
FileCopyUtils.copy(file.getInputStream(), Files.newOutputStream(filePath));
} catch (IOException e) {
e.printStackTrace();
// Gérer l'erreur
}
}
}else {
//Mettre à jour l'article
}
return article.getId();
}
@Override
public void deleteArticle(int id) {
String sql = "UPDATE ARTICLES_VENDUS " +
"SET isDelete = 1 " +
"WHERE no_article = ?";
jdbcTemplate.update(sql, id);
}
@Override
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();
}
@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);
}
}