// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract PipelineRegistry { struct Pipeline { string name; string metadataUri; string endpoint; uint256 price; bool active; } address public immutable owner; mapping(bytes32 => Pipeline) public pipelines; event PipelineRegistered(bytes32 indexed id, string name, string endpoint, uint256 price); event PipelineUpdated(bytes32 indexed id, string metadataUri, string endpoint, uint256 price, bool active); event PipelineStatusChanged(bytes32 indexed id, bool active); modifier onlyOwner() { require(msg.sender == owner, 'ONLY_OWNER'); _; } modifier validId(bytes32 id) { require(id != bytes32(0), 'INVALID_ID'); _; } constructor() { owner = msg.sender; } function registerPipeline(bytes32 id, string calldata name, string calldata metadataUri, string calldata endpoint, uint256 price) external onlyOwner validId(id) { require(bytes(name).length > 0 && bytes(endpoint).length > 0, 'MISSING_METADATA'); require(!pipelines[id].active, 'ALREADY_REGISTERED'); pipelines[id] = Pipeline(name, metadataUri, endpoint, price, true); emit PipelineRegistered(id, name, endpoint, price); } function updatePipeline(bytes32 id, string calldata metadataUri, string calldata endpoint, uint256 price, bool active) external onlyOwner validId(id) { require(bytes(pipelines[id].name).length > 0, 'NOT_REGISTERED'); Pipeline storage pipeline = pipelines[id]; pipeline.metadataUri = metadataUri; pipeline.endpoint = endpoint; pipeline.price = price; pipeline.active = active; emit PipelineUpdated(id, metadataUri, endpoint, price, active); } function setPipelineStatus(bytes32 id, bool active) external onlyOwner validId(id) { require(bytes(pipelines[id].name).length > 0, 'NOT_REGISTERED'); pipelines[id].active = active; emit PipelineStatusChanged(id, active); } }