private async Task MatchLinkerTags(SharelinkTagService tagService, ShareThing newShare, List<ShareThingMail> mails, IEnumerable<SharelinkTag> newShareTags)
 {
     var userService = this.UseSharelinkerService().GetSharelinkerService();
     var linkers = await userService.GetUserlinksOfUserId(UserSessionData.UserId);
     var linkerIds = from l in linkers select l.SlaveUserObjectId;
     var linkersTags = await tagService.GetLinkersTags(linkerIds);
     foreach (var linkerTags in linkersTags)
     {
         var sendMailFlag = false;
         var mail = new ShareThingMail()
         {
             ShareId = newShare.Id,
             Time = DateTime.UtcNow
         };
         if (linkerTags.Key != newShare.UserId)
         {
             var linkTagDatas = from lt in linkerTags.Value select lt;
             var matchTags = tagService.MatchTags(newShareTags, linkTagDatas);
             if (matchTags.Count() > 0)
             {
                 mail.Tags = matchTags;
                 sendMailFlag = true;
                 mail.ToSharelinker = linkerTags.Key;
             }
         }
         if (sendMailFlag)
         {
             mails.Add(mail);
         }
     }
 }
        private async Task<object> SetShareFinished(ShareThing newShare, SharelinkTagService tagService, ShareService service)
        {
            var mails = new List<ShareThingMail>();
            IEnumerable<dynamic> dynamicTags = from tagJson in newShare.Tags select JsonConvert.DeserializeObject(tagJson);
            var newShareTags = (from dt in dynamicTags
                                select new SharelinkTag()
                                {
                                    Data = dt.data,
                                    TagType = dt.type
                                }).ToList();
            var isPrivateShare = newShareTags.Count(st => st.IsPrivateTag()) > 0;
            newShareTags.Add(new SharelinkTag()
            {
                Data = UserSessionData.UserId,
                TagType = SharelinkTagConstant.TAG_TYPE_SHARELINKER
            });
            mails.Add(new ShareThingMail()
            {
                ShareId = newShare.Id,
                Time = DateTime.UtcNow,
                ToSharelinker = new ObjectId(UserSessionData.UserId)
            });

            if (isPrivateShare == false)
            {
                await MatchLinkerTags(tagService, newShare, mails, newShareTags);
            }
            service.InsertMails(mails);
            Startup.ServicesProvider.GetBahamutPubSubService().PublishShareMessages(mails);
            return new { message = "ok" };
        }