1 package de.dlr.shepard.common.filters;
2
3 import de.dlr.shepard.common.configuration.feature.toggles.MigrationModeToggle;
4 import de.dlr.shepard.common.exceptions.ApiError;
5 import jakarta.annotation.Priority;
6 import jakarta.enterprise.context.RequestScoped;
7 import jakarta.ws.rs.container.ContainerRequestContext;
8 import jakarta.ws.rs.container.ContainerRequestFilter;
9 import jakarta.ws.rs.core.Response;
10 import jakarta.ws.rs.core.Response.Status;
11 import jakarta.ws.rs.ext.Provider;
12 import java.io.IOException;
13
14 @Provider
15 @RequestScoped
16 @Priority(999)
17 public class MigrationModeFilter implements ContainerRequestFilter {
18
19 @Override
20 public void filter(ContainerRequestContext requestContext) throws IOException {
21 if (!MigrationModeToggle.isActive()) return;
22 if (PublicEndpointRegistry.isRequestPathPublic(requestContext)) return;
23 if (requestContext.getUriInfo().getPath().startsWith("/temp")) return;
24
25 requestContext.abortWith(
26 Response.status(Status.SERVICE_UNAVAILABLE)
27 .entity(
28 new ApiError(
29 Status.SERVICE_UNAVAILABLE.getStatusCode(),
30 "ServiceUnavailableException",
31 "The application is in migration mode right now. " +
32 "You can retrieve the current migration status at <backend-url>/shepard/api/temp/migrations/state"
33 )
34 )
35 .build()
36 );
37 }
38 }