]> ruin.nu Git - ndwebbie.git/blobdiff - ND/Web/Pages/Forum.pm
stuff
[ndwebbie.git] / ND / Web / Pages / Forum.pm
index 2b287a9d1193828485eef2d7f556e0d54f7f4afe..cc15bad0ed0cbc3c1d88545ab3b75c8aaac10162 100644 (file)
@@ -23,6 +23,7 @@ use warnings;
 use ND::Web::Forum;
 use CGI qw/:standard/;
 use ND::Web::Include;
+use ND::Include;
 
 $ND::PAGES{forum} = {parse => \&parse, process => \&process, render=> \&render};
 
@@ -46,7 +47,7 @@ sub render {
 
        my $board;
        if(param('b')){
-               my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post
+               my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post, bool_or(fa.moderate) AS moderate
                        FROM forum_boards fb NATURAL JOIN forum_access fa
                        WHERE fb.fbid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers
                        WHERE uid = $2))
@@ -71,7 +72,7 @@ sub render {
        }
 
        my $thread;
-       my $findThread = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject, bool_or(fa.post) AS post
+       my $findThread = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject, bool_or(fa.post) AS post, bool_or(fa.moderate) AS moderate
                FROM forum_boards fb NATURAL JOIN forum_access fa NATURAL JOIN forum_threads ft
                WHERE ft.ftid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers
                WHERE uid = $2))
@@ -80,19 +81,41 @@ sub render {
                $thread = $DBH->selectrow_hashref($findThread,undef,param('t'),$ND::UID) or $ND::ERROR .= p($DBH->errstr);
        }
 
-       if (defined param('cmd') && param('cmd') eq 'Submit'){
-               $DBH->begin_work;
-               if ($board && $board->{post}){
-                       $thread = addForumThread $DBH,$board,$ND::UID,param('subject');
+       if (defined param('cmd')){
+               if(param('cmd') eq 'Submit'){
+                       $DBH->begin_work;
+                       if ($board && $board->{post}){
+                               $thread = addForumThread $DBH,$board,$ND::UID,param('subject');
+                       }
+                       if ($thread && $thread->{post}){
+                               addForumPost($DBH,$thread,$ND::UID,param('message'));
+                       }
+                       $DBH->commit or $ND::ERROR .= p($DBH->errstr);
                }
-               if ($thread && $thread->{post}){
-                       addForumPost($DBH,$thread,$ND::UID,param('message'));
+               if(param('cmd') eq 'Move' && $board->{moderate}){
+                       $DBH->begin_work;
+                       my $moveThread = $DBH->prepare(q{UPDATE forum_threads SET fbid = $1 WHERE ftid = $2 AND fbid = $3});
+                       for my $param (param()){
+                               if ($param =~ /t:(\d+)/){
+                                       $moveThread->execute(param('board'),$1,$board->{id}) or $ND::ERROR .= p($DBH->errstr);
+                                       if ($moveThread->rows > 0){
+                                               log_message $ND::UID, qq{Moved thread: $1 to board: $board->{id}};
+                                       }
+                               }
+                       }
+                       $DBH->commit or $ND::ERROR .= p($DBH->errstr);
                }
-               $DBH->commit or $ND::ERROR .= p($DBH->errstr);
        }
 
        my $categories = $DBH->prepare(q{SELECT fcid AS id,category FROM forum_categories ORDER BY fcid});
-       my $threads = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject,count(NULLIF(COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread,count(fp.fpid) AS posts, max(fp.time)::timestamp as last_post
+       my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post
+               FROM forum_boards fb NATURAL JOIN forum_access fa
+               WHERE fb.fcid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers
+               WHERE uid = $2))
+               GROUP BY fb.fbid,fb.board
+               ORDER BY fb.fbid
+                       });
+       my $threads = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject,count(NULLIF(COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread,count(fp.fpid) AS posts, date_trunc('seconds',max(fp.time)::timestamp) as last_post
                FROM forum_threads ft JOIN forum_posts fp USING (ftid) LEFT OUTER JOIN (SELECT * FROM forum_thread_visits WHERE uid = $2) ftv ON ftv.ftid = ft.ftid
                WHERE ft.fbid = $1
                GROUP BY ft.ftid, ft.subject
@@ -109,13 +132,6 @@ sub render {
                $BODY->param(Date => $time);
                $categories->execute or $ND::ERROR .= p($DBH->errstr);
                my @categories;
-               my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post
-                       FROM forum_boards fb NATURAL JOIN forum_access fa
-                       WHERE fb.fcid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers
-                       WHERE uid = $2))
-                       GROUP BY fb.fbid,fb.board
-                       ORDER BY fb.fbid
-                       });
                while (my $category = $categories->fetchrow_hashref){
                        $boards->execute($category->{id},$ND::UID) or $ND::ERROR .= p($DBH->errstr);
                        my @boards;
@@ -141,6 +157,7 @@ sub render {
        }elsif($board){ #List threads in this board
                $BODY->param(Board => $board->{board});
                $BODY->param(Post => $board->{post});
+               $BODY->param(Moderate => $board->{moderate});
                $BODY->param(Id => $board->{id});
                my ($time) = $DBH->selectrow_array('SELECT now()::timestamp',undef);
                $BODY->param(Date => $time);
@@ -154,10 +171,28 @@ sub render {
                }
                $BODY->param(Threads => \@threads);
 
+               if ($board->{moderate}){
+                       $categories->execute or $ND::ERROR .= p($DBH->errstr);
+                       my @categories;
+                       while (my $category = $categories->fetchrow_hashref){
+                               $boards->execute($category->{id},$ND::UID) or $ND::ERROR .= p($DBH->errstr);
+                               my @boards;
+                               while (my $b = $boards->fetchrow_hashref){
+                                       next if (not $b->{post} or $b->{id} == $board->{id});
+                                       delete $b->{post};
+                                       push @boards,$b;
+                               }
+                               $category->{Boards} = \@boards;
+                               delete $category->{id};
+                               push @categories,$category if @boards;
+                       }
+                       $BODY->param(Categories => \@categories);
+               }
+
        }else{ #List boards
                $BODY->param(Overview => 1);
                $categories->execute or $ND::ERROR .= p($DBH->errstr);
-               my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board,count(NULLIF(COALESCE(fp.fpid::boolean,FALSE) AND COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread
+               my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board,count(NULLIF(COALESCE(fp.fpid::boolean,FALSE) AND COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread,date_trunc('seconds',max(fp.time)::timestamp) as last_post
                        FROM forum_boards fb LEFT OUTER JOIN (forum_threads ft JOIN forum_posts fp USING (ftid)) ON fb.fbid = ft.fbid LEFT OUTER JOIN (SELECT * FROM forum_thread_visits WHERE uid = $2) ftv ON ftv.ftid = ft.ftid
                        WHERE fb.fcid = $1 AND 
                        fb.fbid IN (SELECT fbid FROM forum_access WHERE gid IN (SELECT groups($2)))