Feature/ implement basic search function #40

Merged
kasun merged 30 commits from feature/Implement-basic-search-function into main 2026-06-25 17:58:40 +02:00
22 changed files with 36 additions and 31 deletions
Showing only changes of commit 40cbe7103f - Show all commits
@@ -2,5 +2,7 @@ package com.vaessl.app.connection;
import java.time.Instant; import java.time.Instant;
import com.vaessl.app.shared.ServiceType;
public record AuthResponse(ServiceType serviceType, Instant expiresAt) { public record AuthResponse(ServiceType serviceType, Instant expiresAt) {
} }
@@ -19,6 +19,9 @@ import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import com.vaessl.app.shared.ServiceType;
import com.vaessl.app.shared.SessionKeys;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
public class ConnectionController { public class ConnectionController {
@@ -2,6 +2,8 @@ package com.vaessl.app.connection;
import java.time.Instant; import java.time.Instant;
import com.vaessl.app.shared.ServiceProvider;
public interface ConnectionProvider extends ServiceProvider { public interface ConnectionProvider extends ServiceProvider {
void checkCredentials(ConnectionRequest request); void checkCredentials(ConnectionRequest request);
@@ -1,6 +1,7 @@
package com.vaessl.app.connection; package com.vaessl.app.connection;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.vaessl.app.shared.ServiceType;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@@ -8,6 +8,7 @@ import java.util.stream.Collectors;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.vaessl.app.exception.WrongServiceTypeException; import com.vaessl.app.exception.WrongServiceTypeException;
import com.vaessl.app.shared.ServiceType;
@Service @Service
public class ConnectionService { public class ConnectionService {
@@ -11,8 +11,9 @@ import org.springframework.web.client.RestClient;
import com.vaessl.app.exception.EmptyCredentialsException; import com.vaessl.app.exception.EmptyCredentialsException;
import com.vaessl.app.exception.RemoteApiException; import com.vaessl.app.exception.RemoteApiException;
import com.vaessl.app.shared.ServiceType;
import static com.vaessl.app.connection.Endpoint.*; import static com.vaessl.app.shared.Endpoint.*;
@Component @Component
public class HomeboxConnectionProvider implements ConnectionProvider { public class HomeboxConnectionProvider implements ConnectionProvider {
@@ -1,10 +0,0 @@
package com.vaessl.app.connection;
public interface ServiceProvider {
/**
* Returns the service type key used to look up this provider in a registry, e.g.
* {@code "HOMEBOX"}.
*/
ServiceType getServiceType();
}
@@ -12,11 +12,11 @@ import org.springframework.web.client.RestClient;
import com.vaessl.app.connection.ConnectionEntity; import com.vaessl.app.connection.ConnectionEntity;
import com.vaessl.app.connection.ConnectionRepository; import com.vaessl.app.connection.ConnectionRepository;
import com.vaessl.app.connection.HomeboxEntity; import com.vaessl.app.connection.HomeboxEntity;
import com.vaessl.app.connection.ServiceType;
import com.vaessl.app.exception.ConnectionNotFoundException; import com.vaessl.app.exception.ConnectionNotFoundException;
import com.vaessl.app.exception.RemoteApiException; import com.vaessl.app.exception.RemoteApiException;
import com.vaessl.app.shared.ServiceType;
import static com.vaessl.app.connection.Endpoint.*; import static com.vaessl.app.shared.Endpoint.*;
@Component @Component
public class HomeboxSearchProvider implements SearchProvider { public class HomeboxSearchProvider implements SearchProvider {
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.vaessl.app.connection.SessionKeys; import com.vaessl.app.shared.SessionKeys;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@@ -3,7 +3,7 @@ package com.vaessl.app.search;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import com.vaessl.app.connection.ServiceProvider; import com.vaessl.app.shared.ServiceProvider;
/** /**
* Implemented by any service that supports querying its remote API for items. * Implemented by any service that supports querying its remote API for items.
@@ -1,6 +1,6 @@
package com.vaessl.app.search; package com.vaessl.app.search;
import com.vaessl.app.connection.ServiceType; import com.vaessl.app.shared.ServiceType;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@@ -7,7 +7,7 @@ import java.util.stream.Collectors;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.vaessl.app.connection.ServiceType; import com.vaessl.app.shared.ServiceType;
import com.vaessl.app.exception.WrongServiceTypeException; import com.vaessl.app.exception.WrongServiceTypeException;
@Service @Service
@@ -1,4 +1,4 @@
package com.vaessl.app.connection; package com.vaessl.app.shared;
public enum Endpoint { public enum Endpoint {
HOMEBOX_LOGIN("/api/v1/users/login"), LOGIN("/login"), CONNECTION_STATUS( HOMEBOX_LOGIN("/api/v1/users/login"), LOGIN("/login"), CONNECTION_STATUS(
@@ -0,0 +1,6 @@
package com.vaessl.app.shared;
public interface ServiceProvider {
ServiceType getServiceType();
}
@@ -1,4 +1,4 @@
package com.vaessl.app.connection; package com.vaessl.app.shared;
public enum ServiceType { public enum ServiceType {
HOMEBOX; HOMEBOX;
@@ -1,8 +1,8 @@
package com.vaessl.app.connection; package com.vaessl.app.shared;
public final class SessionKeys { public final class SessionKeys {
static final String CONNECTION_ID_SUFFIX = "_CONNECTION_ID"; public static final String CONNECTION_ID_SUFFIX = "_CONNECTION_ID";
private SessionKeys() {} private SessionKeys() {}
@@ -1,6 +1,6 @@
package com.vaessl.app; package com.vaessl.app;
import com.vaessl.app.connection.ServiceType; import com.vaessl.app.shared.ServiceType;
public final class Mockdata { public final class Mockdata {
@@ -2,8 +2,8 @@ package com.vaessl.app.connection;
import static com.vaessl.app.Mockdata.*; import static com.vaessl.app.Mockdata.*;
import static com.vaessl.app.connection.Endpoint.*; import static com.vaessl.app.shared.Endpoint.*;
import static com.vaessl.app.connection.ServiceType.*; import static com.vaessl.app.shared.ServiceType.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test;
import com.vaessl.app.exception.EmptyCredentialsException; import com.vaessl.app.exception.EmptyCredentialsException;
import static com.vaessl.app.Mockdata.*; import static com.vaessl.app.Mockdata.*;
import static com.vaessl.app.connection.ServiceType.HOMEBOX; import static com.vaessl.app.shared.ServiceType.HOMEBOX;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
class HomeboxConnectionProviderTest { class HomeboxConnectionProviderTest {
@@ -15,8 +15,7 @@ class HomeboxConnectionProviderTest {
@Test @Test
void checkCredentialsShouldThrowExceptionWhenFieldsAreMissing() { void checkCredentialsShouldThrowExceptionWhenFieldsAreMissing() {
ConnectionRequest request = ConnectionRequest request = new ConnectionRequest(MOCK_URL, HOMEBOX, null, null, false);
new ConnectionRequest(MOCK_URL, HOMEBOX, null, null, false);
EmptyCredentialsException exception = assertThrows(EmptyCredentialsException.class, () -> { EmptyCredentialsException exception = assertThrows(EmptyCredentialsException.class, () -> {
provider.checkCredentials(request); provider.checkCredentials(request);
@@ -23,9 +23,9 @@ import com.jayway.jsonpath.JsonPath;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static com.github.tomakehurst.wiremock.client.WireMock.*; import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.vaessl.app.connection.Endpoint.*; import static com.vaessl.app.shared.Endpoint.*;
import static com.vaessl.app.exception.ErrorMessage.*; import static com.vaessl.app.exception.ErrorMessage.*;
import static com.vaessl.app.connection.ServiceType.*; import static com.vaessl.app.shared.ServiceType.*;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestRestTemplate @AutoConfigureTestRestTemplate
@@ -12,7 +12,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import com.vaessl.app.connection.ConnectionRepository; import com.vaessl.app.connection.ConnectionRepository;
import com.vaessl.app.exception.ConnectionNotFoundException; import com.vaessl.app.exception.ConnectionNotFoundException;
import static com.vaessl.app.connection.ServiceType.HOMEBOX; import static com.vaessl.app.shared.ServiceType.HOMEBOX;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
@@ -2,7 +2,7 @@ package com.vaessl.app.search;
import static com.vaessl.app.Mockdata.MOCK_PASS; import static com.vaessl.app.Mockdata.MOCK_PASS;
import static com.vaessl.app.Mockdata.MOCK_USER; import static com.vaessl.app.Mockdata.MOCK_USER;
import static com.vaessl.app.connection.Endpoint.*; import static com.vaessl.app.shared.Endpoint.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;