9
9
"github.com/superproj/onex/internal/pkg/client/store"
10
10
known "github.com/superproj/onex/internal/pkg/known/usercenter"
11
11
"github.com/superproj/onex/internal/pkg/onexx"
12
+ "github.com/superproj/onex/internal/usercenter/model"
12
13
"github.com/superproj/onex/pkg/log"
13
14
)
14
15
@@ -21,8 +22,13 @@ func NewActiveUserCallback(store store.Interface) fsm.Callback {
21
22
return func (ctx context.Context , event * fsm.Event ) {
22
23
userM := onexx .FromUserM (ctx )
23
24
log .Infow ("Now active user" , "event" , event .Event , "username" , userM .Username )
24
- // Fake active user operations.
25
- time .Sleep (5 * time .Second )
25
+
26
+ // Active secrets if needed.
27
+ if err := iterateSecrets (ctx , store , userM .UserID , activeSecret ); err != nil {
28
+ event .Err = err
29
+ return
30
+ }
31
+
26
32
log .Infow ("Success to active user" , "event" , event .Event , "username" , userM .Username )
27
33
}
28
34
}
@@ -32,8 +38,13 @@ func NewDisableUserCallback(store store.Interface) fsm.Callback {
32
38
return func (ctx context.Context , event * fsm.Event ) {
33
39
userM := onexx .FromUserM (ctx )
34
40
log .Infow ("Now disable user" , "event" , event .Event , "username" , userM .Username )
35
- // Fake disable user operations.
36
- time .Sleep (5 * time .Second )
41
+
42
+ // Disable secrets if needed.
43
+ if err := iterateSecrets (ctx , store , userM .UserID , disableSecret ); err != nil {
44
+ event .Err = err
45
+ return
46
+ }
47
+
37
48
log .Infow ("Success to disable user" , "event" , event .Event , "username" , userM .Username )
38
49
}
39
50
}
@@ -42,9 +53,22 @@ func NewDisableUserCallback(store store.Interface) fsm.Callback {
42
53
func NewDeleteUserCallback (store store.Interface ) fsm.Callback {
43
54
return func (ctx context.Context , event * fsm.Event ) {
44
55
userM := onexx .FromUserM (ctx )
45
- log .Infow ("Now delete user" , "event" , event .Event , "username" , userM .Username )
46
- // Fake delete user operations.
47
- time .Sleep (5 * time .Second )
56
+ log .Infow ("Now delete user if needed" , "event" , event .Event , "username" , userM .Username )
57
+
58
+ // If a user remains in an disalbed state for more than 5 years,
59
+ // the user should be deleted.
60
+ duration := time .Since (userM .UpdatedAt )
61
+ if duration .Hours () < 24 * 365 * 5 {
62
+ return
63
+ }
64
+
65
+ // Delete secrets if needed.
66
+ if err := iterateSecrets (ctx , store , userM .UserID , deleteSecret ); err != nil {
67
+ event .Err = err
68
+ return
69
+ }
70
+
71
+ // Save user data for archiving purposes.
48
72
log .Infow ("Success to delete user" , "event" , event .Event , "username" , userM .Username )
49
73
}
50
74
}
@@ -79,3 +103,57 @@ func NewUserEventAfterEvent(store store.Interface) fsm.Callback {
79
103
}
80
104
}
81
105
}
106
+
107
+ // activeSecret used to active user secret.
108
+ func activeSecret (ctx context.Context , store store.Interface , secret * model.SecretM ) error {
109
+ log .Infow ("Now actice user secret" , "userID" , secret .UserID , "secretID" , secret .SecretID )
110
+ // To avoid unnecessary database update operations, we first check
111
+ // whether updating the database is required.
112
+ if secret .Status == known .SecretStatusNormal {
113
+ return nil
114
+ }
115
+ secret .Status = known .SecretStatusNormal
116
+ return store .UserCenter ().Secrets ().Update (ctx , secret )
117
+ }
118
+
119
+ // disableSecret used to disable user secret.
120
+ func disableSecret (ctx context.Context , store store.Interface , secret * model.SecretM ) error {
121
+ log .Infow ("Now disable user secret" , "userID" , secret .UserID , "secretID" , secret .SecretID )
122
+ // To avoid unnecessary database update operations, we first check
123
+ // whether updating the database is required.
124
+ if secret .Status == known .SecretStatusDisabled {
125
+ return nil
126
+ }
127
+ secret .Status = known .SecretStatusDisabled
128
+ return store .UserCenter ().Secrets ().Update (ctx , secret )
129
+ }
130
+
131
+ // deleteSecret used to delete user secret.
132
+ func deleteSecret (ctx context.Context , store store.Interface , secret * model.SecretM ) error {
133
+ log .Infow ("Now delete user secret" , "userID" , secret .UserID , "secretID" , secret .SecretID )
134
+ return store .UserCenter ().Secrets ().Delete (ctx , secret .UserID , secret .Name )
135
+ }
136
+
137
+ // iterateSecrets iterates through the secrets of a user specified by userID
138
+ // and calls the action function on each secret.
139
+ func iterateSecrets (
140
+ ctx context.Context ,
141
+ store store.Interface ,
142
+ userID string ,
143
+ action func (ctx context.Context , store store.Interface , secret * model.SecretM ) error ,
144
+ ) error {
145
+ // Retrieve the list of secrets for the specified user.
146
+ _ , secrets , err := store .UserCenter ().Secrets ().List (ctx , userID )
147
+ if err != nil {
148
+ return err
149
+ }
150
+
151
+ // Iterate through each secret and perform the action function.
152
+ for i := range secrets {
153
+ if err := action (ctx , store , secrets [i ]); err != nil {
154
+ return err
155
+ }
156
+ }
157
+
158
+ return nil
159
+ }
0 commit comments