2023-06-06 16:04:39 +01:00
< ? php
2023-10-18 23:58:21 +01:00
2023-06-08 15:10:27 +01:00
namespace api\blog ;
2023-10-18 23:58:21 +01:00
2023-11-14 01:02:27 +00:00
use api\utils\feedGenerator\FeedWriter ;
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-11-18 13:06:27 +00:00
use DonatelloZa\RakePlus\RakePlus ;
2023-11-14 01:02:27 +00:00
use function DI\string ;
use const api\utils\feedGenerator\ATOM ;
use const api\utils\feedGenerator\RSS2 ;
2023-06-06 16:04:39 +01:00
2023-11-18 13:06:27 +00: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-11-14 01:02:27 +00:00
require_once __DIR__ . " /../utils/feedGenerator/FeedWriter.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
2023-11-14 01:02:27 +00:00
* @ return array < array > - Array of all blog posts or error message
2023-06-06 16:04:39 +01:00
*/
2023-06-26 03:54:25 +01:00
public function getBlogPosts () : array
2023-06-06 16:04:39 +01:00
{
$conn = dbConn ();
2023-11-14 01:02:27 +00:00
$stmt = $conn -> prepare ( " SELECT ID, title, DATE_FORMAT(dateCreated, '%Y-%m-%dT%TZ') AS dateCreated,
DATE_FORMAT ( dateModified , '%Y-%m-%dT%TZ' ) AS dateModified , featured , abstract ,
2023-11-18 13:06:27 +00:00
headerImg , body , bodyText , categories , keywords , folderID FROM blog ORDER BY featured DESC ,
2023-11-14 01:02:27 +00:00
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
2023-10-18 00:28:34 +01:00
* @ param string $title - Title of the blog post
2023-11-14 01:02:27 +00:00
* @ return array - Array of blog post or error message
2023-06-06 16:04:39 +01:00
*/
2023-10-18 00:28:34 +01:00
public function getBlogPost ( string $title ) : array
2023-06-06 16:04:39 +01:00
{
$conn = dbConn ();
2023-11-14 01:02:27 +00:00
$stmt = $conn -> prepare ( " SELECT ID, title, DATE_FORMAT(dateCreated, '%Y-%m-%dT%TZ') AS dateCreated,
DATE_FORMAT ( dateModified , '%Y-%m-%dT%TZ' ) AS dateModified , featured , abstract ,
2023-11-18 13:06:27 +00:00
headerImg , body , bodyText , categories , keywords , folderID FROM blog WHERE
2023-11-14 01:02:27 +00:00
title = : title ; " );
2023-10-18 00:28:34 +01:00
$stmt -> bindParam ( " :title " , $title );
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 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-11-14 01:02:27 +00:00
$stmt = $conn -> prepare ( " SELECT ID, title, DATE_FORMAT(dateCreated, '%Y-%m-%dT%TZ') AS dateCreated,
DATE_FORMAT ( dateModified , '%Y-%m-%dT%TZ' ) AS dateModified , featured , abstract ,
2023-11-18 13:06:27 +00:00
headerImg , body , bodyText , categories , keywords , folderID FROM blog ORDER BY
2023-11-14 01:02:27 +00:00
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-11-14 01:02:27 +00:00
$stmt = $conn -> prepare ( " SELECT ID, title, DATE_FORMAT(dateCreated, '%Y-%m-%dT%TZ') AS dateCreated,
DATE_FORMAT ( dateModified , '%Y-%m-%dT%TZ' ) AS dateModified , featured , abstract ,
2023-11-18 13:06:27 +00:00
headerImg , body , bodyText , categories , keywords , folderID 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
2023-10-18 00:28:34 +01:00
/**
2023-10-31 19:36:51 +00:00
* Get all unique categories
* @ return string [] - Array of all categories or error message
2023-10-18 00:28:34 +01:00
*/
public function getCategories () : array
{
$conn = dbConn ();
2023-10-18 23:58:21 +01:00
$stmt = $conn -> prepare ( " SELECT DISTINCT categories FROM blog; " );
2023-10-18 00:28:34 +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 post could not found " );
}
2023-07-12 03:29:56 +01:00
/**
* Delete a blog post with the given ID
* @ param int $ID - ID of the blog post to delete
* @ return string - Success or error message
*/
public function deletePost ( int $ID ) : string
{
$conn = dbConn ();
$stmtCheckPost = $conn -> prepare ( " SELECT * FROM blog WHERE ID = :ID " );
$stmtCheckPost -> bindParam ( " :ID " , $ID );
$stmtCheckPost -> execute ();
$result = $stmtCheckPost -> fetch ( PDO :: FETCH_ASSOC );
if ( ! $result )
{
return " post not found " ;
}
if ( $result [ " featured " ] === 1 )
{
return " cannot delete " ;
}
$stmt = $conn -> prepare ( " DELETE FROM blog WHERE ID = :ID " );
$stmt -> bindParam ( " :ID " , $ID );
if ( $stmt -> execute ())
{
$imagUtils = new imgUtils ();
$imagUtils -> deleteDirectory ( " ../blog/imgs/ " . $result [ " title " ] . " _ " . $result [ " folderID " ] . " / " );
return " success " ;
}
return " error " ;
}
/**
* Update the blog post with the given ID
* @ param int $ID - ID of the blog post to update
* @ param string $title - Title of the blog post
* @ param bool $featured - Whether the blog post is featured or not
2023-10-18 00:28:34 +01:00
* @ param string $abstract - Abstract of the blog post i . e . a short description
2023-07-12 03:29:56 +01:00
* @ param string $body - Body of the blog post
2023-10-31 19:36:51 +00:00
* @ param string $bodyText - Body of the blog post as plain text
2023-07-12 03:29:56 +01:00
* @ param string $dateModified - Date the blog post was modified
* @ param string $categories - Categories of the blog post
* @ return bool | string - Success or error message
*/
2023-10-31 19:36:51 +00:00
public function updatePost ( int $ID , string $title , bool $featured , string $abstract , string $body , string $bodyText , string $dateModified , string $categories ) : bool | string
2023-07-12 03:29:56 +01:00
{
$conn = dbConn ();
$stmtCheckPost = $conn -> prepare ( " SELECT * FROM blog WHERE ID = :ID " );
$stmtCheckPost -> bindParam ( " :ID " , $ID );
$stmtCheckPost -> execute ();
$result = $stmtCheckPost -> fetch ( PDO :: FETCH_ASSOC );
if ( ! $result )
{
return " post not found " ;
}
if ( ! $featured && $result [ " featured " ] === 1 )
{
return " unset feature " ;
}
if ( $featured )
{
$stmtUnsetFeatured = $conn -> prepare ( " UPDATE blog SET featured = 0 WHERE featured = 1; " );
$stmtUnsetFeatured -> execute ();
}
$to = " ../blog/imgs/ " . $title . " _ " . $result [ " folderID " ] . " / " ;
if ( $result [ " title " ] !== $title )
{
$from = " ../blog/imgs/ " . $result [ " title " ] . " _ " . $result [ " folderID " ] . " / " ;
mkdir ( $to , 0777 , true );
rename ( $result [ " headerImg " ], $to . basename ( $result [ " headerImg " ]));
$body = $this -> changeHTMLSrc ( $body , $to , $from );
rmdir ( $from );
}
$from = " ../blog/imgs/tmp/ " ;
$newBody = $this -> changeHTMLSrc ( $body , $to , $from );
2023-11-18 13:06:27 +00:00
$keywords = implode ( " , " , RakePlus :: create ( $bodyText ) -> keywords ());
$stmt = $conn -> prepare ( " UPDATE blog SET title = :title, featured = :featured, abstract = :abstract, body = :body, bodyText = :bodyText, dateModified = :dateModified, categories = :categories, keywords = :keywords WHERE ID = :ID; " );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :ID " , $ID );
$stmt -> bindParam ( " :title " , $title );
$stmt -> bindParam ( " :featured " , $featured );
2023-10-18 00:28:34 +01:00
$stmt -> bindParam ( " :abstract " , $abstract );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :body " , $newBody );
2023-10-31 19:36:51 +00:00
$stmt -> bindParam ( " :bodyText " , $bodyText );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :dateModified " , $dateModified );
$stmt -> bindParam ( " :categories " , $categories );
2023-11-18 13:06:27 +00:00
$stmt -> bindParam ( " :keywords " , $keywords );
2023-07-12 03:29:56 +01:00
return $stmt -> execute ();
}
/**
* Creates a new post di rectory , 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
2023-10-18 00:28:34 +01:00
* @ param string $abstract - Abstract of the blog post i . e . a short description
2023-07-12 03:29:56 +01:00
* @ param string $body - Body of the blog post
2023-10-31 19:36:51 +00:00
* @ param string $bodyText - Body of the blog post as plain text
2023-07-12 03:29:56 +01:00
* @ param string $dateCreated - Date the blog post was created
* @ param bool $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
*/
2023-10-31 19:36:51 +00:00
public function createPost ( string $title , string $abstract , string $body , string $bodyText , string $dateCreated , bool $featured , string $categories , UploadedFileInterface $headerImg ) : int | string
2023-07-12 03:29:56 +01:00
{
$conn = dbConn ();
$folderID = uniqid ();
$targetFile = array ( " imgLocation " => " ../blog/imgs/placeholder.png " );
$targetDir = " ../blog/imgs/ " . $title . " _ " . $folderID . " / " ;
mkdir ( $targetDir , 0777 , true );
if ( $headerImg !== null )
{
$imagUtils = new imgUtils ();
$targetFile = $imagUtils -> uploadFile ( $targetDir , $headerImg );
}
if ( ! is_array ( $targetFile ))
{
return $targetFile ;
}
$newBody = $this -> changeHTMLSrc ( $body , $targetDir , " ../blog/imgs/tmp/ " );
if ( $featured )
{
$stmtMainProject = $conn -> prepare ( " UPDATE blog SET featured = 0 WHERE featured = 1; " );
$stmtMainProject -> execute ();
}
2023-11-18 13:06:27 +00:00
$keywords = implode ( " , " , RakePlus :: create ( $bodyText ) -> keywords ());
$stmt = $conn -> prepare ( " INSERT INTO blog (title, dateCreated, dateModified, featured, headerImg, abstract, body, bodyText, categories, keywords, folderID)
VALUES ( : title , : dateCreated , : dateModified , : featured , : headerImg , : abstract , : body , : bodyText , : categories , : keywords , : folderID ); " );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :title " , $title );
$stmt -> bindParam ( " :dateCreated " , $dateCreated );
$stmt -> bindParam ( " :dateModified " , $dateCreated );
$isFeatured = $featured ? 1 : 0 ;
$stmt -> bindParam ( " :featured " , $isFeatured );
$stmt -> bindParam ( " :headerImg " , $targetFile [ " imgLocation " ]);
2023-10-18 00:28:34 +01:00
$stmt -> bindParam ( " :abstract " , $abstract );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :body " , $newBody );
2023-10-31 19:36:51 +00:00
$stmt -> bindParam ( " :bodyText " , $bodyText );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :categories " , $categories );
2023-11-18 13:06:27 +00:00
$stmt -> bindParam ( " :keywords " , $keywords );
2023-07-12 03:29:56 +01:00
$stmt -> bindParam ( " :folderID " , $folderID );
if ( $stmt -> execute ())
{
return intval ( $conn -> lastInsertId ());
}
return " Error, couldn't create post " ;
}
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 " ;
}
/**
2023-07-12 03:29:56 +01:00
* Upload the header image of the post and update the database
* @ param int $ID - ID of the post
* @ param UploadedFileInterface $img - Image to upload
* @ return string | array - String with error message or array with the location of the uploaded file
2023-06-26 03:54:25 +01:00
*/
2023-07-12 03:29:56 +01:00
public function uploadHeaderImage ( int $ID , UploadedFileInterface $img ) : string | array
2023-06-26 03:54:25 +01:00
{
$conn = dbConn ();
2023-07-12 03:29:56 +01:00
$stmt = $conn -> prepare ( " SELECT * FROM blog WHERE ID = :ID; " );
$stmt -> bindParam ( " :ID " , $ID );
$stmt -> execute ();
$result = $stmt -> fetch ( PDO :: FETCH_ASSOC );
if ( ! $result )
2023-06-26 16:52:48 +01:00
{
2023-07-12 03:29:56 +01:00
return " Couldn't find the post " ;
2023-06-26 16:52:48 +01:00
}
2023-07-12 03:29:56 +01:00
$targetDir = " ../blog/imgs/ " . $result [ " title " ] . " _ " . $result [ " folderID " ] . " / " ;
$imagUtils = new imgUtils ();
$targetFile = $imagUtils -> uploadFile ( $targetDir , $img );
2023-06-26 16:52:48 +01:00
2023-06-26 03:54:25 +01:00
if ( ! is_array ( $targetFile ))
{
return $targetFile ;
}
2023-07-12 03:29:56 +01:00
if ( file_exists ( $targetFile [ " imgLocation " ]))
{
unlink ( $result [ " headerImg " ]);
$stmt = $conn -> prepare ( " UPDATE blog SET headerImg = :headerImg WHERE ID = :ID; " );
$stmt -> bindParam ( " :ID " , $ID );
$stmt -> bindParam ( " :headerImg " , $targetFile [ " imgLocation " ]);
$stmt -> execute ();
if ( $stmt -> rowCount () > 0 )
{
return $targetFile ;
}
return " Couldn't update the post " ;
}
return " Couldn't upload the image " ;
}
/**
* Change the HTML src of the images in the post to point to the new location
* @ param string $body - Body of the post
* @ param string $to - New location of the images
* @ param string $from - Old location of the images
* @ return string - Body of the post with the new image locations
*/
public function changeHTMLSrc ( string $body , string $to , string $from ) : string
{
2023-06-26 03:54:25 +01:00
$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 " );
2023-07-12 03:29:56 +01:00
$src = urldecode ( $src );
2023-06-26 03:54:25 +01:00
$srcList [] = $src ;
$fileName = basename ( $src );
2023-10-18 00:28:34 +01:00
$img -> setAttribute ( " src " , substr ( $to , 2 ) . $fileName );
2023-06-26 03:54:25 +01:00
}
2023-07-12 03:29:56 +01:00
$files = scandir ( $from );
2023-06-26 03:54:25 +01:00
foreach ( $files as $file )
{
if ( $file != " . " && $file != " .. " )
{
2023-07-12 03:29:56 +01:00
if ( ! in_array ( $from . $file , $srcList ))
2023-06-26 03:54:25 +01:00
{
2023-07-12 03:29:56 +01:00
unlink ( $from . $file );
2023-11-14 01:02:27 +00:00
continue ;
2023-06-26 03:54:25 +01:00
}
2023-11-14 01:02:27 +00:00
rename ( $from . $file , $to . $file );
2023-06-26 03:54:25 +01:00
}
}
$newBody = '' ;
foreach ( $doc -> childNodes as $node )
{
$newBody .= $htmlDoc -> saveHTML ( $node );
}
2023-07-12 03:29:56 +01:00
return $newBody ;
2023-06-26 03:54:25 +01:00
}
2023-10-18 00:28:34 +01:00
/**
* Get all posts with the given category
2023-10-18 23:58:21 +01:00
* @ param string $category - Category of the post
2023-11-14 01:02:27 +00:00
* @ return array < array > - Array of all posts with the given category or error message
2023-10-18 00:28:34 +01:00
*/
2023-10-18 23:58:21 +01:00
public function getPostsByCategory ( string $category ) : array
2023-10-18 00:28:34 +01:00
{
$conn = dbConn ();
2023-10-18 23:58:21 +01:00
$stmt = $conn -> prepare ( " SELECT * FROM blog WHERE LOCATE(:category, categories) > 0; " );
2023-10-18 00:28:34 +01:00
$stmt -> bindParam ( " :category " , $category );
$stmt -> execute ();
2023-10-18 23:58:21 +01:00
return $stmt -> fetchAll ( PDO :: FETCH_ASSOC );
2023-10-18 00:28:34 +01:00
}
2023-10-31 19:36:51 +00:00
/**
* Search for a blog post with the given search term
* @ param string $searchTerm - Search term
2023-11-14 01:02:27 +00:00
* @ return array < array > - Array of all posts with the given search term or error message
2023-10-31 19:36:51 +00:00
*/
public function searchBlog ( string $searchTerm ) : array
{
$conn = dbConn ();
$stmt = $conn -> prepare ( " SELECT * FROM blog WHERE MATCH(title, bodyText) AGAINST(:searchTerm IN NATURAL LANGUAGE MODE); " );
$stmt -> bindParam ( " :searchTerm " , $searchTerm );
$stmt -> execute ();
$result = $stmt -> fetchAll ( PDO :: FETCH_ASSOC );
if ( $result )
{
2023-11-05 17:47:44 +00:00
for ( $i = 0 ; $i < count ( $result ); $i ++ )
2023-10-31 19:36:51 +00:00
{
2023-11-05 17:47:44 +00:00
$result [ $i ][ " abstract " ] = $this -> getShortPost ( $searchTerm , stripcslashes ( $result [ $i ][ " bodyText " ]));
2023-10-31 19:36:51 +00:00
}
return $result ;
}
return array ( " errorMessage " => " Error, could not find posts " );
}
2023-11-05 17:47:44 +00:00
/**
* Get the short post with the search term
* @ param string $searchTerm - Search term
* @ param $text - Body of the post as plain text
* @ return string - Short post with the search term
*/
private function getShortPost ( string $searchTerm , $text ) : string
{
$pattern = '/([,:;!?.-]+)/u' ;
$parts = preg_split ( $pattern , $text , - 1 , PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
$cleanedParts = [];
foreach ( $parts as $part )
{
$part = trim ( $part ); // Remove leading/trailing spaces and newline characters
if ( ! empty ( $part ))
{
$cleanedParts [] = $part ;
}
}
$combinedParts = [];
$currentPart = '' ;
foreach ( $cleanedParts as $part )
{
if ( preg_match ( '/[,:;!?.-]/u' , $part ))
{
$currentPart .= $part ;
}
else
{
if ( ! empty ( $currentPart ))
{
$combinedParts [] = trim ( $currentPart );
}
$currentPart = rtrim ( $part );
}
}
if ( ! empty ( $currentPart ))
{
$combinedParts [] = trim ( $currentPart );
}
$result = " " ;
for ( $i = 0 ; $i < count ( $combinedParts ); $i ++ )
{
$part = $combinedParts [ $i ];
if ( stripos ( $part , $searchTerm ) !== false )
{
$before = ( $i > 0 ) ? $combinedParts [ $i - 1 ] : " " ;
$after = ( $i < count ( $combinedParts ) - 1 ) ? $combinedParts [ $i + 1 ] : " " ;
if ( $before === " " && $i > 0 )
{
$before = $combinedParts [ $i - 1 ];
}
$result = $before . " " . $part . " " . $after ;
// If the search term is found, we don't need to continue checking subsequent parts
break ;
}
}
return $result ;
}
2023-11-14 01:02:27 +00:00
/**
* Generate the XML feed
* @ param mixed $type - Type of feed
* @ return array | string - Error message or the XML feed
*/
private function generateXMLFeed ( mixed $type ) : array | string
{
ob_start ();
$feed = new FeedWriter ( $type );
$feed -> setTitle ( " Rohit Pai's Blog " );
$feed -> setLink ( 'https://rohitpai.co.uk/blog' );
$feed -> setFeedURL ( 'https://rohitpai.co.uk/api/blog/feed/atom' );
$feed -> setChannelElement ( 'updated' , date ( DATE_ATOM , time ()));
$feed -> setChannelElement ( 'author' , [ 'name' => 'Rohit Pai' ]);
$posts = $this -> getBlogPosts ();
if ( isset ( $posts [ " errorMessage " ]))
{
return $posts ;
}
foreach ( $posts as $post )
{
$newItem = $feed -> createNewItem ();
$newItem -> setTitle ( $post [ " title " ]);
$newItem -> setLink ( " https://rohitpai.co.uk/blog/post/ " . rawurlencode ( $post [ " title " ]) . " #disqus_thread " );
$newItem -> setDate ( $post [ " dateModified " ]);
$newItem -> setDescription ( $post [ " body " ]);
$feed -> addItem ( $newItem );
}
$feed -> generateFeed ();
$atom = ob_get_contents ();
ob_end_clean ();
return $atom ;
}
/**
* Generate the JSON feed
* @ return array | array [] - Error message or the JSON feed
*/
private function generateJSONFeed () : array
{
$posts = $this -> getBlogPosts ();
if ( isset ( $posts [ " errorMessage " ]))
{
return $posts ;
}
$json = array ();
$json [ " version " ] = " https://jsonfeed.org/version/1.1 " ;
$json [ " title " ] = " Rohit Pai's Blog " ;
$json [ " home_page_url " ] = " https://rohitpai.co.uk/blog " ;
$json [ " feed_url " ] = " https://rohitpai.co.uk/api/blog/feed/json " ;
$json [ " description " ] = " Rohit Pai's personal blog on all things self hosting and various other tech topics " ;
$json [ " author " ] = array (
" name " => " Rohit Pai " ,
" url " => " https://rohitpai.co.uk " ,
" avatar " => " https://rohitpai.co.uk/imgs/profile.jpg "
);
$items = array ();
foreach ( $posts as $post )
{
$items [] = array (
" id " => string ( $post [ " ID " ]),
" url " => " https://rohitpai.co.uk/blog/post/ " . rawurlencode ( $post [ " title " ]) . " #disqus_thread " ,
" title " => $post [ " title " ],
" date_published " => date ( $post [ " dateCreated " ]),
" date_modified " => date ( $post [ " dateModified " ]),
// "description" => $post["abstract"],
" banner_image " => " https://rohitpai.co.uk/ " . rawurlencode ( $post [ " headerImg " ]),
" content_html " => $post [ " body " ]
);
}
$json [ " items " ] = $items ;
return $json ;
}
/**
* Generate the RSS feed based on type
* @ param string $type - Type of feed
* @ return string | array - RSS feed or an error message
*/
public function getFeed ( string $type ) : string | array
{
$feed = " " ;
if ( $type == " atom " )
{
$feed = $this -> generateXMLFeed ( ATOM );
}
if ( $type == " rss " )
{
$feed = $this -> generateXMLFeed ( RSS2 );
}
if ( $type == " json " )
{
$feed = $this -> generateJSONFeed ();
}
return $feed ;
}
2023-06-06 16:04:39 +01:00
}