package org.fenixedu.bennu.core.api;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.fenixedu.bennu.core.domain.BennuGroupIndex;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.groups.DynamicGroup;
import org.fenixedu.bennu.core.groups.Group;
import org.fenixedu.bennu.core.json.JsonBuilder;
import org.fenixedu.bennu.core.json.JsonViewer;
import org.fenixedu.bennu.core.rest.BennuRestResource;
import org.fenixedu.commons.i18n.LocalizedString;
import org.fenixedu.commons.stream.StreamUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@Path("/bennu-core/groups")
public class GroupResource extends BennuRestResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response grantUserMembershipGroup(@QueryParam("groupExpression") String groupExpression) {
verifyAndGetRequestAuthor();
return Response.ok(view(Group.parse(groupExpression))).build();
}
@GET
@Path("/grant")
@Produces(MediaType.APPLICATION_JSON)
public JsonElement grantUserMembershipGroup(@QueryParam("groupExpression") String groupExpression,
@QueryParam("username") String username) {
verifyAndGetRequestAuthor();
User user = User.findByUsername(username);
if (user == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
return view(Group.parse(groupExpression).grant(user));
}
@GET
@Path("/revoke")
@Produces(MediaType.APPLICATION_JSON)
public JsonElement revokeUserFromGroup(@QueryParam("groupExpression") String groupExpression,
@QueryParam("username") String username) {
verifyAndGetRequestAuthor();
User user = User.findByUsername(username);
if (user == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
return view(Group.parse(groupExpression).revoke(user));
}
@GET
@Path("/dynamic")
@Produces(MediaType.APPLICATION_JSON)
public JsonElement listDynamicGroups() {
accessControl(Group.managers());
return view(BennuGroupIndex.allDynamicGroups(), DynamicGroupJsonAdapter.class);
}
@POST
@Path("/dynamic")
@Consumes(MediaType.APPLICATION_JSON)
public JsonElement changeDynamicGroupName(JsonObject obj) {
accessControl(Group.managers());
DynamicGroup group = DynamicGroup.get(obj.get("group").getAsString());
LocalizedString name = obj.has("name") ? LocalizedString.fromJson(obj.get("name")) : null;
group.mutator().setPresentationName(name);
return view(group, DynamicGroupJsonAdapter.class);
}
@POST
@Path("/dynamic/grant")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public JsonElement addUserToDynamicGroup(JsonObject obj) {
accessControl(Group.managers());
DynamicGroup group = DynamicGroup.get(obj.get("group").getAsString());
User user = User.findByUsername(obj.get("user").getAsString());
if (user == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
return view(group.mutator().changeGroup(group.underlyingGroup().grant(user)), DynamicGroupJsonAdapter.class);
}
@POST
@Path("/dynamic/revoke")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public JsonElement removeUserFromDynamicGroup(JsonObject obj) {
accessControl(Group.managers());
DynamicGroup group = DynamicGroup.get(obj.get("group").getAsString());
User user = User.findByUsername(obj.get("user").getAsString());
if (user == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
return view(group.mutator().changeGroup(group.underlyingGroup().revoke(user)), DynamicGroupJsonAdapter.class);
}
public static class DynamicGroupJsonAdapter implements JsonViewer<DynamicGroup> {
@Override
public JsonElement view(DynamicGroup obj, JsonBuilder ctx) {
JsonObject json = new JsonObject();
json.addProperty("name", obj.getName());
LocalizedString customPresentationName = obj.toPersistentGroup().getCustomPresentationName();
json.addProperty("displayName", customPresentationName == null ? obj.getName() : customPresentationName.getContent());
if (customPresentationName != null) {
json.add("customPresentationName", customPresentationName.json());
}
JsonArray users = obj.getMembers().map(user -> {
JsonObject userJson = new JsonObject();
userJson.addProperty("username", user.getUsername());
userJson.addProperty("name", user.getName());
userJson.addProperty("avatar", user.getProfile().getAvatarUrl());
return userJson;
}).collect(StreamUtils.toJsonArray());
json.add("members", users);
return json;
}
}
}