mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-30 22:06:11 +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:
parent
ba2e600d17
commit
0ffad31b92
|
@ -772,20 +772,20 @@ func setRepoNotificationStatusReadIfUnread(e Engine, userID, repoID int64) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetNotificationStatus change the notification status
|
// 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)
|
notification, err := getNotificationByID(x, notificationID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return notification, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if notification.UserID != user.ID {
|
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
|
notification.Status = status
|
||||||
|
|
||||||
_, err = x.ID(notificationID).Update(notification)
|
_, err = x.ID(notificationID).Update(notification)
|
||||||
return err
|
return notification, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNotificationByID return notification by ID
|
// GetNotificationByID return notification by ID
|
||||||
|
|
|
@ -76,12 +76,15 @@ func TestSetNotificationStatus(t *testing.T) {
|
||||||
user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
|
user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
|
||||||
notf := AssertExistsAndLoadBean(t,
|
notf := AssertExistsAndLoadBean(t,
|
||||||
&Notification{UserID: user.ID, Status: NotificationStatusRead}).(*Notification)
|
&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,
|
AssertExistsAndLoadBean(t,
|
||||||
&Notification{ID: notf.ID, Status: NotificationStatusPinned})
|
&Notification{ID: notf.ID, Status: NotificationStatusPinned})
|
||||||
|
|
||||||
assert.Error(t, SetNotificationStatus(1, user, NotificationStatusRead))
|
_, err = SetNotificationStatus(1, user, NotificationStatusRead)
|
||||||
assert.Error(t, SetNotificationStatus(NonexistentID, user, NotificationStatusRead))
|
assert.Error(t, err)
|
||||||
|
_, err = SetNotificationStatus(NonexistentID, user, NotificationStatusRead)
|
||||||
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUpdateNotificationStatuses(t *testing.T) {
|
func TestUpdateNotificationStatuses(t *testing.T) {
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
"code.gitea.io/gitea/modules/convert"
|
"code.gitea.io/gitea/modules/convert"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
"code.gitea.io/gitea/modules/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
func statusStringToNotificationStatus(status string) models.NotificationStatus {
|
func statusStringToNotificationStatus(status string) models.NotificationStatus {
|
||||||
|
@ -176,7 +177,7 @@ func ReadRepoNotifications(ctx *context.APIContext) {
|
||||||
// required: false
|
// required: false
|
||||||
// responses:
|
// responses:
|
||||||
// "205":
|
// "205":
|
||||||
// "$ref": "#/responses/empty"
|
// "$ref": "#/responses/NotificationThreadList"
|
||||||
|
|
||||||
lastRead := int64(0)
|
lastRead := int64(0)
|
||||||
qLastRead := ctx.FormTrim("last_read_at")
|
qLastRead := ctx.FormTrim("last_read_at")
|
||||||
|
@ -213,14 +214,16 @@ func ReadRepoNotifications(ctx *context.APIContext) {
|
||||||
targetStatus = models.NotificationStatusRead
|
targetStatus = models.NotificationStatusRead
|
||||||
}
|
}
|
||||||
|
|
||||||
|
changed := make([]*structs.NotificationThread, len(nl))
|
||||||
|
|
||||||
for _, n := range 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 {
|
if err != nil {
|
||||||
ctx.InternalServerError(err)
|
ctx.InternalServerError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx.Status(http.StatusResetContent)
|
_ = notif.LoadAttributes()
|
||||||
|
changed = append(changed, convert.ToNotificationThread(notif))
|
||||||
}
|
}
|
||||||
|
ctx.JSON(http.StatusResetContent, changed)
|
||||||
ctx.Status(http.StatusResetContent)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ func ReadThread(ctx *context.APIContext) {
|
||||||
// required: false
|
// required: false
|
||||||
// responses:
|
// responses:
|
||||||
// "205":
|
// "205":
|
||||||
// "$ref": "#/responses/empty"
|
// "$ref": "#/responses/NotificationThread"
|
||||||
// "403":
|
// "403":
|
||||||
// "$ref": "#/responses/forbidden"
|
// "$ref": "#/responses/forbidden"
|
||||||
// "404":
|
// "404":
|
||||||
|
@ -87,12 +87,16 @@ func ReadThread(ctx *context.APIContext) {
|
||||||
targetStatus = models.NotificationStatusRead
|
targetStatus = models.NotificationStatusRead
|
||||||
}
|
}
|
||||||
|
|
||||||
err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
|
notif, err := models.SetNotificationStatus(n.ID, ctx.User, targetStatus)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.InternalServerError(err)
|
ctx.InternalServerError(err)
|
||||||
return
|
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 {
|
func getThread(ctx *context.APIContext) *models.Notification {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
"code.gitea.io/gitea/modules/convert"
|
"code.gitea.io/gitea/modules/convert"
|
||||||
|
"code.gitea.io/gitea/modules/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListNotifications list users's notification threads
|
// ListNotifications list users's notification threads
|
||||||
|
@ -125,7 +126,7 @@ func ReadNotifications(ctx *context.APIContext) {
|
||||||
// required: false
|
// required: false
|
||||||
// responses:
|
// responses:
|
||||||
// "205":
|
// "205":
|
||||||
// "$ref": "#/responses/empty"
|
// "$ref": "#/responses/NotificationThreadList"
|
||||||
|
|
||||||
lastRead := int64(0)
|
lastRead := int64(0)
|
||||||
qLastRead := ctx.FormTrim("last_read_at")
|
qLastRead := ctx.FormTrim("last_read_at")
|
||||||
|
@ -158,14 +159,17 @@ func ReadNotifications(ctx *context.APIContext) {
|
||||||
targetStatus = models.NotificationStatusRead
|
targetStatus = models.NotificationStatusRead
|
||||||
}
|
}
|
||||||
|
|
||||||
|
changed := make([]*structs.NotificationThread, 0, len(nl))
|
||||||
|
|
||||||
for _, n := range 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 {
|
if err != nil {
|
||||||
ctx.InternalServerError(err)
|
ctx.InternalServerError(err)
|
||||||
return
|
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
|
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)
|
c.ServerError("SetNotificationStatus", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -739,7 +739,7 @@
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
"205": {
|
"205": {
|
||||||
"$ref": "#/responses/empty"
|
"$ref": "#/responses/NotificationThreadList"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -822,7 +822,7 @@
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
"205": {
|
"205": {
|
||||||
"$ref": "#/responses/empty"
|
"$ref": "#/responses/NotificationThread"
|
||||||
},
|
},
|
||||||
"403": {
|
"403": {
|
||||||
"$ref": "#/responses/forbidden"
|
"$ref": "#/responses/forbidden"
|
||||||
|
@ -7058,7 +7058,7 @@
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
"205": {
|
"205": {
|
||||||
"$ref": "#/responses/empty"
|
"$ref": "#/responses/NotificationThreadList"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue