diff --git a/pkg/notifications/database.go b/pkg/notifications/database.go index a1795e9f37f..fe92bc5df4f 100644 --- a/pkg/notifications/database.go +++ b/pkg/notifications/database.go @@ -97,3 +97,11 @@ func MarkNotificationAsRead(s *xorm.Session, notification *DatabaseNotification, Update(notification) return } + +func MarkAllNotificationsAsRead(s *xorm.Session, userID int64) (err error) { + _, err = s. + Where("notifiable_id = ?", userID). + Cols("read_at"). + Update(&DatabaseNotification{ReadAt: time.Now()}) + return +} diff --git a/pkg/routes/api/v1/notifications.go b/pkg/routes/api/v1/notifications.go new file mode 100644 index 00000000000..783d50dfcff --- /dev/null +++ b/pkg/routes/api/v1/notifications.go @@ -0,0 +1,55 @@ +// Vikunja is a to-do list application to facilitate your life. +// Copyright 2018-present Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public Licensee as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public Licensee for more details. +// +// You should have received a copy of the GNU Affero General Public Licensee +// along with this program. If not, see . + +package v1 + +import ( + "code.vikunja.io/api/pkg/db" + "code.vikunja.io/api/pkg/models" + "code.vikunja.io/api/pkg/modules/auth" + "code.vikunja.io/api/pkg/notifications" + "github.com/labstack/echo/v4" + "net/http" +) + +// MarkAllNotificationsAsRead marks all notifications of a user as read +// @Summary Mark all notifications of a user as read +// @tags sharing +// @Accept json +// @Produce json +// @Success 200 {object} models.Message "All notifications marked as read." +// @Failure 500 {object} models.Message "Internal error" +// @Router /notifications [post] +func MarkAllNotificationsAsRead(c echo.Context) error { + s := db.NewSession() + defer s.Close() + + a, err := auth.GetAuthFromClaims(c) + if err != nil { + return err + } + + if _, is := a.(*models.LinkSharing); is { + return echo.ErrForbidden + } + + err = notifications.MarkAllNotificationsAsRead(s, a.GetID()) + if err != nil { + return err + } + + return c.JSON(http.StatusOK, models.Message{Message: "success"}) +} diff --git a/pkg/routes/routes.go b/pkg/routes/routes.go index 04a98c7386f..d63fff981ac 100644 --- a/pkg/routes/routes.go +++ b/pkg/routes/routes.go @@ -535,6 +535,7 @@ func registerAPIRoutes(a *echo.Group) { } a.GET("/notifications", notificationHandler.ReadAllWeb) a.POST("/notifications/:notificationid", notificationHandler.UpdateWeb) + a.POST("/notifications", apiv1.MarkAllNotificationsAsRead) // Migrations m := a.Group("/migration") diff --git a/rest/mark all notifications as read.bru b/rest/mark all notifications as read.bru new file mode 100644 index 00000000000..ab8bcb58136 --- /dev/null +++ b/rest/mark all notifications as read.bru @@ -0,0 +1,14 @@ +meta { + name: mark all notifications as read + type: http + seq: 3 +} + +post { + url: {{host}}/api/v1/notifications + body: none +} + +headers { + Authorization: Bearer {{token}} +}