삽질하다 도저히 문제 파악이 안돼서 opcUaManager로 분리 테스트 중
This commit is contained in:
75
opcUaManager/Controllers/CrawlerController.cs
Normal file
75
opcUaManager/Controllers/CrawlerController.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using OpcUaManager.Models;
|
||||
using OpcUaManager.Services;
|
||||
|
||||
namespace OpcUaManager.Controllers;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/crawler")]
|
||||
[Produces("application/json")]
|
||||
public class CrawlerController : ControllerBase
|
||||
{
|
||||
private readonly OpcCrawlerService _crawlerSvc;
|
||||
private readonly OpcSessionService _sessionSvc;
|
||||
private readonly ILogger<CrawlerController> _logger;
|
||||
|
||||
public CrawlerController(
|
||||
OpcCrawlerService crawlerSvc,
|
||||
OpcSessionService sessionSvc,
|
||||
ILogger<CrawlerController> logger)
|
||||
{
|
||||
_crawlerSvc = crawlerSvc;
|
||||
_sessionSvc = sessionSvc;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 시작 노드부터 OPC UA 노드 트리를 재귀 탐색합니다.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Sample request:
|
||||
///
|
||||
/// POST /api/crawler/start
|
||||
/// {
|
||||
/// "startNodeId": "ns=1;s=$assetmodel",
|
||||
/// "maxDepth": 5
|
||||
/// }
|
||||
///
|
||||
/// 탐색 결과는 응답 JSON 과 함께 서버 로컬에 Honeywell_FullMap.csv 로 저장됩니다.
|
||||
/// </remarks>
|
||||
[HttpPost("start")]
|
||||
[ProducesResponseType(typeof(CrawlResult), 200)]
|
||||
[ProducesResponseType(typeof(ApiError), 400)]
|
||||
public async Task<IActionResult> Start([FromBody] CrawlRequest req)
|
||||
{
|
||||
if (!_sessionSvc.IsConnected)
|
||||
return BadRequest(new ApiError
|
||||
{
|
||||
Error = "세션 없음",
|
||||
Detail = "먼저 /api/session/connect 로 OPC 서버에 연결하세요."
|
||||
});
|
||||
|
||||
_logger.LogInformation("Crawler 시작: {NodeId} (depth={Depth})",
|
||||
req.StartNodeId, req.MaxDepth);
|
||||
|
||||
// 대규모 탐사는 시간이 오래 걸릴 수 있으므로 타임아웃을 늘려줍니다
|
||||
HttpContext.RequestAborted.ThrowIfCancellationRequested();
|
||||
|
||||
var result = await _crawlerSvc.CrawlAsync(req);
|
||||
|
||||
return result.Success ? Ok(result)
|
||||
: BadRequest(new ApiError { Error = "탐사 실패", Detail = result.Message });
|
||||
}
|
||||
|
||||
/// <summary>마지막 탐사로 생성된 CSV 파일을 다운로드합니다.</summary>
|
||||
[HttpGet("csv")]
|
||||
public IActionResult DownloadCsv()
|
||||
{
|
||||
string path = Path.GetFullPath("Honeywell_FullMap.csv");
|
||||
if (!System.IO.File.Exists(path))
|
||||
return NotFound(new ApiError { Error = "CSV 없음", Detail = "탐사를 먼저 실행하세요." });
|
||||
|
||||
byte[] bytes = System.IO.File.ReadAllBytes(path);
|
||||
return File(bytes, "text/csv", "Honeywell_FullMap.csv");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user