diff options
author | Yorhel <git@yorhel.nl> | 2019-10-12 14:11:06 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2019-10-12 14:11:06 +0200 |
commit | 0be1aa6acb62c13b4bcb4bd52a9c76df5f248e45 (patch) | |
tree | 8bfef25c3a01c740657d2ff2554ad73454d08d27 /lib/VNDB | |
parent | 748ae0c68b5f060807aeb5b201f611859c428c79 (diff) |
v2rw: Convert user notifications interface (/u+/notifies)
Diffstat (limited to 'lib/VNDB')
-rw-r--r-- | lib/VNDB/DB/Users.pm | 70 | ||||
-rw-r--r-- | lib/VNDB/Handler/Users.pm | 151 |
2 files changed, 0 insertions, 221 deletions
diff --git a/lib/VNDB/DB/Users.pm b/lib/VNDB/DB/Users.pm index a0c209c2..d253a52b 100644 --- a/lib/VNDB/DB/Users.pm +++ b/lib/VNDB/DB/Users.pm @@ -7,8 +7,6 @@ use Exporter 'import'; our @EXPORT = qw| dbUserGet dbUserDel - dbNotifyGet dbNotifyMarkRead dbNotifyRemove - dbThrottleGet dbThrottleSet |; @@ -88,73 +86,5 @@ sub dbUserDel { $_[0]->dbExec(q|DELETE FROM users WHERE id = ?|, $_[1]); } - -# %options->{ uid id what results page reverse } -# what: titles -sub dbNotifyGet { - my($s, %o) = @_; - $o{what} ||= ''; - $o{results} ||= 10; - $o{page} ||= 1; - - my %where = ( - 'n.uid = ?' => $o{uid}, - $o{id} ? ( - 'n.id = ?' => $o{id} ) : (), - defined($o{read}) ? ( - 'n.read !s' => $o{read} ? 'IS NOT NULL' : 'IS NULL' ) : (), - ); - - my @join = ( - $o{what} =~ /titles/ ? 'LEFT JOIN users u ON n.c_byuser = u.id' : (), - ); - - my @select = ( - qw|n.id n.ntype n.ltype n.iid n.subid|, - q|extract('epoch' from n.date) as date|, - q|extract('epoch' from n.read) as read|, - $o{what} =~ /titles/ ? ('n.c_title', VNWeb::DB::sql_user()) : (), - ); - - my($r, $np) = $s->dbPage(\%o, q| - SELECT !s - FROM notifications n - !s - !W - ORDER BY n.id !s - |, join(', ', @select), join(' ', @join), \%where, $o{reverse} ? 'DESC' : 'ASC'); - return wantarray ? ($r, $np) : $r; -} - - -# ids -sub dbNotifyMarkRead { - my $s = shift; - $s->dbExec('UPDATE notifications SET read = NOW() WHERE id IN(!l)', \@_); -} - - -# ids -sub dbNotifyRemove { - my $s = shift; - $s->dbExec('DELETE FROM notifications WHERE id IN(!l)', \@_); -} - - -# ip -sub dbThrottleGet { - my $s = shift; - my $t = $s->dbRow("SELECT extract('epoch' from timeout) as timeout FROM login_throttle WHERE ip = ?", shift)->{timeout}; - return $t && $t >= time ? $t : time; -} - -# ip, timeout -sub dbThrottleSet { - my($s, $ip, $timeout) = @_; - !$timeout ? $s->dbExec('DELETE FROM login_throttle WHERE ip = ?', $ip) - : $s->dbExec('UPDATE login_throttle SET timeout = to_timestamp(?) WHERE ip = ?', $timeout, $ip) - || $s->dbExec('INSERT INTO login_throttle (ip, timeout) VALUES (?, to_timestamp(?))', $ip, $timeout); -} - 1; diff --git a/lib/VNDB/Handler/Users.pm b/lib/VNDB/Handler/Users.pm index e10fcaa5..933825e7 100644 --- a/lib/VNDB/Handler/Users.pm +++ b/lib/VNDB/Handler/Users.pm @@ -15,8 +15,6 @@ TUWF::register( qr{u([1-9]\d*)/posts} => \&posts, qr{u([1-9]\d*)/del(/[od])?} => \&delete, qr{u/(all|[0a-z])} => \&list, - qr{u([1-9]\d*)/notifies} => \¬ifies, - qr{u([1-9]\d*)/notify/([1-9]\d*)} => \&readnotify, ); @@ -188,154 +186,5 @@ sub list { } -sub notifies { - my($self, $uid) = @_; - - my $u = $self->dbUserGet(uid => $uid)->[0]; - return $self->htmlDenied if !$u->{id} || $uid != $self->authInfo->{id}; - - my $f = $self->formValidate( - { get => 'p', required => 0, default => 1, template => 'page' }, - { get => 'r', required => 0, default => 0, enum => [0,1] }, - ); - return $self->resNotFound if $f->{_err}; - - # changing the notification settings - my $saved; - if($self->reqMethod() eq 'POST' && $self->reqPost('set')) { - return if !$self->authCheckCode; - my $frm = $self->formValidate( - { post => 'notify_dbedit', required => 0, default => 0, enum => [0,1] }, - { post => 'notify_announce', required => 0, default => 0, enum => [0,1] } - ); - return $self->resNotFound if $frm->{_err}; - $self->authPref($_, $frm->{$_}) for ('notify_dbedit', 'notify_announce'); - $saved = 1; - - # updating notifications - } elsif($self->reqMethod() eq 'POST') { - return if !$self->authCheckCode; - my $frm = $self->formValidate( - { post => 'notifysel', multi => 1, required => 0, template => 'id' }, - { post => 'markread', required => 0 }, - { post => 'remove', required => 0 } - ); - return $self->resNotFound if $frm->{_err}; - my @ids = grep $_, @{$frm->{notifysel}}; - $self->dbNotifyMarkRead(@ids) if @ids && $frm->{markread}; - $self->dbNotifyRemove(@ids) if @ids && $frm->{remove}; - } - - my($list, $np) = $self->dbNotifyGet( - uid => $uid, - page => $f->{p}, - results => 25, - what => 'titles', - read => $f->{r} == 1 ? undef : 0, - reverse => $f->{r} == 1, - ); - - $self->htmlHeader(title => 'My notifications', noindex => 1); - $self->htmlMainTabs(u => $u); - div class => 'mainbox'; - h1 'My notifications'; - p class => 'browseopts'; - a !$f->{r} ? (class => 'optselected') : (), href => "/u$uid/notifies?r=0", 'Unread notifications'; - a $f->{r} ? (class => 'optselected') : (), href => "/u$uid/notifies?r=1", 'All notifications'; - end; - p 'No notifications!' if !@$list; - end; - - my $code = $self->authGetCode("/u$uid/notifies"); - - my %ntypes = ( - pm => 'Private Message', - dbdel => 'Entry you contributed to has been deleted', - listdel => 'VN in your (wish)list has been deleted', - dbedit => 'Entry you contributed to has been edited', - announce => 'Site announcement', - ); - - if(@$list) { - form action => "/u$uid/notifies?r=$f->{r};formcode=$code", method => 'post', id => 'notifies'; - $self->htmlBrowse( - items => $list, - options => $f, - nextpage => $np, - class => 'notifies', - pageurl => "/u$uid/notifies?r=$f->{r}", - header => [ - [ '' ], - [ 'Type' ], - [ 'Age' ], - [ 'ID' ], - [ 'Action' ], - ], - row => sub { - my($s, $n, $l) = @_; - Tr $l->{read} ? () : (class => 'unread'); - td class => 'tc1'; - input type => 'checkbox', name => 'notifysel', value => "$l->{id}"; - end; - td class => 'tc2', $ntypes{$l->{ntype}}; - td class => 'tc3', fmtage $l->{date}; - td class => 'tc4'; - a href => "/u$uid/notify/$l->{id}", "$l->{ltype}$l->{iid}".($l->{subid}?".$l->{subid}":''); - end; - td class => 'tc5 clickable', id => "notify_$l->{id}"; - txt $l->{ltype} eq 't' ? 'Edit of ' : $l->{subid} == 1 ? 'New thread ' : 'Reply to '; - i $l->{c_title}; - txt ' by '; - i VNWeb::HTML::user_displayname($l); - end; - end 'tr'; - }, - footer => sub { - Tr; - td colspan => 5; - input type => 'checkbox', class => 'checkall', name => 'notifysel', value => 0; - txt ' '; - input type => 'submit', name => 'markread', value => 'mark selected read'; - input type => 'submit', name => 'remove', value => 'remove selected'; - b class => 'grayedout', ' (Read notifications are automatically removed after one month)'; - end; - end; - } - ); - end; - } - - form method => 'post', action => "/u$uid/notifies?formcode=$code"; - div class => 'mainbox'; - h1 'Settings'; - div class => 'notice', 'Settings successfully saved.' if $saved; - p; - for('dbedit', 'announce') { - input type => 'checkbox', name => "notify_$_", id => "notify_$_", value => 1, - $self->authPref("notify_$_") ? (checked => 'checked') : (); - label for => "notify_$_", $_ eq 'dbedit' - ? ' Notify me about edits of database entries I contributed to.' - : ' Notify me about site announcements.'; - br; - } - input type => 'submit', name => 'set', value => 'Save'; - end; - end; - end 'form'; - $self->htmlFooter; -} - - -sub readnotify { - my($self, $uid, $nid) = @_; - return $self->htmlDenied if !$self->authInfo->{id} || $uid != $self->authInfo->{id}; - my $n = $self->dbNotifyGet(uid => $uid, id => $nid)->[0]; - return $self->resNotFound if !$n->{iid}; - $self->dbNotifyMarkRead($n->{id}) if !$n->{read}; - # NOTE: for t+.+ IDs, this will create a double redirect, which is rather awkward... - $self->resRedirect("/$n->{ltype}$n->{iid}".($n->{subid}?".$n->{subid}":''), 'perm'); -} - - 1; |