diff --git a/node/code/RIOT b/node/code/RIOT index 886c6a27..a67793d6 160000 --- a/node/code/RIOT +++ b/node/code/RIOT @@ -1 +1 @@ -Subproject commit 886c6a27099bed0157a3bc21fbcd221778bf834d +Subproject commit a67793d6018c17256a5666a665fddf45fbc803f2 diff --git a/node/code/modules/display_handler/forg (1).c:Zone.Identifier b/node/code/modules/display_handler/forg (1).c:Zone.Identifier deleted file mode 100644 index a1036a49..00000000 --- a/node/code/modules/display_handler/forg (1).c:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=https://lvgl.io/ diff --git a/node/pcb/teamagotchi.zip b/node/pcb/teamagotchi.zip index a476d79c..117ed056 100644 Binary files a/node/pcb/teamagotchi.zip and b/node/pcb/teamagotchi.zip differ diff --git a/web_backend/pom.xml b/web_backend/pom.xml index 8471bf32..119be7f3 100644 --- a/web_backend/pom.xml +++ b/web_backend/pom.xml @@ -12,6 +12,7 @@ 3.0.2 3.1.0 1.18.32 + 1.6.0.Beta2 21 UTF-8 UTF-8 @@ -41,6 +42,14 @@ io.quarkus quarkus-rest-client-jackson + + io.quarkus + quarkus-rest + + + io.quarkus + quarkus-rest-jackson + io.quarkus quarkus-hibernate-orm-panache @@ -53,6 +62,10 @@ io.quarkus quarkus-jdbc-h2 + + io.quarkus + quarkus-smallrye-openapi + io.quarkus quarkus-junit5 @@ -78,6 +91,11 @@ jakarta.validation-api ${jakarta.validation.version} + + org.mapstruct + mapstruct + ${mapstruct.version} + org.projectlombok lombok @@ -112,6 +130,24 @@ -parameters + + + org.projectlombok + lombok + ${lombok.version} + + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/UcHandleLeshanEventsImpl.java b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/UcHandleLeshanEventsImpl.java index e917afa2..1d63652e 100644 --- a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/UcHandleLeshanEventsImpl.java +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/UcHandleLeshanEventsImpl.java @@ -11,6 +11,7 @@ */ @ApplicationScoped public class UcHandleLeshanEventsImpl implements UcHandleLeshanEvents { + @Override public void handleRegistration(RegistrationDto dto) { System.out.println("Registration: " + dto.registrationId); diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/LeshanEventListener.java b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/LeshanEventListener.java index dc50f550..04f6b18e 100644 --- a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/LeshanEventListener.java +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/LeshanEventListener.java @@ -8,6 +8,7 @@ import haw.teamagochi.backend.leshanclient.datatypes.events.CoaplogDto; import haw.teamagochi.backend.leshanclient.datatypes.events.RegistrationDto; import haw.teamagochi.backend.leshanclient.datatypes.events.UpdatedDto; +import io.quarkus.arc.profile.UnlessBuildProfile; import io.quarkus.logging.Log; import io.quarkus.runtime.Startup; import jakarta.enterprise.context.ApplicationScoped; @@ -17,6 +18,7 @@ /** * Subscribes to Leshan events and passes them to {@link UcHandleLeshanEvents}. */ +@UnlessBuildProfile("test") @ApplicationScoped public class LeshanEventListener { diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResource.java b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResource.java index 16c9ceb3..de806442 100644 --- a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResource.java +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResource.java @@ -1,38 +1,30 @@ package haw.teamagochi.backend.device.logic.clients.rest; import haw.teamagochi.backend.leshanclient.datatypes.rest.*; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import java.util.Set; import org.eclipse.microprofile.rest.client.inject.RestClient; -/** Resource for {@link LeshanClientRestclient}. */ -@Path("/") +/** + * Resource for {@link LeshanClientRestclient}. + */ public class LeshanClientResource { @RestClient LeshanClientRestclient clientRestclient; - @GET public Set getClients() { return clientRestclient.getClients(); } - @GET - @Path("/clients/{endpoint}") public ClientDto getClient(@PathParam("endpoint") String endpoint) { return clientRestclient.getClient(endpoint); } - @GET - @Path("/clients/{endpoint}/{object}") public ObjectResponseDto getClientObject( @PathParam("endpoint") String endpoint, @PathParam("object") Integer object) { return clientRestclient.getClientObject(endpoint, object); } - @GET - @Path("/clients/{endpoint}/{object}/{instance}") public ObjectInstanceResponseDto getClientObjectInstance( @PathParam("endpoint") String endpoint, @PathParam("object") Integer object, @@ -40,8 +32,6 @@ public ObjectInstanceResponseDto getClientObjectInstance( return clientRestclient.getClientObjectInstance(endpoint, object, instance); } - @GET - @Path("/clients/{endpoint}/{object}/{instance}/{resource}") public ResourceResponseDto getClientResource( @PathParam("endpoint") String endpoint, @PathParam("object") Integer object, @@ -50,8 +40,6 @@ public ResourceResponseDto getClientResource( return clientRestclient.getClientResource(endpoint, object, instance, resource); } - @GET - @Path("/objectspecs/{endpoint}") public Set getClientObjectSpecifications(@PathParam("endpoint") String endpoint) { return clientRestclient.getClientObjectSpecifications(endpoint); } diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientRestclient.java b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientRestclient.java index ccf58308..972b3656 100644 --- a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientRestclient.java +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientRestclient.java @@ -26,25 +26,25 @@ public interface LeshanClientRestclient { @GET @Path("/clients/{endpoint}/{object}") - ObjectResponseDto getClientObject(@PathParam("endpoint") String endpoint, @PathParam("object") Integer object); + ObjectResponseDto getClientObject( + @PathParam("endpoint") String endpoint, @PathParam("object") Integer object); @GET @Path("/clients/{endpoint}/{object}/{instance}") - ObjectInstanceResponseDto getClientObjectInstance(@PathParam("endpoint") String endpoint, @PathParam("object") Integer object, @PathParam("instance") Integer instance); + ObjectInstanceResponseDto getClientObjectInstance( + @PathParam("endpoint") String endpoint, + @PathParam("object") Integer object, + @PathParam("instance") Integer instance); @GET @Path("/clients/{endpoint}/{object}/{instance}/{resource}") - ResourceResponseDto getClientResource(@PathParam("endpoint") String endpoint, @PathParam("object") Integer object, @PathParam("instance") Integer instance, @PathParam("resource") Integer resource); + ResourceResponseDto getClientResource( + @PathParam("endpoint") String endpoint, + @PathParam("object") Integer object, + @PathParam("instance") Integer instance, + @PathParam("resource") Integer resource); @GET @Path("/objectspecs/{endpoint}") Set getClientObjectSpecifications(@PathParam("endpoint") String endpoint); - -// @GET -// @Path("/{id}") -// ClientDto getById(@PathParam("id") String id); - -// @GET -// @Path("/{id}/{objectId}/{objectInstanceId}/{resourceId}") -// ClientDto getById(@PathParam("id") String id, @PathParam("objectId") Integer objectId, @PathParam("objectInstanceId") Integer objectInstanceId, @PathParam("resourceId") Integer resourceId); } diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventClient.java b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventClient.java index c4d92ea9..e67deb6a 100644 --- a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventClient.java +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventClient.java @@ -25,36 +25,43 @@ public interface LeshanEventClient { @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) @SseEventFilter(RegistrationEventFilter.class) Multi> registration(); @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) @SseEventFilter(DeregistrationEventFilter.class) Multi> deregistration(); @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) @SseEventFilter(UpdatedEventFilter.class) Multi> updated(); @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) @SseEventFilter(SleepingEventFilter.class) Multi> sleeping(); @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) @SseEventFilter(AwakeEventFilter.class) Multi> awake(); @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) @SseEventFilter(CoaplogEventFilter.class) Multi> coaplog(); @GET + @Path("/") @Produces(MediaType.SERVER_SENT_EVENTS) Multi> events(); } diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventResource.java b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventResource.java index 08227609..d295eb19 100644 --- a/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventResource.java +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/logic/clients/sse/LeshanEventResource.java @@ -3,14 +3,12 @@ import io.smallrye.mutiny.Multi; import jakarta.inject.Singleton; import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.jboss.resteasy.reactive.client.SseEvent; /** * Event resource for {@link LeshanEventClient}. */ -@Path("/event") @Singleton public class LeshanEventResource { @@ -18,43 +16,36 @@ public class LeshanEventResource { LeshanEventClient eventClient; @GET - @Path("/") public Multi> registration() { return eventClient.registration(); } @GET - @Path("/") public Multi> deregistration() { return eventClient.deregistration(); } @GET - @Path("/") public Multi> updated() { return eventClient.updated(); } @GET - @Path("/") public Multi> sleeping() { return eventClient.sleeping(); } @GET - @Path("/") public Multi> awake() { return eventClient.awake(); } @GET - @Path("/") public Multi> coaplog() { return eventClient.coaplog(); } @GET - @Path("/") public Multi> events() { return eventClient.events(); } diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/DeviceRestService.java b/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/DeviceRestService.java new file mode 100644 index 00000000..6a8206a5 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/DeviceRestService.java @@ -0,0 +1,116 @@ +package haw.teamagochi.backend.device.service.rest.v1; + +import haw.teamagochi.backend.device.dataaccess.model.DeviceEntity; +import haw.teamagochi.backend.device.logic.UcFindDeviceImpl; +import haw.teamagochi.backend.device.service.rest.v1.mapper.DeviceMapper; +import haw.teamagochi.backend.device.service.rest.v1.model.DeviceDTO; +import jakarta.inject.Inject; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import java.util.ArrayList; +import java.util.List; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +/** + * Rest interface for the device component. + */ +@Path("/v1/device") +@Tag(name = "device", description = "Everything about devices.") +public class DeviceRestService { + + @Inject + protected DeviceMapper deviceMapper; + + @Inject + protected UcFindDeviceImpl findDevice; + + /** + * Get all devices. + * + * @return a list of all {@link DeviceDTO DeviceDTOs}, possibly empty + */ + @GET + @Operation(summary = "Get all devices") + @APIResponse(responseCode = "200") + public List getDevices() { + //TODO auth + UserID + long userID = 0l; //TODO + + List allDevices = findDevice.findAllByUserId(userID); + ArrayList allDevicesDTO = new ArrayList<>(); + for(DeviceEntity e : allDevices){ + allDevicesDTO.add(deviceMapper.fromResource(e)); + } + return allDevicesDTO; + //TODO handle possible errors + } + + /** + * Get a device by its id. + * + * @param deviceId of the device to get + * @return the {@link DeviceDTO} if found + * @throws NotFoundException if no device was found + */ + @GET + @Path("/{deviceId}") + @Operation(summary = "Get a device by its id") + @APIResponse(responseCode = "200") + @APIResponse(responseCode = "404", description = "Not Found") + public DeviceDTO getDeviceById(@PathParam("deviceId") long deviceId) { + //TODO user auth + if (findDevice.exists(deviceId)) { + DeviceEntity device = findDevice.find(deviceId); + DeviceDTO deviceDTO = deviceMapper.fromResource(device); + return deviceDTO; + } + throw new NotFoundException(); + } + + /** + * Delete a device by its id. + * + * @param deviceId of the device to delete + * @return the {@link DeviceDTO} if deleted + * @throws NotFoundException if no device was found + */ + @DELETE + @Path("/{deviceId}") + @Operation(summary = "Delete a device by its id") + @APIResponse(responseCode = "200") + @APIResponse(responseCode = "404", description = "Not Found") + public DeviceDTO deleteDevice(@PathParam("deviceId") long deviceId) { + // TODO replace with real implementation + if (deviceId == 1) { + return new DeviceDTO(1, "mock-device"); + } + throw new NotFoundException(); + } + + /** + * Register a device using a registration code. + * + * @param registrationCode the registration code for a device + * @return the {@link DeviceDTO} if registration code is valid + * @throws NotFoundException if the registration code is not found + */ + @POST + @Path("/register/{registrationCode}") + @Operation(summary = "Register a device using a registration code") + @APIResponse(responseCode = "200") + @APIResponse(responseCode = "404", description = "Not Found") + public DeviceDTO registerDevice(@PathParam("registrationCode") String registrationCode) { + // TODO replace with real implementation + if (registrationCode.equals("aaaaaa")) { //if registration manager returns device + //return DeviceDTO of returned Device + return new DeviceDTO(1, "mock-device"); + } + throw new NotFoundException(); + } +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/mapper/DeviceMapper.java b/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/mapper/DeviceMapper.java new file mode 100644 index 00000000..54959612 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/mapper/DeviceMapper.java @@ -0,0 +1,24 @@ +package haw.teamagochi.backend.device.service.rest.v1.mapper; + +import haw.teamagochi.backend.device.dataaccess.model.DeviceEntity; +import haw.teamagochi.backend.device.service.rest.v1.model.DeviceDTO; +import haw.teamagochi.backend.pet.dataaccess.model.PetEntity; +import org.mapstruct.InheritConfiguration; +import org.mapstruct.InheritInverseConfiguration; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel="cdi") +public interface DeviceMapper { + DeviceMapper MAPPER = Mappers.getMapper(DeviceMapper.class); + @Mapping(source = "deviceID", target = "id") + @Mapping(source = "deviceName", target = "name") + DeviceEntity toResource(DeviceDTO device); + + @InheritInverseConfiguration + DeviceDTO fromResource(DeviceEntity device); + + + +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/model/DeviceDTO.java b/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/model/DeviceDTO.java new file mode 100644 index 00000000..532ae2c6 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/device/service/rest/v1/model/DeviceDTO.java @@ -0,0 +1,17 @@ +package haw.teamagochi.backend.device.service.rest.v1.model; + +import haw.teamagochi.backend.pet.service.rest.v1.model.PetInfoDTO; +import lombok.Getter; + +@Getter +public class DeviceDTO { + long deviceID; + String deviceName; + //String deviceType; + + public DeviceDTO (long deviceID, String deviceName){ //}, String deviceType){ + this.deviceID = deviceID; + this.deviceName = deviceName; + //this.deviceType = deviceType; + } +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/PetRestService.java b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/PetRestService.java new file mode 100644 index 00000000..8ffc9e25 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/PetRestService.java @@ -0,0 +1,101 @@ +package haw.teamagochi.backend.pet.service.rest.v1; + +import haw.teamagochi.backend.device.service.rest.v1.model.DeviceDTO; +import haw.teamagochi.backend.pet.service.rest.v1.mapper.PetInfoMapper; +import haw.teamagochi.backend.pet.service.rest.v1.mapper.PetMapper; +import haw.teamagochi.backend.pet.service.rest.v1.model.PetDTO; +import haw.teamagochi.backend.pet.service.rest.v1.model.PetInfoDTO; +import jakarta.inject.Inject; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import java.util.ArrayList; +import java.util.List; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +/** + * Rest interface for the pet component. + */ +@Path("/v1/pet") +@Tag(name = "pet", description = "Everything about pets.") +public class PetRestService { + + @Inject + PetMapper petMapper; + + @Inject + PetInfoMapper petInfoMapper; + + /** + * Get all pets. + * + * @return a list of all {@link PetInfoDTO PetInfoDTOs}, possibly empty + */ + @GET + @Operation(summary = "Get all pets") + @APIResponse(responseCode = "200") + public List getPets() { + // TODO replace with real implementation + return new ArrayList<>(); + } + + /** + * Create a pet. + * + * @param dto containing the pet data + * @return the created pet + */ + @POST + @Operation(summary = "Create a pet") + @APIResponse(responseCode = "200") + public PetInfoDTO createPet(PetInfoDTO dto) { + // TODO replace with real implementation + return dto; + } + + /** + * Get a pet by its id. + * + * @param petId of the pet to get + * @return the {@link DeviceDTO} if found + * @throws NotFoundException if no pet was found + */ + @GET + @Path("/{petId}") + @Operation(summary = "Get a pet by its id") + @APIResponse(responseCode = "200") + @APIResponse(responseCode = "404", description = "Not Found") + public PetInfoDTO getPet(@PathParam("petId") long petId) { + // TODO replace with real implementation, probably with PetDTO + if (petId == 1) { + return null; + //return new PetInfoDTO(); + } + throw new NotFoundException(); + } + + /** + * Delete a pet by its id. + * + * @param petId of the pet to delete + * @return the {@link PetDTO} if deleted + * @throws NotFoundException if no device was found + */ + @DELETE + @Path("/{petId}") + @Operation(summary = "Delete a pet by its id") + @APIResponse(responseCode = "200") + @APIResponse(responseCode = "404", description = "Not Found") + public PetInfoDTO deletePet(@PathParam("petId") long petId) { + // TODO replace with real implementation + if (petId == 1) { + return null;//return new PetInfoDTO(); + } + throw new NotFoundException(); + } +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/mapper/PetInfoMapper.java b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/mapper/PetInfoMapper.java new file mode 100644 index 00000000..b52620d6 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/mapper/PetInfoMapper.java @@ -0,0 +1,18 @@ +package haw.teamagochi.backend.pet.service.rest.v1.mapper; + +import haw.teamagochi.backend.pet.dataaccess.model.PetEntity; +import haw.teamagochi.backend.pet.service.rest.v1.model.PetInfoDTO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel="cdi") +public interface PetInfoMapper { + + PetInfoMapper MAPPER = Mappers.getMapper(PetInfoMapper.class); + + @Mapping(target = "petID", expression = "java(pet.getId())") + @Mapping(target = "petName", expression = "java(pet.getName())") + @Mapping(target = "petType", expression = "java(pet.getPetType().toString())") + PetInfoDTO toResource(PetEntity pet); +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/mapper/PetMapper.java b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/mapper/PetMapper.java new file mode 100644 index 00000000..d4e7d805 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/mapper/PetMapper.java @@ -0,0 +1,45 @@ +package haw.teamagochi.backend.pet.service.rest.v1.mapper; + +import haw.teamagochi.backend.device.service.rest.v1.mapper.DeviceMapper; +import haw.teamagochi.backend.pet.dataaccess.model.PetEntity; +import haw.teamagochi.backend.pet.service.rest.v1.model.PetDTO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +//ggf als abstrct class um custom mappings zu erstellen --> ermöglicht nutzen von methoden??! +@Mapper(componentModel="cdi") +public interface PetMapper { + + PetMapper MAPPER = Mappers.getMapper(PetMapper.class); + @Mapping(target = "petID", expression = "java(pet.getId())") + @Mapping(target ="petName", expression = "java(pet.getName())") + @Mapping(target ="happiness", expression = "java(pet.getHappiness())") + @Mapping(target ="wellbeing", expression = "java(pet.getWellbeing())") + @Mapping(target ="health", expression = "java(pet.getHealth())") + @Mapping(target ="hunger", expression = "java(pet.getHunger())") + @Mapping(target ="cleanliness", expression = "java(pet.getCleanliness())") + @Mapping(target ="fun", expression = "java(pet.getFun())") + @Mapping(target = "petTypeName", expression = "java(pet.getPetType().getName())") + + @Mapping(target ="level", expression = "java(computeLevel(pet))") + @Mapping(target ="levelProgress", expression = "java(computeProgress(pet))") + PetDTO toResource(PetEntity pet); + + + default int computeLevel(PetEntity pet){ + //int[] levelInfo = LevelingManager.computeLevel(pet.xp); + //return levelInfo[0]; + //TODO + return 0; + + } + default int computeProgress(PetEntity pet){ + //int[] levelInfo = LevelingManager.computeLevel(pet.xp); + //return levelInfo[1]; + //TODO + return 0; + } + + +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/model/PetDTO.java b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/model/PetDTO.java new file mode 100644 index 00000000..29594c2a --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/model/PetDTO.java @@ -0,0 +1,42 @@ +package haw.teamagochi.backend.pet.service.rest.v1.model; + +import lombok.Getter; + +@Getter +public class PetDTO { + + long petID; //mapping done + int level; //mapping done + int xp; //mapping done + int levelProgress; //mapping done + String petName; //mapping done + int happiness; //mapping done + int wellbeing; //mapping done + int hunger; //mapping done + int health; //mapping done + int cleanliness; //mapping done + int fun; + String petTypeName; + + long deviceID; + + + + public PetDTO(int xp, String petName, long petID, int happiness, int wellbeing, int hunger, int cleanliness, int fun, + String petTypeName, int level, int levelProgress, int health){ + this.level = level; //compute level(xp); + this.levelProgress = levelProgress; //compute levelProg(xp) + this.petName = petName; //mapping done + this.petID = petID; //mapping done + this.happiness = happiness; // mapping done + this.wellbeing = wellbeing; //mapping done + this.hunger = hunger; //mapping done + this.cleanliness = cleanliness; //mapping done + this.fun = fun; //mapping done + this.petTypeName = petTypeName; + this.health = health; //mapping done + + + } + //TODO +} diff --git a/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/model/PetInfoDTO.java b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/model/PetInfoDTO.java new file mode 100644 index 00000000..50d4d2e7 --- /dev/null +++ b/web_backend/src/main/java/haw/teamagochi/backend/pet/service/rest/v1/model/PetInfoDTO.java @@ -0,0 +1,19 @@ +package haw.teamagochi.backend.pet.service.rest.v1.model; + +import lombok.Getter; + +@Getter +public class PetInfoDTO { + + long petID; + String petName; + String petType; + + public PetInfoDTO(long petID, String petName, String petType){ + this.petID = petID; + this.petType = petType; + this.petName = petName; + } + + //TODO +} diff --git a/web_backend/src/main/resources/application.properties b/web_backend/src/main/resources/application.properties index a947b212..f2b4814d 100644 --- a/web_backend/src/main/resources/application.properties +++ b/web_backend/src/main/resources/application.properties @@ -15,6 +15,28 @@ quarkus.rest-client.leshan-event-api.http2=true #%prod.quarkus.rest-client.leshan-event-api.url=http://teashan/api +# General +%test.quarkus.http.test-timeout=5s + +# Services +quarkus.rest.path=/api + +## OpenAPI UI +quarkus.swagger-ui.always-include=true + +## OpenAPI Metadata +quarkus.smallrye-openapi.info-title=Teamagochi Backend API (development) +quarkus.smallrye-openapi.info-version=1.0.0 +quarkus.smallrye-openapi.info-description=The REST interface for the Teamagochi frontend application. +#quarkus.smallrye-openapi.info-terms-of-service=Your terms here +#quarkus.smallrye-openapi.info-contact-email=techsupport@example.com +#quarkus.smallrye-openapi.info-contact-name=Example API Support +#quarkus.smallrye-openapi.info-contact-url=http://exampleurl.com/contact +#quarkus.smallrye-openapi.info-license-name=Apache 2.0 +#quarkus.smallrye-openapi.info-license-url=https://www.apache.org/licenses/LICENSE-2.0.html + +%prod.quarkus.smallrye-openapi.info-title=Teamagochi Backend API + # Database quarkus.datasource.devservices.enabled=true diff --git a/web_backend/src/test/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResourceTests.java b/web_backend/src/test/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResourceTests.java index 6aab9d58..8b68c793 100644 --- a/web_backend/src/test/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResourceTests.java +++ b/web_backend/src/test/java/haw/teamagochi/backend/device/logic/clients/rest/LeshanClientResourceTests.java @@ -29,6 +29,7 @@ public class LeshanClientResourceTests { @RestClient private LeshanClientRestclient clientService; /** Endpoint: /api/objectspecs/{endpoint}. */ + @Test public void testObjectspecs() { // When @@ -89,6 +90,7 @@ public void testGetClient() { } /** Endpoint: /api/clients/{endpoint}/{object}. */ + @Test public void testGetClientObject() { // Given @@ -112,6 +114,7 @@ public void testGetClientObject() { } /** Endpoint: /api/clients/{endpoint}/{object}/{instance}. */ + @Test public void testGetClientObjectInstance() { // Given @@ -139,6 +142,7 @@ public void testGetClientObjectInstance() { } /** Endpoint: /api/clients/{endpoint}/{object}/{instance}. */ + @Test public void testGetClientObjectInstance_NotFound() { // Given @@ -161,6 +165,7 @@ public void testGetClientObjectInstance_NotFound() { } /** Endpoint: /api/clients/{endpoint}/{object}/{instance}/{resource}. */ + @Test public void testGetClientResource_singleResource() { // Given @@ -191,6 +196,7 @@ public void testGetClientResource_singleResource() { } /** Endpoint: /api/clients/{endpoint}/{object}/{instance}/{resource}. */ + @Test public void testGetClientResource_multiResource() { // Given @@ -224,6 +230,7 @@ public void testGetClientResource_multiResource() { } /** Endpoint: /api/clients/{endpoint}/{object}/{instance}/{resource}. */ + @Test public void testGetClientResource_NotFound() { // Given diff --git a/web_backend/src/test/java/haw/teamagochi/backend/device/service/mapper/DeviceMapperTest.java b/web_backend/src/test/java/haw/teamagochi/backend/device/service/mapper/DeviceMapperTest.java new file mode 100644 index 00000000..b00d2d5a --- /dev/null +++ b/web_backend/src/test/java/haw/teamagochi/backend/device/service/mapper/DeviceMapperTest.java @@ -0,0 +1,40 @@ +package haw.teamagochi.backend.device.service.mapper; + +import haw.teamagochi.backend.device.dataaccess.model.DeviceEntity; +import haw.teamagochi.backend.device.dataaccess.model.DeviceType; +import haw.teamagochi.backend.device.logic.DeviceService; +import haw.teamagochi.backend.device.service.rest.v1.mapper.DeviceMapper; +import haw.teamagochi.backend.device.service.rest.v1.model.DeviceDTO; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.h2.H2DatabaseTestResource; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import jakarta.validation.ConstraintViolationException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +//@QuarkusTest +public class DeviceMapperTest { + + //@Inject + DeviceMapper deviceMapper = DeviceMapper.MAPPER; + //@Inject + //DeviceService deviceService; + + + @Test + public void testMapper() { + //DeviceEntity device = deviceService.createDevice("name", DeviceType.FROG); + //DeviceMapper deviceMapper = new + DeviceEntity device = new DeviceEntity("name", DeviceType.FROG); + DeviceEntity dev2 = new DeviceEntity(); + DeviceDTO deviceDTO = deviceMapper.fromResource(device); + Assertions.assertEquals(deviceDTO.getDeviceID(), device.getId()); + Assertions.assertEquals(deviceDTO.getDeviceName(), device.getName()); + + + } +} + diff --git a/web_backend/src/test/java/haw/teamagochi/backend/device/service/rest/v1/DeviceRestServiceTests.java b/web_backend/src/test/java/haw/teamagochi/backend/device/service/rest/v1/DeviceRestServiceTests.java new file mode 100644 index 00000000..495f4f65 --- /dev/null +++ b/web_backend/src/test/java/haw/teamagochi/backend/device/service/rest/v1/DeviceRestServiceTests.java @@ -0,0 +1,49 @@ +package haw.teamagochi.backend.device.service.rest.v1; + +import static io.restassured.RestAssured.when; +import static org.hamcrest.CoreMatchers.is; + +import haw.teamagochi.backend.device.service.rest.v1.model.DeviceDTO; +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +/** + * Tests for {@link DeviceRestService}. + */ +@QuarkusTest +@TestHTTPEndpoint(DeviceRestService.class) +public class DeviceRestServiceTests { + + // TODO implement the real test + @Test + public void testGetAllDevices() { + when().get("/") + .then() + .statusCode(200) + .body(is("[]")); + } + + // TODO implement the real test + @Test + public void testGetDeviceById() { + DeviceDTO result = + when().get("/1") + .then() + .statusCode(200) + .extract() + .as(DeviceDTO.class); + System.out.println(result.getDeviceID()); + System.out.println(result.getDeviceName()); + } + + // TODO implement the real test + @Test + public void testGetDeviceById_NotFound() { + when() + .get("/99") + .then() + .statusCode(404) + .body(is("")); + } +} diff --git a/web_backend/src/test/java/haw/teamagochi/backend/pet/service/mapper/PetMapperTest.java b/web_backend/src/test/java/haw/teamagochi/backend/pet/service/mapper/PetMapperTest.java new file mode 100644 index 00000000..22c2c777 --- /dev/null +++ b/web_backend/src/test/java/haw/teamagochi/backend/pet/service/mapper/PetMapperTest.java @@ -0,0 +1,25 @@ +package haw.teamagochi.backend.pet.service.mapper; + +import haw.teamagochi.backend.pet.dataaccess.model.PetEntity; +import haw.teamagochi.backend.pet.dataaccess.model.PetTypeEntity; +import haw.teamagochi.backend.pet.service.rest.v1.mapper.PetMapper; +import haw.teamagochi.backend.pet.service.rest.v1.model.PetDTO; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class PetMapperTest { + + PetMapper petMapper = PetMapper.MAPPER; + + @Test + public void testPetMapper(){ + PetEntity pet = new PetEntity("name", new PetTypeEntity("frog")); + PetDTO petDTO = petMapper.toResource(pet); + Assertions.assertEquals(petDTO.getPetID(), pet.getId()); + Assertions.assertEquals(petDTO.getPetName(), pet.getName()); + Assertions.assertEquals(petDTO.getPetTypeName(), pet.getPetType().getName()); + Assertions.assertEquals(petDTO.getFun(), pet.getFun()); + Assertions.assertEquals(petDTO.getXp(), pet.getXp()); + } + +} diff --git a/web_backend/src/test/java/haw/teamagochi/backend/pet/service/rest/v1/PetRestServiceTests.java b/web_backend/src/test/java/haw/teamagochi/backend/pet/service/rest/v1/PetRestServiceTests.java new file mode 100644 index 00000000..4c990a39 --- /dev/null +++ b/web_backend/src/test/java/haw/teamagochi/backend/pet/service/rest/v1/PetRestServiceTests.java @@ -0,0 +1,57 @@ +package haw.teamagochi.backend.pet.service.rest.v1; + +import static io.restassured.RestAssured.when; +import static org.hamcrest.CoreMatchers.is; + +import haw.teamagochi.backend.pet.service.rest.v1.model.PetInfoDTO; +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +/** + * Tests for {@link PetRestService}. + */ +@QuarkusTest +@TestHTTPEndpoint(PetRestService.class) +public class PetRestServiceTests { + + // TODO implement the real test + @Test + public void testGetAllPets() { + when().get("/") + .then() + .statusCode(200) + .body(is("[]")); + } + + // TODO implement the test + @Test + public void testCreatePet() { + // when().post() + } + + // TODO implement the real test + @Test + public void testGetPetById() { + PetInfoDTO result = + when().get("/1") + .then() + .statusCode(200) + .extract() + .as(PetInfoDTO.class); + } + + // TODO implement the real test + @Test + public void testGetPetById_NotFound() { + when() + .get("/99") + .then() + .statusCode(404) + .body(is("")); + } + + // TODO implement the test + @Test + public void testDeletePetById() {} +}