classlib/ExpenseTracker.Api/Controllers/AccountController.cs
2024-08-07 21:12:02 +03:00

156 lines
5.9 KiB
C#

using Microsoft.AspNetCore.Mvc;
using ExpenseTracker.Application.Common.Models;
using ExpenseTracker.Application.Accounts;
using ExpenseTracker.Application.Accounts.Commands.Create;
using ExpenseTracker.Application.Accounts.Queries.GetWithPagination;
using ExpenseTracker.Application.Accounts.Queries.Get;
using ExpenseTracker.Application.Accounts.Commands.Delete;
using ExpenseTracker.Application.Accounts.Commands.Update;
using ExpenseTracker.Application.Accounts.Queries.Charts;
using ExpenseTracker.Application.Accounts.Queries.Charts.GetExpenseBarChart;
using ExpenseTracker.Application.Accounts.Queries.Charts.GetIncomeBarChart;
using ExpenseTracker.Application.Accounts.Queries.Charts.GetProfitBarChart;
using ExpenseTracker.Application.Accounts.Queries.Charts.GetExpenseByCategoryPieChart;
using ExpenseTracker.Application.Accounts.Queries.Export.Json.One;
using ExpenseTracker.Application.Accounts.Queries.Export.Json.Many;
using ExpenseTracker.Application.Accounts.Queries.Export.Csv.One;
using ExpenseTracker.Application.Accounts.Commands.Import.Json.One;
using ExpenseTracker.Application.Accounts.Commands.Import.Json.Many;
namespace ExpenseTracker.Api.Controllers;
[Route("accounts")]
public class AccountController : BaseController
{
[HttpPost]
public async Task<AccountDto> Create([FromBody] CreateAccountCommand command, CancellationToken cancellationToken)
{
return await Mediator.Send(command, cancellationToken);
}
[HttpGet]
public async Task<PaginatedList<AccountDto>> GetPage([FromQuery] GetAccountsWithPaginationQuery query, CancellationToken cancellationToken)
{
return await Mediator.Send(query, cancellationToken);
}
[HttpGet("{id}")]
public async Task<AccountDto> Get(string id, CancellationToken cancellationToken)
{
var query = new GetAccountQuery() { Id = id };
return await Mediator.Send(query, cancellationToken);
}
[HttpPut]
public async Task<AccountDto> Update([FromBody] UpdateAccountCommand command, CancellationToken cancellationToken)
{
return await Mediator.Send(command, cancellationToken);
}
[HttpDelete]
public async Task Delete([FromBody] DeleteAccountCommand command, CancellationToken cancellationToken)
{
await Mediator.Send(command, cancellationToken);
}
[HttpGet("{id}/export/json")]
public async Task<FileContentResult> ExportJsonOne(string id, CancellationToken cancellationToken)
{
var query = new ExportJsonAccountQuery() { Id = id };
var fileBytes = await Mediator.Send(query, cancellationToken);
var mimeType = "application/json";
var fileName = $"account_{id}.json";
return new FileContentResult(fileBytes, mimeType)
{
FileDownloadName = fileName
};
}
[HttpGet("export/json")]
public async Task<FileContentResult> ExportJsonMany(CancellationToken cancellationToken)
{
var query = new ExportJsonAccountsQuery();
var fileBytes = await Mediator.Send(query, cancellationToken);
var mimeType = "application/json";
var fileName = $"accounts.json";
return new FileContentResult(fileBytes, mimeType)
{
FileDownloadName = fileName
};
}
[HttpGet("{id}/export/csv")]
public async Task<FileContentResult> ExportCsvOne(string id, CancellationToken cancellationToken)
{
var query = new ExportCsvAccountQuery() { Id = id };
var fileBytes = await Mediator.Send(query, cancellationToken);
var mimeType = "text/json";
var fileName = $"account_transactions_{id}.csv";
return new FileContentResult(fileBytes, mimeType)
{
FileDownloadName = fileName
};
}
[HttpPost("import/json/one")]
public async Task ImportOneJson(IFormFile file, CancellationToken cancellationToken)
{
byte[] fileBytes;
using (var binaryReader = new BinaryReader(file.OpenReadStream()))
{
fileBytes = binaryReader.ReadBytes((int)file.Length);
}
var query = new ImportJsonAccountQuery() { File = fileBytes };
await Mediator.Send(query, cancellationToken);
}
[HttpPost("import/json/many")]
public async Task ImportManyJson(IFormFile file, CancellationToken cancellationToken)
{
byte[] fileBytes;
using (var binaryReader = new BinaryReader(file.OpenReadStream()))
{
fileBytes = binaryReader.ReadBytes((int)file.Length);
}
var query = new ImportJsonAccountsQuery() { File = fileBytes };
await Mediator.Send(query, cancellationToken);
}
[HttpGet("{id}/expenseBarChart")]
public async Task<DailyTransactionsBarChart> GetExpenseBarChart(string id, [FromQuery] GetExpenseBarChartQuery query, CancellationToken cancellationToken)
{
query.AccountId = id;
return await Mediator.Send(query, cancellationToken);
}
[HttpGet("{id}/incomeBarChart")]
public async Task<DailyTransactionsBarChart> GetIncomeBarChart(string id, [FromQuery] GetIncomeBarChartQuery query, CancellationToken cancellationToken)
{
query.AccountId = id;
return await Mediator.Send(query, cancellationToken);
}
[HttpGet("{id}/profitBarChart")]
public async Task<DailyTransactionsBarChart> GetProfitBarChart(string id, [FromQuery] GetProfitBarChartQuery query, CancellationToken cancellationToken)
{
query.AccountId = id;
return await Mediator.Send(query, cancellationToken);
}
[HttpGet("{id}/expenseByCategoryPieChart")]
public async Task<Dictionary<string, double>> GetExpenseByCategoryPieChart(string id, [FromQuery] GetExpenseByCategoryPieChartQuery query, CancellationToken cancellationToken)
{
query.AccountId = id;
var pieChart = await Mediator.Send(query, cancellationToken);
var result = pieChart.ToDictionary(item => item.Key.ToString(), item => item.Value);
return result;
}
}