From eda562704f79f5cf5720fbaf2c9ac0603c2c3b1c Mon Sep 17 00:00:00 2001 From: munkhbayarg Date: Sat, 23 Sep 2023 19:59:06 +0800 Subject: [PATCH] Synchronize roster items: Apply changes to existing roster items and Adds non-existing items to the roster --- .../controller/UserServiceController.java | 37 +++++++++++++++++-- .../rest/service/UserRosterService.java | 28 ++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/java/org/jivesoftware/openfire/plugin/rest/controller/UserServiceController.java b/src/java/org/jivesoftware/openfire/plugin/rest/controller/UserServiceController.java index c7bde3825..98aa1a8bb 100644 --- a/src/java/org/jivesoftware/openfire/plugin/rest/controller/UserServiceController.java +++ b/src/java/org/jivesoftware/openfire/plugin/rest/controller/UserServiceController.java @@ -44,9 +44,7 @@ import org.xmpp.packet.StreamError; import javax.ws.rs.core.Response; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; /** * The Class UserServiceController. @@ -369,6 +367,39 @@ public void updateRosterItem(String username, String rosterJid, RosterItemEntity roster.updateRosterItem(rosterItem); } + public Map syncRosterEntities(String username, RosterEntities entities) throws UserNotFoundException, + ServiceException, UserAlreadyExistsException, SharedGroupException { + Map ret = new HashMap<>(); + ret.put("inserts", 0); + ret.put("updates", 0); + + getAndCheckUser(username); + Roster roster = getUserRoster(username); + for(RosterItemEntity rosterItemEntity : entities.getRoster()) { + JID jid = new JID(rosterItemEntity.getJid()); + RosterItem rosterItem = roster.getRosterItem(jid); + String key; + if(rosterItem != null) { + key = "updates"; + if (rosterItemEntity.getNickname() != null) { + rosterItem.setNickname(rosterItemEntity.getNickname()); + } + if (rosterItemEntity.getGroups() != null) { + rosterItem.setGroups(rosterItemEntity.getGroups()); + } + }else{ + key = "inserts"; + rosterItem = roster.createRosterItem(jid, rosterItemEntity.getNickname(), + rosterItemEntity.getGroups(), false, true); + } + UserUtils.checkSubType(rosterItemEntity.getSubscriptionType()); + rosterItem.setSubStatus(RosterItem.SubType.getTypeFromInt(rosterItemEntity.getSubscriptionType())); + roster.updateRosterItem(rosterItem); + int count = ret.get(key); + ret.put(key, count + 1); + } + return ret; + } /** * Delete roster item. * diff --git a/src/java/org/jivesoftware/openfire/plugin/rest/service/UserRosterService.java b/src/java/org/jivesoftware/openfire/plugin/rest/service/UserRosterService.java index 68ad31a62..a79aa9755 100644 --- a/src/java/org/jivesoftware/openfire/plugin/rest/service/UserRosterService.java +++ b/src/java/org/jivesoftware/openfire/plugin/rest/service/UserRosterService.java @@ -36,6 +36,7 @@ import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.util.HashMap; @Path("restapi/v1/users/{username}/roster") @Tag(name = "Users", description = "Managing Openfire users.") @@ -148,4 +149,31 @@ public Response updateRoster( } return Response.status(Response.Status.OK).build(); } + + + @PATCH() + @Operation( summary = "Synchronize roster entries", + description = "Apply changes to the existing roster items, Insert non-existing entries") + @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + public Response syncRoster( + @Parameter(description = "The username of the user for which the update a roster entry.", required = true) @PathParam("username") String username, + @RequestBody(description = "The definition of the roster entries that are to be synched (added / updated).", required = true) RosterEntities entities) + throws ServiceException{ + + Object ret; + try { + ret = plugin.syncRosterEntities(username, entities); + } catch (UserNotFoundException e) { + throw new ServiceException(COULD_NOT_UPDATE_THE_ROSTER, "", ExceptionType.USER_NOT_FOUND_EXCEPTION, + Response.Status.NOT_FOUND, e); + } catch (SharedGroupException e) { + throw new ServiceException(COULD_NOT_UPDATE_THE_ROSTER, "", ExceptionType.SHARED_GROUP_EXCEPTION, + Response.Status.BAD_REQUEST, e); + } catch (UserAlreadyExistsException e) { + throw new ServiceException(COULD_NOT_UPDATE_THE_ROSTER, "", + ExceptionType.USER_ALREADY_EXISTS_EXCEPTION, Response.Status.CONFLICT, e); + } + + return Response.ok(ret).build(); + } }