@ -1,7 +1,8 @@
package fr.uca.iut.services ;
package fr.uca.iut.services ;
import com.mongodb.lang.Nullable ;
import com.mongodb.lang.Nullable ;
import fr.uca.iut.entities.* ;
import fr.uca.iut.entities.Pokemong ;
import fr.uca.iut.entities.Trainer ;
import fr.uca.iut.entities.denormalized.PokemongMove ;
import fr.uca.iut.entities.denormalized.PokemongMove ;
import fr.uca.iut.entities.denormalized.TrainerPokemong ;
import fr.uca.iut.entities.denormalized.TrainerPokemong ;
import fr.uca.iut.entities.embedded.Type ;
import fr.uca.iut.entities.embedded.Type ;
@ -39,81 +40,19 @@ public class PokemongService extends GenericService<Pokemong> {
@Override
@Override
public Pokemong addOne ( @NotNull Pokemong pokemong ) {
public Pokemong addOne ( @NotNull Pokemong pokemong ) {
Pokemong persistedPokemong = super . addOne ( pokemong ) ;
Pokemong persistedPokemong = super . addOne ( pokemong ) ;
String trainerId = pokemong . getTrainer ( ) ;
Trainer trainer = trainerService . getOneById ( pokemong . getTrainer ( ) ) ;
if ( trainerId ! = null ) {
if ( trainer ! = null ) {
TrainerPokemong trainerPokemong = new TrainerPokemong ( ) ;
trainerPokemong . setId ( pokemong . getId ( ) ) ;
trainerPokemong . setNickname ( pokemong . getNickname ( ) ) ;
trainerPokemong . setSpecies ( pokemong . getSpecies ( ) ) ;
trainer . getPokemongs ( )
. add ( trainerPokemong ) ;
trainerService . updateOne ( trainer ) ;
}
return persistedPokemong ;
}
@Override
public void deleteOneById ( String id ) {
Pokemong pokemong = getOneById ( id ) ;
if ( pokemong ! = null & & pokemong . getTrainer ( ) ! = null ) {
Trainer trainer = trainerService . getOneById ( pokemong . getTrainer ( ) ) ;
Trainer trainer = trainerService . getOneById ( pokemong . getTrainer ( ) ) ;
if ( trainer ! = null ) {
if ( trainer ! = null ) {
trainer . getPokemongs ( )
TrainerPokemong trainerPokemong = new TrainerPokemong ( ) ;
. removeIf ( trainerPokemong - > trainerPokemong . getId ( )
trainerPokemong . setId ( pokemong . getId ( ) ) ;
. equals ( id ) ) ;
trainerPokemong . setNickname ( pokemong . getNickname ( ) ) ;
trainerPokemong . setSpecies ( pokemong . getSpecies ( ) ) ;
trainer . addPokemong ( trainerPokemong ) ;
trainerService . updateOne ( trainer ) ;
trainerService . updateOne ( trainer ) ;
}
}
}
}
super . deleteOneById ( id ) ;
return persistedPokemong ;
}
@Override
@Nullable
public Pokemong updateOne ( @NotNull Pokemong pokemong ) {
Pokemong existingPokemong = pokemongRepository . findById ( pokemong . getId ( ) ) ;
if ( existingPokemong ! = null ) {
boolean nicknameChanged = ! Objects . equals ( existingPokemong . getNickname ( ) , pokemong . getNickname ( ) ) ;
boolean evoStageChanged = ! Objects . equals ( existingPokemong . getEvoStage ( ) , pokemong . getEvoStage ( ) ) ;
boolean evoTrackChanged = ! Objects . equals ( existingPokemong . getEvoTrack ( ) , pokemong . getEvoTrack ( ) ) ;
existingPokemong . setNickname ( pokemong . getNickname ( ) ) ;
existingPokemong . setDob ( pokemong . getDob ( ) ) ;
existingPokemong . setLevel ( pokemong . getLevel ( ) ) ;
existingPokemong . setPokedexId ( pokemong . getPokedexId ( ) ) ;
existingPokemong . setEvoStage ( pokemong . getEvoStage ( ) ) ;
existingPokemong . setEvoTrack ( pokemong . getEvoTrack ( ) ) ;
existingPokemong . setTrainer ( pokemong . getTrainer ( ) ) ;
existingPokemong . setTypes ( pokemong . getTypes ( ) ) ;
existingPokemong . setMoveSet ( pokemong . getMoveSet ( ) ) ;
pokemongRepository . persistOrUpdate ( existingPokemong ) ;
if ( nicknameChanged | | evoStageChanged | | evoTrackChanged ) {
Trainer trainer = trainerService . getOneById ( existingPokemong . getTrainer ( ) ) ;
if ( trainer ! = null ) {
TrainerPokemong trainerPokemong = trainer . getPokemongs ( )
. stream ( )
. filter ( tp - > tp . getId ( )
. equals ( existingPokemong . getId ( ) ) )
. findFirst ( )
. orElse ( null ) ;
if ( trainerPokemong ! = null ) {
if ( nicknameChanged ) {
trainerPokemong . setNickname ( existingPokemong . getNickname ( ) ) ;
}
if ( evoStageChanged | | evoTrackChanged ) {
trainerPokemong . setSpecies ( existingPokemong . getSpecies ( ) ) ;
}
trainerService . updateOne ( trainer ) ;
}
}
}
}
return existingPokemong ;
}
}
@Override
@Override
@ -143,7 +82,7 @@ public class PokemongService extends GenericService<Pokemong> {
errors . add ( "pokemong evo track was null or invalid" ) ;
errors . add ( "pokemong evo track was null or invalid" ) ;
}
}
Lis t< Type > types = pokemong . getTypes ( ) ;
Se t< Type > types = pokemong . getTypes ( ) ;
if ( types = = null
if ( types = = null
| | types . size ( ) = = 0
| | types . size ( ) = = 0
| | types . size ( ) > 2 )
| | types . size ( ) > 2 )
@ -174,11 +113,82 @@ public class PokemongService extends GenericService<Pokemong> {
}
}
}
}
if ( pokemong . getSchemaVersion ( ) = = null | |
! Objects . equals ( pokemong . getSchemaVersion ( ) , Pokemong . LATEST_SCHEMA_VERSION ) )
{
errors . add (
"pokemong schema version was null or not the latest version: " + Pokemong . LATEST_SCHEMA_VERSION ) ;
}
if ( ! errors . isEmpty ( ) ) {
if ( ! errors . isEmpty ( ) ) {
throw new NonValidEntityException ( "Validation errors: " + String . join ( ", " , errors ) ) ;
throw new NonValidEntityException ( "Validation errors: " + String . join ( ", " , errors ) ) ;
}
}
}
}
@Override
public void deleteOneById ( String id ) {
Pokemong pokemong = getOneById ( id ) ;
if ( pokemong ! = null & & pokemong . getTrainer ( ) ! = null ) {
Trainer trainer = trainerService . getOneById ( pokemong . getTrainer ( ) ) ;
if ( trainer ! = null ) {
trainer . getPokemongs ( )
. removeIf ( trainerPokemong - > trainerPokemong . getId ( )
. equals ( id ) ) ;
trainerService . updateOne ( trainer ) ;
}
}
super . deleteOneById ( id ) ;
}
@Override
@Nullable
public Pokemong updateOne ( @NotNull Pokemong pokemong ) {
super . updateOne ( pokemong ) ;
Pokemong existingPokemong = pokemongRepository . findById ( pokemong . getId ( ) ) ;
if ( existingPokemong ! = null ) {
boolean nicknameChanged = ! Objects . equals ( existingPokemong . getNickname ( ) , pokemong . getNickname ( ) ) ;
boolean evoStageChanged = ! Objects . equals ( existingPokemong . getEvoStage ( ) , pokemong . getEvoStage ( ) ) ;
boolean evoTrackChanged = ! Objects . equals ( existingPokemong . getEvoTrack ( ) , pokemong . getEvoTrack ( ) ) ;
existingPokemong . setNickname ( pokemong . getNickname ( ) ) ;
existingPokemong . setDob ( pokemong . getDob ( ) ) ;
existingPokemong . setLevel ( pokemong . getLevel ( ) ) ;
existingPokemong . setPokedexId ( pokemong . getPokedexId ( ) ) ;
existingPokemong . setEvoStage ( pokemong . getEvoStage ( ) ) ;
existingPokemong . setEvoTrack ( pokemong . getEvoTrack ( ) ) ;
existingPokemong . setTrainer ( pokemong . getTrainer ( ) ) ;
existingPokemong . setTypes ( pokemong . getTypes ( ) ) ;
existingPokemong . setMoveSet ( pokemong . getMoveSet ( ) ) ;
pokemongRepository . persistOrUpdate ( existingPokemong ) ;
if ( nicknameChanged | | evoStageChanged | | evoTrackChanged ) {
Trainer trainer = trainerService . getOneById ( existingPokemong . getTrainer ( ) ) ;
if ( trainer ! = null ) {
TrainerPokemong trainerPokemong = trainer . getPokemongs ( )
. stream ( )
. filter ( tp - > tp . getId ( )
. equals ( existingPokemong . getId ( ) ) )
. findFirst ( )
. orElse ( null ) ;
if ( trainerPokemong ! = null ) {
if ( nicknameChanged ) {
trainerPokemong . setNickname ( existingPokemong . getNickname ( ) ) ;
}
if ( evoStageChanged | | evoTrackChanged ) {
trainerPokemong . setSpecies ( existingPokemong . getSpecies ( ) ) ;
}
trainerService . updateOne ( trainer ) ;
}
}
}
}
return existingPokemong ;
}
public List < Pokemong > findByMove ( String id ) {
public List < Pokemong > findByMove ( String id ) {
return pokemongRepository . findByMove ( id ) ;
return pokemongRepository . findByMove ( id ) ;
}
}
@ -193,10 +203,12 @@ public class PokemongService extends GenericService<Pokemong> {
return repository . existsById ( pokemongId ) ;
return repository . existsById ( pokemongId ) ;
}
}
public void batchUpdatePokemongTrainers ( @NotNull List < TrainerPokemong > trainerPokemongs , @Nullable String trainerId ) {
public void batchUpdatePokemongTrainers ( @NotNull Set < TrainerPokemong > trainerPokemongs ,
@Nullable String trainerId )
{
for ( TrainerPokemong trainerPokemong : trainerPokemongs ) {
for ( TrainerPokemong trainerPokemong : trainerPokemongs ) {
Pokemong pokemong = getOneById ( trainerPokemong . getId ( ) ) ;
Pokemong pokemong = getOneById ( trainerPokemong . getId ( ) ) ;
if ( pokemong ! = null ) {
if ( pokemong ! = null & & ! Objects . equals ( pokemong . getTrainer ( ) , trainerId ) ) {
pokemong . setTrainer ( trainerId ) ;
pokemong . setTrainer ( trainerId ) ;
updateOne ( pokemong ) ;
updateOne ( pokemong ) ;
}
}