mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	Notifications API: respond with updated notifications (#17064)
* notifications api: return updated notifications in response * make generate-swagger * openapi fix Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		@@ -772,20 +772,20 @@ func setRepoNotificationStatusReadIfUnread(e Engine, userID, repoID int64) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetNotificationStatus change the notification status
 | 
			
		||||
func SetNotificationStatus(notificationID int64, user *User, status NotificationStatus) error {
 | 
			
		||||
func SetNotificationStatus(notificationID int64, user *User, status NotificationStatus) (*Notification, error) {
 | 
			
		||||
	notification, err := getNotificationByID(x, notificationID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
		return notification, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if notification.UserID != user.ID {
 | 
			
		||||
		return fmt.Errorf("Can't change notification of another user: %d, %d", notification.UserID, user.ID)
 | 
			
		||||
		return nil, fmt.Errorf("Can't change notification of another user: %d, %d", notification.UserID, user.ID)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	notification.Status = status
 | 
			
		||||
 | 
			
		||||
	_, err = x.ID(notificationID).Update(notification)
 | 
			
		||||
	return err
 | 
			
		||||
	return notification, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetNotificationByID return notification by ID
 | 
			
		||||
 
 | 
			
		||||
@@ -76,12 +76,15 @@ func TestSetNotificationStatus(t *testing.T) {
 | 
			
		||||
	user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	notf := AssertExistsAndLoadBean(t,
 | 
			
		||||
		&Notification{UserID: user.ID, Status: NotificationStatusRead}).(*Notification)
 | 
			
		||||
	assert.NoError(t, SetNotificationStatus(notf.ID, user, NotificationStatusPinned))
 | 
			
		||||
	_, err := SetNotificationStatus(notf.ID, user, NotificationStatusPinned)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	AssertExistsAndLoadBean(t,
 | 
			
		||||
		&Notification{ID: notf.ID, Status: NotificationStatusPinned})
 | 
			
		||||
 | 
			
		||||
	assert.Error(t, SetNotificationStatus(1, user, NotificationStatusRead))
 | 
			
		||||
	assert.Error(t, SetNotificationStatus(NonexistentID, user, NotificationStatusRead))
 | 
			
		||||
	_, err = SetNotificationStatus(1, user, NotificationStatusRead)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	_, err = SetNotificationStatus(NonexistentID, user, NotificationStatusRead)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestUpdateNotificationStatuses(t *testing.T) {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/convert"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/structs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func statusStringToNotificationStatus(status string) models.NotificationStatus {
 | 
			
		||||
@@ -176,7 +177,7 @@ func ReadRepoNotifications(ctx *context.APIContext) {
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// responses:
 | 
			
		||||
	//   "205":
 | 
			
		||||
	//     "$ref": "#/responses/empty"
 | 
			
		||||
	//     "$ref": "#/responses/NotificationThreadList"
 | 
			
		||||
 | 
			
		||||
	lastRead := int64(0)
 | 
			
		||||
	qLastRead := ctx.FormTrim("last_read_at")
 | 
			
		||||
@@ -213,14 +214,16 @@ func ReadRepoNotifications(ctx *context.APIContext) {
 | 
			
		||||
		targetStatus = models.NotificationStatusRead
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	changed := make([]*structs.NotificationThread, len(nl))
 | 
			
		||||
 | 
			
		||||
	for _, n := range nl {
 | 
			
		||||
		err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
 | 
			
		||||
		notif, err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.InternalServerError(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Status(http.StatusResetContent)
 | 
			
		||||
		_ = notif.LoadAttributes()
 | 
			
		||||
		changed = append(changed, convert.ToNotificationThread(notif))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Status(http.StatusResetContent)
 | 
			
		||||
	ctx.JSON(http.StatusResetContent, changed)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ func ReadThread(ctx *context.APIContext) {
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// responses:
 | 
			
		||||
	//   "205":
 | 
			
		||||
	//     "$ref": "#/responses/empty"
 | 
			
		||||
	//     "$ref": "#/responses/NotificationThread"
 | 
			
		||||
	//   "403":
 | 
			
		||||
	//     "$ref": "#/responses/forbidden"
 | 
			
		||||
	//   "404":
 | 
			
		||||
@@ -87,12 +87,16 @@ func ReadThread(ctx *context.APIContext) {
 | 
			
		||||
		targetStatus = models.NotificationStatusRead
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
 | 
			
		||||
	notif, err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Status(http.StatusResetContent)
 | 
			
		||||
	if err = notif.LoadAttributes(); err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.JSON(http.StatusResetContent, convert.ToNotificationThread(notif))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getThread(ctx *context.APIContext) *models.Notification {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/convert"
 | 
			
		||||
	"code.gitea.io/gitea/modules/structs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ListNotifications list users's notification threads
 | 
			
		||||
@@ -125,7 +126,7 @@ func ReadNotifications(ctx *context.APIContext) {
 | 
			
		||||
	//   required: false
 | 
			
		||||
	// responses:
 | 
			
		||||
	//   "205":
 | 
			
		||||
	//     "$ref": "#/responses/empty"
 | 
			
		||||
	//     "$ref": "#/responses/NotificationThreadList"
 | 
			
		||||
 | 
			
		||||
	lastRead := int64(0)
 | 
			
		||||
	qLastRead := ctx.FormTrim("last_read_at")
 | 
			
		||||
@@ -158,14 +159,17 @@ func ReadNotifications(ctx *context.APIContext) {
 | 
			
		||||
		targetStatus = models.NotificationStatusRead
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	changed := make([]*structs.NotificationThread, 0, len(nl))
 | 
			
		||||
 | 
			
		||||
	for _, n := range nl {
 | 
			
		||||
		err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
 | 
			
		||||
		notif, err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.InternalServerError(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Status(http.StatusResetContent)
 | 
			
		||||
		_ = notif.LoadAttributes()
 | 
			
		||||
		changed = append(changed, convert.ToNotificationThread(notif))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Status(http.StatusResetContent)
 | 
			
		||||
	ctx.JSON(http.StatusResetContent, changed)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -160,7 +160,7 @@ func NotificationStatusPost(c *context.Context) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := models.SetNotificationStatus(notificationID, c.User, status); err != nil {
 | 
			
		||||
	if _, err := models.SetNotificationStatus(notificationID, c.User, status); err != nil {
 | 
			
		||||
		c.ServerError("SetNotificationStatus", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -739,7 +739,7 @@
 | 
			
		||||
        ],
 | 
			
		||||
        "responses": {
 | 
			
		||||
          "205": {
 | 
			
		||||
            "$ref": "#/responses/empty"
 | 
			
		||||
            "$ref": "#/responses/NotificationThreadList"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
@@ -822,7 +822,7 @@
 | 
			
		||||
        ],
 | 
			
		||||
        "responses": {
 | 
			
		||||
          "205": {
 | 
			
		||||
            "$ref": "#/responses/empty"
 | 
			
		||||
            "$ref": "#/responses/NotificationThread"
 | 
			
		||||
          },
 | 
			
		||||
          "403": {
 | 
			
		||||
            "$ref": "#/responses/forbidden"
 | 
			
		||||
@@ -7058,7 +7058,7 @@
 | 
			
		||||
        ],
 | 
			
		||||
        "responses": {
 | 
			
		||||
          "205": {
 | 
			
		||||
            "$ref": "#/responses/empty"
 | 
			
		||||
            "$ref": "#/responses/NotificationThreadList"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user