mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-09-26 17:34:41 +00:00
Fix #579: Address review comments
This commit is contained in:
parent
2fd5ef55c8
commit
c52fcd18fe
@ -257,14 +257,10 @@ public abstract class TaskRepository {
|
|||||||
private Task setFields(Task task, Fields fields) throws IOException {
|
private Task setFields(Task task, Fields fields) throws IOException {
|
||||||
task.setOwner(fields.contains("owner") ? getOwner(task) : null);
|
task.setOwner(fields.contains("owner") ? getOwner(task) : null);
|
||||||
task.setService(fields.contains("service") ? getService(task) : null);
|
task.setService(fields.contains("service") ? getService(task) : null);
|
||||||
task.setFollowers(fields.contains("followers") ? getFollowers(task) : null);
|
|
||||||
task.setTags(fields.contains("tags") ? getTags(task.getFullyQualifiedName()) : null);
|
task.setTags(fields.contains("tags") ? getTags(task.getFullyQualifiedName()) : null);
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<EntityReference> getFollowers(Task task) throws IOException {
|
|
||||||
return task == null ? null : EntityUtil.getFollowers(task.getId(), relationshipDAO(), userDAO());
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<TagLabel> getTags(String fqn) {
|
private List<TagLabel> getTags(String fqn) {
|
||||||
return tagDAO().getTags(fqn);
|
return tagDAO().getTags(fqn);
|
||||||
@ -297,19 +293,6 @@ public abstract class TaskRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transaction
|
|
||||||
public Status addFollower(String taskId, String userId) throws IOException {
|
|
||||||
EntityUtil.validate(taskId, taskDAO().findById(taskId), Task.class);
|
|
||||||
return EntityUtil.addFollower(relationshipDAO(), userDAO(), taskId, Entity.TASK, userId, Entity.USER) ?
|
|
||||||
Status.CREATED : Status.OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transaction
|
|
||||||
public void deleteFollower(String taskId, String userId) {
|
|
||||||
EntityUtil.validateUser(userDAO(), userId);
|
|
||||||
EntityUtil.removeFollower(relationshipDAO(), taskId, userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface TaskDAO {
|
public interface TaskDAO {
|
||||||
@SqlUpdate("INSERT INTO task_entity (json) VALUES (:json)")
|
@SqlUpdate("INSERT INTO task_entity (json) VALUES (:json)")
|
||||||
void insert(@Bind("json") String json);
|
void insert(@Bind("json") String json);
|
||||||
|
@ -98,7 +98,6 @@ public class TaskResource {
|
|||||||
task.setHref(RestUtil.getHref(uriInfo, TASK_COLLECTION_PATH, task.getId()));
|
task.setHref(RestUtil.getHref(uriInfo, TASK_COLLECTION_PATH, task.getId()));
|
||||||
EntityUtil.addHref(uriInfo, task.getOwner());
|
EntityUtil.addHref(uriInfo, task.getOwner());
|
||||||
EntityUtil.addHref(uriInfo, task.getService());
|
EntityUtil.addHref(uriInfo, task.getService());
|
||||||
EntityUtil.addHref(uriInfo, task.getFollowers());
|
|
||||||
|
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
@ -122,7 +121,7 @@ public class TaskResource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static final String FIELDS = "taskConfig,owner,service,followers,tags";
|
static final String FIELDS = "taskConfig,owner,service,tags";
|
||||||
public static final List<String> FIELD_LIST = Arrays.asList(FIELDS.replaceAll(" ", "")
|
public static final List<String> FIELD_LIST = Arrays.asList(FIELDS.replaceAll(" ", "")
|
||||||
.split(","));
|
.split(","));
|
||||||
|
|
||||||
@ -284,45 +283,6 @@ public class TaskResource {
|
|||||||
return Response.status(response.getStatus()).entity(task).build();
|
return Response.status(response.getStatus()).entity(task).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PUT
|
|
||||||
@Path("/{id}/followers")
|
|
||||||
@Operation(summary = "Add a follower", tags = "tasks",
|
|
||||||
description = "Add a user identified by `userId` as followed of this task",
|
|
||||||
responses = {
|
|
||||||
@ApiResponse(responseCode = "200", description = "OK"),
|
|
||||||
@ApiResponse(responseCode = "404", description = "Task for instance {id} is not found")
|
|
||||||
})
|
|
||||||
public Response addFollower(@Context UriInfo uriInfo,
|
|
||||||
@Context SecurityContext securityContext,
|
|
||||||
@Parameter(description = "Id of the task", schema = @Schema(type = "string"))
|
|
||||||
@PathParam("id") String id,
|
|
||||||
@Parameter(description = "Id of the user to be added as follower",
|
|
||||||
schema = @Schema(type = "string"))
|
|
||||||
String userId) throws IOException, ParseException {
|
|
||||||
Fields fields = new Fields(FIELD_LIST, "followers");
|
|
||||||
Response.Status status = dao.addFollower(id, userId);
|
|
||||||
Task task = dao.get(id, fields);
|
|
||||||
return Response.status(status).entity(task).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@DELETE
|
|
||||||
@Path("/{id}/followers/{userId}")
|
|
||||||
@Operation(summary = "Remove a follower", tags = "tasks",
|
|
||||||
description = "Remove the user identified `userId` as a follower of the task.")
|
|
||||||
public Task deleteFollower(@Context UriInfo uriInfo,
|
|
||||||
@Context SecurityContext securityContext,
|
|
||||||
@Parameter(description = "Id of the task",
|
|
||||||
schema = @Schema(type = "string"))
|
|
||||||
@PathParam("id") String id,
|
|
||||||
@Parameter(description = "Id of the user being removed as follower",
|
|
||||||
schema = @Schema(type = "string"))
|
|
||||||
@PathParam("userId") String userId) throws IOException, ParseException {
|
|
||||||
Fields fields = new Fields(FIELD_LIST, "followers");
|
|
||||||
dao.deleteFollower(id, userId);
|
|
||||||
Task task = dao.get(id, fields);
|
|
||||||
return addHref(uriInfo, task);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("/{id}")
|
@Path("/{id}")
|
||||||
|
@ -62,7 +62,6 @@ import static javax.ws.rs.core.Response.Status.FORBIDDEN;
|
|||||||
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
|
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
|
||||||
import static javax.ws.rs.core.Response.Status.OK;
|
import static javax.ws.rs.core.Response.Status.OK;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
@ -75,7 +74,7 @@ import static org.openmetadata.catalog.util.TestUtils.adminAuthHeaders;
|
|||||||
import static org.openmetadata.catalog.util.TestUtils.assertEntityPagination;
|
import static org.openmetadata.catalog.util.TestUtils.assertEntityPagination;
|
||||||
import static org.openmetadata.catalog.util.TestUtils.assertResponse;
|
import static org.openmetadata.catalog.util.TestUtils.assertResponse;
|
||||||
import static org.openmetadata.catalog.util.TestUtils.authHeaders;
|
import static org.openmetadata.catalog.util.TestUtils.authHeaders;
|
||||||
import static org.openmetadata.catalog.util.TestUtils.userAuthHeaders;
|
|
||||||
|
|
||||||
public class TaskResourceTest extends CatalogApplicationTest {
|
public class TaskResourceTest extends CatalogApplicationTest {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(TaskResourceTest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(TaskResourceTest.class);
|
||||||
@ -484,43 +483,6 @@ public class TaskResourceTest extends CatalogApplicationTest {
|
|||||||
deleteTask(task.getId(), adminAuthHeaders());
|
deleteTask(task.getId(), adminAuthHeaders());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void put_addDeleteFollower_200(TestInfo test) throws HttpResponseException, URISyntaxException {
|
|
||||||
Task task = createAndCheckTask(create(test), adminAuthHeaders());
|
|
||||||
|
|
||||||
// Add follower to the task
|
|
||||||
User user1 = UserResourceTest.createUser(UserResourceTest.create(test, 1), userAuthHeaders());
|
|
||||||
addAndCheckFollower(task, user1.getId(), CREATED, 1, userAuthHeaders());
|
|
||||||
|
|
||||||
// Add the same user as follower and make sure no errors are thrown and return response is OK (and not CREATED)
|
|
||||||
addAndCheckFollower(task, user1.getId(), OK, 1, userAuthHeaders());
|
|
||||||
|
|
||||||
// Add a new follower to the task
|
|
||||||
User user2 = UserResourceTest.createUser(UserResourceTest.create(test, 2), userAuthHeaders());
|
|
||||||
addAndCheckFollower(task, user2.getId(), CREATED, 2, userAuthHeaders());
|
|
||||||
|
|
||||||
// Delete followers and make sure they are deleted
|
|
||||||
deleteAndCheckFollower(task, user1.getId(), 1, userAuthHeaders());
|
|
||||||
deleteAndCheckFollower(task, user2.getId(), 0, userAuthHeaders());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void put_addDeleteInvalidFollower_200(TestInfo test) throws HttpResponseException, URISyntaxException {
|
|
||||||
Task task = createAndCheckTask(create(test), adminAuthHeaders());
|
|
||||||
|
|
||||||
// Add non existent user as follower to the task
|
|
||||||
HttpResponseException exception = assertThrows(HttpResponseException.class, () ->
|
|
||||||
addAndCheckFollower(task, NON_EXISTENT_ENTITY, CREATED, 1, adminAuthHeaders()));
|
|
||||||
assertResponse(exception, NOT_FOUND, CatalogExceptionMessage.entityNotFound("User", NON_EXISTENT_ENTITY));
|
|
||||||
|
|
||||||
// Delete non existent user as follower to the task
|
|
||||||
exception = assertThrows(HttpResponseException.class, () ->
|
|
||||||
deleteAndCheckFollower(task, NON_EXISTENT_ENTITY, 1, adminAuthHeaders()));
|
|
||||||
assertResponse(exception, NOT_FOUND, CatalogExceptionMessage.entityNotFound("User", NON_EXISTENT_ENTITY));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void delete_nonExistentTask_404() {
|
public void delete_nonExistentTask_404() {
|
||||||
HttpResponseException exception = assertThrows(HttpResponseException.class, () ->
|
HttpResponseException exception = assertThrows(HttpResponseException.class, () ->
|
||||||
@ -728,71 +690,6 @@ public class TaskResourceTest extends CatalogApplicationTest {
|
|||||||
.withTaskUrl(new URI("http://localhost:0"));
|
.withTaskUrl(new URI("http://localhost:0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addAndCheckFollower(Task task, UUID userId, Status status, int totalFollowerCount,
|
|
||||||
Map<String, String> authHeaders) throws HttpResponseException {
|
|
||||||
WebTarget target = CatalogApplicationTest.getResource(String.format("tasks/%s/followers", task.getId()));
|
|
||||||
TestUtils.put(target, userId.toString(), status, authHeaders);
|
|
||||||
|
|
||||||
// GET .../tasks/{taskId} returns newly added follower
|
|
||||||
Task getTask = getTask(task.getId(), "followers", authHeaders);
|
|
||||||
assertEquals(totalFollowerCount, getTask.getFollowers().size());
|
|
||||||
TestUtils.validateEntityReference(getTask.getFollowers());
|
|
||||||
boolean followerFound = false;
|
|
||||||
for (EntityReference followers : getTask.getFollowers()) {
|
|
||||||
if (followers.getId().equals(userId)) {
|
|
||||||
followerFound = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assertTrue(followerFound, "Follower added was not found in task get response");
|
|
||||||
|
|
||||||
// GET .../users/{userId} shows user as following table
|
|
||||||
checkUserFollowing(userId, task.getId(), true, authHeaders);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkUserFollowing(UUID userId, UUID taskId, boolean expectedFollowing,
|
|
||||||
Map<String, String> authHeaders) throws HttpResponseException {
|
|
||||||
// GET .../users/{userId} shows user as following table
|
|
||||||
boolean following = false;
|
|
||||||
User user = UserResourceTest.getUser(userId, "follows", authHeaders);
|
|
||||||
for (EntityReference follows : user.getFollows()) {
|
|
||||||
TestUtils.validateEntityReference(follows);
|
|
||||||
if (follows.getId().equals(taskId)) {
|
|
||||||
following = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assertEquals(expectedFollowing, following, "Follower list for the user is invalid");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteAndCheckFollower(Task task, UUID userId, int totalFollowerCount,
|
|
||||||
Map<String, String> authHeaders) throws HttpResponseException {
|
|
||||||
WebTarget target = CatalogApplicationTest.getResource(String.format("tasks/%s/followers/%s",
|
|
||||||
task.getId(), userId));
|
|
||||||
TestUtils.delete(target, authHeaders);
|
|
||||||
|
|
||||||
Task getTask = checkFollowerDeleted(task.getId(), userId, authHeaders);
|
|
||||||
assertEquals(totalFollowerCount, getTask.getFollowers().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Task checkFollowerDeleted(UUID taskId, UUID userId, Map<String, String> authHeaders)
|
|
||||||
throws HttpResponseException {
|
|
||||||
Task getTask = getTask(taskId, "followers", authHeaders);
|
|
||||||
TestUtils.validateEntityReference(getTask.getFollowers());
|
|
||||||
boolean followerFound = false;
|
|
||||||
for (EntityReference followers : getTask.getFollowers()) {
|
|
||||||
if (followers.getId().equals(userId)) {
|
|
||||||
followerFound = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assertFalse(followerFound, "Follower deleted is still found in table get response");
|
|
||||||
|
|
||||||
// GET .../users/{userId} shows user as following table
|
|
||||||
checkUserFollowing(userId, taskId, false, authHeaders);
|
|
||||||
return getTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void validateTags(List<TagLabel> expectedList, List<TagLabel> actualList)
|
private static void validateTags(List<TagLabel> expectedList, List<TagLabel> actualList)
|
||||||
throws HttpResponseException {
|
throws HttpResponseException {
|
||||||
if (expectedList == null) {
|
if (expectedList == null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user