223 lines
7.5 KiB
PHP
223 lines
7.5 KiB
PHP
<?php
|
|
namespace api\project;
|
|
use PDO;
|
|
use Psr\Http\Message\UploadedFileInterface;
|
|
|
|
require_once __DIR__ . "/../utils/config.php";
|
|
|
|
/**
|
|
* Project Data Class
|
|
* Define all functions which either get, update, create or delete timeline data
|
|
*/
|
|
class projectData
|
|
{
|
|
/**
|
|
* Get all project data
|
|
* @return array - Array of all project data or error message
|
|
*/
|
|
function getProjectData(): array
|
|
{
|
|
$conn = dbConn();
|
|
$stmt = $conn->prepare("SELECT ID, title, isMainProject, information, imgLocation, projectLink, gitLink FROM projects ORDER BY isMainProject DESC;");
|
|
$stmt->execute();
|
|
|
|
// set the resulting array to associative
|
|
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
if ($result)
|
|
{
|
|
return $result;
|
|
}
|
|
|
|
return array("errorMessage" => "Error, project data not found");
|
|
}
|
|
|
|
|
|
/**
|
|
* Update project data in the database with the given ID
|
|
* @param string $ID - ID of the project in the database to update
|
|
* @param string $title - Title of the project
|
|
* @param string $isMainProject - Is the project a main project or not
|
|
* @param string $information - Information about the project
|
|
* @param string $projectLink - Link to the project
|
|
* @param string $gitLink - Link to the git repository
|
|
* @return bool|string - True if project was updated, false if not and there was an error, or an error string
|
|
*/
|
|
function updateProjectData(string $ID, string $title, string $isMainProject, string $information, string $projectLink, string $gitLink): bool | string
|
|
{
|
|
$conn = dbConn();
|
|
|
|
if ($isMainProject === "false")
|
|
{
|
|
$stmtMainProject = $conn->prepare("SELECT isMainProject FROM projects WHERE ID = :ID");
|
|
$stmtMainProject->bindParam(":ID", $ID);
|
|
$stmtMainProject->execute();
|
|
$result = $stmtMainProject->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if ($result["isMainProject"] === "1")
|
|
{
|
|
return "unset main project";
|
|
}
|
|
}
|
|
|
|
if ($isMainProject === "true")
|
|
{
|
|
$stmtMainProject = $conn->prepare("UPDATE projects SET isMainProject = 0;");
|
|
$stmtMainProject->execute();
|
|
}
|
|
|
|
$stmt = $conn->prepare("UPDATE projects SET title = :title, isMainProject = :isMainProject, information = :information, projectLink = :projectLink, gitLink = :gitLink WHERE ID = :ID");
|
|
$stmt->bindParam(":title", $title);
|
|
$isMainProj = ($isMainProject === "true") ? 1 : 0;
|
|
$stmt->bindParam(":isMainProject", $isMainProj);
|
|
$stmt->bindParam(":information", $information);
|
|
$stmt->bindParam(":projectLink", $projectLink);
|
|
$stmt->bindParam(":gitLink", $gitLink);
|
|
$stmt->bindParam(":ID", $ID);
|
|
return $stmt->execute();
|
|
}
|
|
|
|
/**
|
|
* Delete project data from the database
|
|
* @param int $ID - ID of the project in the database to delete
|
|
* @return string - True if project was deleted, false if not and there was an error
|
|
*/
|
|
function deleteProjectData(int $ID): string
|
|
{
|
|
$conn = dbConn();
|
|
|
|
// check if the project is a main project if it is return false
|
|
|
|
$stmtMainProject = $conn->prepare("SELECT isMainProject FROM projects WHERE ID = :ID");
|
|
$stmtMainProject->bindParam(":ID", $ID);
|
|
$stmtMainProject->execute();
|
|
$result = $stmtMainProject->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if ($result["isMainProject"] === "1")
|
|
{
|
|
return "cannot delete";
|
|
}
|
|
|
|
$this->deleteImage($ID);
|
|
|
|
$stmt = $conn->prepare("DELETE FROM projects WHERE ID = :ID");
|
|
$stmt->bindParam(":ID", $ID);
|
|
$stmt->execute();
|
|
|
|
if ($stmt->rowCount() > 0)
|
|
{
|
|
return "ok";
|
|
}
|
|
|
|
return "error";
|
|
}
|
|
|
|
/**
|
|
* Add project data to the database
|
|
* @param string $title - Title of the project
|
|
* @param string $isMainProject - Is the project a main project or not
|
|
* @param string $information - Information about the project
|
|
* @param string $projectLink - Link to the project
|
|
* @param string $gitLink - Link to the github repository
|
|
* @return int|bool - ID of the project if it was added, false if not and there was an error
|
|
*/
|
|
function addProjectData(string $title, string $isMainProject, string $information, string $projectLink, string $gitLink): int|bool
|
|
{
|
|
|
|
$conn = dbConn();
|
|
if ($isMainProject === "true")
|
|
{
|
|
$stmtMainProject = $conn->prepare("UPDATE projects SET isMainProject = 0;");
|
|
$stmtMainProject->execute();
|
|
}
|
|
|
|
$stmt = $conn->prepare("INSERT INTO projects (title, isMainProject, information, projectLink, gitLink) VALUES (:title, :isMainProject, :information, :projectLink, :gitLink)");
|
|
$stmt->bindParam(":title", $title);
|
|
$isMainProj = ($isMainProject === "true") ? 1 : 0;
|
|
$stmt->bindParam(":isMainProject", $isMainProj);
|
|
$stmt->bindParam(":information", $information);
|
|
$stmt->bindParam(":projectLink", $projectLink);
|
|
$stmt->bindParam(":gitLink", $gitLink);
|
|
$stmt->execute();
|
|
|
|
if ($stmt->rowCount() > 0)
|
|
{
|
|
return $conn->lastInsertId();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Upload the image to the server and update the database with the new image location
|
|
* @param int $ID - ID of the project in the database to update
|
|
* @param UploadedFileInterface $img - Image preview of the project
|
|
* @return string|array - String with error message or array with the new image location
|
|
*/
|
|
public function uploadImage(int $ID, UploadedFileInterface $img): string | array
|
|
{
|
|
$targetDir = "../imgs/projects/";
|
|
$targetFile = $targetDir . basename($img->getClientFilename());
|
|
$uploadOk = 1;
|
|
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
|
|
|
|
// Check if file already exists
|
|
if (file_exists($targetFile))
|
|
{
|
|
return "The file already exists";
|
|
}
|
|
|
|
// Check file size
|
|
if ($img->getSize() > 2000000)
|
|
{
|
|
return "The file is too large, max 2MB";
|
|
}
|
|
|
|
// Allow certain file formats
|
|
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif")
|
|
{
|
|
return "Only JPG, JPEG, PNG & GIF files are allowed";
|
|
}
|
|
|
|
$img->moveTo($targetFile);
|
|
|
|
if (file_exists($targetFile))
|
|
{
|
|
$this->deleteImage($ID);
|
|
// update the database with the new image location
|
|
$conn = dbConn();
|
|
$stmt = $conn->prepare("UPDATE projects SET imgLocation = :imgLocation WHERE ID = :ID");
|
|
$stmt->bindParam(":imgLocation", $targetFile);
|
|
$stmt->bindParam(":ID", $ID);
|
|
$stmt->execute();
|
|
|
|
if ($stmt->rowCount() > 0)
|
|
{
|
|
return array("imgLocation" => $targetFile);
|
|
}
|
|
|
|
return "Couldn't update the database";
|
|
}
|
|
|
|
return "Couldn't upload the image";
|
|
}
|
|
|
|
/**
|
|
* Delete the image from the server
|
|
* @param int $ID - ID of the project in the database
|
|
*/
|
|
private function deleteImage(int $ID): void
|
|
{
|
|
$conn = dbConn();
|
|
$imgStmt = $conn->prepare("SELECT imgLocation FROM projects WHERE ID = :ID");
|
|
$imgStmt->bindParam(":ID", $ID);
|
|
$imgStmt->execute();
|
|
$imgLocation = $imgStmt->fetch(PDO::FETCH_ASSOC)["imgLocation"];
|
|
|
|
if ($imgLocation != null)
|
|
{
|
|
unlink($imgLocation);
|
|
}
|
|
}
|
|
}
|