Skip to content

Commit 1728f14

Browse files
enhance: serialize user update methods
1 parent c21a7de commit 1728f14

14 files changed

Lines changed: 302 additions & 225 deletions

File tree

‎api/oidc.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ func (a *OIDCAPI) registerUser(username, oidcID string, hasAdminGroup bool) (*mo
519519
return nil, http.StatusInternalServerError, fmt.Errorf("failed to create user: %w", err)
520520
}
521521
log.Info().Str("oidc_id", oidcID).Str("username", user.Name).Bool("admin", user.Admin).Msg("OIDC auto registration")
522-
if err := a.UserChangeNotifier.fireUserAdded(user.ID); err != nil {
522+
if err := a.UserChangeNotifier.fireUserAdded(a.DB, user.ID); err != nil {
523523
log.Error().Err(err).Uint("user_id", user.ID).Msg("Could not notify user change")
524524
}
525525
return user, 0, nil

‎api/oidc_test.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/gin-gonic/gin"
1515
"github.com/gotify/server/v3/auth"
16+
"github.com/gotify/server/v3/database"
1617
"github.com/gotify/server/v3/decaymap"
1718
"github.com/gotify/server/v3/mode"
1819
"github.com/gotify/server/v3/model"
@@ -49,7 +50,7 @@ func (s *OIDCSuite) BeforeTest(suiteName, testName string) {
4950
s.db = testdb.NewDB(s.T())
5051
s.notified = false
5152
notifier := new(UserChangeNotifier)
52-
notifier.OnUserAdded(func(uint) error {
53+
notifier.OnUserAdded(func(tx *database.GormDatabase, uid uint) error {
5354
s.notified = true
5455
return nil
5556
})

‎api/plugin.go‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (c *PluginAPI) GetPlugins(ctx *gin.Context) {
8080
Website: info.Website,
8181
License: info.License,
8282
Enabled: conf.Enabled,
83-
Capabilities: inst.Supports().Strings(),
83+
Capabilities: inst.Instance().Supports().Strings(),
8484
})
8585
}
8686
}
@@ -255,7 +255,7 @@ func (c *PluginAPI) GetDisplay(ctx *gin.Context) {
255255
ctx.AbortWithError(404, errors.New("plugin instance not found"))
256256
return
257257
}
258-
ctx.JSON(200, instance.GetDisplay(location.Get(ctx)))
258+
ctx.JSON(200, instance.Instance().GetDisplay(location.Get(ctx)))
259259
})
260260
}
261261

@@ -317,7 +317,7 @@ func (c *PluginAPI) GetConfig(ctx *gin.Context) {
317317
return
318318
}
319319

320-
if aborted := supportOrAbort(ctx, instance, compat.Configurer); aborted {
320+
if aborted := supportOrAbort(ctx, instance.Instance(), compat.Configurer); aborted {
321321
return
322322
}
323323

@@ -381,11 +381,11 @@ func (c *PluginAPI) UpdateConfig(ctx *gin.Context) {
381381
return
382382
}
383383

384-
if aborted := supportOrAbort(ctx, instance, compat.Configurer); aborted {
384+
if aborted := supportOrAbort(ctx, instance.Instance(), compat.Configurer); aborted {
385385
return
386386
}
387387

388-
newConf := instance.DefaultConfig()
388+
newConf := instance.Instance().DefaultConfig()
389389
newconfBytes, err := io.ReadAll(ctx.Request.Body)
390390
if err != nil {
391391
ctx.AbortWithError(500, err)
@@ -395,7 +395,7 @@ func (c *PluginAPI) UpdateConfig(ctx *gin.Context) {
395395
ctx.AbortWithError(400, err)
396396
return
397397
}
398-
if err := instance.ValidateAndSetConfig(newConf); err != nil {
398+
if err := instance.Instance().ValidateAndSetConfig(newConf); err != nil {
399399
ctx.AbortWithError(400, err)
400400
return
401401
}

‎api/plugin_test.go‎

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type PluginSuite struct {
2929
suite.Suite
3030
db *testdb.Database
3131
a *PluginAPI
32+
u *UserAPI
3233
ctx *gin.Context
3334
recorder *httptest.ResponseRecorder
3435
manager *plugin.Manager
@@ -39,19 +40,20 @@ func (s *PluginSuite) BeforeTest(suiteName, testName string) {
3940
mode.Set(mode.TestDev)
4041
s.db = testdb.NewDB(s.T())
4142
s.resetRecorder()
42-
manager, err := plugin.NewManager(s.db, "", nil, s)
43+
manager, err := plugin.NewManager(s.db.GormDatabase, "", nil, s)
4344
assert.Nil(s.T(), err)
4445
s.manager = manager
4546
withURL(s.ctx, "http", "example.com")
4647
s.a = &PluginAPI{DB: s.db, Manager: manager, Notifier: s}
48+
s.u = &UserAPI{DB: s.db.GormDatabase, UserChangeNotifier: &UserChangeNotifier{}}
4749

4850
mockPluginCompat := new(mock.Plugin)
4951
assert.Nil(s.T(), s.manager.LoadPlugin(mockPluginCompat))
5052

51-
s.db.User(1)
52-
assert.Nil(s.T(), s.manager.InitializeForUserID(1))
53-
s.db.User(2)
54-
assert.Nil(s.T(), s.manager.InitializeForUserID(2))
53+
s.db.NewUserWithNameAdmin(1, "user1", true)
54+
assert.Nil(s.T(), s.manager.InitializeForUserID(s.db.GormDatabase, 1))
55+
s.db.NewUserWithNameAdmin(2, "user2", true)
56+
assert.Nil(s.T(), s.manager.InitializeForUserID(s.db.GormDatabase, 2))
5557

5658
s.db.CreatePluginConf(&model.PluginConf{
5759
UserID: 1,
@@ -97,6 +99,31 @@ func (s *PluginSuite) Test_GetPlugins() {
9799
assert.False(s.T(), pluginConfs[0].Enabled, "Plugins should be disabled by default")
98100
}
99101

102+
func (s *PluginSuite) Test_DeleteUser() {
103+
test.WithUser(s.ctx, 1)
104+
105+
s.ctx.Request = httptest.NewRequest("POST", "/plugin/1/enable", nil)
106+
s.ctx.Params = gin.Params{{Key: "id", Value: "1"}}
107+
s.a.EnablePlugin(s.ctx)
108+
109+
assert.Equal(s.T(), 200, s.recorder.Code)
110+
111+
if pluginConf, err := s.db.GetPluginConfByUserAndPath(1, mock.ModulePath); assert.NoError(s.T(), err) {
112+
assert.True(s.T(), pluginConf.Enabled)
113+
}
114+
s.resetRecorder()
115+
116+
s.ctx.Request = httptest.NewRequest("DELETE", "/user/1", nil)
117+
s.ctx.Params = gin.Params{{Key: "id", Value: "1"}}
118+
s.u.DeleteUserByID(s.ctx)
119+
120+
assert.Equal(s.T(), 200, s.recorder.Code)
121+
122+
user, err := s.db.GetUserByID(1)
123+
assert.NoError(s.T(), err)
124+
assert.Nil(s.T(), user)
125+
}
126+
100127
func (s *PluginSuite) Test_EnableDisablePlugin() {
101128
{
102129
test.WithUser(s.ctx, 1)
@@ -161,7 +188,7 @@ func (s *PluginSuite) Test_EnableDisablePlugin() {
161188

162189
func (s *PluginSuite) Test_EnableDisablePlugin_EnableReturnsError_expect500() {
163190
s.db.User(16)
164-
assert.Nil(s.T(), s.manager.InitializeForUserID(16))
191+
assert.Nil(s.T(), s.manager.InitializeForUserID(s.db.GormDatabase, 16))
165192
mock.ReturnErrorOnEnableForUser(16, errors.New("test error"))
166193
conf, err := s.db.GetPluginConfByUserAndPath(16, mock.ModulePath)
167194
assert.NoError(s.T(), err)
@@ -183,7 +210,7 @@ func (s *PluginSuite) Test_EnableDisablePlugin_EnableReturnsError_expect500() {
183210

184211
func (s *PluginSuite) Test_EnableDisablePlugin_DisableReturnsError_expect500() {
185212
s.db.User(17)
186-
assert.Nil(s.T(), s.manager.InitializeForUserID(17))
213+
assert.Nil(s.T(), s.manager.InitializeForUserID(s.db.GormDatabase, 17))
187214
mock.ReturnErrorOnDisableForUser(17, errors.New("test error"))
188215
conf, err := s.db.GetPluginConfByUserAndPath(17, mock.ModulePath)
189216
assert.NoError(s.T(), err)
@@ -291,7 +318,7 @@ func (s *PluginSuite) Test_GetDisplay() {
291318
assert.NoError(s.T(), err)
292319
inst, err := s.manager.Instance(conf.ID)
293320
assert.Nil(s.T(), err)
294-
mockInst := inst.(*mock.PluginInstance)
321+
mockInst := inst.Instance().(*mock.PluginInstance)
295322

296323
mockInst.DisplayString = "test string"
297324

@@ -312,7 +339,7 @@ func (s *PluginSuite) Test_GetDisplay_NotImplemented_expectEmptyString() {
312339
assert.NoError(s.T(), err)
313340
inst, err := s.manager.Instance(conf.ID)
314341
assert.Nil(s.T(), err)
315-
mockInst := inst.(*mock.PluginInstance)
342+
mockInst := inst.Instance().(*mock.PluginInstance)
316343

317344
mockInst.SetCapability(compat.Displayer, false)
318345
defer mockInst.SetCapability(compat.Displayer, true)
@@ -334,7 +361,7 @@ func (s *PluginSuite) Test_GetDisplay_incorrectUser_expectNotFound() {
334361
assert.NoError(s.T(), err)
335362
inst, err := s.manager.Instance(conf.ID)
336363
assert.Nil(s.T(), err)
337-
mockInst := inst.(*mock.PluginInstance)
364+
mockInst := inst.Instance().(*mock.PluginInstance)
338365

339366
mockInst.DisplayString = "test string"
340367

@@ -380,7 +407,7 @@ func (s *PluginSuite) Test_GetConfig() {
380407
assert.NoError(s.T(), err)
381408
inst, err := s.manager.Instance(conf.ID)
382409
assert.Nil(s.T(), err)
383-
mockInst := inst.(*mock.PluginInstance)
410+
mockInst := inst.Instance().(*mock.PluginInstance)
384411

385412
assert.Equal(s.T(), mockInst.DefaultConfig(), mockInst.Config, "Initial config should be default config")
386413
{
@@ -402,7 +429,7 @@ func (s *PluginSuite) Test_GetConfg_notImplemeted_expect400() {
402429
assert.NoError(s.T(), err)
403430
inst, err := s.manager.Instance(conf.ID)
404431
assert.Nil(s.T(), err)
405-
mockInst := inst.(*mock.PluginInstance)
432+
mockInst := inst.Instance().(*mock.PluginInstance)
406433

407434
mockInst.SetCapability(compat.Configurer, false)
408435
defer mockInst.SetCapability(compat.Configurer, true)
@@ -464,7 +491,7 @@ func (s *PluginSuite) Test_UpdateConfig() {
464491
assert.NoError(s.T(), err)
465492
inst, err := s.manager.Instance(conf.ID)
466493
assert.Nil(s.T(), err)
467-
mockInst := inst.(*mock.PluginInstance)
494+
mockInst := inst.Instance().(*mock.PluginInstance)
468495

469496
newConfig := &mock.PluginConfig{
470497
TestKey: "test__new__config",
@@ -499,7 +526,7 @@ func (s *PluginSuite) Test_UpdateConfig_invalidConfig_expect400() {
499526
assert.NoError(s.T(), err)
500527
inst, err := s.manager.Instance(conf.ID)
501528
assert.Nil(s.T(), err)
502-
mockInst := inst.(*mock.PluginInstance)
529+
mockInst := inst.Instance().(*mock.PluginInstance)
503530
origConfig := mockInst.Config
504531

505532
newConfig := &mock.PluginConfig{
@@ -536,7 +563,7 @@ func (s *PluginSuite) Test_UpdateConfig_malformedYAML_expect400() {
536563
assert.NoError(s.T(), err)
537564
inst, err := s.manager.Instance(conf.ID)
538565
assert.Nil(s.T(), err)
539-
mockInst := inst.(*mock.PluginInstance)
566+
mockInst := inst.Instance().(*mock.PluginInstance)
540567
origConfig := mockInst.Config
541568

542569
newConfigYAML := []byte(`--- "rg e""`)
@@ -568,7 +595,7 @@ func (s *PluginSuite) Test_UpdateConfig_ioError_expect500() {
568595
assert.NoError(s.T(), err)
569596
inst, err := s.manager.Instance(conf.ID)
570597
assert.Nil(s.T(), err)
571-
mockInst := inst.(*mock.PluginInstance)
598+
mockInst := inst.Instance().(*mock.PluginInstance)
572599
origConfig := mockInst.Config
573600

574601
{
@@ -598,7 +625,7 @@ func (s *PluginSuite) Test_UpdateConfig_notImplemented_expect400() {
598625
assert.NoError(s.T(), err)
599626
inst, err := s.manager.Instance(conf.ID)
600627
assert.Nil(s.T(), err)
601-
mockInst := inst.(*mock.PluginInstance)
628+
mockInst := inst.Instance().(*mock.PluginInstance)
602629

603630
newConfig := &mock.PluginConfig{
604631
TestKey: "test__new__config",
@@ -626,7 +653,7 @@ func (s *PluginSuite) Test_UpdateConfig_incorrectUser_expectNotFound() {
626653
assert.NoError(s.T(), err)
627654
inst, err := s.manager.Instance(conf.ID)
628655
assert.Nil(s.T(), err)
629-
mockInst := inst.(*mock.PluginInstance)
656+
mockInst := inst.Instance().(*mock.PluginInstance)
630657
origConfig := mockInst.Config
631658

632659
newConfig := &mock.PluginConfig{

‎api/stream/stream.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/gin-gonic/gin"
1212
"github.com/gorilla/websocket"
1313
"github.com/gotify/server/v3/auth"
14+
"github.com/gotify/server/v3/database"
1415
"github.com/gotify/server/v3/model"
1516
)
1617

@@ -50,7 +51,7 @@ func (a *API) CollectConnectedClientTokens() []string {
5051
}
5152

5253
// NotifyDeletedUser closes existing connections for the given user.
53-
func (a *API) NotifyDeletedUser(userID uint) error {
54+
func (a *API) NotifyDeletedUser(tx *database.GormDatabase, userID uint) error {
5455
a.lock.Lock()
5556
defer a.lock.Unlock()
5657
if clients, ok := a.clients[userID]; ok {

‎api/stream/stream_test.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func TestDeleteUser(t *testing.T) {
321321
expectNoMessage(userTwo...)
322322
expectNoMessage(userThree...)
323323

324-
api.NotifyDeletedUser(1)
324+
api.NotifyDeletedUser(nil, 1)
325325

326326
api.Notify(1, &model.MessageExternal{ID: 2, Message: "there"})
327327
expectNoMessage(userOne...)

0 commit comments

Comments
 (0)