public ActionResult RestoreAnnotationReplies(string connectionId, string fileId, string annotationGuid, AnnotationReplyInfo[] replies, string callback = null)
 {
     try
     {
         var result = (replies == null || replies.Length == 0 ?
             new RestoreRepliesResult { AnnotationGuid = annotationGuid, ReplyIds = new string[0] } :
             _annotationSvc.RestoreAnnotationReplies(connectionId, fileId, annotationGuid, replies));
         return this.JsonOrJsonP(result, callback);
     }
     catch(AnnotatorException e)
     {
         return this.JsonOrJsonP(new FailedResponse { Reason = e.Message }, callback);
     }
 }
        /// <summary>
        /// Restores a hierarchy of annotation replies
        /// </summary>
        /// <param name="connectionId">Socket connection identifier to validate user permissions for</param>
        /// <param name="fileId">The document path to update the reply text for</param>
        /// <param name="annotationGuid">The annotation global unique identifier</param>
        /// <param name="replies">The list of annotation replies to restore</param>
        /// <returns>An instance of an object containing the operation result</returns>
        public RestoreRepliesResult RestoreAnnotationReplies(string connectionId, string fileId, string annotationGuid, AnnotationReplyInfo[] replies)
        {
            var reviewer = _annotationBroadcaster.GetConnectionUser(connectionId);
            if(reviewer == null)
            {
                throw new AnnotatorException("There is no such reviewer.");
            }
            var user = _userSvc.GetUserByGuid(reviewer.Value.UserGuid);
            var document = GetDocument(fileId, user.Id);

            _annotator.CheckReviewerPermissions(user.Id, document.Id, AnnotationReviewerRights.CanAnnotate);

            if(replies == null || replies.Length == 0)
            {
                return new RestoreRepliesResult { AnnotationGuid = annotationGuid, ReplyIds = new string[0] };
            }

            var idsMap = new StringDictionary();
            var result = new RestoreRepliesResult { AnnotationGuid = annotationGuid, ReplyIds = new string[replies.Length] };
            var annotation = _mapper.Map<CreateAnnotationResult>(_annotator.GetAnnotation(annotationGuid, document.Id, user.Id));

            for(var i = 0; i < replies.Length; i++)
            {
                var r = replies[i];
                var parentGuid = (!string.IsNullOrEmpty(r.ParentReplyGuid) && idsMap.ContainsKey(r.ParentReplyGuid) ?
                    idsMap[r.ParentReplyGuid] : r.ParentReplyGuid);
                var replyResult = _annotator.CreateAnnotationReply(annotation.Id, r.Message, parentGuid, document.Id, user.Id);

                idsMap[r.Guid] = replyResult.ReplyGuid;
                result.ReplyIds[i] = replyResult.ReplyGuid;
            }

            return result;
        }
 public void DeleteAnnotationReply(IList<string> collaboratorGuids, string connectionIdToExclude, string annotationGuid, string replyGuid, AnnotationReplyInfo[] replies)
 {
     Array.ForEach(
         _annotationsHub.GetConnectionIdsToCall(connectionIdToExclude, collaboratorGuids), x =>
                   GetClient(x).deleteAnnotationReplyOnClient(connectionIdToExclude, annotationGuid, replyGuid, replies));
 }