コード例 #1
0
        public async Task <bool> CreateFeedback(Guid sessionId, Guid userId, CreateUserFeedbackDTO feedback)
        {
            var userFeedback = UserFeedbackBO.CreateUserFeedback(sessionId, userId, DateTime.UtcNow, feedback.Comment, feedback.Rate);

            if (await _sessionFeedbackRepository.CreateFeedback(userFeedback))
            {
                _lastFeedbacksWriterService.AddNewFeedback(userFeedback);
                return(true);
            }
            return(false);
        }
コード例 #2
0
 public static UserFeedbackDataModel GenerateFromUserFeedbackBO(UserFeedbackBO bo, int lastUserFeedbacksCount)
 {
     return(new UserFeedbackDataModel()
     {
         LastUserFeedbacksCount = lastUserFeedbacksCount,
         SessionId_UserId = $"{bo.SessionId}_{bo.UserId}",
         SessionId = bo.SessionId.ToString(),
         UserId = bo.UserId.ToString(),
         SubmitDate = DateTimeHelper.DateTime2IsoUtcTime(bo.SubmitDate),
         Comment = bo.Comment,
         Rate = bo.Rate
     });
 }
コード例 #3
0
        public static ReadUserFeedbackDTO CreateDTOFromBO(UserFeedbackBO bo)
        {
            if (bo == null)
            {
                return(null);
            }

            return(new ReadUserFeedbackDTO()
            {
                SessionId = bo.SessionId.ToString(),
                UserId = bo.UserId.ToString(),
                SubmitDate = DateTimeHelper.DateTime2IsoUtcTime(bo.SubmitDate),
                Comment = bo.Comment,
                Rate = bo.Rate
            });
        }
コード例 #4
0
 /// <summary>
 /// SessionFeedbacks table is used to store feedbacks
 ///To satisfy the requirement to get the last feedbacks for a specific session we had to choose SessionId as our hash key
 /// but since we want to be able to do order on date for a session we had to choose SessionId as hash
 /// not the best index since it might be the case that there are many users in one session so the best index would be using userId as hash and sessionId as index
 /// While creating the feedback we use the uniqueness of sessionId and userId as a condition to preventing multiple feedback
 /// </summary>
 /// <param name="userFeedback"></param>
 /// <returns>True if it succeeded to add a feedback for the user, and false if user has already added a feedback for the session.</returns>
 public async Task <bool> CreateFeedback(UserFeedbackBO userFeedback)
 {
     try
     {
         var request = new PutItemRequest
         {
             TableName = _SessionFeedbacksTableName,
             Item      = new Dictionary <string, AttributeValue>()
             {
                 { nameof(UserFeedbackBO.SessionId), new AttributeValue {
                       S = userFeedback.SessionId.ToString()
                   } },
                 { $"{nameof(UserFeedbackBO.SessionId) }_{nameof(UserFeedbackBO.Rate) }", new AttributeValue {
                       S = $"{userFeedback.SessionId.ToString()}_{((int)userFeedback.Rate).ToString()}"
                   } },
                 { nameof(UserFeedbackBO.UserId), new AttributeValue()
                   {
                       S = userFeedback.UserId.ToString()
                   } },
                 { nameof(UserFeedbackBO.SubmitDate), new AttributeValue()
                   {
                       S = DateTimeHelper.DateTime2IsoUtcTime(userFeedback.SubmitDate)
                   } },
                 { nameof(UserFeedbackBO.Comment), new AttributeValue()
                   {
                       S = userFeedback.Comment
                   } },
                 { nameof(UserFeedbackBO.Rate), new AttributeValue()
                   {
                       N = ((int)userFeedback.Rate).ToString()
                   } },
             },
             //This condition lets us prevent having more than one feedback from a user for a specific session
             //https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.ConditionalUpdate
             ConditionExpression = "attribute_not_exists(UserId)"
         };
         await ExecuteCommand(request);
     }
     catch (ConditionalCheckFailedException)
     {
         //when this exception happens means already there is a feedback from the user with UserId
         //for the session with SessionId
         return(false);
     }
     return(true);
 }
コード例 #5
0
        /// <summary>
        /// Mapper function from data values to our Business Object
        /// </summary>
        /// <param name="items"></param>
        /// <returns></returns>
        private IEnumerable <UserFeedbackBO> ExtractQueryResult(List <Dictionary <string, AttributeValue> > items)
        {
            var result = new List <UserFeedbackBO>();

            foreach (var item in items)
            {
                var feedback = UserFeedbackBO.CreateUserFeedback(
                    Guid.Parse(item[nameof(UserFeedbackBO.SessionId)].S),
                    Guid.Parse(item[nameof(UserFeedbackBO.UserId)].S),
                    DateTimeHelper.IsoUtcTime2UtcDateTime(item[nameof(UserFeedbackBO.SubmitDate)].S),
                    item[nameof(UserFeedbackBO.Comment)].S,
                    (UserRate)int.Parse(item[nameof(UserFeedbackBO.Rate)].N)
                    );
                result.Add(feedback);
            }
            return(result);
        }
コード例 #6
0
 public Task CreateFeedback(UserFeedbackBO userFeedback)
 {
     return(this._sessionFeedbackRepository.CreateFeedback(userFeedback));
 }