Files
dbserver/opcUaManager/Controllers/DatabaseController.cs

99 lines
3.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.AspNetCore.Mvc;
using OpcUaManager.Models;
using OpcUaManager.Services;
namespace OpcUaManager.Controllers;
[ApiController]
[Route("api/database")]
[Produces("application/json")]
public class DatabaseController : ControllerBase
{
private readonly DatabaseService _dbSvc;
private readonly ILogger<DatabaseController> _logger;
public DatabaseController(DatabaseService dbSvc, ILogger<DatabaseController> logger)
{
_dbSvc = dbSvc;
_logger = logger;
}
/// <summary>
/// DB 연결을 테스트합니다.
/// </summary>
[HttpPost("test")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ApiError), 400)]
public async Task<IActionResult> Test([FromBody] DbWriteRequest req)
{
var (ok, msg) = await _dbSvc.TestConnectionAsync(req);
return ok ? Ok(new { Message = msg })
: BadRequest(new ApiError { Error = "연결 실패", Detail = msg });
}
/// <summary>
/// opc_history 테이블을 없으면 생성합니다.
/// </summary>
[HttpPost("init")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ApiError), 400)]
public async Task<IActionResult> Init([FromBody] DbWriteRequest req)
{
var (ok, msg) = await _dbSvc.EnsureTableAsync(req);
return ok ? Ok(new { Message = msg })
: BadRequest(new ApiError { Error = "테이블 초기화 실패", Detail = msg });
}
/// <summary>
/// OPC 태그를 지정 횟수만큼 읽어 DB에 저장합니다 (원본 5회 루프).
/// </summary>
/// <remarks>
/// Sample request:
///
/// POST /api/database/write
/// {
/// "tagNodeId": "ns=1;s=shinam:p-6102.hzset.fieldvalue",
/// "tagName": "p-6102",
/// "count": 5,
/// "intervalMs": 2000,
/// "dbHost": "localhost",
/// "dbName": "opcdb",
/// "dbUser": "postgres",
/// "dbPassword": "postgres"
/// }
/// </remarks>
[HttpPost("write")]
[ProducesResponseType(typeof(DbWriteResult), 200)]
[ProducesResponseType(typeof(ApiError), 400)]
public async Task<IActionResult> Write([FromBody] DbWriteRequest req)
{
if (string.IsNullOrWhiteSpace(req.TagNodeId) || string.IsNullOrWhiteSpace(req.TagName))
return BadRequest(new ApiError
{
Error = "필수값 누락",
Detail = "TagNodeId, TagName 은 필수입니다."
});
req.Count = Math.Clamp(req.Count, 1, 100);
_logger.LogInformation("DB 저장 시작: {Tag} × {Count}회", req.TagName, req.Count);
var result = await _dbSvc.WriteLoopAsync(req);
return result.Success ? Ok(result)
: BadRequest(new ApiError { Error = "저장 실패", Detail = result.Message });
}
/// <summary>
/// opc_history 테이블의 최근 레코드를 조회합니다.
/// </summary>
[HttpPost("query")]
[ProducesResponseType(typeof(DbQueryResult), 200)]
[ProducesResponseType(typeof(ApiError), 400)]
public async Task<IActionResult> Query([FromBody] DbWriteRequest req, [FromQuery] int limit = 100)
{
var result = await _dbSvc.QueryRecentAsync(req, limit);
return result.Success ? Ok(result)
: BadRequest(new ApiError { Error = "조회 실패", Detail = result.Message });
}
}