Skip to content

Commit

Permalink
feat: store calendar group as folder
Browse files Browse the repository at this point in the history
  • Loading branch information
matteobaglini authored and drazen04 committed Nov 11, 2024
1 parent aeed771 commit 26b232c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Object> context) throws ServiceException {
final var zsc = getZimbraSoapContext(context);
Expand All @@ -28,23 +40,40 @@ public Element handle(Element request, Map<String, Object> 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<String> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 26b232c

Please sign in to comment.