73 lines
2.4 KiB
Go
73 lines
2.4 KiB
Go
package handler
|
|
|
|
import (
|
|
"log/slog"
|
|
"net/http"
|
|
|
|
"github.com/anxi0uz/logiflow/internal/api"
|
|
"github.com/anxi0uz/logiflow/internal/models"
|
|
storage "github.com/anxi0uz/logiflow/pkg"
|
|
"github.com/huandu/go-sqlbuilder"
|
|
openapi_types "github.com/oapi-codegen/runtime/types"
|
|
)
|
|
|
|
func (s *Server) ListNotifications(w http.ResponseWriter, r *http.Request, params api.ListNotificationsParams) {
|
|
ctx := r.Context()
|
|
claims, ok := ctx.Value(UserKey).(*Claims)
|
|
if !ok {
|
|
slog.ErrorContext(ctx, "Error while casting claims")
|
|
s.JSON(w, r, http.StatusInternalServerError, MsgInternalError, RespError)
|
|
return
|
|
}
|
|
|
|
notifs, err := storage.GetAll[models.Notification](ctx, "notifications", s.DB, func(sb *sqlbuilder.SelectBuilder) {
|
|
sb.Where(sb.EQ("user_id", claims.ID))
|
|
if params.UnreadOnly != nil && *params.UnreadOnly {
|
|
sb.Where(sb.EQ("is_read", false))
|
|
}
|
|
})
|
|
if err != nil {
|
|
slog.ErrorContext(ctx, "Error while getting notifications", slog.String("error", err.Error()))
|
|
s.JSON(w, r, http.StatusInternalServerError, MsgInternalError, RespError)
|
|
return
|
|
}
|
|
s.JSON(w, r, http.StatusOK, notifs, RespSuccess)
|
|
}
|
|
|
|
func (s *Server) MarkNotificationRead(w http.ResponseWriter, r *http.Request, id openapi_types.UUID) {
|
|
ctx := r.Context()
|
|
claims, ok := ctx.Value(UserKey).(*Claims)
|
|
if !ok {
|
|
slog.ErrorContext(ctx, "Error while casting claims")
|
|
s.JSON(w, r, http.StatusInternalServerError, MsgInternalError, RespError)
|
|
return
|
|
}
|
|
|
|
notification, err := storage.GetOne[models.Notification](ctx, s.DB, "notifications", func(sb *sqlbuilder.SelectBuilder) {
|
|
sb.Where(sb.EQ("id", id))
|
|
})
|
|
if err != nil {
|
|
slog.ErrorContext(ctx, "Error while getting notification", slog.String("error", err.Error()))
|
|
s.JSON(w, r, http.StatusInternalServerError, MsgInternalError, RespError)
|
|
return
|
|
}
|
|
if notification == nil {
|
|
s.JSON(w, r, http.StatusNotFound, MsgNotFound, RespNotFound)
|
|
return
|
|
}
|
|
if notification.UserID != claims.ID {
|
|
s.JSON(w, r, http.StatusForbidden, MsgForbidden, RespError)
|
|
return
|
|
}
|
|
notification.IsRead = true
|
|
|
|
if err := storage.Update(ctx, "notifications", *notification, s.DB, func(sb *sqlbuilder.UpdateBuilder) {
|
|
sb.Where(sb.EQ("id", id))
|
|
}); err != nil {
|
|
slog.ErrorContext(ctx, "Error while updating notification", slog.String("error", err.Error()))
|
|
s.JSON(w, r, http.StatusInternalServerError, MsgInternalError, RespError)
|
|
return
|
|
}
|
|
s.JSON(w, r, http.StatusOK, "Updated", RespSuccess)
|
|
}
|