grozdeto
grozdeto

Reputation: 1379

How to handle JSON deserialization?

I have a class OrderRequestModel with 10 properties.

I would like to throw exception if any of the properties is null but do not want to do 10 if checks.

How can i do this smartly?

        if (model is DeliveryRequestModel)
        {
            if (model.Items == null || !model.Items.Any())
            {
                throw (new ArgumentException("За доставка трябва да има поне един артикул!"));
            }

            if ((model as DeliveryRequestModel).DocumentType_Id != 1 & (model as DeliveryRequestModel).DocumentType_Id != 5)
            {
                errors.Add(new ArgumentException("Доставката може да бъде само от тип фактура или стокова разписка. Фактурата е документ от тип 1, а стоковата разписка е документ от тип 5"));
            }
        }

        if (model is SaleRequestModel)
        {
            if (!model.Items.Any())
            {
                errors.Add(new ArgumentNullException("За продажба трябва да има поне един артикул!"));
            }
        }

        if (model.PaymentMode_Id != 1 & model.PaymentMode_Id != 2)
        {
             errors.Add(new ArgumentException("Не съществува такъв начин на плащане. Моля подайте начин за плащане 1 за в брой или 2 за банков превод"));
        }

        if (model.VatRate_Id != 1 & model.VatRate_Id != 2)
        {
            errors.Add(new ArgumentException("Не съществува такава данъчна ставка. Моля избере 1 за без ДДС или опция 2 за ДДС"));
        }
        else
        {

            var vatRate = await db.VatRates.AsNoTracking().FirstAsync(r => r.Id == model.VatRate_Id);

            foreach (var item in model.Items)
            {

                item.VatBase = item.Quantity * (item.UnitPrice - item.Discount);
                item.Vat = item.VatBase * vatRate.Amount / 100;
                item.Total = item.VatBase + item.Vat;
            }
        }

        if (model.Currency_Code != "BGN" & model.Currency_Code != "EUR")
        {
            errors.Add(new ArgumentException("Не съшествува такува валута. Моля изберете BGN за левове или EUR за евро"));
        }

        var codes = model.Items.Select(i => i.Goods_Code).Distinct();
        var goodsNotFound = codes.Where(c => !db.Goods.Any(g => g.Code == c)).ToList();
        if (goodsNotFound.Any())
        {
            errors.Add(new ArgumentException($"Продукт(и) с кодове {string.Join(", ", goodsNotFound)} не съществуват."));
        }

        if (model.Items.Any(i => i.Quantity <= 0))
        {
            errors.Add(new ArgumentException("Продажбите трябва да имат поне един артикул!"));
        }

        if (model.Items.Any(i => i.UnitPrice <= 0))
        {
            errors.Add(new ArgumentException("Цената на артикула трябва да е по-голяма от 0!"));
        }

        if (model.Items.Any(i => i.Discount < 0))
        {
            errors.Add(new ArgumentException("Продуктите не могат да имат отрицателна отстъпка!"));
        }

        if (model.Items.Any(i => i.UnitPrice <= i.Discount))
        {
            errors.Add(new ArgumentException("Продуктите не могат да имат отстъпка по-голяма или равна на цената на артикула!"));
        }

        var company = await db.Companies.FirstOrDefaultAsync(c => c.UIC == model.UIC);

        if (company == null)
        {
            errors.Add(new ArgumentException("Не съществува компания с такъв ЕИК"));
        }

        if (errors.Any())
        {
            throw new ArgumentException(string.Join("; ", errors).Replace("System.ArgumentException: ", ""));
        }

        return company.Id;
    }

All those models properties I have to check them if they are null, so when the user send a JSON and one of the object he specified is null, to throw a message different from:

            "Error converting value {null} to type 'System.Int32'. Path 'DocumentType_Id', line 2, position 24."

Which is the error I get from Postman.

Upvotes: 0

Views: 72

Answers (1)

Harshad Vekariya
Harshad Vekariya

Reputation: 1052

Use reflection like below:

List<string> values = typeof(FilterParams)
                          .GetProperties()
                          .Select(prop => prop.GetValue(model, null));

if (values.Count > 0) {
   // there are null values
}

Upvotes: 3

Related Questions