2019-04-20 07:15:19 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2016-12-30 21:49:54 +03:00
package user
import (
2017-01-12 07:27:09 +03:00
"errors"
2016-12-30 21:49:54 +03:00
"fmt"
2017-01-12 07:27:09 +03:00
"strconv"
2017-01-02 21:31:50 +03:00
"strings"
2016-12-30 21:49:54 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
2017-01-12 07:27:09 +03:00
"code.gitea.io/gitea/modules/setting"
2016-12-30 21:49:54 +03:00
)
const (
tplNotification base . TplName = "user/notification/notification"
)
// GetNotificationCount is the middleware that sets the notification count in the context
func GetNotificationCount ( c * context . Context ) {
2017-01-02 21:31:50 +03:00
if strings . HasPrefix ( c . Req . URL . Path , "/api" ) {
return
}
2016-12-30 21:49:54 +03:00
if ! c . IsSigned {
return
}
2017-01-30 17:21:49 +03:00
count , err := models . GetNotificationCount ( c . User , models . NotificationStatusUnread )
2016-12-30 21:49:54 +03:00
if err != nil {
2018-01-11 00:34:17 +03:00
c . ServerError ( "GetNotificationCount" , err )
2016-12-30 21:49:54 +03:00
return
}
c . Data [ "NotificationUnreadCount" ] = count
}
// Notifications is the notifications page
func Notifications ( c * context . Context ) {
2017-01-03 22:09:36 +03:00
var (
2017-02-11 07:00:01 +03:00
keyword = strings . Trim ( c . Query ( "q" ) , " " )
2017-01-03 22:09:36 +03:00
status models . NotificationStatus
page = c . QueryInt ( "page" )
perPage = c . QueryInt ( "perPage" )
)
if page < 1 {
page = 1
}
if perPage < 1 {
perPage = 20
}
switch keyword {
2016-12-30 21:49:54 +03:00
case "read" :
status = models . NotificationStatusRead
default :
status = models . NotificationStatusUnread
}
2017-01-12 07:27:09 +03:00
statuses := [ ] models . NotificationStatus { status , models . NotificationStatusPinned }
notifications , err := models . NotificationsForUser ( c . User , statuses , page , perPage )
2016-12-30 21:49:54 +03:00
if err != nil {
2018-01-11 00:34:17 +03:00
c . ServerError ( "ErrNotificationsForUser" , err )
2016-12-30 21:49:54 +03:00
return
}
2017-01-03 22:09:36 +03:00
total , err := models . GetNotificationCount ( c . User , status )
if err != nil {
2018-01-11 00:34:17 +03:00
c . ServerError ( "ErrGetNotificationCount" , err )
2017-01-03 22:09:36 +03:00
return
}
2017-01-13 12:31:48 +03:00
title := c . Tr ( "notifications" )
2017-01-18 04:18:55 +03:00
if status == models . NotificationStatusUnread && total > 0 {
title = fmt . Sprintf ( "(%d) %s" , total , title )
2016-12-30 21:49:54 +03:00
}
c . Data [ "Title" ] = title
2017-01-03 22:09:36 +03:00
c . Data [ "Keyword" ] = keyword
2016-12-30 21:49:54 +03:00
c . Data [ "Status" ] = status
c . Data [ "Notifications" ] = notifications
2019-04-20 07:15:19 +03:00
pager := context . NewPagination ( int ( total ) , perPage , page , 5 )
pager . SetDefaultParams ( c )
c . Data [ "Page" ] = pager
2016-12-30 21:49:54 +03:00
c . HTML ( 200 , tplNotification )
}
2017-01-12 07:27:09 +03:00
// NotificationStatusPost is a route for changing the status of a notification
func NotificationStatusPost ( c * context . Context ) {
var (
notificationID , _ = strconv . ParseInt ( c . Req . PostFormValue ( "notification_id" ) , 10 , 64 )
statusStr = c . Req . PostFormValue ( "status" )
status models . NotificationStatus
)
switch statusStr {
case "read" :
status = models . NotificationStatusRead
case "unread" :
status = models . NotificationStatusUnread
case "pinned" :
status = models . NotificationStatusPinned
default :
2018-01-11 00:34:17 +03:00
c . ServerError ( "InvalidNotificationStatus" , errors . New ( "Invalid notification status" ) )
2017-01-12 07:27:09 +03:00
return
}
if err := models . SetNotificationStatus ( notificationID , c . User , status ) ; err != nil {
2018-01-11 00:34:17 +03:00
c . ServerError ( "SetNotificationStatus" , err )
2017-01-12 07:27:09 +03:00
return
}
url := fmt . Sprintf ( "%s/notifications" , setting . AppSubURL )
c . Redirect ( url , 303 )
}
2017-12-07 08:52:57 +03:00
// NotificationPurgePost is a route for 'purging' the list of notifications - marking all unread as read
func NotificationPurgePost ( c * context . Context ) {
err := models . UpdateNotificationStatuses ( c . User , models . NotificationStatusUnread , models . NotificationStatusRead )
if err != nil {
2018-01-11 00:34:17 +03:00
c . ServerError ( "ErrUpdateNotificationStatuses" , err )
2017-12-07 08:52:57 +03:00
return
}
url := fmt . Sprintf ( "%s/notifications" , setting . AppSubURL )
c . Redirect ( url , 303 )
}