public BalancesModule(ICheckingAccountsData accountsData)
            : base("/api")
        {
            this.RequiresAuthentication();
            _accountsData = accountsData;
            Get["/CheckingAccounts"] = parameters => { return Response.AsJson(accountsData.GetAll()); };

            Get["/CheckingAccounts/{id}"] = parameters =>
                {
                    int id = int.Parse(parameters.id);
                    CheckingAccount checkingAccount = accountsData.Get(id);

                    if (checkingAccount == null)
                    {
                        return new Response
                            {
                                StatusCode = HttpStatusCode.NotFound
                            };
                    }
                    return Response.AsJson(checkingAccount);
                };
            Put["/CheckingAccounts/{id}"] = parameters =>
                {
                    var account = this.Bind<CheckingAccount>();

                    _accountsData.Update(account);

                    return new Response
                        {
                            StatusCode = HttpStatusCode.OK
                        };
                };

            Delete["/CheckingAccounts/{id}"] = parameters =>
                {
                    int id = int.Parse(parameters.id);

                    _accountsData.Delete(id);

                    return new Response
                        {
                            StatusCode = HttpStatusCode.OK
                        };
                };

            Post["/CheckingAccounts"] = parameters =>
                {
                    var account = this.Bind<CheckingAccount>();

                    _accountsData.Add(account);

                    return new Response
                        {
                            StatusCode = HttpStatusCode.OK
                        };
                };
        }
        public BalancesModule(ICheckingAccountsData accountsData) : base("/api")
        {
            this.RequiresAuthentication();
            _accountsData            = accountsData;
            Get["/CheckingAccounts"] = parameters => { return(Response.AsJson(accountsData.GetAll())); };

            Get["/CheckingAccounts/{id}"] = parameters =>
            {
                int             id = int.Parse(parameters.id);
                CheckingAccount checkingAccount = accountsData.Get(id);

                if (checkingAccount == null)
                {
                    return(new Response
                    {
                        StatusCode = HttpStatusCode.NotFound
                    });
                }
                return(Response.AsJson(checkingAccount));
            };
            Put["/CheckingAccounts/{id}"] = parameters =>
            {
                var account = this.Bind <CheckingAccount>();

                _accountsData.Update(account);

                return(new Response
                {
                    StatusCode = HttpStatusCode.OK
                });
            };

            Delete["/CheckingAccounts/{id}"] = parameters =>
            {
                int id = int.Parse(parameters.id);

                _accountsData.Delete(id);

                return(new Response
                {
                    StatusCode = HttpStatusCode.OK
                });
            };

            Post["/CheckingAccounts"] = parameters =>
            {
                var account = this.Bind <CheckingAccount>();

                _accountsData.Add(account);

                return(new Response
                {
                    StatusCode = HttpStatusCode.OK
                });
            };
        }
        public TransfersModule(ICheckingAccountsData accountsData) : base("/api")
        {
            this.RequiresAuthentication();
            _accountsData = accountsData;

            Post["/PerformTransfer"] = parameters =>
            {
                var account = this.Bind <TransferRequest>();

                CheckingAccount source      = _accountsData.Get(account.SourceId);
                CheckingAccount destination = _accountsData.Get(account.DestinationId);

                if (source.Balance < account.Amount)
                {
                    return(Response.AsJson(new ApiError
                    {
                        ErrorMessage = "Not enough money from source share.",
                        ErrorCode = 1234,
                        ErrorName = "not_enough_money"
                    }, HttpStatusCode.BadRequest));
                }


                source.Balance      -= account.Amount;
                destination.Balance += account.Amount;

                source.RecentTransactions.Insert(0, new RecentTransaction
                {
                    Amount    = -account.Amount,
                    Comment   = "Transfer to " + destination.Description,
                    OccuredOn = DateTime.Now.ToString()
                });


                destination.RecentTransactions.Insert(0, new RecentTransaction
                {
                    Amount    = account.Amount,
                    Comment   = "Transfer from " + source.Description,
                    OccuredOn = DateTime.Now.ToString()
                });


                return(new Response
                {
                    StatusCode = HttpStatusCode.Created
                });
            };
        }
        public TransfersModule(ICheckingAccountsData accountsData)
            : base("/api")
        {
            this.RequiresAuthentication();
            _accountsData = accountsData;

            Post["/PerformTransfer"] = parameters =>
                {
                    var account = this.Bind<TransferRequest>();

                    CheckingAccount source = _accountsData.Get(account.SourceId);
                    CheckingAccount destination = _accountsData.Get(account.DestinationId);

                    if (source.Balance < account.Amount)
                    {
                        return Response.AsJson(new ApiError
                            {
                                ErrorMessage = "Not enough money from source share.",
                                ErrorCode = 1234,
                                ErrorName = "not_enough_money"
                            }, HttpStatusCode.BadRequest);
                    }

                    source.Balance -= account.Amount;
                    destination.Balance += account.Amount;

                    source.RecentTransactions.Insert(0, new RecentTransaction
                        {
                            Amount = -account.Amount,
                            Comment = "Transfer to " + destination.Description,
                            OccuredOn = DateTime.Now.ToString()
                        });

                    destination.RecentTransactions.Insert(0, new RecentTransaction
                        {
                            Amount = account.Amount,
                            Comment = "Transfer from " + source.Description,
                            OccuredOn = DateTime.Now.ToString()
                        });

                    return new Response
                        {
                            StatusCode = HttpStatusCode.Created
                        };
                };
        }