mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
feat(coderd): add format option to inbox notifications watch endpoint (#17034)
This PR aims to allow clients to use different format for the title and content of inbox notifications - on the watch endpoint. This solution will help to have it working and formatted differently on VSCode, WebUI ... [Related to this issue](https://github.com/coder/internal/issues/523)
This commit is contained in:
@ -17,11 +17,17 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/httpapi"
|
||||
"github.com/coder/coder/v2/coderd/httpmw"
|
||||
"github.com/coder/coder/v2/coderd/pubsub"
|
||||
markdown "github.com/coder/coder/v2/coderd/render"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
"github.com/coder/coder/v2/codersdk/wsjson"
|
||||
"github.com/coder/websocket"
|
||||
)
|
||||
|
||||
const (
|
||||
notificationFormatMarkdown = "markdown"
|
||||
notificationFormatPlaintext = "plaintext"
|
||||
)
|
||||
|
||||
// convertInboxNotificationResponse works as a util function to transform a database.InboxNotification to codersdk.InboxNotification
|
||||
func convertInboxNotificationResponse(ctx context.Context, logger slog.Logger, notif database.InboxNotification) codersdk.InboxNotification {
|
||||
return codersdk.InboxNotification{
|
||||
@ -60,6 +66,7 @@ func convertInboxNotificationResponse(ctx context.Context, logger slog.Logger, n
|
||||
// @Param targets query string false "Comma-separated list of target IDs to filter notifications"
|
||||
// @Param templates query string false "Comma-separated list of template IDs to filter notifications"
|
||||
// @Param read_status query string false "Filter notifications by read status. Possible values: read, unread, all"
|
||||
// @Param format query string false "Define the output format for notifications title and body." enums(plaintext,markdown)
|
||||
// @Success 200 {object} codersdk.GetInboxNotificationResponse
|
||||
// @Router /notifications/inbox/watch [get]
|
||||
func (api *API) watchInboxNotifications(rw http.ResponseWriter, r *http.Request) {
|
||||
@ -73,6 +80,7 @@ func (api *API) watchInboxNotifications(rw http.ResponseWriter, r *http.Request)
|
||||
targets = p.UUIDs(vals, []uuid.UUID{}, "targets")
|
||||
templates = p.UUIDs(vals, []uuid.UUID{}, "templates")
|
||||
readStatus = p.String(vals, "all", "read_status")
|
||||
format = p.String(vals, notificationFormatMarkdown, "format")
|
||||
)
|
||||
p.ErrorExcessParams(vals)
|
||||
if len(p.Errors) > 0 {
|
||||
@ -176,6 +184,23 @@ func (api *API) watchInboxNotifications(rw http.ResponseWriter, r *http.Request)
|
||||
api.Logger.Error(ctx, "failed to count unread inbox notifications", slog.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
// By default, notifications are stored as markdown
|
||||
// We can change the format based on parameter if required
|
||||
if format == notificationFormatPlaintext {
|
||||
notif.Title, err = markdown.PlaintextFromMarkdown(notif.Title)
|
||||
if err != nil {
|
||||
api.Logger.Error(ctx, "failed to convert notification title to plain text", slog.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
notif.Content, err = markdown.PlaintextFromMarkdown(notif.Content)
|
||||
if err != nil {
|
||||
api.Logger.Error(ctx, "failed to convert notification content to plain text", slog.Error(err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if err := encoder.Encode(codersdk.GetInboxNotificationResponse{
|
||||
Notification: notif,
|
||||
UnreadCount: int(unreadCount),
|
||||
@ -196,6 +221,7 @@ func (api *API) watchInboxNotifications(rw http.ResponseWriter, r *http.Request)
|
||||
// @Param targets query string false "Comma-separated list of target IDs to filter notifications"
|
||||
// @Param templates query string false "Comma-separated list of template IDs to filter notifications"
|
||||
// @Param read_status query string false "Filter notifications by read status. Possible values: read, unread, all"
|
||||
// @Param starting_before query string false "ID of the last notification from the current page. Notifications returned will be older than the associated one" format(uuid)
|
||||
// @Success 200 {object} codersdk.ListInboxNotificationsResponse
|
||||
// @Router /notifications/inbox [get]
|
||||
func (api *API) listInboxNotifications(rw http.ResponseWriter, r *http.Request) {
|
||||
|
Reference in New Issue
Block a user