Skip to content

Commit

Permalink
feat: add modify calendar group.
Browse files Browse the repository at this point in the history
  • Loading branch information
drazen04 committed Nov 11, 2024
1 parent ccb8b1e commit 5835e2f
Show file tree
Hide file tree
Showing 6 changed files with 196 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,8 @@ private MailConstants() {}
public static final String E_CREATE_CALENDAR_GROUP_RESPONSE = "CreateCalendarGroupResponse";
public static final String E_DELETE_CALENDAR_GROUP_REQUEST = "DeleteCalendarGroupRequest";
public static final String E_DELETE_CALENDAR_GROUP_RESPONSE = "DeleteCalendarGroupResponse";
public static final String E_MODIFY_CALENDAR_GROUP_REQUEST = "ModifyCalendarGroupRequest";
public static final String E_MODIFY_CALENDAR_GROUP_RESPONSE = "ModifyCalendarGroupResponse";

// noop
public static final QName NO_OP_REQUEST = QName.get(E_NO_OP_REQUEST, NAMESPACE);
Expand Down Expand Up @@ -466,6 +468,10 @@ private MailConstants() {}
QName.get(E_DELETE_CALENDAR_GROUP_REQUEST, NAMESPACE);
public static final QName DELETE_CALENDAR_GROUP_RESPONSE =
QName.get(E_DELETE_CALENDAR_GROUP_RESPONSE, NAMESPACE);
public static final QName MODIFY_CALENDAR_GROUP_REQUEST =
QName.get(E_MODIFY_CALENDAR_GROUP_REQUEST, NAMESPACE);
public static final QName MODIFY_CALENDAR_GROUP_RESPONSE =
QName.get(E_MODIFY_CALENDAR_GROUP_RESPONSE, NAMESPACE);

public static final QName GET_APPT_SUMMARIES_REQUEST =
QName.get(E_GET_APPT_SUMMARIES_REQUEST, NAMESPACE);
Expand Down
25 changes: 14 additions & 11 deletions soap/src/main/java/com/zimbra/soap/JaxbUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,6 @@
import com.zimbra.soap.mail.type.ModifyNotification.ModifyItemNotification;
import com.zimbra.soap.mail.type.PendingFolderModifications;
import com.zimbra.soap.util.JaxbInfo;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import org.dom4j.Document;
import org.dom4j.Namespace;
import org.dom4j.io.DocumentResult;
Expand All @@ -55,6 +44,18 @@
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public final class JaxbUtil {

private static final Log LOG = ZimbraLog.soap;
Expand Down Expand Up @@ -708,6 +709,8 @@ public final class JaxbUtil {
com.zimbra.soap.mail.message.CreateCalendarGroupResponse.class,
com.zimbra.soap.mail.message.DeleteCalendarGroupRequest.class,
com.zimbra.soap.mail.message.DeleteCalendarGroupResponse.class,
com.zimbra.soap.mail.message.ModifyCalendarGroupRequest.class,
com.zimbra.soap.mail.message.ModifyCalendarGroupResponse.class,
com.zimbra.soap.mail.message.GetCalendarItemSummariesRequest.class,
com.zimbra.soap.mail.message.GetCalendarItemSummariesResponse.class,
com.zimbra.soap.mail.message.GetContactsRequest.class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// SPDX-FileCopyrightText: 2022 Synacor, Inc.
// SPDX-FileCopyrightText: 2022 Zextras <https://www.zextras.com>
//
// SPDX-License-Identifier: GPL-2.0-only

package com.zimbra.soap.mail.message;

import com.zimbra.common.soap.MailConstants;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

/**
* @zm-api-command-auth-required true
* @zm-api-command-admin-auth-required false
* @zm-api-command-description Modify a new Calendar Group
*/
@XmlRootElement(name = MailConstants.E_MODIFY_CALENDAR_GROUP_REQUEST)
public class ModifyCalendarGroupRequest {
/** no-argument constructor wanted by JAXB */
public ModifyCalendarGroupRequest() {}

/**
* @zm-api-field-tag id
* @zm-api-field-description Calendar Group ID
*/
@XmlAttribute(name = "id" /* id */, required = true)
private String id;

/**
* @zm-api-field-tag calendarIds
* @zm-api-field-description Calendar IDs
*/
@XmlElement(name = "calendarId" /* calendarId */, required = true)
private List<String> calendarIds;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public List<String> getCalendarIds() {
return calendarIds;
}

public void setCalendarIds(List<String> calendarIds) {
this.calendarIds = calendarIds;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SPDX-FileCopyrightText: 2022 Synacor, Inc.
// SPDX-FileCopyrightText: 2022 Zextras <https://www.zextras.com>
//
// SPDX-License-Identifier: GPL-2.0-only

package com.zimbra.soap.mail.message;

import com.zimbra.common.soap.MailConstants;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = MailConstants.E_MODIFY_CALENDAR_GROUP_RESPONSE)
public class ModifyCalendarGroupResponse {
/**
* @zm-api-field-tag group
* @zm-api-field-description Calendar Group Info
*/
@XmlElement(name = "group" /* group */, required = true)
private CalendarGroupInfo group;

/** no-argument constructor wanted by JAXB */
public ModifyCalendarGroupResponse() {}

public CalendarGroupInfo getGroup() {
return group;
}

public void setGroup(CalendarGroupInfo group) {
this.group = group;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ public void registerHandlers(DocumentDispatcher dispatcher) {
dispatcher.registerHandler(MailConstants.GET_CALENDAR_GROUPS_REQUEST, new GetCalendarGroups());
dispatcher.registerHandler(MailConstants.CREATE_CALENDAR_GROUP_REQUEST, new CreateCalendarGroup());
dispatcher.registerHandler(MailConstants.DELETE_CALENDAR_GROUP_REQUEST, new DeleteCalendarGroup());
dispatcher.registerHandler(MailConstants.MODIFY_CALENDAR_GROUP_REQUEST, new ModifyCalendarGroup());
dispatcher.registerHandler(MailConstants.GET_APPT_SUMMARIES_REQUEST, new GetApptSummaries());
dispatcher.registerHandler(MailConstants.GET_APPOINTMENT_REQUEST, new GetAppointment());
dispatcher.registerHandler(MailConstants.SET_APPOINTMENT_REQUEST, new SetAppointment());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.zimbra.cs.service.mail;

import com.zimbra.common.service.ServiceException;
import com.zimbra.common.soap.Element;
import com.zimbra.common.soap.MailConstants;
import com.zimbra.cs.index.SortBy;
import com.zimbra.cs.mailbox.Folder;
import com.zimbra.cs.mailbox.MailItem;
import com.zimbra.cs.mailbox.Mailbox;
import com.zimbra.cs.mailbox.Metadata;
import com.zimbra.cs.mailbox.OperationContext;
import com.zimbra.soap.ZimbraSoapContext;
import com.zimbra.soap.mail.message.ModifyCalendarGroupRequest;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class ModifyCalendarGroup 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);
final var account = getRequestedAccount(zsc);

if (!canAccessAccount(zsc, account))
throw ServiceException.PERM_DENIED("can not access account");

final var mbox = getRequestedMailbox(zsc);
final var octxt = getOperationContext(zsc, context);

ModifyCalendarGroupRequest req = zsc.elementToJaxb(request);

// TODO - double: ServiceException.OPERATION_DENIED | ServiceException.FAILURE | ServiceException.PERM_DENIED
int id = Integer.parseInt(req.getId());
var group = getFolderById(mbox, octxt, id)
.orElseThrow(() -> ServiceException.OPERATION_DENIED("Calendar group with ID " + req.getId() + " does NOT exist"));

mbox.setCustomData(octxt, group.getId(), MailItem.Type.CALENDAR_GROUP, encodeCustomMetadata(req));
return buildResponse(zsc, group);
}

private static Element buildResponse(ZimbraSoapContext zsc, Folder group)
throws ServiceException {
final var response = zsc.createElement(MailConstants.MODIFY_CALENDAR_GROUP_RESPONSE);

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);
}
return response;
}

private static Optional<Folder> getFolderById(Mailbox mbox, OperationContext octxt, int id) throws ServiceException {
return mbox.getCalendarGroups(octxt, SortBy.NAME_ASC).stream()
.filter(group -> group.getId() == id).findFirst();
}

private static MailItem.CustomMetadata encodeCustomMetadata(ModifyCalendarGroupRequest 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();
}
}

0 comments on commit 5835e2f

Please sign in to comment.