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() {}
+}