diff --git a/models/migrations/v1_24/v321.go b/models/migrations/v1_24/v321.go index 3e26f0f961..430b6c1adc 100644 --- a/models/migrations/v1_24/v321.go +++ b/models/migrations/v1_24/v321.go @@ -35,7 +35,7 @@ func AddFineGrainedActionsNotificationSettings(x *xorm.Engine) error { if err := db.Iterate(context.Background(), nil, func(ctx context.Context, user *User) error { settings = append(settings, NotificationSettings{ UserID: user.ID, - Actions: user_model.NotificationActionsFailureOnly, + Actions: user_model.NotificationGiteaActionsFailureOnly, }) if len(settings) >= 100 { _, err := x.Insert(&settings) diff --git a/models/user/user_notification.go b/models/user/user_notification.go index 37f30f9c6c..2a13c6cc9c 100644 --- a/models/user/user_notification.go +++ b/models/user/user_notification.go @@ -9,10 +9,11 @@ import ( "code.gitea.io/gitea/models/db" ) +// Actions email preference const ( - NotificationActionsAll = "all" - NotificationActionsFailureOnly = "failureonly" - NotificationActionsDisabled = "disabled" + NotificationGiteaActionsAll = "all" + NotificationGiteaActionsFailureOnly = "failureonly" + NotificationGiteaActionsDisabled = "disabled" ) type NotificationSettings struct { diff --git a/models/user/user_notification_test.go b/models/user/user_notification_test.go index 396b03fd4d..2dbd0a01b3 100644 --- a/models/user/user_notification_test.go +++ b/models/user/user_notification_test.go @@ -17,21 +17,21 @@ func TestUserNotificationSettings(t *testing.T) { settings, err := GetUserNotificationSettings(db.DefaultContext, 1) assert.NoError(t, err) - assert.Equal(t, NotificationActionsFailureOnly, settings.Actions) + assert.Equal(t, NotificationGiteaActionsFailureOnly, settings.Actions) assert.NoError(t, UpdateUserNotificationSettings(db.DefaultContext, &NotificationSettings{ UserID: 1, - Actions: NotificationActionsAll, + Actions: NotificationGiteaActionsAll, })) settings, err = GetUserNotificationSettings(db.DefaultContext, 1) assert.NoError(t, err) - assert.Equal(t, NotificationActionsAll, settings.Actions) + assert.Equal(t, NotificationGiteaActionsAll, settings.Actions) assert.NoError(t, UpdateUserNotificationSettings(db.DefaultContext, &NotificationSettings{ UserID: 1, - Actions: NotificationActionsDisabled, + Actions: NotificationGiteaActionsDisabled, })) settings, err = GetUserNotificationSettings(db.DefaultContext, 1) assert.NoError(t, err) - assert.Equal(t, NotificationActionsDisabled, settings.Actions) + assert.Equal(t, NotificationGiteaActionsDisabled, settings.Actions) } diff --git a/routers/web/user/setting/notifications.go b/routers/web/user/setting/notifications.go index 16e58a0481..27fbebf721 100644 --- a/routers/web/user/setting/notifications.go +++ b/routers/web/user/setting/notifications.go @@ -29,6 +29,13 @@ func Notifications(ctx *context.Context) { ctx.Data["PageIsSettingsNotifications"] = true ctx.Data["EmailNotificationsPreference"] = ctx.Doer.EmailNotificationsPreference + fineGrainedPreference, err := user_model.GetUserNotificationSettings(ctx, ctx.Doer.ID) + if err != nil { + ctx.ServerError("GetUserNotificationSettings", err) + return + } + ctx.Data["ActionsEmailNotificationsPreference"] = fineGrainedPreference.Actions + ctx.HTML(http.StatusOK, tplSettingsNotifications) } @@ -45,7 +52,7 @@ func NotificationsEmailPost(ctx *context.Context) { preference == user_model.EmailNotificationsDisabled || preference == user_model.EmailNotificationsAndYourOwn) { log.Error("Email notifications preference change returned unrecognized option %s: %s", preference, ctx.Doer.Name) - ctx.ServerError("SetEmailPreference", errors.New("option unrecognized")) + ctx.ServerError("NotificationsEmailPost", errors.New("option unrecognized")) return } opts := &user.UpdateOptions{ @@ -60,3 +67,31 @@ func NotificationsEmailPost(ctx *context.Context) { ctx.Flash.Success(ctx.Tr("settings.email_preference_set_success")) ctx.Redirect(setting.AppSubURL + "/user/settings/notifications") } + +// NotificationsActionsEmailPost set user's email notification preference on Gitea Actions +func NotificationsActionsEmailPost(ctx *context.Context) { + if !ctx.GetContextValue("EnableActions").(bool) { + ctx.NotFound(nil) + return + } + + preference := ctx.FormString("preference") + if !(preference == user_model.NotificationGiteaActionsAll || + preference == user_model.NotificationGiteaActionsDisabled || + preference == user_model.NotificationGiteaActionsFailureOnly) { + log.Error("Actions Email notifications preference change returned unrecognized option %s: %s", preference, ctx.Doer.Name) + ctx.ServerError("NotificationsActionsEmailPost", errors.New("option unrecognized")) + return + } + opts := &user.UpdateNotificationSettingsOptions{ + Actions: optional.Some(preference), + } + if err := user.UpdateNotificationSettings(ctx, new(user_model.NotificationSettings), opts); err != nil { + log.Error("Cannot set actions email notifications preference: %v", err) + ctx.ServerError("UpdateNotificationSettings", err) + return + } + log.Trace("Actions email notifications preference made %s: %s", preference, ctx.Doer.Name) + ctx.Flash.Success(ctx.Tr("settings.email_preference_set_success")) + ctx.Redirect(setting.AppSubURL + "/user/settings/notifications") +} diff --git a/routers/web/web.go b/routers/web/web.go index b9c7013f63..f8612db504 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -598,6 +598,7 @@ func registerWebRoutes(m *web.Router) { m.Group("/notifications", func() { m.Get("", user_setting.Notifications) m.Post("/email", user_setting.NotificationsEmailPost) + m.Post("/actions", user_setting.NotificationsActionsEmailPost) }) m.Group("/security", func() { m.Get("", security.Security) diff --git a/services/user/update_test.go b/services/user/update_test.go index 599c3fd2b6..e8a7ad8c04 100644 --- a/services/user/update_test.go +++ b/services/user/update_test.go @@ -133,14 +133,14 @@ func TestUpdateNotificationSettings(t *testing.T) { settingsCopy := *settings assert.NoError(t, UpdateNotificationSettings(db.DefaultContext, settings, &UpdateNotificationSettingsOptions{ - Actions: optional.Some(user_model.NotificationActionsAll), + Actions: optional.Some(user_model.NotificationGiteaActionsAll), })) - assert.Equal(t, user_model.NotificationActionsAll, settings.Actions) + assert.Equal(t, user_model.NotificationGiteaActionsAll, settings.Actions) assert.NotEqual(t, settingsCopy.Actions, settings.Actions) assert.NoError(t, UpdateNotificationSettings(db.DefaultContext, settings, &UpdateNotificationSettingsOptions{ - Actions: optional.Some(user_model.NotificationActionsDisabled), + Actions: optional.Some(user_model.NotificationGiteaActionsDisabled), })) - assert.Equal(t, user_model.NotificationActionsDisabled, settings.Actions) + assert.Equal(t, user_model.NotificationGiteaActionsDisabled, settings.Actions) assert.NotEqual(t, settingsCopy.Actions, settings.Actions) } diff --git a/templates/user/settings/notifications.tmpl b/templates/user/settings/notifications.tmpl index 4694bbb30a..db00fe59a4 100644 --- a/templates/user/settings/notifications.tmpl +++ b/templates/user/settings/notifications.tmpl @@ -29,6 +29,37 @@ + + {{if .EnableActions}} +

+ Actions +

+
+
+
+
+ {{$.CsrfTokenHtml}} +
+ + +
+
+ +
+
+
+
+
+ {{end}} {{template "user/settings/layout_footer" .}}