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
2017-01-03 22:09:36 +03:00
"github.com/Unknwon/paginater"
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
}
count , err := models . GetNotificationUnreadCount ( c . User )
if err != nil {
c . Handle ( 500 , "GetNotificationCount" , err )
return
}
c . Data [ "NotificationUnreadCount" ] = count
}
// Notifications is the notifications page
func Notifications ( c * context . Context ) {
2017-01-03 22:09:36 +03:00
var (
keyword = c . Query ( "q" )
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 {
c . Handle ( 500 , "ErrNotificationsForUser" , err )
return
}
2017-01-03 22:09:36 +03:00
total , err := models . GetNotificationCount ( c . User , status )
if err != nil {
c . Handle ( 500 , "ErrGetNotificationCount" , err )
return
}
2016-12-30 21:49:54 +03:00
title := "Notifications"
if count := len ( notifications ) ; count > 0 {
title = fmt . Sprintf ( "(%d) %s" , count , title )
}
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
2017-01-03 22:09:36 +03:00
c . Data [ "Page" ] = paginater . New ( int ( total ) , perPage , page , 5 )
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 :
c . Handle ( 500 , "InvalidNotificationStatus" , errors . New ( "Invalid notification status" ) )
return
}
if err := models . SetNotificationStatus ( notificationID , c . User , status ) ; err != nil {
c . Handle ( 500 , "SetNotificationStatus" , err )
return
}
url := fmt . Sprintf ( "%s/notifications" , setting . AppSubURL )
c . Redirect ( url , 303 )
}