Remove deprecated user-group web-service for API v1.1 (#769)

Change-Id: Iaf660040892e692194e1ba3fdd8298f68e6b42cd
diff --git a/Changes b/Changes
index 9c7da74..e7d2949 100644
--- a/Changes
+++ b/Changes
@@ -2,7 +2,10 @@
 
 - Introduced APIDeprecationFilter (#759)
 - Deprecated matchInfo web-service has been removed for API v1.1.
-- Remove deprecated Authorization Post web-service for API v1.1.
+- Remove deprecated Authorization Post web-service for API v1.1 (#767)
+- Remove deprecated user-group web-services for API v1.1 (#769)
+
+
 
 # version 0.79.1
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java b/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
index fa3607c..6e7d1fd 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
@@ -15,6 +15,7 @@
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.service.UserGroupService;
 import de.ids_mannheim.korap.web.KustvaktResponseHandler;
+import de.ids_mannheim.korap.web.filter.APIDeprecationFilter;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
 import de.ids_mannheim.korap.web.filter.BlockingFilter;
@@ -203,6 +204,8 @@
     @POST
     @Path("@{groupName}/invite")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response inviteGroupMembers (
             @Context SecurityContext securityContext,
             @PathParam("groupName") String groupName,
@@ -251,6 +254,8 @@
     @POST
     @Path("@{groupName}/role/add")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response addMemberRoles (@Context SecurityContext securityContext,
             @PathParam("groupName") String groupName,
             @FormParam("memberUsername") String memberUsername,
@@ -350,6 +355,8 @@
     @Deprecated
     @POST
     @Path("@{groupName}/subscribe")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response subscribeToGroup (@Context SecurityContext securityContext,
             @PathParam("groupName") String groupName) {
         throw kustvaktResponseHandler.throwit(new KustvaktException(
@@ -373,6 +380,8 @@
     @Deprecated
     @DELETE
     @Path("@{groupName}/unsubscribe")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response unsubscribeFromGroup (
             @Context SecurityContext securityContext,
             @PathParam("groupName") String groupName) {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupDeprecationTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupDeprecationTest.java
new file mode 100644
index 0000000..12d803b
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupDeprecationTest.java
@@ -0,0 +1,107 @@
+package de.ids_mannheim.korap.web.controller.usergroup;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+public class UserGroupDeprecationTest extends SpringJerseyTest{
+
+	private String groupName= "GroupV1_0";
+	
+	private void testDeprecation (Response response) throws KustvaktException {
+		assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+		String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(StatusCodes.DEPRECATED,
+                node.at("/errors/0/0").asInt());
+	}
+	
+	@Test
+	public void testV1_0 () throws KustvaktException {
+		Form form = new Form();
+        form.param("members", "marlin");
+        
+        // invite member
+		Response response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/invite").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		testDeprecation(response);
+	
+		// add member role
+		response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/role/add").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		testDeprecation(response);
+		
+		// subscribe
+		response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/subscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		testDeprecation(response);
+
+		// unsusbcribe
+		response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/unsubscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .delete();
+		testDeprecation(response);
+	}
+	
+	@Test
+	public void testCurrentVersion () throws KustvaktException {
+		Form form = new Form();
+        form.param("members", "marlin");
+        
+        // invite member
+		Response response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/invite").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	
+		// add member role
+		response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/role/add").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+		
+		// subscribe
+		response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/subscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+
+		// unsusbcribe
+		response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/unsubscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .delete();
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	}
+}