rafaelturon/blockchain-investments

View on GitHub
src/Blockchain.Investments.Api/Controllers/TransactionController.cs

Summary

Maintainability
A
0 mins
Test Coverage
using System;
using System.Linq;
using System.Collections.Generic;
using Blockchain.Investments.Core.ReadModel;
using Blockchain.Investments.Core.ReadModel.Dtos;
using Blockchain.Investments.Core.WriteModel.Commands;
using CQRSlite.Commands;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Blockchain.Investments.Core.Domain;
using Blockchain.Investments.Core.Infrastructure;
using Microsoft.AspNetCore.Http;

namespace Blockchain.Investments.Api.Controllers
{
    [Route("api/[controller]")]
    public class TransactionController : Controller
    {
        private readonly ILogger<TransactionController> _logger;
        private readonly ICommandSender _commandSender;
        private readonly IReadModelFacade _readmodel;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public TransactionController (ILogger<TransactionController> logger,
                                        IHttpContextAccessor httpContextAccessor,
                                        ICommandSender commandSender,
                                        IReadModelFacade readmodel)
        {
            _logger = logger;
            _httpContextAccessor = httpContextAccessor;
            _readmodel = readmodel;
            _commandSender = commandSender;
        }

        // GET api/values
        [HttpGet]
        public IEnumerable<BookDto> Get()
        {
            _logger.LogInformation(LoggingEvents.LIST_ITEMS, "Listing all items");
            return _readmodel.GetTransactionItems();
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public IActionResult Get(Guid id)
        {
            _logger.LogInformation(LoggingEvents.GET_ITEM, "Getting item {0}", id.ToString());

            var transaction = _readmodel.GetTransactionItems().FirstOrDefault(p => p.AggregateId == id);
            if (transaction == null)
            {
                _logger.LogWarning(LoggingEvents.GET_ITEM_NOTFOUND, "GetById({ID}) NOT FOUND", id.ToString());
                return NotFound();
            }
            return new ObjectResult(transaction);
        }

        // POST api/values
        [HttpPost]
        public IActionResult Post([FromBody]JournalEntry journalEntry)
        {
            if (journalEntry == null || journalEntry.EventDate == null ||
                 journalEntry.Splits == null || journalEntry.Splits.Count < 2)
            {
                return BadRequest();
            }

            string userId = _httpContextAccessor.HttpContext.User.Claims
                            .Where(c => c.Type == Constants.ClaimType)
                            .Select(c => c.Value).SingleOrDefault();
            BookDto book = _readmodel.Find("UserId", userId);
            if (book == null)
            {
                Guid journalEntryId = Guid.NewGuid();
                _commandSender.Send(new CreateJournal(journalEntryId, userId, journalEntry));
                _logger.LogInformation(LoggingEvents.INSERT_ITEM, "Item {0} Added. New Book", journalEntryId);
            }
            else
            {
                _commandSender.Send(new AddJournalEntry(book.AggregateId, userId, journalEntry));
                _logger.LogInformation(LoggingEvents.UPDATE_ITEM, "Item {0} Added", book.AggregateId);
            }

            return new OkResult();
        }
    }
}