diff --git a/build.gradle b/build.gradle index 73db4a9..5091209 100644 --- a/build.gradle +++ b/build.gradle @@ -9,14 +9,17 @@ repositories { } dependencies { + // FIXME "Provides transitive vulnerable dependency maven:org.jboss.resteasy:resteasy-core:6.2.1.Final + // CVE-2023-0482 7.8 Creation of Temporary File With Insecure Permissions vulnerability with medium severity found + // Results powered by Checkmarx(c)" implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") - implementation 'io.quarkus:quarkus-resteasy-reactive-jsonb' - implementation 'io.quarkus:quarkus-mongodb-client' - implementation 'io.quarkus:quarkus-arc' - implementation 'io.quarkus:quarkus-resteasy-reactive' - implementation 'io.quarkus:quarkus-mongodb-panache' - testImplementation 'io.quarkus:quarkus-junit5' - testImplementation 'io.rest-assured:rest-assured' + implementation 'io.quarkus:quarkus-resteasy:3.0.0.Alpha6' + implementation 'io.quarkus:quarkus-resteasy-jackson:3.0.0.Alpha6' + implementation 'io.quarkus:quarkus-arc:3.0.0.Alpha6' + implementation 'io.quarkus:quarkus-mongodb-client:3.0.0.Alpha6' + implementation 'org.mongodb:mongodb-driver-sync:4.9.1' + testImplementation 'io.quarkus:quarkus-junit5:3.0.0.Alpha6' + testImplementation 'io.rest-assured:rest-assured:5.3.0' } group 'fr.uca.iut' diff --git a/src/main/java/fr/uca/iut/codecs/GenericCodec.java b/src/main/java/fr/uca/iut/codecs/GenericCodec.java new file mode 100644 index 0000000..c948176 --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/GenericCodec.java @@ -0,0 +1,48 @@ +package fr.uca.iut.codecs; + +import com.mongodb.MongoClientSettings; +import fr.uca.iut.entities.GenericEntity; +import org.bson.*; +import org.bson.codecs.Codec; +import org.bson.codecs.CollectibleCodec; +import org.bson.codecs.DecoderContext; +import org.bson.codecs.EncoderContext; +import org.bson.types.ObjectId; + +public abstract class GenericCodec implements CollectibleCodec { + private final Codec documentCodec; + protected GenericCodec() { + this.documentCodec = MongoClientSettings.getDefaultCodecRegistry() + .get(Document.class); + } + + public Codec getDocumentCodec() { + return documentCodec; + } + @Override + public abstract void encode(BsonWriter writer, T entity, EncoderContext encoderContext); + + @Override + public abstract Class getEncoderClass(); + + @Override + public T generateIdIfAbsentFromDocument(T document) { + if (!documentHasId(document)) { + document.setId(new ObjectId().toString()); + } + return document; + } + + @Override + public boolean documentHasId(T document) { + return document.getId() != null; + } + + @Override + public BsonValue getDocumentId(T document) { + return new BsonObjectId(new ObjectId(document.getId())); + } + + @Override + public abstract T decode(BsonReader reader, DecoderContext decoderContext); +} diff --git a/src/main/java/fr/uca/iut/codecs/pokemong/PokemongCodec.java b/src/main/java/fr/uca/iut/codecs/pokemong/PokemongCodec.java new file mode 100644 index 0000000..0610934 --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/pokemong/PokemongCodec.java @@ -0,0 +1,127 @@ +package fr.uca.iut.codecs.pokemong; + +import com.mongodb.MongoClientSettings; +import fr.uca.iut.codecs.GenericCodec; +import fr.uca.iut.entities.Pokemong; +import fr.uca.iut.entities.Type; +import fr.uca.iut.utils.PokemongName; +import fr.uca.iut.utils.TypeName; +import org.bson.*; +import org.bson.codecs.*; +import org.bson.types.ObjectId; + +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; + +public class PokemongCodec extends GenericCodec { + private final Codec documentCodec; + + public PokemongCodec() { + this.documentCodec = MongoClientSettings.getDefaultCodecRegistry() + .get(Document.class); + } + + @Override + public void encode(BsonWriter writer, Pokemong pokemong, EncoderContext encoderContext) { + Document doc = new Document(); + doc.put("_id", new ObjectId(pokemong.getId())); + doc.put("nickname", pokemong.getNickname()); + doc.put("dob", + Date.from(pokemong.getDob() + .atStartOfDay(ZoneId.systemDefault()) + .toInstant())); + doc.put("level", pokemong.getLevel()); + doc.put("pokedexId", pokemong.getPokedexId()); + doc.put("evoStage", pokemong.getEvoStage()); + List evoTrack = Optional.ofNullable(pokemong.getEvoTrack()) + .orElse(Collections.emptyList()) + .stream() + .map(Enum::name) + .collect(Collectors.toList()); + + doc.put("evoTrack", evoTrack); + doc.put("isMegaEvolved", pokemong.getMegaEvolved()); + doc.put("trainer", pokemong.getTrainer()); + List types = Optional.ofNullable(pokemong.getTypes()) + .orElse(Collections.emptyList()) + .stream() + .map(type -> { + Document typeDoc = new Document(); + typeDoc.put("name", + type.getName() + .name()); + List weakAgainst = type.getWeakAgainst() + .stream() + .map(Enum::name) + .collect(Collectors.toList()); + typeDoc.put("weakAgainst", weakAgainst); + List effectiveAgainst = type.getEffectiveAgainst() + .stream() + .map(Enum::name) + .collect(Collectors.toList()); + typeDoc.put("effectiveAgainst", effectiveAgainst); + return typeDoc; + }) + .collect(Collectors.toList()); + doc.put("types", types); + doc.put("moveSet", pokemong.getMoveSet()); + documentCodec.encode(writer, doc, encoderContext); + } + + @Override + public Class getEncoderClass() { + return Pokemong.class; + } + + @Override + public Pokemong decode(BsonReader reader, DecoderContext decoderContext) { + Document document = documentCodec.decode(reader, decoderContext); + Pokemong pokemong = new Pokemong(); + pokemong.setId(document.getObjectId("_id").toString()); + pokemong.setNickname(document.getString("nickname")); + Date dob = document.getDate("dob"); + if (dob != null) { + pokemong.setDob(dob.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate()); + } + pokemong.setPokedexId(document.getInteger("pokedexId")); + pokemong.setEvoStage(document.getInteger("evoStage")); + List evoTrack = Optional.ofNullable((List) document.get("evoTrack")) + .orElse(Collections.emptyList()) + .stream() + .map(PokemongName::valueOf) + .collect(Collectors.toList()); + pokemong.setEvoTrack(evoTrack); + pokemong.setMegaEvolved(document.getBoolean("isMegaEvolved")); + pokemong.setTrainer(document.getObjectId("trainer")); + List types = Optional.ofNullable((List) document.get("types")) + .orElse(Collections.emptyList()) + .stream() + .map(typeDoc -> { + Type type = new Type(); + type.setName(TypeName.valueOf(typeDoc.getString("name"))); + List weakAgainst = Optional + .ofNullable((List) typeDoc.get("weakAgainst")) + .orElse(Collections.emptyList()) + .stream() + .map(TypeName::valueOf) + .collect(Collectors.toList()); + type.setWeakAgainst(weakAgainst); + List effectiveAgainst = Optional + .ofNullable((List) typeDoc.get("effectiveAgainst")) + .orElse(Collections.emptyList()) + .stream() + .map(TypeName::valueOf) + .collect(Collectors.toList()); + type.setEffectiveAgainst(effectiveAgainst); + return type; + }) + .collect(Collectors.toList()); + pokemong.setTypes(types); + pokemong.setMoveSet(Optional.ofNullable(document.getList("moveSet", ObjectId.class)) + .orElse(Collections.emptyList())); + return pokemong; + } +} diff --git a/src/main/java/fr/uca/iut/codecs/pokemong/PokemongCodecProvider.java b/src/main/java/fr/uca/iut/codecs/pokemong/PokemongCodecProvider.java new file mode 100644 index 0000000..376412f --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/pokemong/PokemongCodecProvider.java @@ -0,0 +1,16 @@ +package fr.uca.iut.codecs.pokemong; + +import fr.uca.iut.entities.Pokemong; +import org.bson.codecs.Codec; +import org.bson.codecs.configuration.CodecProvider; +import org.bson.codecs.configuration.CodecRegistry; + +public class PokemongCodecProvider implements CodecProvider { + @Override + public Codec get(Class clazz, CodecRegistry registry) { + if (clazz.equals(Pokemong.class)) { + return (Codec) new PokemongCodec(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/fr/uca/iut/codecs/trainer/TrainerCodec.java b/src/main/java/fr/uca/iut/codecs/trainer/TrainerCodec.java new file mode 100644 index 0000000..ea2a396 --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/trainer/TrainerCodec.java @@ -0,0 +1,57 @@ +package fr.uca.iut.codecs.trainer; + +import com.mongodb.MongoClientSettings; +import fr.uca.iut.codecs.GenericCodec; +import fr.uca.iut.entities.Trainer; +import org.bson.*; +import org.bson.codecs.Codec; +import org.bson.codecs.DecoderContext; +import org.bson.codecs.EncoderContext; +import org.bson.types.ObjectId; + +import java.time.ZoneId; +import java.util.Date; + +public class TrainerCodec extends GenericCodec { + private final Codec documentCodec; + + public TrainerCodec() { + this.documentCodec = MongoClientSettings.getDefaultCodecRegistry() + .get(Document.class); + } + + @Override + public void encode(BsonWriter writer, Trainer trainer, EncoderContext encoderContext) { + Document doc = new Document(); + doc.put("_id", new ObjectId(trainer.getId())); + doc.put("name", trainer.getName()); + doc.put("dob", Date.from(trainer.getDob().atStartOfDay(ZoneId.systemDefault()).toInstant())); + doc.put("wins", trainer.getWins()); + doc.put("losses", trainer.getLosses()); + doc.put("pastOpponents", trainer.getPastOpponents()); + doc.put("pokemongs", trainer.getPokemongs()); + documentCodec.encode(writer, doc, encoderContext); + } + + @Override + public Class getEncoderClass() { + return Trainer.class; + } + + @Override + public Trainer decode(BsonReader reader, DecoderContext decoderContext) { + Document document = documentCodec.decode(reader, decoderContext); + Trainer trainer = new Trainer(); + trainer.setId(document.getObjectId("_id").toString()); + trainer.setName(document.getString("name")); + Date dob = document.getDate("dob"); + if (dob != null) { + trainer.setDob(dob.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + } + trainer.setWins(document.getInteger("wins", 0)); + trainer.setLosses(document.getInteger("losses", 0)); + trainer.setPastOpponents(document.getList("pastOpponents", ObjectId.class)); + trainer.setPokemongs(document.getList("pokemongs", ObjectId.class)); + return trainer; + } +} diff --git a/src/main/java/fr/uca/iut/codecs/trainer/TrainerCodecProvider.java b/src/main/java/fr/uca/iut/codecs/trainer/TrainerCodecProvider.java new file mode 100644 index 0000000..80c178e --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/trainer/TrainerCodecProvider.java @@ -0,0 +1,16 @@ +package fr.uca.iut.codecs.trainer; + +import fr.uca.iut.entities.Trainer; +import org.bson.codecs.Codec; +import org.bson.codecs.configuration.CodecProvider; +import org.bson.codecs.configuration.CodecRegistry; + +public class TrainerCodecProvider implements CodecProvider { + @Override + public Codec get(Class clazz, CodecRegistry registry) { + if (clazz.equals(Trainer.class)) { + return (Codec) new TrainerCodec(); + } + return null; + } +} diff --git a/src/main/java/fr/uca/iut/codecs/type/TypeCodec.java b/src/main/java/fr/uca/iut/codecs/type/TypeCodec.java new file mode 100644 index 0000000..8b01381 --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/type/TypeCodec.java @@ -0,0 +1,67 @@ +package fr.uca.iut.codecs.type; + +import com.mongodb.MongoClientSettings; +import fr.uca.iut.entities.Type; +import fr.uca.iut.utils.TypeName; +import org.bson.*; +import org.bson.codecs.Codec; +import org.bson.codecs.DecoderContext; +import org.bson.codecs.EncoderContext; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class TypeCodec implements Codec { + private final Codec documentCodec; + + public TypeCodec() { + this.documentCodec = MongoClientSettings.getDefaultCodecRegistry() + .get(Document.class); + } + + @Override + public void encode(BsonWriter writer, Type type, EncoderContext encoderContext) { + Document doc = new Document(); + Optional.ofNullable(type.getName()) + .map(Enum::name) + .ifPresent(name -> doc.put("name", name)); + + Optional.ofNullable(type.getWeakAgainst()) + .map(weakAgainst -> weakAgainst.stream().map(Enum::name).collect(Collectors.toList())) + .ifPresent(weakAgainst -> doc.put("weakAgainst", weakAgainst)); + + Optional.ofNullable(type.getEffectiveAgainst()) + .map(effectiveAgainst -> effectiveAgainst.stream().map(Enum::name).collect(Collectors.toList())) + .ifPresent(effectiveAgainst -> doc.put("effectiveAgainst", effectiveAgainst)); + + documentCodec.encode(writer, doc, encoderContext); + } + + @Override + public Class getEncoderClass() { + return Type.class; + } + + @Override + public Type decode(BsonReader reader, DecoderContext decoderContext) { + Document document = documentCodec.decode(reader, decoderContext); + Type type = new Type(); + + Optional.ofNullable(document.getString("name")) + .map(TypeName::valueOf) + .ifPresent(type::setName); + + Optional.ofNullable(document.get("weakAgainst")) + .filter(obj -> obj instanceof List) + .map(obj -> ((List) obj).stream().map(TypeName::valueOf).collect(Collectors.toList())) + .ifPresent(type::setWeakAgainst); + + Optional.ofNullable(document.get("effectiveAgainst")) + .filter(obj -> obj instanceof List) + .map(obj -> ((List) obj).stream().map(TypeName::valueOf).collect(Collectors.toList())) + .ifPresent(type::setEffectiveAgainst); + + return type; + } +} diff --git a/src/main/java/fr/uca/iut/codecs/type/TypeCodecProvider.java b/src/main/java/fr/uca/iut/codecs/type/TypeCodecProvider.java new file mode 100644 index 0000000..4a75c95 --- /dev/null +++ b/src/main/java/fr/uca/iut/codecs/type/TypeCodecProvider.java @@ -0,0 +1,16 @@ +package fr.uca.iut.codecs.type; + +import fr.uca.iut.entities.Type; +import org.bson.codecs.Codec; +import org.bson.codecs.configuration.CodecProvider; +import org.bson.codecs.configuration.CodecRegistry; + +public class TypeCodecProvider implements CodecProvider { + @Override + public Codec get(Class clazz, CodecRegistry registry) { + if (clazz.equals(Type.class)) { + return (Codec) new TypeCodec(); + } + return null; + } +} diff --git a/src/main/java/fr/uca/iut/controllers/PokemongController.java b/src/main/java/fr/uca/iut/controllers/PokemongController.java index af6e2f6..9032f87 100644 --- a/src/main/java/fr/uca/iut/controllers/PokemongController.java +++ b/src/main/java/fr/uca/iut/controllers/PokemongController.java @@ -6,7 +6,6 @@ import jakarta.inject.Inject; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; -import org.bson.types.ObjectId; @Path("/pokemong") @Produces(MediaType.APPLICATION_JSON) @@ -19,8 +18,7 @@ public class PokemongController { @Path("/{id}") public Response getPokemong(@PathParam("id") String id) { try { - ObjectId objectId = new ObjectId(id); - Pokemong pokemong = pokemongService.getPokemong(objectId); + Pokemong pokemong = pokemongService.getPokemong(id); if (pokemong != null) { return Response.ok(pokemong) .build(); @@ -48,7 +46,7 @@ public class PokemongController { public Response createPokemong(Pokemong pokemong) { if (pokemongService.isNotMature(pokemong)) { - pokemong.isMegaEvolved = null; + pokemong.setMegaEvolved(null); } Pokemong newPokemong = pokemongService.addPokemong(pokemong); @@ -64,10 +62,10 @@ public class PokemongController { public Response updatePokemong(@PathParam("id") String id, Pokemong pokemong) { try { if (pokemongService.isNotMature(pokemong)) { - pokemong.isMegaEvolved = null; + pokemong.setMegaEvolved(null); } - pokemong.id = new ObjectId(id); + pokemong.setId(id); Pokemong updatedPokemong = pokemongService.updatePokemong(pokemong); if (updatedPokemong != null) { @@ -91,8 +89,7 @@ public class PokemongController { @Path("/{id}") public Response deletePokemong(@PathParam("id") String id) { try { - ObjectId objectId = new ObjectId(id); - pokemongService.deletePokemong(objectId); + pokemongService.deletePokemong(id); return Response.ok() .build(); diff --git a/src/main/java/fr/uca/iut/entities/GenericEntity.java b/src/main/java/fr/uca/iut/entities/GenericEntity.java new file mode 100644 index 0000000..bcfbf04 --- /dev/null +++ b/src/main/java/fr/uca/iut/entities/GenericEntity.java @@ -0,0 +1,32 @@ +package fr.uca.iut.entities; + +import org.bson.codecs.pojo.annotations.BsonId; + +import java.util.Objects; + +public abstract class GenericEntity { + + @BsonId + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GenericEntity entity = (GenericEntity) o; + return Objects.equals(id, entity.id); + } +} diff --git a/src/main/java/fr/uca/iut/entities/Move.java b/src/main/java/fr/uca/iut/entities/Move.java index c1655fd..d0dacc0 100644 --- a/src/main/java/fr/uca/iut/entities/Move.java +++ b/src/main/java/fr/uca/iut/entities/Move.java @@ -1,13 +1,65 @@ package fr.uca.iut.entities; -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.common.MongoEntity; - -@MongoEntity(collection = "moves") -public class Move extends PanacheMongoEntity { - public String name; - public String category; - public Integer power; - public Integer accuracy; - public Type type; +import org.bson.codecs.pojo.annotations.BsonId; + +public class Move extends GenericEntity { + public static final String COLLECTION_NAME = "moves"; + + @BsonId + private String id; + private String name; + private String category; + private Integer power; + private Integer accuracy; + private Type type; + + public Move() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Integer getPower() { + return power; + } + + public void setPower(Integer power) { + this.power = power; + } + + public Integer getAccuracy() { + return accuracy; + } + + public void setAccuracy(Integer accuracy) { + this.accuracy = accuracy; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } } \ No newline at end of file diff --git a/src/main/java/fr/uca/iut/entities/Pokemong.java b/src/main/java/fr/uca/iut/entities/Pokemong.java index e4ac19a..d55deee 100644 --- a/src/main/java/fr/uca/iut/entities/Pokemong.java +++ b/src/main/java/fr/uca/iut/entities/Pokemong.java @@ -1,25 +1,119 @@ package fr.uca.iut.entities; import fr.uca.iut.utils.PokemongName; -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.common.MongoEntity; +import org.bson.codecs.pojo.annotations.BsonId; import org.bson.types.ObjectId; import java.time.LocalDate; import java.util.List; -import java.util.Set; - -@MongoEntity(collection = "pokemongs") -public class Pokemong extends PanacheMongoEntity { - public String nickname; - public LocalDate dob; - public Integer level; - public Integer pokedexId; - public Integer evoStage; - public List evoTrack; - public Boolean isMegaEvolved; - public ObjectId trainer; - public Set types; // TODO Bound this within [1;2] (in controller) - public List moveSet; // TODO Bound this within [1;4] (in controller) and denormalize move "name" + +public class Pokemong extends GenericEntity { + public static final String COLLECTION_NAME = "pokemongs"; + @BsonId + private String id; + private String nickname; + private LocalDate dob; + private Integer level; + private Integer pokedexId; + private Integer evoStage; + private List evoTrack; + private Boolean isMegaEvolved; + private ObjectId trainer; + private List types; // TODO Bound this within [1;2] (in controller) + private List moveSet; // TODO Bound this within [1;4] (in controller) and denormalize move "name" + + public Pokemong() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public LocalDate getDob() { + return dob; + } + + public void setDob(LocalDate dob) { + this.dob = dob; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getPokedexId() { + return pokedexId; + } + + public void setPokedexId(Integer pokedexId) { + this.pokedexId = pokedexId; + } + + public Integer getEvoStage() { + return evoStage; + } + + public void setEvoStage(Integer evoStage) { + this.evoStage = evoStage; + } + + public List getEvoTrack() { + return evoTrack; + } + + public void setEvoTrack(List evoTrack) { + this.evoTrack = evoTrack; + } + + public Boolean getMegaEvolved() { + return isMegaEvolved; + } + + public void setMegaEvolved(Boolean megaEvolved) { + isMegaEvolved = megaEvolved; + } + + public ObjectId getTrainer() { + return trainer; + } + + public void setTrainer(ObjectId trainer) { + this.trainer = trainer; + } + + // TODO take particular care with collections + + // TODO study the question of encapsulation when it comes to using these dependencies... + public List getTypes() { + return types; + } + + public void setTypes(List types) { + this.types = types; + } + + public List getMoveSet() { + return moveSet; + } + + public void setMoveSet(List moveSet) { + this.moveSet = moveSet; + } + } diff --git a/src/main/java/fr/uca/iut/entities/Trainer.java b/src/main/java/fr/uca/iut/entities/Trainer.java index e4330e4..7b920e3 100644 --- a/src/main/java/fr/uca/iut/entities/Trainer.java +++ b/src/main/java/fr/uca/iut/entities/Trainer.java @@ -1,18 +1,78 @@ package fr.uca.iut.entities; -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.common.MongoEntity; +import org.bson.codecs.pojo.annotations.BsonId; import org.bson.types.ObjectId; import java.time.LocalDate; import java.util.List; -@MongoEntity(collection = "trainers") -public class Trainer extends PanacheMongoEntity { - public String name; - public LocalDate dob; - public Integer wins; - public Integer losses; - public List pastOpponents; - public List pokemongs; +public class Trainer extends GenericEntity { + public static final String COLLECTION_NAME = "trainers"; + + @BsonId + private String id; + private String name; + private LocalDate dob; + private Integer wins; + private Integer losses; + private List pastOpponents; + private List pokemongs; + + public Trainer() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LocalDate getDob() { + return dob; + } + + public void setDob(LocalDate dob) { + this.dob = dob; + } + + public Integer getWins() { + return wins; + } + + public void setWins(Integer wins) { + this.wins = wins; + } + + public Integer getLosses() { + return losses; + } + + public void setLosses(Integer losses) { + this.losses = losses; + } + + public List getPastOpponents() { + return pastOpponents; + } + + public void setPastOpponents(List pastOpponents) { + this.pastOpponents = pastOpponents; + } + + public List getPokemongs() { + return pokemongs; + } + + public void setPokemongs(List pokemongs) { + this.pokemongs = pokemongs; + } } diff --git a/src/main/java/fr/uca/iut/entities/Type.java b/src/main/java/fr/uca/iut/entities/Type.java index 476cfe5..6eb5756 100644 --- a/src/main/java/fr/uca/iut/entities/Type.java +++ b/src/main/java/fr/uca/iut/entities/Type.java @@ -1,17 +1,41 @@ package fr.uca.iut.entities; import fr.uca.iut.utils.TypeName; -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.common.MongoEntity; import java.util.List; import java.util.Objects; -@MongoEntity(collection = "types") -public class Type extends PanacheMongoEntity { - public TypeName name; - public List weakAgainst; - public List effectiveAgainst; +public class Type { + + private TypeName name; + private List weakAgainst; + private List effectiveAgainst; + + public Type() {} + + public TypeName getName() { + return name; + } + + public void setName(TypeName name) { + this.name = name; + } + + public List getWeakAgainst() { + return weakAgainst; + } + + public void setWeakAgainst(List weakAgainst) { + this.weakAgainst = weakAgainst; + } + + public List getEffectiveAgainst() { + return effectiveAgainst; + } + + public void setEffectiveAgainst(List effectiveAgainst) { + this.effectiveAgainst = effectiveAgainst; + } @Override public int hashCode() { @@ -27,4 +51,5 @@ public class Type extends PanacheMongoEntity { Objects.equals(weakAgainst, type.weakAgainst) && Objects.equals(effectiveAgainst, type.effectiveAgainst); } -} + +} \ No newline at end of file diff --git a/src/main/java/fr/uca/iut/repositories/MoveRepository.java b/src/main/java/fr/uca/iut/repositories/MoveRepository.java deleted file mode 100644 index 14a2007..0000000 --- a/src/main/java/fr/uca/iut/repositories/MoveRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.uca.iut.repositories; - -import fr.uca.iut.entities.Move; -import io.quarkus.mongodb.panache.PanacheMongoRepository; -import jakarta.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class MoveRepository implements PanacheMongoRepository { -} diff --git a/src/main/java/fr/uca/iut/repositories/PokemongRepository.java b/src/main/java/fr/uca/iut/repositories/PokemongRepository.java index a883808..f60ec5d 100644 --- a/src/main/java/fr/uca/iut/repositories/PokemongRepository.java +++ b/src/main/java/fr/uca/iut/repositories/PokemongRepository.java @@ -1,9 +1,58 @@ package fr.uca.iut.repositories; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.ReplaceOptions; import fr.uca.iut.entities.Pokemong; -import io.quarkus.mongodb.panache.PanacheMongoRepository; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.bson.types.ObjectId; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import java.util.ArrayList; +import java.util.List; + +import static com.mongodb.client.model.Filters.eq; @ApplicationScoped -public class PokemongRepository implements PanacheMongoRepository { +public class PokemongRepository { + + // FIXME? or suppress warning: "Unsatisfied dependency: no bean matches the injection point" + @Inject + MongoClient mongoClient; + + @ConfigProperty(name = "quarkus.mongodb.database") + String DB_NAME; + + private MongoCollection getCollection() { + MongoDatabase db = mongoClient.getDatabase(DB_NAME); + return db.getCollection(Pokemong.COLLECTION_NAME, Pokemong.class); + } + + public Pokemong findById(String id) { + return getCollection().find(eq("_id", new ObjectId(id))) + .first(); + } + + public void persist(Pokemong pokemong) { + getCollection().insertOne(pokemong); + } + + public List listAll() { + return getCollection().find() + .into(new ArrayList<>()); + } + + public void delete(Pokemong pokemong) { + getCollection().deleteOne(eq("_id", new ObjectId(pokemong.getId()))); + } + + public void persistOrUpdate(Pokemong pokemong) { + getCollection().replaceOne( + eq("_id", new ObjectId(pokemong.getId())), + pokemong, + new ReplaceOptions().upsert(true) + ); + } } diff --git a/src/main/java/fr/uca/iut/repositories/TrainerRepository.java b/src/main/java/fr/uca/iut/repositories/TrainerRepository.java deleted file mode 100644 index ac92959..0000000 --- a/src/main/java/fr/uca/iut/repositories/TrainerRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.uca.iut.repositories; - -import fr.uca.iut.entities.Trainer; -import io.quarkus.mongodb.panache.PanacheMongoRepository; -import jakarta.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class TrainerRepository implements PanacheMongoRepository { -} diff --git a/src/main/java/fr/uca/iut/repositories/TypeRepository.java b/src/main/java/fr/uca/iut/repositories/TypeRepository.java deleted file mode 100644 index cfa5f57..0000000 --- a/src/main/java/fr/uca/iut/repositories/TypeRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.uca.iut.repositories; - -import fr.uca.iut.entities.Type; -import io.quarkus.mongodb.panache.PanacheMongoRepository; -import jakarta.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class TypeRepository implements PanacheMongoRepository { -} diff --git a/src/main/java/fr/uca/iut/services/MoveService.java b/src/main/java/fr/uca/iut/services/MoveService.java deleted file mode 100644 index ba5413a..0000000 --- a/src/main/java/fr/uca/iut/services/MoveService.java +++ /dev/null @@ -1,4 +0,0 @@ -package fr.uca.iut.services; - -public class MoveService { -} diff --git a/src/main/java/fr/uca/iut/services/PokemongService.java b/src/main/java/fr/uca/iut/services/PokemongService.java index a0fb627..b7d47a5 100644 --- a/src/main/java/fr/uca/iut/services/PokemongService.java +++ b/src/main/java/fr/uca/iut/services/PokemongService.java @@ -4,7 +4,6 @@ import fr.uca.iut.entities.Pokemong; import fr.uca.iut.repositories.PokemongRepository; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.bson.types.ObjectId; import java.util.List; @@ -19,7 +18,7 @@ public class PokemongService { return pokemong; } - public Pokemong getPokemong(ObjectId id) { + public Pokemong getPokemong(String id) { return pokemongRepository.findById(id); } @@ -27,7 +26,7 @@ public class PokemongService { return pokemongRepository.listAll(); } - public void deletePokemong(ObjectId id) { + public void deletePokemong(String id) { Pokemong pokemong = pokemongRepository.findById(id); if (pokemong != null) { pokemongRepository.delete(pokemong); @@ -35,18 +34,18 @@ public class PokemongService { } public Pokemong updatePokemong(Pokemong pokemong) { - Pokemong existingPokemong = pokemongRepository.findById(pokemong.id); + Pokemong existingPokemong = pokemongRepository.findById(pokemong.getId()); if (existingPokemong != null) { - existingPokemong.nickname = pokemong.nickname; - existingPokemong.dob = pokemong.dob; - existingPokemong.level = pokemong.level; - existingPokemong.pokedexId = pokemong.pokedexId; - existingPokemong.evoStage = pokemong.evoStage; - existingPokemong.evoTrack = pokemong.evoTrack; - existingPokemong.isMegaEvolved = pokemong.isMegaEvolved; - existingPokemong.trainer = pokemong.trainer; - existingPokemong.types = pokemong.types; - existingPokemong.moveSet = pokemong.moveSet; + 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.setMegaEvolved(pokemong.getMegaEvolved()); + existingPokemong.setTrainer(pokemong.getTrainer()); + existingPokemong.setTypes(pokemong.getTypes()); + existingPokemong.setMoveSet(pokemong.getMoveSet()); pokemongRepository.persistOrUpdate(existingPokemong); } return existingPokemong; @@ -54,10 +53,12 @@ public class PokemongService { public boolean isNotMature(Pokemong pokemong) { return pokemong == null - || pokemong.evoStage == null - || pokemong.evoTrack == null - || pokemong.evoTrack.isEmpty() - || (pokemong.evoStage != pokemong.evoTrack.size() - 1); + || pokemong.getEvoStage() == null + || pokemong.getEvoTrack() == null + || pokemong.getEvoTrack() + .isEmpty() + || (pokemong.getEvoStage() != pokemong.getEvoTrack() + .size() - 1); } // TODO PATCH ? diff --git a/src/main/java/fr/uca/iut/services/TrainerService.java b/src/main/java/fr/uca/iut/services/TrainerService.java deleted file mode 100644 index 5a52ba9..0000000 --- a/src/main/java/fr/uca/iut/services/TrainerService.java +++ /dev/null @@ -1,4 +0,0 @@ -package fr.uca.iut.services; - -public class TrainerService { -} diff --git a/src/main/java/fr/uca/iut/services/TypeService.java b/src/main/java/fr/uca/iut/services/TypeService.java deleted file mode 100644 index 8584257..0000000 --- a/src/main/java/fr/uca/iut/services/TypeService.java +++ /dev/null @@ -1,4 +0,0 @@ -package fr.uca.iut.services; - -public class TypeService { -}