diff --git a/src/main/java/de/tum/cit/aet/artemis/communication/dto/PushNotificationDeviceConfigurationDTO.java b/src/main/java/de/tum/cit/aet/artemis/communication/dto/PushNotificationDeviceConfigurationDTO.java new file mode 100644 index 000000000000..6239b8851fcd --- /dev/null +++ b/src/main/java/de/tum/cit/aet/artemis/communication/dto/PushNotificationDeviceConfigurationDTO.java @@ -0,0 +1,9 @@ +package de.tum.cit.aet.artemis.communication.dto; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public record PushNotificationDeviceConfigurationDTO(String deviceType, String token, String secretKey, Date expirationDate, String apiType, String userLogin) { +} diff --git a/src/main/java/de/tum/cit/aet/artemis/communication/repository/PushNotificationDeviceConfigurationRepository.java b/src/main/java/de/tum/cit/aet/artemis/communication/repository/PushNotificationDeviceConfigurationRepository.java index 044df41104bd..43f8a612a500 100644 --- a/src/main/java/de/tum/cit/aet/artemis/communication/repository/PushNotificationDeviceConfigurationRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/communication/repository/PushNotificationDeviceConfigurationRepository.java @@ -38,6 +38,8 @@ WHERE p.expirationDate > CURRENT_TIMESTAMP() """) List findByUserIn(@Param("users") Set users, @Param("deviceType") PushNotificationDeviceType deviceType); + List findPushNotificationDeviceConfigurationsByOwner(User owner); + /** * Cleans up the old/expired push notifications device configurations */ diff --git a/src/main/java/de/tum/cit/aet/artemis/communication/web/PushNotificationResource.java b/src/main/java/de/tum/cit/aet/artemis/communication/web/PushNotificationResource.java index 3078e9f3d6cd..55e31eb9ba08 100644 --- a/src/main/java/de/tum/cit/aet/artemis/communication/web/PushNotificationResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/communication/web/PushNotificationResource.java @@ -4,8 +4,10 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; +import java.util.Arrays; import java.util.Base64; import java.util.Date; +import java.util.List; import jakarta.validation.Valid; @@ -15,10 +17,12 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,6 +31,8 @@ import de.tum.cit.aet.artemis.communication.domain.push_notification.PushNotificationApiType; import de.tum.cit.aet.artemis.communication.domain.push_notification.PushNotificationDeviceConfiguration; import de.tum.cit.aet.artemis.communication.domain.push_notification.PushNotificationDeviceConfigurationId; +import de.tum.cit.aet.artemis.communication.domain.push_notification.PushNotificationDeviceType; +import de.tum.cit.aet.artemis.communication.dto.PushNotificationDeviceConfigurationDTO; import de.tum.cit.aet.artemis.communication.dto.PushNotificationRegisterBody; import de.tum.cit.aet.artemis.communication.dto.PushNotificationRegisterDTO; import de.tum.cit.aet.artemis.communication.dto.PushNotificationUnregisterRequest; @@ -134,6 +140,27 @@ public ResponseEntity unregister(@Valid @RequestBody PushNotificationUnreg return ResponseEntity.ok().build(); } + /** + * API endpoint to view user tokens + * + * @return the users push tokens + */ + @GetMapping(value = "push-tokens", produces = MediaType.APPLICATION_JSON_VALUE) + @EnforceAtLeastStudent + public ResponseEntity> userTokens() { + var user = userRepository.getUser(); + + var tokens = pushNotificationDeviceConfigurationRepository.findPushNotificationDeviceConfigurationsByOwner(user); + + List ret = tokens.stream() + .map(token -> new PushNotificationDeviceConfigurationDTO(token.getDeviceType() == PushNotificationDeviceType.APNS ? "APNS" : "Firebase", token.getToken(), + Arrays.toString(token.getSecretKey()), token.getExpirationDate(), token.getApiType() == PushNotificationApiType.DEFAULT ? "DEFAULT" : "V2", + user.getLogin())) + .toList(); + + return ResponseEntity.ok(ret); + } + private String getToken() { // TODO: we should rather get the token from the cookie, e.g. something like Cookie jwtCookie = WebUtils.getCookie(httpServletRequest, JWT_COOKIE_NAME); UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();