Загрузка данных


<?php

use PDO;

function taskId($uri) {
    $str = str_replace("/tasks", "", $uri);
    if ($str === "") {
        return 0;
    }
    $str = str_replace("/", "", $str);
    return (integer)$str;
}

function outError($code, $message) {
    http_response_code($code);
    header("Content-Type: application/json");
    echo json_encode(['error' => $message], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}

function outObject($code, $obj) {
    http_response_code($code);
    header("Content-Type: application/json");
    echo json_encode($obj, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}

function getQueryRows($pdo, $id) {
    $conds =[];
    $params = [];
    $text = "SELECT id, title, description, status FROM tasks";
    if ($id !== 0) {
        $conds[] = "(id = ?)";
        $params[] = $id;
    }
    foreach ($_GET as $key=>$value) {
        if ($key === "query") {
            $conds[] = "(status LIKE ? OR description LIKE ? OR title LIKE ?)";
            $params[] = "%".$value."%";
            $params[] = "%".$value."%";
            $params[] = "%".$value."%";
        }
        else {
            $conds[] = "($key = ?)";
            $params[] = $value;
        }
    }
    if (count($conds) !== 0) {
        $text = $text." WHERE ".implode(" AND ", $conds);
    }
    $result = $pdo->prepare($text);
    $result->execute($params);
    $rows = $result->fetchAll(PDO::FETCH_OBJ);
    return $rows;
}

function postUpdateQuery($pdo, $id, $obj) {
    $fields =[];
    $params = [];
    foreach ($obj as $key=>$value) {
        $fields[] = "$key = ?";
        $params[] = $value;
    }
    $text = "UPDATE tasks SET ".implode(", ", $fields)." WHERE id = ?";
    $params[] = $id;
    $result = $pdo->prepare($text);
    $result->execute($params);
    $rows = getQueryRows($pdo, $id);
    return $rows;
}

function postInsertQuery($pdo, $obj) {
    $result = $pdo->query("SELECT id, title, description, status FROM tasks");
    $rows = $result->fetchAll();
    $nextId = count($rows) + 1;
    $result = $pdo->prepare("INSERT INTO tasks (id, title, description, status) VALUES (?, ?, ?, ?)");
    $result->execute([$nextId, $obj['title'], $obj['description'], $obj['status']]);
    $rows = getQueryRows($pdo, $nextId);
    return $rows;
}

function postDeleteQuery($pdo, $id) {
    $result = $pdo->prepare("DELETE FROM tasks WHERE id = ?");
    $result->execute([$id]);
}

function getTasks($pdo) {
    $rows = getQueryRows($pdo, 0);
    $result = [];
    foreach ($rows as $row) {
        $result[] = $row;
    }
    outObject(200, $result);
}

function getTask($pdo, $task) {
    $rows = getQueryRows($pdo, $task);
    if (count($rows) === 0) {
        outError(404, 'Task not found');
        return;
    }
    outObject(200, $rows[0]);
}

function doGetTasks($pdo, $uri) {
    $id = taskId($uri);
    if ($id === 0) {
        getTasks($pdo);
        return;
    }
    getTask($pdo, $id);
}
function doPostTasks($pdo, $uri) {
    $obj = json_decode(file_get_contents('php://stdin'), true);
    if (count($obj) === 0) {
        outError(422, "Invalid input");
        return;
    }
    foreach ($obj as $key=>$value) {
        switch ($key) {
            case "status":
                if (!array_key_exists($value, ["pending"=>'', "done"=>'', "in-progress"=>'', "to-do"=>''])) {
                    outError(422, "Invalid status");
                    return;
                }
                if (gettype($value) !== "string") {
                    outError(422, "Invalid status");
                    return;
                }
                break;
            case "title": 
                if (gettype($value) !== "string") {
                    outError(422, "Invalid title");
                    return;
                }
                if (strlen($value) < 5) {
                    outError(422, "Invalid title");
                    return;
                }
                break;
            case "description": 
                if (gettype($value) !== "string") {
                    outError(422, "Invalid description");
                    return;
                }
                if (strlen($value) < 5) {
                    outError(422, "Invalid description");
                    return;
                }
                break;
            default:
                break;
        }
        
    }    
    $id = taskId($uri);
    if ($id === 0) {
        $rows = postInsertQuery($pdo, $obj);
        outObject(201, $rows[0]);
        return;
    }
    $rows = getQueryRows($pdo, $id);
    if (count($rows) === 0) {
        outError(404, "Task not found");
        return;
    }
    $rows = postUpdateQuery($pdo, $id, $obj);
    outObject(200, $rows[0]);
    return;
}

function doDeleteTasks($pdo, $uri) {
    $id = taskId($uri);
    $rows = getQueryRows($pdo, $id);
    if (count($rows) !== 0) {
        postDeleteQuery($pdo, $id);
        http_response_code(204);
        header("Content-Type: application/json");
        return;
    }
}

function run() {
    try {
        $pdo = new PDO('sqlite:' . DB_NAME);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['error' => 'Database connection failed'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

        return;
    }
    // Получение пути и метода запроса
    $requestUri = $_SERVER['REQUEST_URI'];
    $requestMethod = $_SERVER['REQUEST_METHOD'];
    switch ($requestMethod) {
        case "GET":
            if (str_contains($requestUri, "/tasks")) {
                doGetTasks($pdo, $requestUri);
            }
            else {
                outError(404, "Not found");
                // http_response_code(404);
                // header("Content-Type: application/json");
                // echo json_encode(['error' => 'Not found'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            }
            break;
        case "POST":
            if (str_contains($requestUri, "/tasks")) {
                doPostTasks($pdo, $requestUri);
            }
            else {
                outError(404, "Not found");
            }
            break;
        case "DELETE":
            if (str_contains($requestUri, "/tasks")) {
                doDeleteTasks($pdo, $requestUri);
            }
            else {
                outError(404, "Not found");
            }
            break;
        default:
            break;
    }
}

// В этой работе не удаляйте вызов функции run();
run();