diff --git a/src/Controller/RequestController.php b/src/Controller/RequestController.php index 45ccb62..789cf98 100644 --- a/src/Controller/RequestController.php +++ b/src/Controller/RequestController.php @@ -8,12 +8,17 @@ use App\Repository\ApikeyRepository; use App\Repository\DomainRepository; use DI\Container; use DI\ContainerBuilder; +use OpenApi\Annotations\ServerVariable; +use OpenApi\Annotations\Tag; +use OpenApi\Generator; use UnhandledMatchError; use function DI\autowire; +use OpenApi\Attributes as OAT; /** * */ +#[OAT\Info(version: '0.0.1', title: 'bindAPI' )] class RequestController { //private DatabaseConnection $databaseConnection; @@ -46,54 +51,164 @@ class RequestController $this->apikeyRepository = $this->container->get(name: ApikeyRepository::class); } - + /** + * @OA\Server( + * url = "https://ns2.24unix.net/api" + * ) + * @OA\Tag(name = "Server") + * @OA\Get( + * path = "/ping", + * summary = "Returning pong.", + * description = "Can be used to check API or server availability.", + * tags={"Server"}, + * @OA\Response(response = "200", description = "OK"), + * @OA\Response(response = "401", description = "API key is missing or invalid."), + * security={ + * {"Authorization":{"read"}} + * } + * ) + * + * @OA\SecurityScheme (name="bindAPISecurity", + * type="apiKey", + * description="description", + * name="X-API-Key", + * in="header", + * securityScheme="Authorization" + * + * ) + * @SwaggerDefinition( + * securityDefinition = @SecurityDefinition( + * apiKeyAuthDefinitions = { + * @ApiKeyAuthDefinition( + * key = "X-API-Key", in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, name = "X-API-KEY" + * ) + * } + * ) + * ) + * @OA\Tag(name = "Domains") + * @OA\Get( + * path="/domains", + * summary="Listing all domains.", + * description="desc", + * tags={"Domains"}, + * @OA\Response(response="200", description="OK"), + * @OA\Response(response = "401", description = "API key is missing or invalid."), + * @OA\Response(response="404", description="Domain not found."), + * security={ + * {"Authorization":{"read":"write"}} + * } + * ) + * @OA\Post( + * path="/domains", + * summary="Create a domain.", + * description="Creates a new domain.", + * tags={"Domains"}, + * @OA\Response(response="201", description="Created"), + * @OA\Response(response = "400", description = "Invalid request body."), + * @OA\Response(response = "401", description = "API key is missing or invalid."), + * @OA\Response(response="404", description="Domain not found."), + * security={ + * {"Authorization":{"read":"write"}} + * } + * ) + * @OA\Get( + * path="/domains/{name}", + * summary="Returns a single domain.", + * description="Returns information of a single domain specified by its domain name.", + * tags={"Domains"}, + * @OA\Response(response="200", description="OK"), + * @OA\Response(response = "401", description = "API key is missing or invalid."), + * @OA\Response(response="404", description="Domain not found."), + * security={ + * {"Authorization":{"read":"write"}} + * } + * ) + * @OA\Put( + * path="/domains/{name}", + * summary="Updates a domain.", + * description="Updates a domain. Only supplied fields will be updated, existing won't be affected.", + * tags={"Domains"}, + * @OA\Response(response="200", description="OK"), + * @OA\Response(response = "401", description = "API key is missing or invalid."), + * @OA\Response(response="404", description="Domain not found."), + * security={ + * {"Authorization":{"read":"write"}} + * } + * ) + * @OA\Delete ( + * path="/domains/{name}", + * summary="Deletes a domain.", + * description="Deletes a domain.", + * tags={"Domains"}, + * @OA\Response(response="200", description="OK"), + * @OA\Response(response = "401", description = "API key is missing or invalid."), + * @OA\Response(response="404", description="Domain not found."), + * security={ + * {"Authorization":{"read":"write"}} + * } + * ) + * * @return void */ public function processRequest() { - if (empty($this->uri[2]) || !(($this->uri[2] == 'domains') || $this->uri[2] == 'ping')) { + $command = $this->uri[2]; + + if (empty($command) || !(($command == 'domains') || ($command == 'ping') || ($command == 'apidoc'))) { $this->header = '404 Not Found'; $this->status = "404 Not Found"; $this->message = "Endpoint not found."; } else { - if ($this->checkPassword()) { - if ($this->uri[2] == "ping") { - $this->header = '200 OK'; - $this->status = 'pong'; - } else { - try { - match ($this->requestMethod) { - 'GET' => $this->handleDomainGetRequest(), - 'POST' => $this->handleDomainPostRequest(), - 'PUT' => $this->handleDomainPutRequest(), - 'DELETE' => $this->handleDomainDeleteRequest() - }; - } catch (UnhandledMatchError) { - $this->header = '400 Bad Request'; - $this->status = '400 Bad Request'; - $this->message = "unknown request method: $this->requestMethod"; + if ($command == 'apidoc') { + $openapi = Generator::scan(sources: [__DIR__ . 'RequestController.php']); + $this->status = 'openapi'; + $this->result[] = $openapi->toJson(); + } else { + if ($this->checkPassword()) { + + if ($this->uri[2] == "ping") { + $this->header = '200 OK'; + $this->status = 'pong'; + } else { + try { + match ($this->requestMethod) { + 'GET' => $this->handleDomainGetRequest(), + 'POST' => $this->handleDomainPostRequest(), + 'PUT' => $this->handleDomainPutRequest(), + 'DELETE' => $this->handleDomainDeleteRequest() + }; + } catch (UnhandledMatchError) { + $this->header = '400 Bad Request'; + $this->status = '400 Bad Request'; + $this->message = "unknown request method: $this->requestMethod"; + } } } } - } - - if (!empty($this->header)) { - header(header: $_SERVER['SERVER_PROTOCOL'] . ' ' . $this->header); - } - if (!empty($this->result)) { - echo json_encode(value: $this->result); - } else { - if (!empty($this->status) && $this->status == 'pong') { - echo json_encode(value: [ - 'response' => $this->status - ]); + + if (!empty($this->header)) { + header(header: $_SERVER['SERVER_PROTOCOL'] . ' ' . $this->header); + } + if (!empty($this->result)) { + if (!empty($this->status) && $this->status == 'openapi') { + header(header: 'Content-Type: application/json'); + echo $this->result[0]; + } else { + echo json_encode(value: $this->result); + } } else { - echo json_encode(value: [ - 'status' => $this->status ?? "Error: No status", - 'message' => $this->message ?? "Error: No message." - ]); + if (!empty($this->status) && $this->status == 'pong') { + echo json_encode(value: [ + 'response' => $this->status + ]); + } else { + echo json_encode(value: [ + 'status' => $this->status ?? "Error: No status", + 'message' => $this->message ?? "Error: No message." + ]); + } } } } @@ -173,7 +288,8 @@ class RequestController /** * @return void */ - public function handleDomainPostRequest(): void + public + function handleDomainPostRequest(): void { $name = $_POST['name'] ?? ''; $panelID = intval(value: $_POST['panel_id'] ?? 0); @@ -206,7 +322,8 @@ class RequestController /** * @return void */ - public function handleDomainPutRequest(): void + public + function handleDomainPutRequest(): void { $putData = fopen(filename: 'php://input', mode: 'r'); $data = fread(stream: $putData, length: 512); @@ -249,10 +366,12 @@ class RequestController } } + /** * @return void */ - public function handleDomainDeleteRequest(): void + public + function handleDomainDeleteRequest(): void { $deleteData = fopen(filename: 'php://input', mode: 'r'); $data = fread(stream: $deleteData, length: 512);