2023-06-06 16:04:39 +01:00
< ? php
2023-06-08 15:10:27 +01:00
namespace api\blog ;
2023-06-26 03:54:25 +01:00
use api\utils\imgUtils ;
use DOMDocument ;
2023-06-06 16:04:39 +01:00
use PDO ;
2023-06-26 03:54:25 +01:00
use Psr\Http\Message\UploadedFileInterface ;
2023-06-06 16:04:39 +01:00
2023-06-08 15:10:27 +01:00
require_once __DIR__ . " /../utils/config.php " ;
2023-06-26 03:54:25 +01:00
require_once __DIR__ . " /../utils/imgUtils.php " ;
2023-06-06 16:04:39 +01:00
/**
* Blog Data Class
* Define all functions which either get , update , create or delete posts
*/
class blogData
{
/**
* Get all blog posts
* @ return array - Array of all blog posts or error message
*/
2023-06-26 03:54:25 +01:00
public function getBlogPosts () : array
2023-06-06 16:04:39 +01:00
{
$conn = dbConn ();
2023-06-26 03:54:25 +01:00
$stmt = $conn -> prepare ( " SELECT ID, title, dateCreated, dateModified, body, categories FROM blog ORDER BY dateCreated DESC; " );
2023-06-06 16:04:39 +01:00
$stmt -> execute ();
// set the resulting array to associative
$result = $stmt -> fetchAll ( PDO :: FETCH_ASSOC );
if ( $result )
{
return $result ;
}
return array ( " errorMessage " => " Error, blog data not found " );
}
/**
* Get a blog post with the given ID
* @ param string $ID - ID of the blog post to get
* @ return array - Array of all blog posts or error message
*/
2023-06-26 03:54:25 +01:00
public function getBlogPost ( string $ID ) : array
2023-06-06 16:04:39 +01:00
{
$conn = dbConn ();
2023-06-26 03:54:25 +01:00
$stmt = $conn -> prepare ( " SELECT ID, title, dateCreated, dateModified, featured, headerImg, body, categories FROM blog WHERE ID = :ID; " );
2023-06-06 16:04:39 +01:00
$stmt -> bindParam ( " :ID " , $ID );
$stmt -> execute ();
// set the resulting array to associative
$result = $stmt -> fetch ( PDO :: FETCH_ASSOC );
if ( $result )
{
return $result ;
}
return array ( " errorMessage " => " Error, blog post could not found " );
}
/**
* Get the latest blog post
* @ return array - Array of the latest blog post or error message
*/
2023-06-26 03:54:25 +01:00
public function getLatestBlogPost () : array
2023-06-06 16:04:39 +01:00
{
$conn = dbConn ();
2023-06-26 03:54:25 +01:00
$stmt = $conn -> prepare ( " SELECT ID, title, dateCreated, dateModified, featured, headerImg, body, categories FROM blog ORDER BY dateCreated DESC LIMIT 1; " );
2023-06-06 16:04:39 +01:00
$stmt -> execute ();
// set the resulting array to associative
$result = $stmt -> fetch ( PDO :: FETCH_ASSOC );
if ( $result )
{
return $result ;
}
return array ( " errorMessage " => " Error, blog post could not found " );
}
/**
* Get featured blog post
* @ return array - Array of the featured blog post or error message
*/
2023-06-26 03:54:25 +01:00
public function getFeaturedBlogPost () : array
2023-06-06 16:04:39 +01:00
{
$conn = dbConn ();
2023-06-26 03:54:25 +01:00
$stmt = $conn -> prepare ( " SELECT ID, title, dateCreated, dateModified, featured, headerImg, body, categories FROM blog WHERE featured = 1; " );
2023-06-06 16:04:39 +01:00
$stmt -> execute ();
$result = $stmt -> fetch ( PDO :: FETCH_ASSOC );
if ( $result )
{
return $result ;
}
return array ( " errorMessage " => " Error, blog post could not found " );
}
2023-06-26 03:54:25 +01:00
/**
* Upload the images in the post to temp folder and return image location
* @ param UploadedFileInterface $img - Image to upload
* @ return string | array - String with error message or array with the location of the uploaded file
*/
public function uploadPostImage ( UploadedFileInterface $img ) : string | array
{
$targetDir = " ../blog/imgs/tmp/ " ;
$imagUtils = new imgUtils ();
$targetFile = $imagUtils -> uploadFile ( $targetDir , $img );
$file = $targetDir . basename ( $img -> getClientFilename ());
if ( file_exists ( $file ))
{
return array ( " url " => $file );
}
if ( ! is_array ( $targetFile ))
{
return $targetFile ;
}
if ( file_exists ( $targetFile [ " imgLocation " ]))
{
return array ( " url " => $targetFile [ " imgLocation " ]);
}
return " Couldn't upload the image " ;
}
/**
* Creates a new post directory , uploads the header image and moves the images from the
* temp folder to the new folder , then updates the post html to point to the new images , finally
* it creates the post in the database
* @ param string $title - Title of the blog post
* @ param string $body - Body of the blog post
* @ param string $dateCreated - Date the blog post was created
* @ param string $featured - Whether the blog post is featured or not
* @ param string $categories - Categories of the blog post
* @ param UploadedFileInterface $headerImg - Header image of the blog post
* @ return int | string - ID of the blog post or error message
*/
public function createPost ( string $title , string $body , string $dateCreated , string $featured , string $categories , UploadedFileInterface $headerImg ) : int | string
{
$conn = dbConn ();
$targetDir = " ../blog/imgs/ " . $title . " _ " . uniqid () . " / " ;
mkdir ( $targetDir , 0777 , true );
$imagUtils = new imgUtils ();
$targetFile = $imagUtils -> uploadFile ( $targetDir , $headerImg );
if ( ! is_array ( $targetFile ))
{
return $targetFile ;
}
$htmlDoc = new DOMDocument ();
$htmlDoc -> loadHTML ( $body , LIBXML_NOERROR );
$doc = $htmlDoc -> getElementsByTagName ( 'body' ) -> item ( 0 );
$imgs = $doc -> getElementsByTagName ( 'img' );
$srcList = array ();
foreach ( $imgs as $img )
{
$src = $img -> getAttribute ( " src " );
$srcList [] = $src ;
$fileName = basename ( $src );
$img -> setAttribute ( " src " , $targetDir . $fileName );
}
$files = scandir ( " ../blog/imgs/tmp/ " );
foreach ( $files as $file )
{
if ( $file != " . " && $file != " .. " )
{
if ( ! in_array ( " ../blog/imgs/tmp/ " . $file , $srcList ))
{
unlink ( " ../blog/imgs/tmp/ " . $file );
}
else
{
rename ( " ../blog/imgs/tmp/ " . $file , $targetDir . $file );
}
}
}
$newBody = '' ;
foreach ( $doc -> childNodes as $node )
{
$newBody .= $htmlDoc -> saveHTML ( $node );
}
$stmt = $conn -> prepare ( " INSERT INTO blog (title, dateCreated, dateModified, featured, headerImg, body, categories)
VALUES ( : title , : dateCreated , : dateModified , : featured , : headerImg , : body , : categories ); " );
$stmt -> bindParam ( " :title " , $title );
$stmt -> bindParam ( " :dateCreated " , $dateCreated );
$stmt -> bindParam ( " :dateModified " , $dateCreated );
$stmt -> bindParam ( " :featured " , $featured );
$stmt -> bindParam ( " :headerImg " , $targetFile [ " imgLocation " ]);
$stmt -> bindParam ( " :body " , $newBody );
$stmt -> bindParam ( " :categories " , $categories );
if ( $stmt -> execute ())
{
return intval ( $conn -> lastInsertId ());
}
return " Error, couldn't create post " ;
}
2023-06-06 16:04:39 +01:00
}