feat(drawings): add drawings API endpoint with comprehensive filtering
Add new /drawings endpoint with support for filtering by text fields, date ranges, dimensions, and boolean flags. Includes MCP tools for integration with Claude Code. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -400,4 +400,175 @@ public class PepTools
|
||||
return $"Error calling PEP API: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
[McpServerTool, Description("Get a list of drawings with comprehensive filtering options for all fields including dimensions, dates, and boolean flags.")]
|
||||
public static async Task<string> GetDrawings(
|
||||
[Description("Filter by partial name (case-insensitive)")] string? name = null,
|
||||
[Description("Filter by partial customer name (case-insensitive)")] string? customer = null,
|
||||
[Description("Filter by partial customer ID (case-insensitive)")] string? custId = null,
|
||||
[Description("Filter by partial description (case-insensitive)")] string? description = null,
|
||||
[Description("Filter by partial revision (case-insensitive)")] string? revision = null,
|
||||
[Description("Filter by partial material (case-insensitive)")] string? material = null,
|
||||
[Description("Filter by partial material grade (case-insensitive)")] string? materialGrade = null,
|
||||
[Description("Filter by partial programmer name (case-insensitive)")] string? programmer = null,
|
||||
[Description("Filter by partial created by (case-insensitive)")] string? createdBy = null,
|
||||
[Description("Filter by exact status match")] string? status = null,
|
||||
[Description("Filter by exact type match")] string? type = null,
|
||||
[Description("Filter by exact application match")] string? application = null,
|
||||
[Description("Filter by creation date after (yyyy-MM-dd)")] string? createdAfter = null,
|
||||
[Description("Filter by creation date before (yyyy-MM-dd)")] string? createdBefore = null,
|
||||
[Description("Filter by modified date after (yyyy-MM-dd)")] string? modifiedAfter = null,
|
||||
[Description("Filter by modified date before (yyyy-MM-dd)")] string? modifiedBefore = null,
|
||||
[Description("Filter by minimum width")] double? minWidth = null,
|
||||
[Description("Filter by maximum width")] double? maxWidth = null,
|
||||
[Description("Filter by minimum length")] double? minLength = null,
|
||||
[Description("Filter by maximum length")] double? maxLength = null,
|
||||
[Description("Filter by minimum area")] double? minArea = null,
|
||||
[Description("Filter by maximum area")] double? maxArea = null,
|
||||
[Description("Filter by has bevel")] bool? hasBevel = null,
|
||||
[Description("Filter by has lead-in")] bool? hasLeadIn = null,
|
||||
[Description("Filter by has tab")] bool? hasTab = null,
|
||||
[Description("Number of results to skip (default 0)")] int offset = 0,
|
||||
[Description("Maximum number of results to return (default 100)")] int limit = 100)
|
||||
{
|
||||
try
|
||||
{
|
||||
var queryParams = new List<string>();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
queryParams.Add($"name={Uri.EscapeDataString(name)}");
|
||||
if (!string.IsNullOrWhiteSpace(customer))
|
||||
queryParams.Add($"customer={Uri.EscapeDataString(customer)}");
|
||||
if (!string.IsNullOrWhiteSpace(custId))
|
||||
queryParams.Add($"custId={Uri.EscapeDataString(custId)}");
|
||||
if (!string.IsNullOrWhiteSpace(description))
|
||||
queryParams.Add($"description={Uri.EscapeDataString(description)}");
|
||||
if (!string.IsNullOrWhiteSpace(revision))
|
||||
queryParams.Add($"revision={Uri.EscapeDataString(revision)}");
|
||||
if (!string.IsNullOrWhiteSpace(material))
|
||||
queryParams.Add($"material={Uri.EscapeDataString(material)}");
|
||||
if (!string.IsNullOrWhiteSpace(materialGrade))
|
||||
queryParams.Add($"materialGrade={Uri.EscapeDataString(materialGrade)}");
|
||||
if (!string.IsNullOrWhiteSpace(programmer))
|
||||
queryParams.Add($"programmer={Uri.EscapeDataString(programmer)}");
|
||||
if (!string.IsNullOrWhiteSpace(createdBy))
|
||||
queryParams.Add($"createdBy={Uri.EscapeDataString(createdBy)}");
|
||||
if (!string.IsNullOrWhiteSpace(status))
|
||||
queryParams.Add($"status={Uri.EscapeDataString(status)}");
|
||||
if (!string.IsNullOrWhiteSpace(type))
|
||||
queryParams.Add($"type={Uri.EscapeDataString(type)}");
|
||||
if (!string.IsNullOrWhiteSpace(application))
|
||||
queryParams.Add($"application={Uri.EscapeDataString(application)}");
|
||||
if (!string.IsNullOrWhiteSpace(createdAfter))
|
||||
queryParams.Add($"createdAfter={Uri.EscapeDataString(createdAfter)}");
|
||||
if (!string.IsNullOrWhiteSpace(createdBefore))
|
||||
queryParams.Add($"createdBefore={Uri.EscapeDataString(createdBefore)}");
|
||||
if (!string.IsNullOrWhiteSpace(modifiedAfter))
|
||||
queryParams.Add($"modifiedAfter={Uri.EscapeDataString(modifiedAfter)}");
|
||||
if (!string.IsNullOrWhiteSpace(modifiedBefore))
|
||||
queryParams.Add($"modifiedBefore={Uri.EscapeDataString(modifiedBefore)}");
|
||||
if (minWidth.HasValue)
|
||||
queryParams.Add($"minWidth={minWidth.Value}");
|
||||
if (maxWidth.HasValue)
|
||||
queryParams.Add($"maxWidth={maxWidth.Value}");
|
||||
if (minLength.HasValue)
|
||||
queryParams.Add($"minLength={minLength.Value}");
|
||||
if (maxLength.HasValue)
|
||||
queryParams.Add($"maxLength={maxLength.Value}");
|
||||
if (minArea.HasValue)
|
||||
queryParams.Add($"minArea={minArea.Value}");
|
||||
if (maxArea.HasValue)
|
||||
queryParams.Add($"maxArea={maxArea.Value}");
|
||||
if (hasBevel.HasValue)
|
||||
queryParams.Add($"hasBevel={hasBevel.Value.ToString().ToLower()}");
|
||||
if (hasLeadIn.HasValue)
|
||||
queryParams.Add($"hasLeadIn={hasLeadIn.Value.ToString().ToLower()}");
|
||||
if (hasTab.HasValue)
|
||||
queryParams.Add($"hasTab={hasTab.Value.ToString().ToLower()}");
|
||||
|
||||
queryParams.Add($"offset={offset}");
|
||||
queryParams.Add($"limit={limit}");
|
||||
|
||||
var query = "?" + string.Join("&", queryParams);
|
||||
var response = await _httpClient.GetAsync($"/drawings{query}");
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
return $"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}";
|
||||
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
return json;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return $"Error calling PEP API: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
[McpServerTool, Description("Get detailed information about a specific drawing by its ID.")]
|
||||
public static async Task<string> GetDrawing(
|
||||
[Description("The drawing ID to look up")] int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = await _httpClient.GetAsync($"/drawings/{id}");
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
return $"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}";
|
||||
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
return json;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return $"Error calling PEP API: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
[McpServerTool, Description("Get detailed information about a specific drawing by its exact name.")]
|
||||
public static async Task<string> GetDrawingByName(
|
||||
[Description("The exact drawing name to look up")] string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = await _httpClient.GetAsync($"/drawings/name/{Uri.EscapeDataString(name)}");
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
return $"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}";
|
||||
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
return json;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return $"Error calling PEP API: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
[McpServerTool, Description("Search for drawings by partial name match. Returns matching drawings with basic information.")]
|
||||
public static async Task<string> SearchDrawings(
|
||||
[Description("The partial drawing name to search for")] string searchTerm,
|
||||
[Description("Maximum number of results to return (default 100)")] int limit = 100)
|
||||
{
|
||||
try
|
||||
{
|
||||
var queryParams = new List<string>
|
||||
{
|
||||
$"search={Uri.EscapeDataString(searchTerm)}",
|
||||
$"limit={limit}"
|
||||
};
|
||||
|
||||
var query = "?" + string.Join("&", queryParams);
|
||||
var response = await _httpClient.GetAsync($"/drawings/search{query}");
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
return $"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}";
|
||||
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
return json;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return $"Error calling PEP API: {ex.Message}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user