@ -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,20 +40,91 @@ 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 ( ) ;
if ( trainerId ! = null ) {
Trainer trainer = trainerService . getOneById ( pokemong . getTrainer ( ) ) ;
Trainer trainer = trainerService . getOneById ( pokemong . getTrainer ( ) ) ;
if ( trainer ! = null ) {
if ( trainer ! = null ) {
TrainerPokemong trainerPokemong = new TrainerPokemong ( ) ;
TrainerPokemong trainerPokemong = new TrainerPokemong ( ) ;
trainerPokemong . setId ( pokemong . getId ( ) ) ;
trainerPokemong . setId ( pokemong . getId ( ) ) ;
trainerPokemong . setNickname ( pokemong . getNickname ( ) ) ;
trainerPokemong . setNickname ( pokemong . getNickname ( ) ) ;
trainerPokemong . setSpecies ( pokemong . getSpecies ( ) ) ;
trainerPokemong . setSpecies ( pokemong . getSpecies ( ) ) ;
trainer . getPokemongs ( )
trainer . addPokemong ( trainerPokemong ) ;
. add ( trainerPokemong ) ;
trainerService . updateOne ( trainer ) ;
trainerService . updateOne ( trainer ) ;
}
}
}
return persistedPokemong ;
return persistedPokemong ;
}
}
@Override
public void validateOne ( Pokemong pokemong ) {
super . validateOne ( pokemong ) ;
List < String > errors = new ArrayList < > ( ) ;
if ( pokemong . getDob ( ) = = null ) {
errors . add ( "pokemong date of birth was null or invalid" ) ;
}
if ( pokemong . getLevel ( ) = = null | | pokemong . getLevel ( ) < 1 ) {
errors . add ( "pokemong level was null or less than 1" ) ;
}
if ( pokemong . getPokedexId ( ) = = null | | pokemong . getPokedexId ( ) < 1 ) {
errors . add ( "pokemong pokedex id was null or less than 1" ) ;
}
if ( pokemong . getEvoStage ( ) = = null | | pokemong . getEvoStage ( ) < 0 ) {
errors . add ( "pokemong evo stage was null or negative" ) ;
}
if ( pokemong . getEvoTrack ( ) = = null ) {
errors . add ( "pokemong evo track was null or invalid" ) ;
}
Set < Type > types = pokemong . getTypes ( ) ;
if ( types = = null
| | types . size ( ) = = 0
| | types . size ( ) > 2 )
{
errors . add ( "pokemong types was null or empty or had more than 2 types" ) ;
}
Set < PokemongMove > moveSet = pokemong . getMoveSet ( ) ;
if ( moveSet = = null ) {
errors . add ( "pokemong move set was null" ) ;
}
else {
if ( moveSet . size ( ) = = 0 | | moveSet . size ( ) > 4 ) {
errors . add ( "pokemong move set was empty or had more than 4 moves" ) ;
}
for ( PokemongMove move : moveSet ) {
String moveId = move . getId ( ) ;
String moveName = move . getName ( ) ;
if ( StringUtils . isBlankStringOrNull ( moveId ) | | ! moveService . existsById ( moveId ) ) {
errors . add ( "move with id " + moveId + " does not exist" ) ;
}
if ( StringUtils . isBlankStringOrNull ( moveName ) ) {
errors . add ( "move name was null, blank or empty" ) ;
}
// We don't check whether the move name is consistent with the original -- trainers can rename moves
// locally in a pokemong. If once in a while a Move has its name updated, the change will be reflected
// in all the PokemongMoves, and the local aliases will be lost
}
}
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 ( ) ) {
throw new NonValidEntityException ( "Validation errors: " + String . join ( ", " , errors ) ) ;
}
}
@Override
@Override
public void deleteOneById ( String id ) {
public void deleteOneById ( String id ) {
Pokemong pokemong = getOneById ( id ) ;
Pokemong pokemong = getOneById ( id ) ;
@ -71,6 +143,7 @@ public class PokemongService extends GenericService<Pokemong> {
@Override
@Override
@Nullable
@Nullable
public Pokemong updateOne ( @NotNull Pokemong pokemong ) {
public Pokemong updateOne ( @NotNull Pokemong pokemong ) {
super . updateOne ( pokemong ) ;
Pokemong existingPokemong = pokemongRepository . findById ( pokemong . getId ( ) ) ;
Pokemong existingPokemong = pokemongRepository . findById ( pokemong . getId ( ) ) ;
if ( existingPokemong ! = null ) {
if ( existingPokemong ! = null ) {
boolean nicknameChanged = ! Objects . equals ( existingPokemong . getNickname ( ) , pokemong . getNickname ( ) ) ;
boolean nicknameChanged = ! Objects . equals ( existingPokemong . getNickname ( ) , pokemong . getNickname ( ) ) ;
@ -116,69 +189,6 @@ public class PokemongService extends GenericService<Pokemong> {
return existingPokemong ;
return existingPokemong ;
}
}
@Override
public void validateOne ( Pokemong pokemong ) {
super . validateOne ( pokemong ) ;
List < String > errors = new ArrayList < > ( ) ;
if ( pokemong . getDob ( ) = = null ) {
errors . add ( "pokemong date of birth was null or invalid" ) ;
}
if ( pokemong . getLevel ( ) = = null | | pokemong . getLevel ( ) < 1 ) {
errors . add ( "pokemong level was null or less than 1" ) ;
}
if ( pokemong . getPokedexId ( ) = = null | | pokemong . getPokedexId ( ) < 1 ) {
errors . add ( "pokemong pokedex id was null or less than 1" ) ;
}
if ( pokemong . getEvoStage ( ) = = null | | pokemong . getEvoStage ( ) < 0 ) {
errors . add ( "pokemong evo stage was null or negative" ) ;
}
if ( pokemong . getEvoTrack ( ) = = null ) {
errors . add ( "pokemong evo track was null or invalid" ) ;
}
List < Type > types = pokemong . getTypes ( ) ;
if ( types = = null
| | types . size ( ) = = 0
| | types . size ( ) > 2 )
{
errors . add ( "pokemong types was null or empty or had more than 2 types" ) ;
}
Set < PokemongMove > moveSet = pokemong . getMoveSet ( ) ;
if ( moveSet = = null ) {
errors . add ( "pokemong move set was null" ) ;
}
else {
if ( moveSet . size ( ) = = 0 | | moveSet . size ( ) > 4 ) {
errors . add ( "pokemong move set was empty or had more than 4 moves" ) ;
}
for ( PokemongMove move : moveSet ) {
String moveId = move . getId ( ) ;
String moveName = move . getName ( ) ;
if ( StringUtils . isBlankStringOrNull ( moveId ) | | ! moveService . existsById ( moveId ) ) {
errors . add ( "move with id " + moveId + " does not exist" ) ;
}
if ( StringUtils . isBlankStringOrNull ( moveName ) ) {
errors . add ( "move name was null, blank or empty" ) ;
}
// We don't check whether the move name is consistent with the original -- trainers can rename moves
// locally in a pokemong. If once in a while a Move has its name updated, the change will be reflected
// in all the PokemongMoves, and the local aliases will be lost
}
}
if ( ! errors . isEmpty ( ) ) {
throw new NonValidEntityException ( "Validation errors: " + String . join ( ", " , errors ) ) ;
}
}
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 ) ;
}
}