Пример #1
0
 public CurrenciesController(
     IGetCurrencies getCurrencies,
     IGetCurrencyByCode getCurrencyByCode,
     IUpsertCurrency upsertCurrency,
     IDeleteCurrency deleteCurrency,
     Func <Try <Email>, string, CreateCurrencyModel, Task <ValidationResult> > validate)
 {
     this.getCurrencies     = getCurrencies;
     this.getCurrencyByCode = getCurrencyByCode;
     this.upsertCurrency    = upsertCurrency;
     this.deleteCurrency    = deleteCurrency;
     this.validate          = validate;
 }
Пример #2
0
        internal MoneyModelValidator(
            Email email,
            IGetCurrencyByCode getCurrencyByCode)
        {
            this.RuleFor(model => model.Value)
            .GreaterThan(0)
            .WithMessage("Money value is required.");

            this.RuleFor(model => model.Currency)
            .NotNull()
            .WithMessage("Currency is required.")
            .SetValidator(new CurrencyModelValidator(email, getCurrencyByCode));
        }
        internal CreateBudgetModelValidator(
            Email email,
            string?id,
            IGetBudgets getBudgets,
            IGetCategoryByName getCategoryByName,
            IGetCurrencyByCode getCurrencyByCode)
        {
            this.RuleFor(model => model)
            .MustAsync(async(budget, _) =>
            {
                if (budget?.Recurrence == null)
                {
                    return(true);
                }

                var entities = await getBudgets.GetResult(NewGetByAllParam(
                                                              email,
                                                              NewFilterBuilder()
                                                              .Where("year".Equal(budget.Recurrence.Start.Year)
                                                                     .And("month".Equal(budget.Recurrence.Start.Month))
                                                                     .And("day".Equal(budget.Recurrence.Start.Day))
                                                                     .And("category".Equal(budget.Category)))
                                                              .Build()));

                return(entities
                       .Fold(true)(page => page.Data.All(@try => @try
                                                         .Fold(true)(item => id != default && item.Id.Equals(new Guid(id))))));
            })
            .WithMessage("Budget already exists.");

            this.RuleFor(model => model.Description)
            .NotEmpty()
            .WithMessage("Description is required.");

            this.RuleFor(model => model.Limit)
            .NotNull()
            .WithMessage("Limit is required.")
            .SetValidator(new MoneyModelValidator(email, getCurrencyByCode));

            this.RuleFor(model => model.Recurrence)
            .NotNull()
            .WithMessage("Recurrence is required.")
            .SetValidator(new RecurrenceModelValidator());

            this.RuleFor(model => model.Category)
            .NotEmpty()
            .WithMessage("Category is required.")
            .MustAsync(async(category, _) => await getCategoryByName.GetResult(NewGetByIdParam(email, category.Name)))
            .WithMessage("Category not found.");
        }
        internal CreateCurrencyModelValidator(
            Email email,
            string currency,
            IGetCurrencyByCode getCurrencyByCode)
        {
            this.RuleFor(model => model.Code)
            .NotEmpty()
            .WithMessage("Currency code is required.")
            .MustAsync(async(code, _) => await getCurrencyByCode.GetResult(NewGetByIdParam(email, currency)) || currency.Equals(code))
            .WithMessage("Path currency must be equal to body currency.");

            this.RuleFor(model => model.Symbol)
            .NotEmpty()
            .WithMessage("Currency symbol is required.");
        }
Пример #5
0
        internal PaymentModelValidator(
            Email email,
            IGetCurrencyByCode getCurrencyByCode,
            IGetPaymentMethodByName getPaymentMethodByName)
        {
            this.RuleFor(model => model.Cost)
            .NotNull()
            .WithMessage("Cost is required.")
            .SetValidator(new MoneyModelValidator(email, getCurrencyByCode));

            this.RuleFor(model => model.Date)
            .NotEqual(default(DateTime))
            .WithMessage("Payment date is required.");

            this.RuleFor(model => model.Method)
            .NotEmpty()
            .WithMessage("Payment method is required.")
            .MustAsync(async(method, _) => await getPaymentMethodByName.GetResult(NewGetByIdParam(email, method)))
            .WithMessage("Payment method not found.");
        }
        internal CreateConfigurationModelValidator(
            Email email,
            IGetCategoryByName getCategoryByName,
            IGetCurrencyByCode getCurrencyByCode,
            IGetPayeeByName getPayeeByName,
            IGetPaymentMethodByName getPaymentMethodByName)
        {
            this.RuleFor(model => model.Type)
            .NotEmpty()
            .WithMessage("Type is required.");

            this.RuleFor(model => model.PaymentMethod)
            .NotEmpty()
            .WithMessage("Payment method is required.")
            .MustAsync(async(method, _) => await getPaymentMethodByName.GetResult(NewGetByIdParam(email, method)))
            .WithMessage("Payment method not found.");

            this.RuleFor(model => model.Currency)
            .NotNull()
            .WithMessage("Currency is required.")
            .SetValidator(new CurrencyModelValidator(email, getCurrencyByCode));

            this.RuleFor(model => model.Payee)
            .NotEmpty()
            .WithMessage("Payee is required.")
            .MustAsync(async(payee, _) => await getPayeeByName.GetResult(NewGetByIdParam(email, payee.Name)))
            .WithMessage("Payee not found.");

            this.RuleFor(model => model.Category)
            .NotEmpty()
            .WithMessage("Category is required.")
            .MustAsync(async(category, _) => await getCategoryByName.GetResult(NewGetByIdParam(email, category.Name)))
            .WithMessage("Category not found.");

            this.RuleFor(model => model.Tags)
            .NotNull()
            .NotEmpty()
            .WithMessage("Must be at least one tag for configuration.");
        }
        internal CreateTransactionModelValidator(
            Email email,
            string?id,
            IGetCategoryByName getCategoryByName,
            IGetCurrencyByCode getCurrencyByCode,
            IGetPayeeByName getPayeeByName,
            IGetPaymentMethodByName getPaymentMethodByName,
            IGetTransactions getTransactions)
        {
            this.RuleFor(model => model)
            .MustAsync(async(transaction, _) =>
            {
                if (transaction?.Payment?.Cost == null)
                {
                    return(true);
                }

                var entities = await getTransactions.GetResult(NewGetByAllParam(
                                                                   email,
                                                                   NewFilterBuilder()
                                                                   .Where("year".Equal(transaction.Payment.Date.Year)
                                                                          .And("month".Equal(transaction.Payment.Date.Month))
                                                                          .And("day".Equal(transaction.Payment.Date.Day))
                                                                          .And("value".Equal(transaction.Payment.Cost.Value.ToString(GetCultureInfo("en-US"))))
                                                                          .And("category".Equal(transaction.Category))
                                                                          .And("currency".Equal(transaction.Payment.Cost.Currency.Code))
                                                                          .And("payee".Equal(transaction.Payee.Name))
                                                                          .And("paymentMethod".Equal(transaction.Payment.Method)))
                                                                   .Build()));

                return(entities
                       .Fold(true)(page => page.Data.All(@try => @try
                                                         .Fold(true)(item => id != default && item.Id.Equals(new Guid(id))))));
            })
            .WithMessage("Transaction already exists.");

            this.RuleFor(model => model.Type)
            .NotEmpty()
            .WithMessage("Type is required.");

            this.RuleFor(model => model.Payment)
            .NotNull()
            .WithMessage("Payment is required.")
            .SetValidator(new PaymentModelValidator(email, getCurrencyByCode, getPaymentMethodByName));

            this.RuleFor(model => model.Installment)
            .SetValidator(new CreateInstallmentModelValidator());

            this.RuleFor(model => model.Payee)
            .NotEmpty()
            .WithMessage("Payee is required.")
            .MustAsync(async(payee, _) => await getPayeeByName.GetResult(NewGetByIdParam(email, payee.Name)))
            .WithMessage("Payee not found.");

            this.RuleFor(model => model.Category)
            .NotEmpty()
            .WithMessage("Category is required.")
            .MustAsync(async(category, _) => await getCategoryByName.GetResult(NewGetByIdParam(email, category.Name)))
            .WithMessage("Category not found.");

            this.RuleFor(model => model.Tags)
            .NotNull()
            .NotEmpty()
            .WithMessage("Must be at least one tag for transaction.");
        }
Пример #8
0
 internal CurrencyModelValidator(
     Email email,
     IGetCurrencyByCode getCurrencyByCode) => this.RuleFor(model => model.Code)