forked from gitea/gitea
		
	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:
		
							parent
							
								
									ba2e600d17
								
							
						
					
					
						commit
						0ffad31b92
					
				| @ -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" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Norwin
						Norwin