Modification

This commit is contained in:
MAIZY Amaury 2025-04-29 09:18:11 +02:00
parent 057b275f2f
commit 9fe8cf4981
19 changed files with 460 additions and 31 deletions

View file

@ -1,13 +1,22 @@
package fr.clelia.avis; package fr.clelia.avis;
import fr.clelia.avis.business.Joueur;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.time.LocalDate;
@SpringBootApplication @SpringBootApplication
public class AvisApplication { public class AvisApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(AvisApplication.class, args); SpringApplication.run(AvisApplication.class, args);
Joueur joueur = Joueur.builder()
.pseudo("Joueur")
.email("amaury.maizy@soprasteria.com")
.dateDeNaissance(LocalDate.of(2000, 1, 1))
.build();
} }
} }

View file

@ -14,4 +14,4 @@ public class Avatar {
@OneToOne(mappedBy="avatar") @OneToOne(mappedBy="avatar")
private Utilisateur utilisateur; private Utilisateur utilisateur;
} }

View file

@ -1,9 +1,11 @@
package fr.clelia.avis.business; package fr.clelia.avis.business;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.*; import lombok.*;
import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import java.util.List; import java.util.List;
@ -19,6 +21,7 @@ public class Editeur {
@Id @Id
@GeneratedValue @GeneratedValue
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id; private Long id;
@Column(length = 100, unique = true) @Column(length = 100, unique = true)
@ -27,8 +30,12 @@ public class Editeur {
private String logo; private String logo;
@JsonManagedReference
@OneToMany(mappedBy = "editeur", cascade = CascadeType.REMOVE) // OneEditeurToManyJeux
private List<Jeu> jeux;
public Editeur(String nom, String logo) { public Editeur(String nom, String logo) {
this.nom = nom; this.nom = nom;
this.logo = logo; this.logo = logo;
} }
} }

View file

@ -1,23 +1,177 @@
package fr.clelia.avis.business; package fr.clelia.avis.business;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.Data;
import java.util.List; import lombok.NonNull;
import java.util.ArrayList; import java.time.LocalDate;
import java.util.List;
@Entity @Entity
@Data @Data
public class Jeu { public class Jeu {
@Id @Id
@GeneratedValue
private Long id; private Long id;
@NonNull
private String nom;
@ManyToOne @ManyToOne
@JoinColumn(name = "editeur_id") @NonNull
@JsonBackReference
private Editeur editeur; private Editeur editeur;
@ManyToMany @ManyToMany
private List<Plateforme> plateformes = new ArrayList<>(); @NonNull
@JsonManagedReference // On souhaite voir en Json les plateformes du jeu
private List<Plateforme> plateformes;
} private LocalDate dateDeSortie;
private boolean possedeImage;
public Jeu(@NonNull String nom, @NonNull Editeur editeur, @NonNull List<Plateforme> plateformes) {
this.nom = nom;
this.editeur = editeur;
this.plateformes = plateformes;
}
public Jeu(Long id, @NonNull String nom, @NonNull Editeur editeur, @NonNull List<Plateforme> plateformes) {
this.id = id;
this.nom = nom;
this.editeur = editeur;
this.plateformes = plateformes;
}
public Jeu() {
}
public static JeuBuilder builder() {
return new JeuBuilder();
}
public Long getId() {
return this.id;
}
public @NonNull String getNom() {
return this.nom;
}
public @NonNull Editeur getEditeur() {
return this.editeur;
}
public @NonNull List<Plateforme> getPlateformes() {
return this.plateformes;
}
public void setId(Long id) {
this.id = id;
}
public void setNom(@NonNull String nom) {
this.nom = nom;
}
public void setEditeur(@NonNull Editeur editeur) {
this.editeur = editeur;
}
public void setPlateformes(@NonNull List<Plateforme> plateformes) {
this.plateformes = plateformes;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof Jeu)) return false;
final Jeu other = (Jeu) o;
if (!other.canEqual((Object) this)) return false;
final Object this$id = this.getId();
final Object other$id = other.getId();
if (this$id == null ? other$id != null : !this$id.equals(other$id)) return false;
final Object this$nom = this.getNom();
final Object other$nom = other.getNom();
if (this$nom == null ? other$nom != null : !this$nom.equals(other$nom)) return false;
final Object this$editeur = this.getEditeur();
final Object other$editeur = other.getEditeur();
if (this$editeur == null ? other$editeur != null : !this$editeur.equals(other$editeur)) return false;
final Object this$plateformes = this.getPlateformes();
final Object other$plateformes = other.getPlateformes();
if (this$plateformes == null ? other$plateformes != null : !this$plateformes.equals(other$plateformes))
return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof Jeu;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $id = this.getId();
result = result * PRIME + ($id == null ? 43 : $id.hashCode());
final Object $nom = this.getNom();
result = result * PRIME + ($nom == null ? 43 : $nom.hashCode());
final Object $editeur = this.getEditeur();
result = result * PRIME + ($editeur == null ? 43 : $editeur.hashCode());
final Object $plateformes = this.getPlateformes();
result = result * PRIME + ($plateformes == null ? 43 : $plateformes.hashCode());
return result;
}
public String toString() {
return "Jeu(id=" + this.getId() + ", nom=" + this.getNom() + ", editeur=" + this.getEditeur() + ", plateformes=" + this.getPlateformes() + ")";
}
public static class JeuBuilder {
private Long id;
private @NonNull String nom;
private @NonNull Editeur editeur;
private @NonNull List<Plateforme> plateformes;
JeuBuilder() {
}
public JeuBuilder id(Long id) {
this.id = id;
return this;
}
public JeuBuilder nom(@NonNull String nom) {
this.nom = nom;
return this;
}
public JeuBuilder editeur(@NonNull Editeur editeur) {
this.editeur = editeur;
return this;
}
public JeuBuilder plateformes(@NonNull List<Plateforme> plateformes) {
this.plateformes = plateformes;
return this;
}
public Jeu build() {
return new Jeu(this.id, this.nom, this.editeur, this.plateformes);
}
public String toString() {
return "Jeu.JeuBuilder(id=" + this.id + ", nom=" + this.nom + ", editeur=" + this.editeur + ", plateformes=" + this.plateformes + ")";
}
}
/*
public Jeu(String nom, Editeur editeur, List<Plateforme> plateformes) {
this.nom = nom;
this.editeur = editeur;
this.plateformes = plateformes;
}
*/
}

View file

@ -14,4 +14,4 @@ import java.time.LocalDate;
public class Joueur extends Utilisateur { public class Joueur extends Utilisateur {
private LocalDate dateDeNaissance; private LocalDate dateDeNaissance;
} }

View file

@ -13,4 +13,4 @@ import org.springframework.boot.convert.DataSizeUnit;
public class Moderateur extends Utilisateur { public class Moderateur extends Utilisateur {
private String numeroDeTelephone; private String numeroDeTelephone;
} }

View file

@ -1,19 +1,31 @@
package fr.clelia.avis.business; package fr.clelia.avis.business;
import jakarta.persistence.*; import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import lombok.*; import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
@Data import java.util.List;
@DynamicInsert
@DynamicUpdate
@Entity @Entity
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
public class Plateforme { public class Plateforme {
@Id @Id
@GeneratedValue @GeneratedValue
private Long id; private Long id;
@NonNull
private String nom; private String nom;
@ManyToMany(mappedBy="plateformes")
@JsonIgnore
private List<Jeu> jeux;
} }

View file

@ -0,0 +1,34 @@
package fr.clelia.avis.controller;
import fr.clelia.avis.service.EditeurService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class EditeurController {
// Dépendance
private final EditeurService editeurService;
public EditeurController(EditeurService editeurService) {
this.editeurService = editeurService;
}
@GetMapping("editeurs")
public ModelAndView getEditeurs() {
ModelAndView mav = new ModelAndView("editeurs");
mav.addObject("editeurs", editeurService.recupererEditeurs());
return mav;
}
@PostMapping("editeurs")
public ModelAndView postEditeurs(@RequestParam("NOM") String nomRecherche) {
ModelAndView modelAndView = new ModelAndView("editeurs");
modelAndView.addObject("editeurs", editeurService.recupererEditeursAyantUnNomContenant(nomRecherche));
modelAndView.addObject("nom", nomRecherche);
return modelAndView;
}
}

View file

@ -1,22 +1,110 @@
package fr.clelia.avis.initialisation; package fr.clelia.avis.initialisation;
import fr.clelia.avis.business.Editeur; import fr.clelia.avis.business.Editeur;
import fr.clelia.avis.business.Plateforme;
import fr.clelia.avis.repository.EditeurRepository; import fr.clelia.avis.repository.EditeurRepository;
import fr.clelia.avis.repository.PlateformeRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component // Spring va instancier cette classe @Component // Spring va instancier cette classe
// et placer cette instance dans son conteneur IoC // et placer cette instance dans son conteneur IoC
@AllArgsConstructor //@AllArgsConstructor
public class AjoutDonneesInitiales { public class AjoutDonneesInitiales {
// Dépendances // Dépendances
@Autowired
private EditeurRepository editeurRepository; private EditeurRepository editeurRepository;
@Autowired
private PlateformeRepository plateformeRepository;
@EventListener(ApplicationReadyEvent.class) @EventListener(ApplicationReadyEvent.class)
public void init() { public void init() {
System.out.println("Ajout des données initiales"); System.out.println("Ajout des données initiales");
ajouterEditeurs();
ajouterPlateformes();
} }
}
private void ajouterEditeurs() {
if (editeurRepository.count() == 0) {
editeurRepository.save(new Editeur("Mobius Digital", "mobiusdigitalgames.com"));
editeurRepository.save(new Editeur("Activision", "activision.com"));
editeurRepository.save(new Editeur("Amazon Games","amazongames.com"));
editeurRepository.save(new Editeur("Ankama", "ankama.com"));
editeurRepository.save(new Editeur("Psyonix", "psyonix.com"));
editeurRepository.save(new Editeur("Bandai Namco", "bandai.co.jp"));
editeurRepository.save(new Editeur("Bethesda", "bethesda.net"));
editeurRepository.save(new Editeur("BioWare", "bioware.com"));
editeurRepository.save(new Editeur("Blizzard", "blizzard.com"));
editeurRepository.save(new Editeur("Capcom", "capcom.com"));
editeurRepository.save(new Editeur("CCP", "ccpgames.com"));
editeurRepository.save(new Editeur("CD Projekt Red", "cdprojekt.com"));
editeurRepository.save(new Editeur("Davilex", "davilex.nl"));
editeurRepository.save(new Editeur("Digital Extreme", "digitalextremes.com"));
editeurRepository.save(new Editeur("Electronic Arts", "ea.com"));
editeurRepository.save(new Editeur("Epic Games", "epicgames.com"));
editeurRepository.save(new Editeur("FromSoftware", "fromsoftware.jp"));
editeurRepository.save(new Editeur("Hazelight Studios", "hazelight.se"));
editeurRepository.save(new Editeur("idSoftware", "idsoftware.com"));
editeurRepository.save(new Editeur("Microsoft", "microsoft.com"));
editeurRepository.save(new Editeur("MonolithSoftware", "monolithsoft.co.jp"));
editeurRepository.save(new Editeur("Naughty Dog", "naughtydog.com"));
editeurRepository.save(new Editeur("Nintendo", "nintendo.com"));
editeurRepository.save(new Editeur("Riot Games", "riotgames.com"));
editeurRepository.save(new Editeur("Rockstar", "rockstar.com"));
editeurRepository.save(new Editeur("Sega", "sega.com"));
editeurRepository.save(new Editeur("Square Enix", "squareenix.com"));
editeurRepository.save(new Editeur("Tencent", "tencentgames.com"));
editeurRepository.save(new Editeur("Ubisoft", "ubisoft.com"));
editeurRepository.save(new Editeur("Ultra Software", null));
editeurRepository.save(new Editeur("Valve", "valvesoftware.com"));
editeurRepository.save(new Editeur("Wildcard", "wildcardmobile.com"));
}
}
private void ajouterPlateformes() {
if (plateformeRepository.count() == 0) {
plateformeRepository.save(new Plateforme("Amstrad CPC"));
plateformeRepository.save(new Plateforme("Nintendo Wii"));
plateformeRepository.save(new Plateforme("Nintendo Wii U"));
plateformeRepository.save(new Plateforme("Nintendo Switch"));
plateformeRepository.save(new Plateforme("Windows"));
plateformeRepository.save(new Plateforme("MacOS"));
plateformeRepository.save(new Plateforme("Steam"));
plateformeRepository.save(new Plateforme("Neo-Geo"));
plateformeRepository.save(new Plateforme("PlayStation 1"));
plateformeRepository.save(new Plateforme("PlayStation 2"));
plateformeRepository.save(new Plateforme("PlayStation 3"));
plateformeRepository.save(new Plateforme("PlayStation 4"));
plateformeRepository.save(new Plateforme("PlayStation 5"));
plateformeRepository.save(new Plateforme("PlayStation Vita"));
plateformeRepository.save(new Plateforme("PSP"));
plateformeRepository.save(new Plateforme("Sega Dreamcast"));
plateformeRepository.save(new Plateforme("Sega Mastersystem"));
plateformeRepository.save(new Plateforme("Sega Saturn"));
plateformeRepository.save(new Plateforme("Xbox One"));
plateformeRepository.save(new Plateforme("Xbox One Series"));
plateformeRepository.save(new Plateforme("Xbox 360"));
plateformeRepository.save(new Plateforme("Amiga"));
plateformeRepository.save(new Plateforme("Android"));
plateformeRepository.save(new Plateforme("Atari 8-bit"));
plateformeRepository.save(new Plateforme("Atari Jaguar"));
plateformeRepository.save(new Plateforme("Commodore 64"));
plateformeRepository.save(new Plateforme("Game Boy"));
plateformeRepository.save(new Plateforme("Game Boy Color"));
plateformeRepository.save(new Plateforme("Game Boy Advance"));
plateformeRepository.save(new Plateforme("Game Boy Advance SP"));
plateformeRepository.save(new Plateforme("NES"));
plateformeRepository.save(new Plateforme("PC-Engine"));
plateformeRepository.save(new Plateforme("SNES"));
plateformeRepository.save(new Plateforme("Nintendo 3DS"));
plateformeRepository.save(new Plateforme("Nintendo 64"));
plateformeRepository.save(new Plateforme("Nintendo DS"));
plateformeRepository.save(new Plateforme("Nintendo Gamecube"));
}
}
}

View file

@ -1,4 +1,7 @@
package fr.clelia.avis.repository; package fr.clelia.avis.repository;
public interface AvatarRepository { import fr.clelia.avis.business.Avatar;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AvatarRepository extends JpaRepository<Avatar, Long> {
} }

View file

@ -1,4 +1,8 @@
package fr.clelia.avis.repository; package fr.clelia.avis.repository;
public interface JeuRepository { import fr.clelia.avis.business.Jeu;
} import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
public interface JeuRepository extends JpaRepository<Jeu, Long> {
}

View file

@ -1,4 +1,7 @@
package fr.clelia.avis.repository; package fr.clelia.avis.repository;
public interface JoueurRepository { import fr.clelia.avis.business.Joueur;
} import org.springframework.data.jpa.repository.JpaRepository;
public interface JoueurRepository extends JpaRepository<Joueur, Long> {
}

View file

@ -1,4 +1,7 @@
package fr.clelia.avis.repository; package fr.clelia.avis.repository;
public interface ModerateurRepository { import fr.clelia.avis.business.Moderateur;
} import org.springframework.data.jpa.repository.JpaRepository;
public interface ModerateurRepository extends JpaRepository<Moderateur, Long> {
}

View file

@ -1,4 +1,7 @@
package fr.clelia.avis.repository; package fr.clelia.avis.repository;
public interface PlateformeRepository { import fr.clelia.avis.business.Plateforme;
} import org.springframework.data.jpa.repository.JpaRepository;
public interface PlateformeRepository extends JpaRepository<Plateforme, Long> {
}

View file

@ -1,4 +1,7 @@
package fr.clelia.avis.repository; package fr.clelia.avis.repository;
public interface UtilisateurRepository { import fr.clelia.avis.business.Utilisateur;
} import org.springframework.data.jpa.repository.JpaRepository;
public interface UtilisateurRepository extends JpaRepository<Utilisateur, Long> {
}

View file

@ -0,0 +1,12 @@
package fr.clelia.avis.service;
import fr.clelia.avis.business.Editeur;
import java.util.List;
public interface EditeurService {
List<Editeur> recupererEditeurs();
List<Editeur> recupererEditeursAyantUnNomContenant(String nomRecherche);
}

View file

@ -0,0 +1,32 @@
package fr.clelia.avis.service.impl;
import fr.clelia.avis.business.Editeur;
import fr.clelia.avis.repository.EditeurRepository;
import fr.clelia.avis.service.EditeurService;
import org.springframework.stereotype.Service;
import java.util.List;
//@Component
@Service
public class EditeurServiceImpl implements EditeurService {
private final EditeurRepository editeurRepository;
// Ce constructeur va faire déduire à Spring
// qu'il doit d'abord instancier la repo
// avant d'instancier le service
public EditeurServiceImpl(EditeurRepository editeurRepository) {
this.editeurRepository = editeurRepository;
}
@Override
public List<Editeur> recupererEditeurs() {
return editeurRepository.findAll();
}
@Override
public List<Editeur> recupererEditeursAyantUnNomContenant(String nomRecherche) {
return editeurRepository.findByNomContainingIgnoreCase(nomRecherche);
}
}

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="fr">
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<title>Editeurs</title>
</head>
<body>
<div th:replace="~{entete}"></div>
<h1>Liste des éditeurs</h1>
<form action="editeurs" method="POST">
<input type="text" id="nom" name="NOM" placeholder="Nom de l'éditeur" th:value="${nom}">
<input type="submit" value="Rechercher">
</form>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Id <a th:href="@{'index?page=0&sort=id'}">Trier</a></th>
<th>Logo <a th:href="@{'index?page=0&sort=logo'}">Trier</a></th>
<th>Nom <a th:href="@{'index?page=0&sort=nom'}">Trier</a></th>
</tr>
</thead>
<tr th:each="editeur:${editeurs}">
<td th:text="${editeur.id}"></td>
<td><img th:src="@{'https://logo.clearbit.com/' + ${editeur.logo} + '?size=150'}" alt="Logo de l'éditeur'"></td>
<td th:text="${editeur.nom}"></td>
</tr>
</table>
</body>
</html>

View file

@ -0,0 +1,32 @@
<!DOCTYPE html>
<table>
<tr>
<td><a href="editeurs">&Eacute;diteurs</a></td>
<td><a href="jeux">Jeux</a></td>
<td><a href="plateformes">Plateformes</a></td>
<td><a href="configuration">Configuration</a></td>
<td><a href="/swagger-ui/index.html" target="swagger">Swagger</a></td>
</tr>
</table>
<table>
<tr>
<td>H2</td>
<td><a href="/h2-console" target="h2_console">Console</a></td>
</tr>
</table>
<table>
<tr>
<td>Actuator</td>
<td><a href="/beans" target="beans">Beans</a></td>
<td><a href="/health" target="health">Health</a></td>
<td><a href="/configprops" target="configprops">Propriétés de configuration</a></td>
<td><a href="/env" target="env">Environnement</a></td>
</tr>
</table>
<table>
<tr>
<td>Hibernate</td>
<td><a href="statistiques" target="statistiques">Statistiques</a></td>
</tr>
</table>