-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
196 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
54 changes: 54 additions & 0 deletions
54
soap/src/main/java/com/zimbra/soap/mail/message/ModifyCalendarGroupRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
soap/src/main/java/com/zimbra/soap/mail/message/ModifyCalendarGroupResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
89 changes: 89 additions & 0 deletions
89
store/src/main/java/com/zimbra/cs/service/mail/ModifyCalendarGroup.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |