2013-10-05 12:55:03 +02:00
< ? php
2013-10-05 21:24:20 +02:00
class PostController
2013-10-05 12:55:03 +02:00
{
2013-10-07 00:44:17 +02:00
public function workWrapper ( $callback )
{
2013-10-09 21:02:54 +02:00
$this -> context -> stylesheets [] = '../lib/tagit/jquery.tagit.css' ;
$this -> context -> scripts [] = '../lib/tagit/jquery.tagit.js' ;
2013-10-07 00:44:17 +02:00
$callback ();
}
2013-11-22 21:20:56 +01:00
private static function serializePost ( $post )
2013-10-13 12:28:16 +02:00
{
$x = [];
foreach ( $post -> sharedTag as $tag )
2013-11-22 21:20:56 +01:00
$x [] = TextHelper :: reprTag ( $tag -> name );
foreach ( $post -> via ( 'crossref' ) -> sharedPost as $relatedPost )
$x [] = TextHelper :: reprPost ( $relatedPost );
$x [] = $post -> safety ;
$x [] = $post -> source ;
$x [] = $post -> file_hash ;
2013-10-13 12:28:16 +02:00
natcasesort ( $x );
2013-11-22 21:20:56 +01:00
$x = join ( ' ' , $x );
2013-10-13 12:28:16 +02:00
return md5 ( $x );
}
private static function handleUploadErrors ( $file )
{
switch ( $file [ 'error' ])
{
case UPLOAD_ERR_OK :
break ;
case UPLOAD_ERR_INI_SIZE :
throw new SimpleException ( 'File is too big (maximum size allowed: ' . ini_get ( 'upload_max_filesize' ) . ')' );
case UPLOAD_ERR_FORM_SIZE :
throw new SimpleException ( 'File is too big than it was allowed in HTML form' );
case UPLOAD_ERR_PARTIAL :
throw new SimpleException ( 'File transfer was interrupted' );
case UPLOAD_ERR_NO_FILE :
throw new SimpleException ( 'No file was uploaded' );
case UPLOAD_ERR_NO_TMP_DIR :
throw new SimpleException ( 'Server misconfiguration error: missing temporary folder' );
case UPLOAD_ERR_CANT_WRITE :
throw new SimpleException ( 'Server misconfiguration error: cannot write to disk' );
case UPLOAD_ERR_EXTENSION :
throw new SimpleException ( 'Server misconfiguration error: upload was canceled by an extension' );
default :
throw new SimpleException ( 'Generic file upload error (id: ' . $file [ 'error' ] . ')' );
}
if ( ! is_uploaded_file ( $file [ 'tmp_name' ]))
throw new SimpleException ( 'Generic file upload error' );
}
2013-10-08 23:02:31 +02:00
2013-10-05 12:55:03 +02:00
/**
2013-10-29 09:04:42 +01:00
* @ route / { source }
* @ route / { source } / { page }
* @ route / { source } / { query } /
* @ route / { source } / { query } / { page }
* @ route / { source } / { additionalInfo } / { query } /
* @ route / { source } / { additionalInfo } / { query } / { page }
* @ validate source posts | mass - tag
2013-10-09 11:45:18 +02:00
* @ validate page \d *
* @ validate query [ ^ \ / ] *
2013-10-29 09:04:42 +01:00
* @ validate additionalInfo [ ^ \ / ] *
2013-10-05 12:55:03 +02:00
*/
2013-10-29 09:04:42 +01:00
public function listAction ( $query = null , $page = 1 , $source = 'posts' , $additionalInfo = null )
2013-10-05 12:55:03 +02:00
{
2013-10-17 22:57:32 +02:00
$this -> context -> stylesheets [] = 'post-small.css' ;
2013-10-09 11:45:18 +02:00
$this -> context -> stylesheets [] = 'post-list.css' ;
2013-11-01 12:48:02 +01:00
$this -> context -> stylesheets [] = 'tabs.css' ;
2013-10-10 00:12:27 +02:00
$this -> context -> stylesheets [] = 'paginator.css' ;
2013-11-01 12:48:02 +01:00
$this -> context -> viewName = 'post-list-wrapper' ;
2013-10-22 00:17:06 +02:00
if ( $this -> context -> user -> hasEnabledEndlessScrolling ())
2013-10-10 00:12:27 +02:00
$this -> context -> scripts [] = 'paginator-endless.js' ;
2013-10-29 09:04:42 +01:00
if ( $source == 'mass-tag' )
$this -> context -> scripts [] = 'mass-tag.js' ;
$this -> context -> source = $source ;
$this -> context -> additionalInfo = $additionalInfo ;
2013-10-09 11:45:18 +02:00
2013-10-14 00:25:40 +02:00
//redirect requests in form of /posts/?query=... to canonical address
2013-10-05 22:52:55 +02:00
$formQuery = InputHelper :: get ( 'query' );
2013-10-13 22:20:06 +02:00
if ( $formQuery !== null )
2013-10-05 22:52:55 +02:00
{
2013-10-13 22:20:06 +02:00
$this -> context -> transport -> searchQuery = $formQuery ;
if ( strpos ( $formQuery , '/' ) !== false )
2013-10-14 00:25:40 +02:00
throw new SimpleException ( 'Search query contains invalid characters' );
2013-11-18 14:00:54 +01:00
$url = \Chibi\UrlHelper :: route ( 'post' , 'list' , [ 'source' => $source , 'additionalInfo' => $additionalInfo , 'query' => $formQuery ]);
2013-10-05 22:52:55 +02:00
\Chibi\UrlHelper :: forward ( $url );
return ;
}
2013-11-18 14:00:54 +01:00
$query = trim ( $query );
2013-10-09 11:45:18 +02:00
$page = intval ( $page );
$postsPerPage = intval ( $this -> config -> browsing -> postsPerPage );
2013-10-20 00:36:50 +02:00
$this -> context -> subTitle = 'posts' ;
2013-10-13 13:17:23 +02:00
$this -> context -> transport -> searchQuery = $query ;
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: ListPosts );
2013-10-29 09:04:42 +01:00
if ( $source == 'mass-tag' )
{
PrivilegesHelper :: confirmWithException ( Privilege :: MassTag );
$this -> context -> massTagTag = $additionalInfo ;
$this -> context -> massTagQuery = $query ;
}
2013-10-07 20:44:14 +02:00
2013-10-28 11:19:15 +01:00
$postCount = Model_Post :: getEntityCount ( $query );
2013-10-09 11:45:18 +02:00
$pageCount = ceil ( $postCount / $postsPerPage );
2013-10-13 22:20:06 +02:00
$page = max ( 1 , min ( $pageCount , $page ));
2013-10-28 11:19:15 +01:00
$posts = Model_Post :: getEntities ( $query , $postsPerPage , $page );
2013-10-09 11:45:18 +02:00
2013-10-16 13:07:01 +02:00
$this -> context -> transport -> paginator = new StdClass ;
$this -> context -> transport -> paginator -> page = $page ;
$this -> context -> transport -> paginator -> pageCount = $pageCount ;
$this -> context -> transport -> paginator -> entityCount = $postCount ;
$this -> context -> transport -> paginator -> entities = $posts ;
2013-10-07 20:44:14 +02:00
$this -> context -> transport -> posts = $posts ;
2013-10-05 19:24:08 +02:00
}
2013-10-08 23:02:31 +02:00
2013-10-29 09:04:42 +01:00
/**
* @ route / post / { id } / toggle - tag / { tag }
* @ validate tag [ ^ \ / ] *
*/
public function toggleTagAction ( $id , $tag )
{
$post = Model_Post :: locate ( $id );
$this -> context -> transport -> post = $post ;
2013-11-21 21:06:18 +01:00
$tagRow = Model_Tag :: locate ( $tag , false );
if ( $tagRow !== null )
$tag = $tagRow -> name ;
2013-10-29 09:04:42 +01:00
if ( InputHelper :: get ( 'submit' ))
{
PrivilegesHelper :: confirmWithException ( Privilege :: MassTag );
$tags = array_map ( function ( $x ) { return $x -> name ; }, $post -> sharedTag );
if ( in_array ( $tag , $tags ))
2013-11-16 21:21:43 +01:00
{
2013-10-29 09:04:42 +01:00
$tags = array_diff ( $tags , [ $tag ]);
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-tag-del' , '{user} untagged {post} with {tag}' , [ 'post' => TextHelper :: reprPost ( $post ), 'tag' => TextHelper :: reprTag ( $tag )]);
2013-11-16 21:21:43 +01:00
}
2013-10-29 09:04:42 +01:00
else
2013-11-16 21:21:43 +01:00
{
2013-10-29 09:04:42 +01:00
$tags += [ $tag ];
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-tag-add' , '{user} tagged {post} with {tag}' , [ 'post' => TextHelper :: reprPost ( $post ), 'tag' => TextHelper :: reprTag ( $tag )]);
2013-11-16 21:21:43 +01:00
}
2013-10-29 09:04:42 +01:00
$dbTags = Model_Tag :: insertOrUpdate ( $tags );
$post -> sharedTag = $dbTags ;
2013-11-22 21:20:56 +01:00
Model_Post :: save ( $post );
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-29 09:04:42 +01:00
}
}
2013-10-13 12:28:16 +02:00
/**
* @ route / favorites
* @ route / favorites / { page }
* @ validate page \d *
*/
public function favoritesAction ( $page = 1 )
{
$this -> listAction ( 'favmin:1' , $page );
}
2013-10-21 13:13:10 +02:00
/**
* @ route / random
* @ route / random / { page }
* @ validate page \d *
*/
public function randomAction ( $page = 1 )
{
$this -> listAction ( 'order:random' , $page );
}
2013-10-05 19:24:08 +02:00
/**
* @ route / post / upload
*/
public function uploadAction ()
{
2013-10-07 00:44:17 +02:00
$this -> context -> stylesheets [] = 'upload.css' ;
2013-10-25 09:40:33 +02:00
$this -> context -> stylesheets [] = 'tabs.css' ;
2013-10-07 00:44:17 +02:00
$this -> context -> scripts [] = 'upload.js' ;
2013-10-05 21:22:28 +02:00
$this -> context -> subTitle = 'upload' ;
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: UploadPost );
2013-10-16 18:07:23 +02:00
if ( $this -> config -> registration -> needEmailForUploading )
PrivilegesHelper :: confirmEmail ( $this -> context -> user );
2013-10-07 00:44:17 +02:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
2013-10-07 00:44:17 +02:00
{
2013-11-22 21:20:56 +01:00
R :: transaction ( function ()
2013-10-25 09:40:33 +02:00
{
2013-11-22 21:20:56 +01:00
$post = Model_Post :: create ();
2013-10-13 12:28:16 +02:00
2013-11-22 21:20:56 +01:00
//basic stuff
$anonymous = InputHelper :: get ( 'anonymous' );
if ( $this -> context -> loggedIn and ! $anonymous )
$post -> uploader = $this -> context -> user ;
2013-10-13 12:28:16 +02:00
2013-11-22 21:20:56 +01:00
//store the post to get the ID in the logs
Model_Post :: save ( $post );
2013-10-07 00:44:17 +02:00
2013-11-22 21:20:56 +01:00
//log
LogHelper :: bufferChanges ();
$fmt = ( $anonymous and ! $this -> config -> misc -> logAnonymousUploads )
? 'someone'
: '{user}' ;
$fmt .= ' added {post}' ;
LogHelper :: logEvent ( 'post-new' , $fmt , [ 'post' => TextHelper :: reprPost ( $post )]);
2013-10-07 00:44:17 +02:00
2013-11-22 21:20:56 +01:00
//after logging basic info, do the editing stuff
$this -> doEdit ( $post , true );
//this basically means that user didn't specify file nor url
if ( empty ( $post -> type ))
throw new SimpleException ( 'No post type detected; upload faled' );
2013-10-07 00:44:17 +02:00
2013-11-22 21:20:56 +01:00
LogHelper :: flush ();
//finish
Model_Post :: save ( $post );
});
2013-11-16 21:21:43 +01:00
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-07 00:44:17 +02:00
}
2013-10-05 19:24:08 +02:00
}
2013-10-13 12:28:16 +02:00
/**
2013-10-17 22:57:32 +02:00
* @ route / post / { id } / edit
2013-10-13 12:28:16 +02:00
*/
public function editAction ( $id )
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
2013-10-15 13:14:48 +02:00
$this -> context -> transport -> post = $post ;
2013-10-13 12:28:16 +02:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
2013-10-13 12:28:16 +02:00
{
2013-11-22 21:20:56 +01:00
$editToken = InputHelper :: get ( 'edit-token' );
if ( $editToken != self :: serializePost ( $post ))
throw new SimpleException ( 'This post was already edited by someone else in the meantime' );
2013-10-13 12:28:16 +02:00
2013-11-22 21:20:56 +01:00
LogHelper :: bufferChanges ();
$this -> doEdit ( $post , false );
LogHelper :: flush ();
2013-10-13 12:28:16 +02:00
2013-11-22 21:20:56 +01:00
Model_Post :: save ( $post );
2013-11-01 20:51:19 +01:00
Model_Tag :: removeUnused ();
2013-10-30 20:20:01 +01:00
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-21 23:50:30 +02:00
}
2013-10-13 12:28:16 +02:00
}
2013-11-17 14:52:46 +01:00
/**
* @ route / post / { id } / flag
*/
public function flagAction ( $id )
{
$post = Model_Post :: locate ( $id );
PrivilegesHelper :: confirmWithException ( Privilege :: FlagPost );
if ( InputHelper :: get ( 'submit' ))
{
2013-11-17 20:30:04 +01:00
$key = TextHelper :: reprPost ( $post );
2013-11-17 14:52:46 +01:00
2013-11-17 20:30:04 +01:00
$flagged = SessionHelper :: get ( 'flagged' , []);
if ( in_array ( $key , $flagged ))
2013-11-17 14:52:46 +01:00
throw new SimpleException ( 'You already flagged this post' );
2013-11-17 20:30:04 +01:00
$flagged [] = $key ;
SessionHelper :: set ( 'flagged' , $flagged );
2013-11-17 14:52:46 +01:00
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-flag' , '{user} flagged {post} for moderator attention' , [ 'post' => TextHelper :: reprPost ( $post )]);
2013-11-17 14:52:46 +01:00
StatusHelper :: success ();
}
}
2013-10-13 12:28:16 +02:00
/**
2013-10-17 22:57:32 +02:00
* @ route / post / { id } / hide
2013-10-13 12:28:16 +02:00
*/
public function hideAction ( $id )
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: HidePost , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
2013-11-16 21:21:43 +01:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
{
2013-11-22 21:20:56 +01:00
$post -> setHidden ( true );
Model_Post :: save ( $post );
2013-11-16 21:21:43 +01:00
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-hide' , '{user} hidden {post}' , [ 'post' => TextHelper :: reprPost ( $post )]);
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-21 23:50:30 +02:00
}
2013-10-13 12:28:16 +02:00
}
2013-11-16 21:21:43 +01:00
2013-10-13 12:28:16 +02:00
/**
2013-10-17 22:57:32 +02:00
* @ route / post / { id } / unhide
2013-10-13 12:28:16 +02:00
*/
public function unhideAction ( $id )
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: HidePost , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
2013-11-16 21:21:43 +01:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
{
2013-11-22 21:20:56 +01:00
$post -> setHidden ( false );
Model_Post :: save ( $post );
2013-11-16 21:21:43 +01:00
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-unhide' , '{user} unhidden {post}' , [ 'post' => TextHelper :: reprPost ( $post )]);
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-21 23:50:30 +02:00
}
2013-10-13 12:28:16 +02:00
}
2013-11-16 21:21:43 +01:00
2013-10-13 12:28:16 +02:00
/**
2013-10-17 22:57:32 +02:00
* @ route / post / { id } / delete
2013-10-13 12:28:16 +02:00
*/
public function deleteAction ( $id )
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: DeletePost , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
2013-11-16 21:21:43 +01:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
{
2013-11-22 21:20:56 +01:00
Model_Post :: remove ( $post );
2013-11-16 21:21:43 +01:00
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-delete' , '{user} deleted {post}' , [ 'post' => TextHelper :: reprPost ( $id )]);
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-21 23:50:30 +02:00
}
2013-10-13 12:28:16 +02:00
}
2013-10-12 14:53:47 +02:00
/**
2013-10-17 22:57:32 +02:00
* @ route / post / { id } / add - fav
* @ route / post / { id } / fav - add
2013-10-12 14:53:47 +02:00
*/
public function addFavoriteAction ( $id )
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
2013-10-21 23:50:30 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: FavoritePost );
2013-10-12 14:53:47 +02:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
{
if ( ! $this -> context -> loggedIn )
throw new SimpleException ( 'Not logged in' );
2013-10-12 14:53:47 +02:00
2013-11-22 21:20:56 +01:00
$this -> context -> user -> addToFavorites ( $post );
Model_User :: save ( $this -> context -> user );
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-21 23:50:30 +02:00
}
2013-10-12 14:53:47 +02:00
}
/**
2013-10-17 22:57:32 +02:00
* @ route / post / { id } / rem - fav
* @ route / post / { id } / fav - rem
2013-10-12 14:53:47 +02:00
*/
public function remFavoriteAction ( $id )
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: FavoritePost );
2013-10-12 14:53:47 +02:00
2013-10-21 23:50:30 +02:00
if ( InputHelper :: get ( 'submit' ))
{
if ( ! $this -> context -> loggedIn )
throw new SimpleException ( 'Not logged in' );
2013-10-12 14:53:47 +02:00
2013-11-22 21:20:56 +01:00
$this -> context -> user -> remFromFavorites ( $post );
Model_User :: save ( $this -> context -> user );
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-10-21 23:50:30 +02:00
}
2013-10-12 14:53:47 +02:00
}
2013-10-08 23:02:31 +02:00
2013-11-10 12:23:59 +01:00
/**
* @ route / post / { id } / score / { score }
* @ validate score - 1 | 0 | 1
*/
public function scoreAction ( $id , $score )
{
$post = Model_Post :: locate ( $id );
PrivilegesHelper :: confirmWithException ( Privilege :: ScorePost );
if ( InputHelper :: get ( 'submit' ))
{
if ( ! $this -> context -> loggedIn )
throw new SimpleException ( 'Not logged in' );
2013-11-22 21:20:56 +01:00
$this -> context -> user -> score ( $post , $score );
Model_User :: save ( $this -> context -> user );
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-11-10 12:23:59 +01:00
}
}
2013-10-19 13:38:20 +02:00
/**
* @ route / post / { id } / feature
*/
public function featureAction ( $id )
{
$post = Model_Post :: locate ( $id );
PrivilegesHelper :: confirmWithException ( Privilege :: FeaturePost );
Model_Property :: set ( Model_Property :: FeaturedPostId , $post -> id );
Model_Property :: set ( Model_Property :: FeaturedPostUserId , $this -> context -> user -> id );
Model_Property :: set ( Model_Property :: FeaturedPostDate , time ());
2013-11-16 18:40:26 +01:00
StatusHelper :: success ();
2013-11-17 23:29:59 +01:00
LogHelper :: logEvent ( 'post-feature' , '{user} featured {post} on main page' , [ 'post' => TextHelper :: reprPost ( $post )]);
2013-10-19 13:38:20 +02:00
}
2013-10-05 19:24:08 +02:00
/**
2013-10-07 20:44:14 +02:00
* Action that decorates the page containing the post .
2013-10-05 19:24:08 +02:00
* @ route / post / { id }
*/
2013-10-07 20:44:14 +02:00
public function viewAction ( $id )
2013-10-05 19:24:08 +02:00
{
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $id );
R :: preload ( $post , [
'tag' ,
'comment' ,
'ownComment.commenter' => 'user' ]);
2013-10-12 10:46:15 +02:00
2013-10-13 12:28:16 +02:00
if ( $post -> hidden )
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: ViewPost , 'hidden' );
PrivilegesHelper :: confirmWithException ( Privilege :: ViewPost );
PrivilegesHelper :: confirmWithException ( Privilege :: ViewPost , PostSafety :: toString ( $post -> safety ));
2013-10-07 20:44:14 +02:00
2013-10-13 12:28:16 +02:00
$buildNextPostQuery = function ( $dbQuery , $id , $next )
{
$dbQuery -> select ( 'id' )
-> from ( 'post' )
-> where ( $next ? 'id > ?' : 'id < ?' )
-> put ( $id );
2013-10-27 20:48:40 +01:00
$allowedSafety = array_filter ( PostSafety :: getAll (), function ( $safety )
{
return PrivilegesHelper :: confirm ( Privilege :: ListPosts , PostSafety :: toString ( $safety )) and
$this -> context -> user -> hasEnabledSafety ( $safety );
});
$dbQuery -> and ( 'safety' ) -> in ( '(' . R :: genSlots ( $allowedSafety ) . ')' );
foreach ( $allowedSafety as $s )
$dbQuery -> put ( $s );
2013-10-18 00:09:50 +02:00
if ( ! PrivilegesHelper :: confirm ( Privilege :: ListPosts , 'hidden' ))
2013-10-13 12:28:16 +02:00
$dbQuery -> andNot ( 'hidden' );
$dbQuery -> orderBy ( $next ? 'id asc' : 'id desc' )
-> limit ( 1 );
};
$prevPostQuery = R :: $f -> begin ();
$buildNextPostQuery ( $prevPostQuery , $id , false );
$prevPost = $prevPostQuery -> get ( 'row' );
$nextPostQuery = R :: $f -> begin ();
$buildNextPostQuery ( $nextPostQuery , $id , true );
$nextPost = $nextPostQuery -> get ( 'row' );
2013-11-22 21:20:56 +01:00
$favorite = $this -> context -> user -> hasFavorited ( $post );
$score = $this -> context -> user -> getScore ( $post );
2013-11-17 20:30:04 +01:00
$flagged = in_array ( TextHelper :: reprPost ( $post ), SessionHelper :: get ( 'flagged' , []));
2013-11-18 14:33:43 +01:00
$this -> context -> pageThumb = \Chibi\UrlHelper :: route ( 'post' , 'thumb' , [ 'name' => $post -> name ]);
2013-10-09 21:58:57 +02:00
$this -> context -> stylesheets [] = 'post-view.css' ;
2013-10-17 22:57:32 +02:00
$this -> context -> stylesheets [] = 'comment-small.css' ;
2013-10-12 14:53:47 +02:00
$this -> context -> scripts [] = 'post-view.js' ;
2013-10-19 22:56:56 +02:00
$this -> context -> subTitle = 'showing @' . $post -> id . ' – ' . join ( ', ' , array_map ( function ( $x ) { return $x [ 'name' ]; }, $post -> sharedTag ));
2013-10-12 14:53:47 +02:00
$this -> context -> favorite = $favorite ;
2013-11-10 12:23:59 +01:00
$this -> context -> score = $score ;
2013-11-17 20:30:04 +01:00
$this -> context -> flagged = $flagged ;
2013-10-07 20:44:14 +02:00
$this -> context -> transport -> post = $post ;
2013-10-13 12:28:16 +02:00
$this -> context -> transport -> prevPostId = $prevPost ? $prevPost [ 'id' ] : null ;
$this -> context -> transport -> nextPostId = $nextPost ? $nextPost [ 'id' ] : null ;
2013-11-22 21:20:56 +01:00
$this -> context -> transport -> editToken = self :: serializePost ( $post );
2013-10-07 20:44:14 +02:00
}
2013-10-08 23:02:31 +02:00
/**
* Action that renders the thumbnail of the requested file and sends it to user .
2013-10-23 00:16:52 +02:00
* @ route / post / { name } / thumb
2013-10-08 23:02:31 +02:00
*/
2013-11-18 14:33:43 +01:00
public function thumbAction ( $name , $width = null , $height = null )
2013-10-08 23:02:31 +02:00
{
2013-11-22 21:20:56 +01:00
$path = Model_Post :: getThumbCustomPath ( $name , $width , $height );
2013-10-08 23:02:31 +02:00
if ( ! file_exists ( $path ))
{
2013-11-22 21:20:56 +01:00
$path = Model_Post :: getThumbDefaultPath ( $name , $width , $height );
if ( ! file_exists ( $path ))
2013-10-08 23:02:31 +02:00
{
2013-11-22 21:20:56 +01:00
$post = Model_Post :: locate ( $name );
PrivilegesHelper :: confirmWithException ( Privilege :: ListPosts );
PrivilegesHelper :: confirmWithException ( Privilege :: ListPosts , PostSafety :: toString ( $post -> safety ));
$post -> makeThumb ( $width , $height );
if ( ! file_exists ( $path ))
$path = $this -> config -> main -> mediaPath . DS . 'img' . DS . 'thumb.jpg' ;
2013-10-08 23:02:31 +02:00
}
}
2013-11-22 21:20:56 +01:00
2013-10-08 23:02:31 +02:00
if ( ! is_readable ( $path ))
throw new SimpleException ( 'Thumbnail file is not readable' );
2013-11-22 21:20:56 +01:00
$this -> context -> layoutName = 'layout-file' ;
2013-10-19 13:00:03 +02:00
$this -> context -> transport -> cacheDaysToLive = 30 ;
2013-10-29 09:18:00 +01:00
$this -> context -> transport -> mimeType = 'image/jpeg' ;
2013-10-23 00:16:52 +02:00
$this -> context -> transport -> fileHash = 'thumb' . md5 ( $name . filemtime ( $path ));
2013-10-08 23:02:31 +02:00
$this -> context -> transport -> filePath = $path ;
}
2013-10-07 20:44:14 +02:00
/**
* Action that renders the requested file itself and sends it to user .
2013-10-17 22:57:32 +02:00
* @ route / post / { name } / retrieve
2013-10-07 20:44:14 +02:00
*/
2013-10-07 23:17:33 +02:00
public function retrieveAction ( $name )
2013-10-07 20:44:14 +02:00
{
$this -> context -> layoutName = 'layout-file' ;
2013-10-17 22:57:32 +02:00
$post = Model_Post :: locate ( $name , true );
2013-10-07 20:44:14 +02:00
2013-10-18 00:09:50 +02:00
PrivilegesHelper :: confirmWithException ( Privilege :: RetrievePost );
PrivilegesHelper :: confirmWithException ( Privilege :: RetrievePost , PostSafety :: toString ( $post -> safety ));
2013-10-07 20:44:14 +02:00
2013-10-09 19:25:56 +02:00
$path = $this -> config -> main -> filesPath . DS . $post -> name ;
2013-10-07 20:44:14 +02:00
if ( ! file_exists ( $path ))
throw new SimpleException ( 'Post file does not exist' );
if ( ! is_readable ( $path ))
throw new SimpleException ( 'Post file is not readable' );
2013-10-13 13:37:18 +02:00
$ext = substr ( $post -> orig_name , strrpos ( $post -> orig_name , '.' ) + 1 );
if ( strpos ( $post -> orig_name , '.' ) === false )
$ext = '.dat' ;
$fn = sprintf ( '%s_%s_%s.%s' ,
$this -> config -> main -> title ,
2013-11-21 21:06:18 +01:00
$post -> id ,
join ( ',' , array_map ( function ( $tag ) { return $tag -> name ; }, $post -> sharedTag )),
2013-10-13 13:37:18 +02:00
$ext );
$fn = preg_replace ( '/[[:^print:]]/' , '' , $fn );
2013-10-19 13:00:03 +02:00
$ttl = 60 * 60 * 24 * 14 ;
2013-10-13 14:01:07 +02:00
2013-10-19 13:00:03 +02:00
$this -> context -> transport -> cacheDaysToLive = 14 ;
2013-10-13 13:37:18 +02:00
$this -> context -> transport -> customFileName = $fn ;
2013-10-07 20:44:14 +02:00
$this -> context -> transport -> mimeType = $post -> mimeType ;
2013-10-19 13:00:03 +02:00
$this -> context -> transport -> fileHash = 'post' . $post -> file_hash ;
2013-10-07 20:44:14 +02:00
$this -> context -> transport -> filePath = $path ;
2013-10-05 12:55:03 +02:00
}
2013-11-22 21:20:56 +01:00
private function doEdit ( $post , $isNew )
{
/* file contents */
if ( isset ( $_FILES [ 'file' ]))
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostFile , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$suppliedFile = $_FILES [ 'file' ];
self :: handleUploadErrors ( $suppliedFile );
$srcPath = $suppliedFile [ 'tmp_name' ];
$post -> setContentFromPath ( $srcPath );
if ( ! $isNew )
LogHelper :: logEvent ( 'post-edit' , '{user} changed contents of {post}' , [ 'post' => TextHelper :: reprPost ( $post )]);
}
elseif ( InputHelper :: get ( 'url' ))
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostFile , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$url = InputHelper :: get ( 'url' );
$post -> setContentFromUrl ( $url );
if ( ! $isNew )
LogHelper :: logEvent ( 'post-edit' , '{user} changed contents of {post}' , [ 'post' => TextHelper :: reprPost ( $post )]);
}
/* safety */
$suppliedSafety = InputHelper :: get ( 'safety' );
if ( $suppliedSafety !== null )
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostSafety , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$oldSafety = $post -> safety ;
$post -> setSafety ( $suppliedSafety );
$newSafety = $post -> safety ;
if ( $oldSafety != $newSafety )
LogHelper :: logEvent ( 'post-edit' , '{user} changed safety for {post} to {safety}' , [ 'post' => TextHelper :: reprPost ( $post ), 'safety' => PostSafety :: toString ( $post -> safety )]);
}
/* tags */
$suppliedTags = InputHelper :: get ( 'tags' );
if ( $suppliedTags !== null )
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostTags , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$oldTags = array_map ( function ( $tag ) { return $tag -> name ; }, $post -> sharedTag );
$post -> setTagsFromText ( $suppliedTags );
$newTags = array_map ( function ( $tag ) { return $tag -> name ; }, $post -> sharedTag );
foreach ( array_diff ( $oldTags , $newTags ) as $tag )
LogHelper :: logEvent ( 'post-tag-del' , '{user} untagged {post} with {tag}' , [ 'post' => TextHelper :: reprPost ( $post ), 'tag' => TextHelper :: reprTag ( $tag )]);
foreach ( array_diff ( $newTags , $oldTags ) as $tag )
LogHelper :: logEvent ( 'post-tag-add' , '{user} tagged {post} with {tag}' , [ 'post' => TextHelper :: reprPost ( $post ), 'tag' => TextHelper :: reprTag ( $tag )]);
}
/* source */
$suppliedSource = InputHelper :: get ( 'source' );
if ( $suppliedSource !== null )
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostSource , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$oldSource = $post -> source ;
$post -> setSource ( $suppliedSource );
$newSource = $post -> source ;
if ( $oldSource != $newSource )
LogHelper :: logEvent ( 'post-edit' , '{user} changed source for {post} to {source}' , [ 'post' => TextHelper :: reprPost ( $post ), 'source' => $post -> source ]);
}
/* relations */
$suppliedRelations = InputHelper :: get ( 'relations' );
if ( $suppliedRelations !== null )
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostRelations , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$oldRelatedIds = array_map ( function ( $post ) { return $post -> id ; }, $post -> via ( 'crossref' ) -> sharedPost );
$post -> setRelationsFromText ( $suppliedRelations );
$newRelatedIds = array_map ( function ( $post ) { return $post -> id ; }, $post -> via ( 'crossref' ) -> sharedPost );
foreach ( array_diff ( $oldRelatedIds , $newRelatedIds ) as $post2id )
LogHelper :: logEvent ( 'post-relation-del' , '{user} removed relation between {post} and {post2}' , [ 'post' => TextHelper :: reprPost ( $post ), 'post2' => TextHelper :: reprPost ( $post2id )]);
foreach ( array_diff ( $newRelatedIds , $oldRelatedIds ) as $post2id )
LogHelper :: logEvent ( 'post-relation-add' , '{user} added relation between {post} and {post2}' , [ 'post' => TextHelper :: reprPost ( $post ), 'post2' => TextHelper :: reprPost ( $post2id )]);
}
/* thumbnail */
if ( ! empty ( $_FILES [ 'thumb' ][ 'name' ]))
{
if ( ! $isNew )
PrivilegesHelper :: confirmWithException ( Privilege :: EditPostThumb , PrivilegesHelper :: getIdentitySubPrivilege ( $post -> uploader ));
$suppliedFile = $_FILES [ 'thumb' ];
self :: handleUploadErrors ( $suppliedFile );
$srcPath = $suppliedFile [ 'tmp_name' ];
$post -> setCustomThumbnailFromPath ( $srcPath );
LogHelper :: logEvent ( 'post-edit' , '{user} changed thumb for {post}' , [ 'post' => TextHelper :: reprPost ( $post )]);
}
}
2013-10-05 12:55:03 +02:00
}