AssetManager.API/AssetManager.API/Controllers/PortfolioController.cs
niannian zheng 455d47f887 refactor(API): 统一路由格式并添加接口文档注释
- 将控制器路由从`[controller]`格式改为明确路径
- 为所有接口添加XML文档注释,说明功能和使用方法
- 保持路由风格一致,部分接口添加版本前缀
2026-02-28 16:02:59 +08:00

258 lines
8.5 KiB
C#

using AssetManager.Models.DTOs;
using AssetManager.Models;
using AssetManager.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace AssetManager.API.Controllers;
[ApiController]
[Route("api/v1/portfolio")]
[Authorize]
public class PortfolioController : ControllerBase
{
private readonly ILogger<PortfolioController> _logger;
private readonly IPortfolioService _portfolioService;
public PortfolioController(ILogger<PortfolioController> logger, IPortfolioService portfolioService)
{
_logger = logger;
_portfolioService = portfolioService;
}
/// <summary>
/// 创建新投资组合
/// </summary>
/// <param name="request">投资组合创建请求参数</param>
/// <returns>创建的投资组合详情</returns>
/// <remarks>
/// 此接口用于创建新的投资组合。
/// </remarks>
[HttpPost]
public ActionResult<ApiResponse<CreatePortfolioResponse>> CreatePortfolio([FromBody] CreatePortfolioRequest request)
{
try
{
_logger.LogInformation("Request to create portfolio");
var response = _portfolioService.CreatePortfolio(request);
_logger.LogInformation("Portfolio created successfully");
return Ok(new ApiResponse<CreatePortfolioResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = response,
message = "success"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error creating portfolio");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<CreatePortfolioResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,
message = ex.Message
});
}
}
/// <summary>
/// 获取投资组合列表
/// </summary>
/// <returns>投资组合列表</returns>
/// <remarks>
/// 此接口用于获取投资组合列表。
/// </remarks>
[HttpGet]
public ActionResult<ApiResponse<GetPortfoliosResponse>> GetPortfolios()
{
try
{
_logger.LogInformation("Request to get portfolios");
var response = _portfolioService.GetPortfolios();
_logger.LogInformation("Portfolios retrieved successfully");
return Ok(new ApiResponse<GetPortfoliosResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = response,
message = "success"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error retrieving portfolios");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<GetPortfoliosResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,
message = ex.Message
});
}
}
/// <summary>
/// 获取总资产情况
/// </summary>
/// <returns>总资产情况</returns>
/// <remarks>
/// 此接口用于获取用户的总资产情况。
/// </remarks>
[HttpGet("assets")]
public ActionResult<ApiResponse<TotalAssetsResponse>> GetTotalAssets()
{
try
{
_logger.LogInformation("Request to get total assets");
var response = _portfolioService.GetTotalAssets();
_logger.LogInformation("Total assets retrieved successfully");
return Ok(new ApiResponse<TotalAssetsResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = response,
message = "success"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error retrieving total assets");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<TotalAssetsResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,
message = ex.Message
});
}
}
/// <summary>
/// 获取单个投资组合详情
/// </summary>
/// <param name="id">投资组合ID</param>
/// <returns>投资组合详情</returns>
/// <remarks>
/// 此接口用于获取指定投资组合的详细信息。
/// </remarks>
[HttpGet("{id}")]
public ActionResult<ApiResponse<PortfolioDetailResponse>> GetPortfolioById(string id)
{
try
{
_logger.LogInformation($"Request to get portfolio by id: {id}");
var response = _portfolioService.GetPortfolioById(id);
_logger.LogInformation("Portfolio retrieved successfully");
return Ok(new ApiResponse<PortfolioDetailResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = response,
message = "success"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error retrieving portfolio");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<PortfolioDetailResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,
message = ex.Message
});
}
}
/// <summary>
/// 获取交易记录
/// </summary>
/// <param name="portfolioId">投资组合ID</param>
/// <param name="limit">每页记录数</param>
/// <param name="offset">偏移量</param>
/// <returns>交易记录列表</returns>
/// <remarks>
/// 此接口用于获取指定投资组合的交易记录。
/// </remarks>
[HttpGet("transactions")]
public ActionResult<ApiResponse<GetTransactionsResponse>> GetTransactions([FromQuery] string portfolioId, [FromQuery] int limit = 10, [FromQuery] int offset = 0)
{
try
{
_logger.LogInformation($"Request to get transactions for portfolio: {portfolioId}");
var response = _portfolioService.GetTransactions(portfolioId, limit, offset);
_logger.LogInformation("Transactions retrieved successfully");
return Ok(new ApiResponse<GetTransactionsResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = response,
message = "success"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error retrieving transactions");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<GetTransactionsResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,
message = ex.Message
});
}
}
/// <summary>
/// 创建新交易
/// </summary>
/// <param name="request">交易创建请求参数</param>
/// <returns>创建的交易详情</returns>
/// <remarks>
/// 此接口用于创建新的交易。
/// </remarks>
[HttpPost("transactions")]
public ActionResult<ApiResponse<CreateTransactionResponse>> CreateTransaction([FromBody] CreateTransactionRequest request)
{
try
{
_logger.LogInformation("Request to create transaction");
var response = _portfolioService.CreateTransaction(request);
_logger.LogInformation("Transaction created successfully");
return Ok(new ApiResponse<CreateTransactionResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = response,
message = "success"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error creating transaction");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<CreateTransactionResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,
message = ex.Message
});
}
}
}