public void StoreAnswer(Answer answer) { using var redis = RedisManager.GetClient(); if (answer.Id == default(long)) { answer.Id = redis.As <Answer>().GetNextSequence(); answer.CreatedDate = DateTime.UtcNow; } //Store as a 'Related Answer' to the parent Question redis.As <Question>().StoreRelatedEntities(answer.QuestionId, answer); //Populate user => answer index redis.AddItemToSet(UserAnswerIndex.Answers(answer.UserId), answer.Id.ToString()); }
public void VoteAnswerDown(long userId, long answerId) { //Populate Question => User and User => Question set indexes in a single transaction RedisManager.ExecTrans(trans => { //Register downvote against answer and remove any upvotes if any trans.QueueCommand(redis => redis.AddItemToSet(AnswerUserIndex.DownVotes(answerId), userId.ToString())); trans.QueueCommand(redis => redis.RemoveItemFromSet(AnswerUserIndex.UpVotes(answerId), userId.ToString())); //Register downvote against user and remove any upvotes if any trans.QueueCommand(redis => redis.AddItemToSet(UserAnswerIndex.DownVotes(userId), answerId.ToString())); trans.QueueCommand(redis => redis.RemoveItemFromSet(UserAnswerIndex.UpVotes(userId), answerId.ToString())); }); }
/// <summary> /// Delete Answer by performing compensating actions to StoreAnswer() to keep the datastore in a consistent state /// </summary> /// <param name="questionId"></param> /// <param name="answerId"></param> public void DeleteAnswer(long questionId, long answerId) { using var redis = RedisManager.GetClient(); var answer = redis.As <Question>().GetRelatedEntities <Answer>(questionId).FirstOrDefault(x => x.Id == answerId); if (answer == null) { return; } redis.As <Question>().DeleteRelatedEntity <Answer>(questionId, answerId); //remove user => answer index redis.RemoveItemFromSet(UserAnswerIndex.Answers(answer.UserId), answerId.ToString()); }