/// <summary> /// Update a relationship between a user and a topic /// </summary> /// <param name="processType">Process type</param> /// <param name="relationshipOperation">Relationship operation</param> /// <param name="relationshipHandle">Relationship handle</param> /// <param name="followerUserHandle">Follower user handle</param> /// <param name="followingTopicHandle">Following topic handle</param> /// <param name="appHandle">App handle</param> /// <param name="lastUpdatedTime">Last updated time</param> /// <param name="followerRelationshipLookupEntity">Follower relationship lookup entity</param> /// <param name="followingRelationshipLookupEntity">Following relationship lookup entity</param> /// <returns>Update relationship task</returns> public async Task UpdateRelationshipToTopic( ProcessType processType, RelationshipOperation relationshipOperation, string relationshipHandle, string followerUserHandle, string followingTopicHandle, string appHandle, DateTime lastUpdatedTime, ITopicRelationshipLookupEntity followerRelationshipLookupEntity, ITopicRelationshipLookupEntity followingRelationshipLookupEntity) { TopicRelationshipStatus topicRelationshipStatus = this.GetTopicRelationshipStatus(relationshipOperation); if (processType == ProcessType.Frontend) { await this.topicRelationshipsStore.UpdateTopicFollowerRelationship( StorageConsistencyMode.Strong, relationshipHandle, followingTopicHandle, followerUserHandle, appHandle, topicRelationshipStatus, lastUpdatedTime, followerRelationshipLookupEntity); await this.topicRelationshipsStore.UpdateTopicFollowingRelationship( StorageConsistencyMode.Strong, relationshipHandle, followerUserHandle, followingTopicHandle, appHandle, topicRelationshipStatus, lastUpdatedTime, followingRelationshipLookupEntity); // fanout an activity indicating that the followerUser is now following the followingTopicHandle await this.fanoutActivitiesQueue.SendFanoutActivityMessage( followerUserHandle, appHandle, relationshipHandle, ActivityType.Following, followerUserHandle, null, ContentType.Topic, followingTopicHandle, lastUpdatedTime); } }
/// <summary> /// Get topic relationship status /// </summary> /// <param name="relationshipOperation">Relationship operation</param> /// <returns>Topic relationship status</returns> private TopicRelationshipStatus GetTopicRelationshipStatus(RelationshipOperation relationshipOperation) { TopicRelationshipStatus topicRelationshipStatus = TopicRelationshipStatus.None; if (relationshipOperation == RelationshipOperation.UnfollowTopic) { topicRelationshipStatus = TopicRelationshipStatus.None; } else if (relationshipOperation == RelationshipOperation.FollowTopic) { topicRelationshipStatus = TopicRelationshipStatus.Follow; } else { this.log.LogError("Invalid relationship operation on topic"); } return(topicRelationshipStatus); }
/// <summary> /// Update topic follower relationship. /// Follower user : someone who follows the topic. /// </summary> /// <param name="storageConsistencyMode">Consistency mode</param> /// <param name="relationshipHandle">Relationship handle</param> /// <param name="topicHandle">topic handle</param> /// <param name="relationshipUserHandle">Relationship user handle</param> /// <param name="appHandle">App handle</param> /// <param name="topicRelationshipStatus">Topic relationship status</param> /// <param name="lastUpdatedTime">Last updated time</param> /// <param name="readTopicRelationshipLookupEntity">Read topic relationship lookup entity</param> /// <returns>Update follower relationship task</returns> public async Task UpdateTopicFollowerRelationship( StorageConsistencyMode storageConsistencyMode, string relationshipHandle, string topicHandle, string relationshipUserHandle, string appHandle, TopicRelationshipStatus topicRelationshipStatus, DateTime lastUpdatedTime, ITopicRelationshipLookupEntity readTopicRelationshipLookupEntity) { CTStore store = await this.tableStoreManager.GetStore(ContainerIdentifier.TopicFollowers); ObjectTable lookupTable = this.tableStoreManager.GetTable(ContainerIdentifier.TopicFollowers, TableIdentifier.TopicFollowersLookup) as ObjectTable; FeedTable feedTable = this.tableStoreManager.GetTable(ContainerIdentifier.TopicFollowers, TableIdentifier.TopicFollowersFeed) as FeedTable; CountTable countTable = this.tableStoreManager.GetTable(ContainerIdentifier.TopicFollowers, TableIdentifier.TopicFollowersCount) as CountTable; string objectKey = this.GetObjectKey(appHandle, relationshipUserHandle); string feedKey = this.GetFeedKey(appHandle, topicRelationshipStatus); string countKey = this.GetCountKey(appHandle, topicRelationshipStatus); Transaction transaction = new Transaction(); UserRelationshipFeedEntity relationshipFeedEntity = new UserRelationshipFeedEntity() { RelationshipHandle = relationshipHandle, UserHandle = relationshipUserHandle }; if (readTopicRelationshipLookupEntity == null) { // if readTopicRelationshipLookupEntity is null, then we are inserting a new relationship TopicRelationshipLookupEntity newRelationshipLookupEntity = new TopicRelationshipLookupEntity() { RelationshipHandle = relationshipHandle, LastUpdatedTime = lastUpdatedTime, TopicRelationshipStatus = topicRelationshipStatus, }; transaction.Add(Operation.Insert(lookupTable, topicHandle, objectKey, newRelationshipLookupEntity)); if (topicRelationshipStatus != TopicRelationshipStatus.None) { transaction.Add(Operation.Insert(feedTable, topicHandle, feedKey, relationshipHandle, relationshipFeedEntity)); transaction.Add(Operation.InsertOrIncrement(countTable, topicHandle, countKey)); } } else { // otherwise, we are updating an existing relationship TopicRelationshipStatus oldTopicRelationshipStatus = readTopicRelationshipLookupEntity.TopicRelationshipStatus; string oldRelationshipHandle = readTopicRelationshipLookupEntity.RelationshipHandle; string oldFeedKey = this.GetFeedKey(appHandle, oldTopicRelationshipStatus); string oldCountKey = this.GetCountKey(appHandle, oldTopicRelationshipStatus); readTopicRelationshipLookupEntity.RelationshipHandle = relationshipHandle; readTopicRelationshipLookupEntity.TopicRelationshipStatus = topicRelationshipStatus; readTopicRelationshipLookupEntity.LastUpdatedTime = lastUpdatedTime; transaction.Add(Operation.Replace(lookupTable, topicHandle, objectKey, readTopicRelationshipLookupEntity as TopicRelationshipLookupEntity)); if (topicRelationshipStatus == oldTopicRelationshipStatus) { if (topicRelationshipStatus != TopicRelationshipStatus.None && relationshipHandle != oldRelationshipHandle) { transaction.Add(Operation.Delete(feedTable, topicHandle, oldFeedKey, oldRelationshipHandle)); transaction.Add(Operation.Insert(feedTable, topicHandle, feedKey, relationshipHandle, relationshipFeedEntity)); } } else { if (topicRelationshipStatus != TopicRelationshipStatus.None) { transaction.Add(Operation.Insert(feedTable, topicHandle, feedKey, relationshipHandle, relationshipFeedEntity)); transaction.Add(Operation.Increment(countTable, topicHandle, countKey)); } if (oldTopicRelationshipStatus != TopicRelationshipStatus.None) { transaction.Add(Operation.Delete(feedTable, topicHandle, oldFeedKey, oldRelationshipHandle)); transaction.Add(Operation.Increment(countTable, topicHandle, oldCountKey, -1.0)); } } } await store.ExecuteTransactionAsync(transaction, storageConsistencyMode.ToConsistencyMode()); }
/// <summary> /// Get count key from app handle and relationship status /// </summary> /// <param name="appHandle">App handle</param> /// <param name="relationshipStatus">Relationship status</param> /// <returns>Count key</returns> private string GetCountKey(string appHandle, TopicRelationshipStatus relationshipStatus) { return(string.Join("+", appHandle, relationshipStatus.ToString())); }