{
  "openapi": "3.0.1",
  "info": {
    "title": "Dataforth Product API",
    "description": "API for accessing Dataforth product catalog data",
    "version": "v1"
  },
  "paths": {
    "/api/v1/Admin/refresh-cache": {
      "post": {
        "tags": [
          "Admin"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RefreshCacheResponseDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server Error"
          }
        }
      }
    },
    "/api/v1/Admin/cache-status": {
      "get": {
        "tags": [
          "Admin"
        ],
        "parameters": [
          {
            "name": "appName",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "dataforth.web"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CacheStatusResponseDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/Categories": {
      "get": {
        "tags": [
          "Categories"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CategoryListItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/Categories/{id}": {
      "get": {
        "tags": [
          "Categories"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/Categories/by-catalog-node/{catalogNodeId}": {
      "get": {
        "tags": [
          "Categories"
        ],
        "parameters": [
          {
            "name": "catalogNodeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/OrderableProducts/{orderableProductId}/Attributes": {
      "post": {
        "tags": [
          "OrderableProducts"
        ],
        "parameters": [
          {
            "name": "orderableProductId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProductAttributeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProductAttributeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProductAttributeRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductAttributeResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server Error"
          }
        }
      }
    },
    "/api/v1/OrderableProducts/{orderableProductId}/Attributes/{attributeId}": {
      "put": {
        "tags": [
          "OrderableProducts"
        ],
        "parameters": [
          {
            "name": "orderableProductId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "attributeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProductAttributeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProductAttributeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProductAttributeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductAttributeResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server Error"
          }
        }
      },
      "delete": {
        "tags": [
          "OrderableProducts"
        ],
        "parameters": [
          {
            "name": "orderableProductId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "attributeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server Error"
          }
        }
      }
    },
    "/api/v1/Products": {
      "get": {
        "tags": [
          "Products"
        ],
        "parameters": [
          {
            "name": "productSeriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "categoryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ProductListItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/Products/{id}": {
      "get": {
        "tags": [
          "Products"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/Products/by-part-number/{partNumber}": {
      "get": {
        "tags": [
          "Products"
        ],
        "parameters": [
          {
            "name": "partNumber",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/product-series": {
      "get": {
        "tags": [
          "ProductSeries"
        ],
        "parameters": [
          {
            "name": "categoryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesListItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/product-series/{id}": {
      "get": {
        "tags": [
          "ProductSeries"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/product-series/by-designation/{designation}": {
      "get": {
        "tags": [
          "ProductSeries"
        ],
        "parameters": [
          {
            "name": "designation",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/product-series/by-catalog-node/{catalogNodeId}": {
      "get": {
        "tags": [
          "ProductSeries"
        ],
        "parameters": [
          {
            "name": "catalogNodeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/ProductType": {
      "get": {
        "tags": [
          "ProductType"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ProductTypeListItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/ProductType/{productTypeId}/products": {
      "get": {
        "tags": [
          "ProductType"
        ],
        "parameters": [
          {
            "name": "productTypeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderableProductDto"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/TestReportDataFiles": {
      "post": {
        "tags": [
          "TestReportDataFiles"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTestReportRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTestReportRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTestReportRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateTestReportResponse"
                }
              }
            }
          },
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateTestReportResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponseDto"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "TestReportDataFiles"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          },
          {
            "name": "serialNumberPrefix",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "afterSerialNumber",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestReportDataFileListItemDtoPagedResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/TestReportDataFiles/bulk": {
      "post": {
        "tags": [
          "TestReportDataFiles"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkCreateTestReportRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkCreateTestReportRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkCreateTestReportRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkCreateTestReportResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponseDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/TestReportDataFiles/{serialNumber}": {
      "get": {
        "tags": [
          "TestReportDataFiles"
        ],
        "parameters": [
          {
            "name": "serialNumber",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestReportDataFileDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponseDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "TestReportDataFiles"
        ],
        "parameters": [
          {
            "name": "serialNumber",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponseDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/TestReportDataFiles/stats": {
      "get": {
        "tags": [
          "TestReportDataFiles"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestReportDataFileStatsDto"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "BulkCreateTestReportRequest": {
        "required": [
          "Items"
        ],
        "type": "object",
        "properties": {
          "Items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CreateTestReportRequest"
            }
          }
        },
        "additionalProperties": false
      },
      "BulkCreateTestReportResponse": {
        "type": "object",
        "properties": {
          "TotalReceived": {
            "type": "integer",
            "format": "int32"
          },
          "Created": {
            "type": "integer",
            "format": "int32"
          },
          "Updated": {
            "type": "integer",
            "format": "int32"
          },
          "Unchanged": {
            "type": "integer",
            "format": "int32"
          },
          "Errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CacheStatusResponseDto": {
        "type": "object",
        "properties": {
          "AppName": {
            "type": "string",
            "nullable": true
          },
          "PendingRefresh": {
            "type": "boolean"
          },
          "CheckedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "CategoryDetailDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductSeriesListItemDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CategoryListItemDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductSeriesCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CreateProductAttributeRequest": {
        "required": [
          "AttributeType",
          "Name"
        ],
        "type": "object",
        "properties": {
          "Name": {
            "maxLength": 50,
            "minLength": 0,
            "type": "string"
          },
          "Unit": {
            "maxLength": 20,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "AttributeType": {
            "minLength": 1,
            "type": "string"
          },
          "StringValue": {
            "type": "string",
            "nullable": true
          },
          "NumberValue": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "BooleanValue": {
            "type": "boolean",
            "nullable": true
          },
          "DateValue": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "SortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "SortTier": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CreateTestReportRequest": {
        "required": [
          "Content",
          "SerialNumber"
        ],
        "type": "object",
        "properties": {
          "SerialNumber": {
            "maxLength": 50,
            "minLength": 0,
            "type": "string"
          },
          "Content": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreateTestReportResponse": {
        "type": "object",
        "properties": {
          "SerialNumber": {
            "type": "string",
            "nullable": true
          },
          "ContentHash": {
            "type": "string",
            "nullable": true
          },
          "Created": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ErrorResponseDto": {
        "type": "object",
        "properties": {
          "Message": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "OrderableProductDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "PartNumber": {
            "type": "string",
            "nullable": true
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "OrderableProductGroupId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "WeightInGrams": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "ProductTypeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "LifecycleStatus": {
            "type": "string",
            "nullable": true
          },
          "PcnUrl": {
            "type": "string",
            "nullable": true
          },
          "OrderingAvailability": {
            "type": "string",
            "nullable": true
          },
          "Attributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductAttributeDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": {}
      },
      "ProductAttributeDto": {
        "type": "object",
        "properties": {
          "ProductAttributeId": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Unit": {
            "type": "string",
            "nullable": true
          },
          "AttributeType": {
            "type": "string",
            "nullable": true
          },
          "StringValue": {
            "type": "string",
            "nullable": true
          },
          "NumberValue": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "BooleanValue": {
            "type": "boolean",
            "nullable": true
          },
          "DateValue": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "SortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "SortTier": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ProductAttributeResponseDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Unit": {
            "type": "string",
            "nullable": true
          },
          "AttributeType": {
            "type": "string",
            "nullable": true
          },
          "StringValue": {
            "type": "string",
            "nullable": true
          },
          "NumberValue": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "BooleanValue": {
            "type": "boolean",
            "nullable": true
          },
          "DateValue": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "SortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "SortTier": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ProductDetailDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "PartNumber": {
            "type": "string",
            "nullable": true
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "ProductSeriesId": {
            "type": "integer",
            "format": "int32"
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductSeriesCatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "PartNumberRoots": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "OrderableProducts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderableProductDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProductListItemDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "PartNumber": {
            "type": "string",
            "nullable": true
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "ProductSeriesId": {
            "type": "integer",
            "format": "int32"
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ProductSeriesListItemDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ProductTypeListItemDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RefreshCacheResponseDto": {
        "type": "object",
        "properties": {
          "Success": {
            "type": "boolean"
          },
          "Message": {
            "type": "string",
            "nullable": true
          },
          "RefreshedApps": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "LifecycleRecordsUpdated": {
            "type": "integer",
            "format": "int32"
          },
          "RefreshRequestedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SeriesDetailDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductCategoryId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductCategoryCatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "Products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesProductDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesListItemDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductCategoryId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductCategoryCatalogNodeId": {
            "type": "integer",
            "format": "int32"
          },
          "ProductCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesProductDto": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "integer",
            "format": "int32"
          },
          "PartNumber": {
            "type": "string",
            "nullable": true
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Slug": {
            "type": "string",
            "nullable": true
          },
          "CatalogNodeId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "TestReportDataFileDto": {
        "type": "object",
        "properties": {
          "SerialNumber": {
            "type": "string",
            "nullable": true
          },
          "Content": {
            "type": "string",
            "nullable": true
          },
          "CreatedAtUtc": {
            "type": "string",
            "format": "date-time"
          },
          "UpdatedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TestReportDataFileListItemDto": {
        "type": "object",
        "properties": {
          "SerialNumber": {
            "type": "string",
            "nullable": true
          },
          "CreatedAtUtc": {
            "type": "string",
            "format": "date-time"
          },
          "UpdatedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TestReportDataFileListItemDtoPagedResultDto": {
        "type": "object",
        "properties": {
          "Items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestReportDataFileListItemDto"
            },
            "nullable": true
          },
          "TotalCount": {
            "type": "integer",
            "format": "int32"
          },
          "Page": {
            "type": "integer",
            "format": "int32"
          },
          "PageSize": {
            "type": "integer",
            "format": "int32"
          },
          "NextCursor": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TestReportDataFileStatsDto": {
        "type": "object",
        "properties": {
          "TotalCount": {
            "type": "integer",
            "format": "int32"
          },
          "LatestCreatedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "LatestUpdatedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateProductAttributeRequest": {
        "required": [
          "AttributeType",
          "Name"
        ],
        "type": "object",
        "properties": {
          "Name": {
            "maxLength": 50,
            "minLength": 0,
            "type": "string"
          },
          "Unit": {
            "maxLength": 20,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "AttributeType": {
            "minLength": 1,
            "type": "string"
          },
          "StringValue": {
            "type": "string",
            "nullable": true
          },
          "NumberValue": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "BooleanValue": {
            "type": "boolean",
            "nullable": true
          },
          "DateValue": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "SortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "SortTier": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "oauth2": {
        "type": "oauth2",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://login.dataforth.com/connect/authorize",
            "tokenUrl": "https://login.dataforth.com/connect/token",
            "scopes": {
              "openid": "OpenID",
              "profile": "Profile",
              "dataforth.web": "Dataforth API"
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "oauth2": [
        "openid",
        "profile",
        "dataforth.web"
      ]
    }
  ]
}