public void FromDbItem_FullyPopulated_ExpectedContent()
        {
            Dictionary <string, AttributeValue> input = GetPopulatedDbItem();
            PhotoLikeRecord result = Mappers.PhotoLike.FromDbItem(input);

            result.CreatedTime.ShouldBe(createdTime);
            result.PhotoId.ShouldBe(photoId);
            result.UserId.ShouldBe(userId);
        }
Exemple #2
0
        private async Task AddLikeRecord(UserId userId, PhotoId photoId)
        {
            logWriter.LogInformation($"{nameof(AddLikeRecord)}({nameof(userId)} = '{userId}', {nameof(photoId)} = '{photoId}')");

            var photo = await photoRepository.GetPhotoById(photoId, Guid.Empty);

            if (photo.PhotoIsLikedByCurrentUser)
            {
                return;
            }

            PhotoLikeRecord likeRecord = new PhotoLikeRecord
            {
                UserId      = userId,
                PhotoId     = photoId,
                CreatedTime = DateTimeOffset.UtcNow
            };

            var scoreDelta = scoreCalculator.GetLikeScore(likeRecord);

            var putItemRequest = new PutItemRequest()
            {
                TableName = tableName,
                Item      = Mappers.PhotoLike.ToDbItem(likeRecord),
            };

            try
            {
                await dynamoDbCore.PutItem(putItemRequest);
                await UpdateLikeCountAndScore(photo, 1, scoreDelta);
            }
            catch (Exception ex)
            {
                logWriter.LogError(ex, $"Error in {nameof(AddLikeRecord)}({nameof(userId)} = '{userId}', {nameof(photoId)} = '{photoId}'):\n{ex.ToString()}");
                throw;
            }
        }
Exemple #3
0
        private async Task RemoveLikeRecord(UserId userId, PhotoId photoId)
        {
            BatchGetItemRequest request = new BatchGetItemRequest
            {
                RequestItems = new Dictionary <string, KeysAndAttributes>
                {
                    { tableName, new KeysAndAttributes {
                          Keys = new[] {
                              Mappers.PhotoModel.ToDbKey(new PhotoModel {
                                    PhotoId = photoId
                                }),
                              Mappers.PhotoLike.ToDbKey(new PhotoLikeRecord {
                                    PhotoId = photoId, UserId = userId
                                })
                          }.ToList()
                      } }
                }
            };

            var items = await dynamoDbCore.BatchGetItem(request);

            PhotoModel      photo      = null;
            PhotoLikeRecord likeRecord = null;

            foreach (var item in items[tableName])
            {
                switch (item[FieldMappings.RecordType].S.ToLower())
                {
                case "photo":
                    photo = Mappers.PhotoModel.FromDbItem(item);
                    break;

                case "photolike":
                    likeRecord = Mappers.PhotoLike.FromDbItem(item);
                    break;
                }
            }

            if (likeRecord == null)
            {
                return;
            }

            logWriter.LogInformation($"{nameof(RemoveLikeRecord)}({nameof(userId)} = '{userId}', {nameof(photoId)} = '{photoId}')");

            var scoreDelta = scoreCalculator.GetLikeScore(likeRecord) * -1;

            var deleteItemRequest = new DeleteItemRequest(
                tableName,
                Mappers.PhotoLike.ToDbKey(new PhotoLikeRecord
            {
                UserId      = userId,
                PhotoId     = photoId,
                CreatedTime = system.Time.UtcNow
            }));

            try
            {
                await dynamoDbCore.DeleteItem(deleteItemRequest);
                await UpdateLikeCountAndScore(photo, -1, scoreDelta);
            }
            catch (Exception ex)
            {
                logWriter.LogError(ex, $"Error in {nameof(RemoveLikeRecord)}({nameof(userId)} = '{userId}', {nameof(photoId)} = '{photoId}'):\n{ex.ToString()}");
                throw;
            }
        }