From 26b232c9802d2a5b127ec425965dcb30530a0fd0 Mon Sep 17 00:00:00 2001 From: Matteo Baglini Date: Thu, 19 Sep 2024 16:21:00 +0200 Subject: [PATCH] feat: store calendar group as folder --- .../cs/service/mail/CreateCalendarGroup.java | 47 +++++++++++++++---- .../account/CreateCalendarGroupTest.java | 2 +- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/store/src/main/java/com/zimbra/cs/service/mail/CreateCalendarGroup.java b/store/src/main/java/com/zimbra/cs/service/mail/CreateCalendarGroup.java index 6eb179add84..d4e8811047b 100644 --- a/store/src/main/java/com/zimbra/cs/service/mail/CreateCalendarGroup.java +++ b/store/src/main/java/com/zimbra/cs/service/mail/CreateCalendarGroup.java @@ -5,13 +5,25 @@ import com.zimbra.common.soap.MailConstants; import com.zimbra.cs.mailbox.Folder; import com.zimbra.cs.mailbox.MailItem; +import com.zimbra.cs.mailbox.Metadata; import com.zimbra.soap.ZimbraSoapContext; import com.zimbra.soap.mail.message.CreateCalendarGroupRequest; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class CreateCalendarGroup extends MailDocumentHandler { + private static final String LIST_SEPARATOR = "#"; + private static final String CALENDAR_IDS_SECTION_KEY = "calendarIds"; + private static final String CALENDAR_IDS_METADATA_KEY = "cids"; + + private static final String GROUP_ELEMENT_NAME = "group"; + private static final String ID_ELEMENT_NAME = "id"; + private static final String NAME_ELEMENT_NAME = "name"; + private static final String CALENDAR_ID_ELEMENT_NAME = "calendarId"; + @Override public Element handle(Element request, Map context) throws ServiceException { final var zsc = getZimbraSoapContext(context); @@ -28,23 +40,40 @@ public Element handle(Element request, Map context) throws Servi final var fopt = new Folder.FolderOptions(); fopt.setDefaultView(MailItem.Type.CALENDAR_GROUP); + fopt.setCustomMetadata(encodeCustomMetadata(req)); final var group = mbox.createFolder(octxt, req.getName(), 1, fopt); return buildResponse(zsc, group); } - private static Element buildResponse(ZimbraSoapContext zsc, Folder group) { + private static Element buildResponse(ZimbraSoapContext zsc, Folder group) + throws ServiceException { final var response = zsc.createElement(MailConstants.CREATE_CALENDAR_GROUP_RESPONSE); - final var groupInfo = response.addUniqueElement("group"); - groupInfo.addAttribute("id", group.getId()); - groupInfo.addAttribute("name", group.getName()); - // TODO - double: read from metadata? - // final var calendarIds = group.calendarIds(); - final var calendarIds = List.of("10", "420", "421"); - for (final var calendarId : calendarIds) { - final var calendarIdElement = groupInfo.addNonUniqueElement("calendarId"); + + final var groupInfo = response.addUniqueElement(GROUP_ELEMENT_NAME); + groupInfo.addAttribute(ID_ELEMENT_NAME, group.getId()); + groupInfo.addAttribute(NAME_ELEMENT_NAME, group.getName()); + + for (final var calendarId : decodeCustomMetadata(group)) { + final var calendarIdElement = groupInfo.addNonUniqueElement(CALENDAR_ID_ELEMENT_NAME); calendarIdElement.setText(calendarId.toString()); } return response; } + + private static MailItem.CustomMetadata encodeCustomMetadata(CreateCalendarGroupRequest req) + throws ServiceException { + final var encodedList = + req.getCalendarIds().stream() + .map(String::valueOf) + .collect(Collectors.joining(LIST_SEPARATOR)); + final var metadata = new Metadata().put(CALENDAR_IDS_METADATA_KEY, encodedList).toString(); + return new MailItem.CustomMetadata(CALENDAR_IDS_SECTION_KEY, metadata); + } + + private static List decodeCustomMetadata(Folder group) throws ServiceException { + final var encodedList = + group.getCustomData(CALENDAR_IDS_SECTION_KEY).get(CALENDAR_IDS_METADATA_KEY); + return Arrays.stream(encodedList.split(LIST_SEPARATOR)).toList(); + } } diff --git a/store/src/test/java/com/zimbra/cs/service/account/CreateCalendarGroupTest.java b/store/src/test/java/com/zimbra/cs/service/account/CreateCalendarGroupTest.java index 460cd8ee96d..e41a5222f7d 100644 --- a/store/src/test/java/com/zimbra/cs/service/account/CreateCalendarGroupTest.java +++ b/store/src/test/java/com/zimbra/cs/service/account/CreateCalendarGroupTest.java @@ -46,7 +46,7 @@ void setUp() throws Exception { void createGroup() throws Exception { final var request = new CreateCalendarGroupRequest(); request.setName("Test Group"); - request.setCalendarIds(List.of("1", "2", "3")); + request.setCalendarIds(List.of("10", "420", "421")); final var soapResponse = getSoapClient().executeSoap(account, request);