mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Add subject-type filter to list notification API endpoints (#16177)
Close #15886
This commit is contained in:
		@@ -6,10 +6,12 @@ package notify
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/routers/api/v1/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewAvailable check if unread notifications exist
 | 
			
		||||
@@ -22,3 +24,44 @@ func NewAvailable(ctx *context.APIContext) {
 | 
			
		||||
	//     "$ref": "#/responses/NotificationCount"
 | 
			
		||||
	ctx.JSON(http.StatusOK, api.NotificationCount{New: models.CountUnread(ctx.User)})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getFindNotificationOptions(ctx *context.APIContext) *models.FindNotificationOptions {
 | 
			
		||||
	before, since, err := utils.GetQueryBeforeSince(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	opts := &models.FindNotificationOptions{
 | 
			
		||||
		ListOptions:       utils.GetListOptions(ctx),
 | 
			
		||||
		UserID:            ctx.User.ID,
 | 
			
		||||
		UpdatedBeforeUnix: before,
 | 
			
		||||
		UpdatedAfterUnix:  since,
 | 
			
		||||
	}
 | 
			
		||||
	if !ctx.QueryBool("all") {
 | 
			
		||||
		statuses := ctx.QueryStrings("status-types")
 | 
			
		||||
		opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread", "pinned"})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	subjectTypes := ctx.QueryStrings("subject-type")
 | 
			
		||||
	if len(subjectTypes) != 0 {
 | 
			
		||||
		opts.Source = subjectToSource(subjectTypes)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func subjectToSource(value []string) (result []models.NotificationSource) {
 | 
			
		||||
	for _, v := range value {
 | 
			
		||||
		switch strings.ToLower(v) {
 | 
			
		||||
		case "issue":
 | 
			
		||||
			result = append(result, models.NotificationSourceIssue)
 | 
			
		||||
		case "pull":
 | 
			
		||||
			result = append(result, models.NotificationSourcePullRequest)
 | 
			
		||||
		case "commit":
 | 
			
		||||
			result = append(result, models.NotificationSourceCommit)
 | 
			
		||||
		case "repository":
 | 
			
		||||
			result = append(result, models.NotificationSourceRepository)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,6 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/convert"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/routers/api/v1/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func statusStringToNotificationStatus(status string) models.NotificationStatus {
 | 
			
		||||
@@ -67,7 +66,6 @@ func ListRepoNotifications(ctx *context.APIContext) {
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: If true, show notifications marked as read. Default value is false
 | 
			
		||||
	//   type: string
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: status-types
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread & pinned"
 | 
			
		||||
@@ -75,19 +73,24 @@ func ListRepoNotifications(ctx *context.APIContext) {
 | 
			
		||||
	//   collectionFormat: multi
 | 
			
		||||
	//   items:
 | 
			
		||||
	//     type: string
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: subject-type
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: "filter notifications by subject type"
 | 
			
		||||
	//   type: array
 | 
			
		||||
	//   collectionFormat: multi
 | 
			
		||||
	//   items:
 | 
			
		||||
	//     type: string
 | 
			
		||||
	//     enum: [issue,pull,commit,repository]
 | 
			
		||||
	// - name: since
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: Only show notifications updated after the given time. This is a timestamp in RFC 3339 format
 | 
			
		||||
	//   type: string
 | 
			
		||||
	//   format: date-time
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: before
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: Only show notifications updated before the given time. This is a timestamp in RFC 3339 format
 | 
			
		||||
	//   type: string
 | 
			
		||||
	//   format: date-time
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: page
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: page number of results to return (1-based)
 | 
			
		||||
@@ -99,24 +102,12 @@ func ListRepoNotifications(ctx *context.APIContext) {
 | 
			
		||||
	// responses:
 | 
			
		||||
	//   "200":
 | 
			
		||||
	//     "$ref": "#/responses/NotificationThreadList"
 | 
			
		||||
 | 
			
		||||
	before, since, err := utils.GetQueryBeforeSince(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
 | 
			
		||||
	opts := getFindNotificationOptions(ctx)
 | 
			
		||||
	if ctx.Written() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	opts := models.FindNotificationOptions{
 | 
			
		||||
		ListOptions:       utils.GetListOptions(ctx),
 | 
			
		||||
		UserID:            ctx.User.ID,
 | 
			
		||||
		RepoID:            ctx.Repo.Repository.ID,
 | 
			
		||||
		UpdatedBeforeUnix: before,
 | 
			
		||||
		UpdatedAfterUnix:  since,
 | 
			
		||||
	}
 | 
			
		||||
	opts.RepoID = ctx.Repo.Repository.ID
 | 
			
		||||
 | 
			
		||||
	if !ctx.QueryBool("all") {
 | 
			
		||||
		statuses := ctx.QueryStrings("status-types")
 | 
			
		||||
		opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread", "pinned"})
 | 
			
		||||
	}
 | 
			
		||||
	nl, err := models.GetNotifications(opts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
@@ -192,7 +183,7 @@ func ReadRepoNotifications(ctx *context.APIContext) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	opts := models.FindNotificationOptions{
 | 
			
		||||
	opts := &models.FindNotificationOptions{
 | 
			
		||||
		UserID:            ctx.User.ID,
 | 
			
		||||
		RepoID:            ctx.Repo.Repository.ID,
 | 
			
		||||
		UpdatedBeforeUnix: lastRead,
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/convert"
 | 
			
		||||
	"code.gitea.io/gitea/routers/api/v1/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ListNotifications list users's notification threads
 | 
			
		||||
@@ -29,7 +28,6 @@ func ListNotifications(ctx *context.APIContext) {
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: If true, show notifications marked as read. Default value is false
 | 
			
		||||
	//   type: string
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: status-types
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread & pinned."
 | 
			
		||||
@@ -37,19 +35,24 @@ func ListNotifications(ctx *context.APIContext) {
 | 
			
		||||
	//   collectionFormat: multi
 | 
			
		||||
	//   items:
 | 
			
		||||
	//     type: string
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: subject-type
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: "filter notifications by subject type"
 | 
			
		||||
	//   type: array
 | 
			
		||||
	//   collectionFormat: multi
 | 
			
		||||
	//   items:
 | 
			
		||||
	//     type: string
 | 
			
		||||
	//     enum: [issue,pull,commit,repository]
 | 
			
		||||
	// - name: since
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: Only show notifications updated after the given time. This is a timestamp in RFC 3339 format
 | 
			
		||||
	//   type: string
 | 
			
		||||
	//   format: date-time
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: before
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: Only show notifications updated before the given time. This is a timestamp in RFC 3339 format
 | 
			
		||||
	//   type: string
 | 
			
		||||
	//   format: date-time
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// - name: page
 | 
			
		||||
	//   in: query
 | 
			
		||||
	//   description: page number of results to return (1-based)
 | 
			
		||||
@@ -61,22 +64,11 @@ func ListNotifications(ctx *context.APIContext) {
 | 
			
		||||
	// responses:
 | 
			
		||||
	//   "200":
 | 
			
		||||
	//     "$ref": "#/responses/NotificationThreadList"
 | 
			
		||||
 | 
			
		||||
	before, since, err := utils.GetQueryBeforeSince(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Error(http.StatusUnprocessableEntity, "GetQueryBeforeSince", err)
 | 
			
		||||
	opts := getFindNotificationOptions(ctx)
 | 
			
		||||
	if ctx.Written() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	opts := models.FindNotificationOptions{
 | 
			
		||||
		ListOptions:       utils.GetListOptions(ctx),
 | 
			
		||||
		UserID:            ctx.User.ID,
 | 
			
		||||
		UpdatedBeforeUnix: before,
 | 
			
		||||
		UpdatedAfterUnix:  since,
 | 
			
		||||
	}
 | 
			
		||||
	if !ctx.QueryBool("all") {
 | 
			
		||||
		statuses := ctx.QueryStrings("status-types")
 | 
			
		||||
		opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread", "pinned"})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nl, err := models.GetNotifications(opts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
@@ -141,7 +133,7 @@ func ReadNotifications(ctx *context.APIContext) {
 | 
			
		||||
			lastRead = tmpLastRead.Unix()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	opts := models.FindNotificationOptions{
 | 
			
		||||
	opts := &models.FindNotificationOptions{
 | 
			
		||||
		UserID:            ctx.User.ID,
 | 
			
		||||
		UpdatedBeforeUnix: lastRead,
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user