Search code examples
excelasp.net-coreepplus

ASP.NET Core - Error CS1503 Argument 1: cannot convert from 'Request.CreateMandateDto' to 'Response.MandateListDto' in Excel upload


I am uploading excel file using ASP.NET Core 6 Web API with EPPlus package.

I have two DTOs, CreateMandateDto as request DTO and MandateListDto as response DTO.

I have written code as shown below.

Response:

public class Response<T>
{
    public T Data { get; set; }
    public bool Successful { get; set; }
    public string Message { get; set; }
    public int StatusCode { get; set; }

    public Response(int statusCode, bool success, string msg, T data)
    {
        Data = data;
        Successful = success;
        StatusCode = statusCode;
        Message = msg;
    }

    public Response()
    {
    }

    public static Response<T> Fail(string errorMessage, int statusCode = 404)
    {
        return new Response<T> { Successful = false, Message = errorMessage, StatusCode = statusCode };
    }

    public static Response<T> Success(string successMessage, T data, int statusCode = 200)
    {
        return new Response<T> { Successful = true, Message = successMessage, Data = data, StatusCode = statusCode };
    }

    public override string ToString() => JsonConvert.SerializeObject(this);
}

ExcelHelper:

public static class ExcelHelper
{
    public static List<CreateMandateDto> ReadMandatesFromExcel(IFormFile excelFile)
    {
        List<CreateMandateDto> mandates = new List<CreateMandateDto>();

        using (var package = new ExcelPackage(excelFile.OpenReadStream()))
        {
            var worksheet = package.Workbook.Worksheets[0]; 
            int rowCount = worksheet.Dimension.Rows;

            for (int row = 2; row <= rowCount; row++) 
            {
                var mandate = new CreateMandateDto();

                mandate.DrAccountNumber = worksheet.Cells[row, 1].Value.ToString();
                mandate.StartDate = DateTime.Parse(worksheet.Cells[row, 2].Value.ToString());
                mandate.EndDate = DateTime.Parse(worksheet.Cells[row, 3].Value.ToString());
                mandate.PaymentFrequency = (PaymentFrequency)Enum.Parse(typeof(PaymentFrequency), worksheet.Cells[row, 4].Value.ToString());
                mandate.Amount = decimal.Parse(worksheet.Cells[row, 5].Value.ToString());

                mandates.Add(mandate);
            }
        }

        return mandates;
    }
}

The ExcelHelper will read the excel sheet before its validated and passed to the DB.

AddMandateAsyncEngine: this method inserts the data into the database:

    public async Task<Response<MandateListDto>> AddMandateAsyncEngine(CreateMandateDto requestDto)
    {
        var response = new Response<MandateListDto>();

        var mandate = _mapper.Map<Mandate>(requestDto);
        string transactionJsonData = JsonConvert.SerializeObject(mandate);

        mandate.CreatedBy = userName;
        mandate.RawData = transactionJsonData;
        mandate.PaymentCount = (int)numberOfTimes;
        mandate.CreatedBy = userName;

        await _unitOfWork.MerchantMandates.InsertAsync(mandate);
        await _unitOfWork.Save();
    }

    return response;
}

UploadMerchantMandateExcelAsync: this method collates and implements everything. It combines the two methods. Validates, insert the successful data and displays, then will not allow the failed ones, but display the non-successful ones

public async Task<Response<List<MandateListDto>>> UploadMerchantMandateExcelAsync(IFormFile excelFile)
{
    var mandates = ExcelHelper.ReadMandatesFromExcel(excelFile);
    var response = new Response<List<MandateListDto>>();

    if (excelFile == null || excelFile.Length <= 0)
    {
        response.StatusCode = (int)HttpStatusCode.OK;
        response.Message = "No File Available for Upload";
        response.Successful = false;
        return await Task.FromResult(response);
    }

    var successfulMandates = new List<MandateListDto>();
    var failedMandates = new List<MandateListDto>();

    foreach (var mandate in mandates)
    {
        var result = await AddMandateAsyncEngine(mandate);

        if (result.Successful)
        {
            successfulMandates.Add(result.Data);
        }
        else
        {
            failedMandates.Add(mandate);
        }
    }

    if (successfulMandates.Any())
    {
        response.Data = successfulMandates;
        response.Successful = true;
        response.StatusCode = (int)HttpStatusCode.OK;
        response.Message = "Mandates created successfully.";
    }
    else
    {
        response.Data = failedMandates;
        response.Successful = false;
        response.StatusCode = (int)HttpStatusCode.BadRequest;
        response.Message = "Failed to create mandates.";
    }

    return response;
}

However, I got this error:

Error CS1503
Argument 1: cannot convert from 'Request.CreateMandateDto' to 'Response.MandateListDto'

Then mandate is highlighted in failedMandates.Add(mandate).

How do I resolve this?


Solution

  • your method from the helper ReadMandatesFromExcel returns list of CreateMandateDto:

    List<CreateMandateDto> ReadMandatesFromExcel(IFormFile excelFile)
    

    Your list your create to catch the failed objects is of type MandateListDto:

    var failedMandates = new List<MandateListDto>();
    

    So adding an object of type CreateMandateDto to a list of type MandateListDto will not work here:

    else
    {
      failedMandates.Add(mandate);
    }