TellmeRevitPluging/Controllers/FileController.cs

254 lines
9.0 KiB
C#

using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using RevitHttpControl.Models;
using RevitHttpControl.Services;
namespace RevitHttpControl.Controllers
{
/// <summary>
/// 文件操作控制器
/// </summary>
[RoutePrefix("api")]
public class FileController : ApiController
{
/// <summary>
/// 打开文件
/// </summary>
/// <param name="request">打开文件请求</param>
/// <returns>打开文件响应</returns>
[HttpPost]
[Route("open")]
public HttpResponseMessage OpenFile([FromBody] OpenFileRequest request)
{
try
{
// 参数验证
if (request == null)
{
var badRequestResponse = new ApiResponse<object>
{
Success = false,
Code = 400,
Message = "请求参数不能为空",
Data = new { error = "INVALID_REQUEST" }
};
return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse);
}
if (string.IsNullOrWhiteSpace(request.FilePath))
{
var badRequestResponse = new ApiResponse<object>
{
Success = false,
Code = 400,
Message = "文件路径不能为空",
Data = new { error = "INVALID_FILE_PATH" }
};
return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse);
}
// 验证文件路径
if (!DocumentService.ValidateFilePath(request.FilePath))
{
var notFoundResponse = new ApiResponse<object>
{
Success = false,
Code = 404,
Message = "文件不存在或路径无效",
Data = new { error = "FILE_NOT_FOUND" }
};
return Request.CreateResponse(HttpStatusCode.NotFound, notFoundResponse);
}
// 同步打开文件
var result = DocumentService.OpenDocument(request);
var successResponse = new ApiResponse<OpenFileResponse>
{
Success = true,
Code = 200,
Message = "文件打开成功",
Data = result
};
return Request.CreateResponse(HttpStatusCode.OK, successResponse);
}
catch (ArgumentException ex)
{
var badRequestResponse = new ApiResponse<object>
{
Success = false,
Code = 400,
Message = ex.Message,
Data = new { error = "INVALID_ARGUMENT" }
};
return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse);
}
catch (System.IO.FileNotFoundException ex)
{
var notFoundResponse = new ApiResponse<object>
{
Success = false,
Code = 404,
Message = ex.Message,
Data = new { error = "FILE_NOT_FOUND" }
};
return Request.CreateResponse(HttpStatusCode.NotFound, notFoundResponse);
}
catch (TimeoutException ex)
{
var timeoutResponse = new ApiResponse<object>
{
Success = false,
Code = 408,
Message = ex.Message,
Data = new { error = "OPERATION_TIMEOUT" }
};
return Request.CreateResponse(HttpStatusCode.RequestTimeout, timeoutResponse);
}
catch (Exception ex)
{
var errorResponse = new ApiResponse<object>
{
Success = false,
Code = 500,
Message = "打开文件时发生错误",
Data = new
{
error = "INTERNAL_ERROR",
errorDescription = ex.Message
}
};
return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse);
}
}
/// <summary>
/// 异步打开文件
/// </summary>
/// <param name="request">打开文件请求</param>
/// <returns>异步任务响应</returns>
[HttpPost]
[Route("open/async")]
public HttpResponseMessage OpenFileAsync([FromBody] OpenFileRequest request)
{
try
{
// 参数验证
if (request == null || string.IsNullOrWhiteSpace(request.FilePath))
{
var badRequestResponse = new ApiResponse<object>
{
Success = false,
Code = 400,
Message = "请求参数无效",
Data = new { error = "INVALID_REQUEST" }
};
return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse);
}
// 创建异步任务
var taskId = TaskManager.Instance.CreateTask();
TaskManager.Instance.SetTaskRunning(taskId);
// 异步执行打开文件操作
DocumentService.OpenDocumentAsync(request, taskId, TaskManager.Instance);
var asyncResponse = new AsyncOperationResponse
{
TaskId = taskId,
StatusUrl = $"/api/task/{taskId}"
};
var successResponse = new ApiResponse<AsyncOperationResponse>
{
Success = true,
Code = 202,
Message = "文件打开任务已创建",
Data = asyncResponse
};
return Request.CreateResponse(HttpStatusCode.Accepted, successResponse);
}
catch (Exception ex)
{
var errorResponse = new ApiResponse<object>
{
Success = false,
Code = 500,
Message = "创建异步任务失败",
Data = new
{
error = "INTERNAL_ERROR",
errorDescription = ex.Message
}
};
return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse);
}
}
/// <summary>
/// 关闭当前打开文件
/// </summary>
/// <returns>关闭文件响应</returns>
[HttpPost]
[Route("close")]
public HttpResponseMessage CloseFile()
{
try
{
var result = DocumentService.CloseCurrentDocument();
var successResponse = new ApiResponse<CloseFileResponse>
{
Success = true,
Code = 200,
Message = "文件关闭成功",
Data = result
};
return Request.CreateResponse(HttpStatusCode.OK, successResponse);
}
catch (InvalidOperationException ex)
{
var conflictResponse = new ApiResponse<object>
{
Success = false,
Code = 409,
Message = ex.Message,
Data = new { error = "NO_DOCUMENT_OPEN" }
};
return Request.CreateResponse(HttpStatusCode.Conflict, conflictResponse);
}
catch (TimeoutException ex)
{
var timeoutResponse = new ApiResponse<object>
{
Success = false,
Code = 408,
Message = ex.Message,
Data = new { error = "OPERATION_TIMEOUT" }
};
return Request.CreateResponse(HttpStatusCode.RequestTimeout, timeoutResponse);
}
catch (Exception ex)
{
var errorResponse = new ApiResponse<object>
{
Success = false,
Code = 500,
Message = "关闭文件时发生错误",
Data = new
{
error = "INTERNAL_ERROR",
errorDescription = ex.Message
}
};
return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse);
}
}
}
}