16
16
GetSecretRequest , GetSecretResponse ,
17
17
CreateSecretRequest , CreateSecretResponse ,
18
18
UpdateSecretRequest , UpdateSecretResponse ,
19
- DeleteSecretRequest , DeleteSecretResponse ,
20
- Secret as SecretProto
19
+ Secret as SecretProto ,
20
+ UpdateSecretOp
21
21
)
22
22
23
23
logger = logging .getLogger (__name__ )
@@ -34,7 +34,6 @@ def _secret_to_proto(secret: Secret) -> SecretProto:
34
34
"""Convert a Secret model to a Secret proto"""
35
35
return SecretProto (
36
36
id = StringValue (value = str (secret .id )),
37
- name = StringValue (value = secret .name ),
38
37
key = StringValue (value = secret .key ),
39
38
masked_value = StringValue (value = _mask_secret_value (secret .value )),
40
39
description = StringValue (value = secret .description or "" ),
@@ -99,18 +98,17 @@ def secret_create(request_message: CreateSecretRequest) -> Union[CreateSecretRes
99
98
"""Create a new secret"""
100
99
account : Account = get_request_account ()
101
100
user = get_request_user ()
102
-
103
- name = request_message .name .value
101
+
104
102
key = request_message .key .value
105
103
value = request_message .value .value
106
104
description = request_message .description .value
107
105
108
106
# Validate required fields
109
- if not name or not key or not value :
107
+ if not key or not value :
110
108
return CreateSecretResponse (
111
109
meta = get_meta (),
112
110
success = BoolValue (value = False ),
113
- message = Message (title = "Invalid Request" , description = "Name, key , and value are required" )
111
+ message = Message (title = "Invalid Request" , description = "Key , and value are required" )
114
112
)
115
113
116
114
# Check if key already exists for this account
@@ -125,7 +123,6 @@ def secret_create(request_message: CreateSecretRequest) -> Union[CreateSecretRes
125
123
try :
126
124
secret = Secret .objects .create (
127
125
account = account ,
128
- name = name ,
129
126
key = key ,
130
127
value = value ,
131
128
description = description ,
@@ -151,94 +148,75 @@ def secret_create(request_message: CreateSecretRequest) -> Union[CreateSecretRes
151
148
152
149
@web_api (UpdateSecretRequest )
153
150
def secret_update (request_message : UpdateSecretRequest ) -> Union [UpdateSecretResponse , HttpResponse ]:
154
- """Update a secret's name or description (not the value) """
151
+ """Update a secret using operations """
155
152
account : Account = get_request_account ()
156
153
user = get_request_user ()
157
154
158
- secret_id = request_message .secret_id .value
159
- name = request_message .name .value
160
- description = request_message .description .value
161
- key = request_message .key .value
162
-
163
- if not secret_id :
164
- return UpdateSecretResponse (
165
- meta = get_meta (),
166
- success = BoolValue (value = False ),
167
- message = Message (title = "Invalid Request" , description = "Secret ID is required" )
168
- )
155
+ update_secret_ops = request_message .update_secret_ops
169
156
170
- try :
171
- secret = Secret .objects .get (id = secret_id , account = account , is_active = True )
172
-
173
- # Update fields if provided
174
- if name :
175
- secret .name = name
176
- if description is not None : # Allow empty description
177
- secret .description = description
178
- if key :
179
- secret .key = key
180
- secret .last_updated_by = user
181
- secret .save ()
182
-
183
- return UpdateSecretResponse (
184
- meta = get_meta (),
185
- success = BoolValue (value = True ),
186
- message = Message (title = "Success" , description = "Secret updated successfully" ),
187
- secret = _secret_to_proto (secret )
188
- )
189
- except Secret .DoesNotExist :
157
+ if not update_secret_ops :
190
158
return UpdateSecretResponse (
191
159
meta = get_meta (),
192
160
success = BoolValue (value = False ),
193
- message = Message (title = "Not Found " , description = "Secret not found " )
161
+ message = Message (title = "Invalid Request " , description = "No update operations provided " )
194
162
)
195
- except Exception as e :
196
- logger .error (f"Error updating secret: { str (e )} " )
163
+
164
+ # All operations should reference the same secret
165
+ secret_ids = set (op .secret_id .value for op in update_secret_ops )
166
+ if len (secret_ids ) != 1 :
197
167
return UpdateSecretResponse (
198
168
meta = get_meta (),
199
169
success = BoolValue (value = False ),
200
- message = Message (title = "Error " , description = "Failed to update secret" )
170
+ message = Message (title = "Invalid Request " , description = "All operations must reference the same secret" )
201
171
)
202
-
203
-
204
- @web_api (DeleteSecretRequest )
205
- def secret_delete (request_message : DeleteSecretRequest ) -> Union [DeleteSecretResponse , HttpResponse ]:
206
- """Soft delete a secret by setting is_active to False"""
207
- account : Account = get_request_account ()
208
- user = get_request_user ()
209
172
210
- secret_id = request_message .secret_id .value
211
-
212
- if not secret_id :
213
- return DeleteSecretResponse (
214
- meta = get_meta (),
215
- success = BoolValue (value = False ),
216
- message = Message (title = "Invalid Request" , description = "Secret ID is required" )
217
- )
173
+ secret_id = list (secret_ids )[0 ]
218
174
219
175
try :
220
176
secret = Secret .objects .get (id = secret_id , account = account , is_active = True )
221
177
222
- # Soft delete by setting is_active to False
223
- secret .is_active = False
178
+ # Store the original user for later restoration
179
+ original_last_updated_by = secret .last_updated_by
180
+
181
+ # Set the user who is making the update
224
182
secret .last_updated_by = user
225
- secret .save ()
183
+ secret .save (update_fields = [ 'last_updated_by' ] )
226
184
227
- return DeleteSecretResponse (
228
- meta = get_meta (),
229
- success = BoolValue (value = True ),
230
- message = Message (title = "Success" , description = "Secret deleted successfully" )
231
- )
185
+ try :
186
+ # Apply all update operations
187
+ from executor .secrets .crud .secrets_update_processor import secrets_update_processor
188
+ secrets_update_processor .update (secret , update_secret_ops )
189
+
190
+ # Get the updated secret
191
+ updated_secret = Secret .objects .get (id = secret_id )
192
+
193
+ return UpdateSecretResponse (
194
+ meta = get_meta (),
195
+ success = BoolValue (value = True ),
196
+ message = Message (title = "Success" , description = "Secret updated successfully" ),
197
+ secret = _secret_to_proto (updated_secret )
198
+ )
199
+ except Exception as e :
200
+ # Restore the original user if update fails
201
+ secret .last_updated_by = original_last_updated_by
202
+ secret .save (update_fields = ['last_updated_by' ])
203
+
204
+ logger .error (f"Error updating secret: { str (e )} " )
205
+ return UpdateSecretResponse (
206
+ meta = get_meta (),
207
+ success = BoolValue (value = False ),
208
+ message = Message (title = "Error" , description = str (e ))
209
+ )
232
210
except Secret .DoesNotExist :
233
- return DeleteSecretResponse (
211
+ return UpdateSecretResponse (
234
212
meta = get_meta (),
235
213
success = BoolValue (value = False ),
236
214
message = Message (title = "Not Found" , description = "Secret not found" )
237
215
)
238
216
except Exception as e :
239
- logger .error (f"Error deleting secret: { str (e )} " )
240
- return DeleteSecretResponse (
217
+ logger .error (f"Error updating secret: { str (e )} " )
218
+ return UpdateSecretResponse (
241
219
meta = get_meta (),
242
220
success = BoolValue (value = False ),
243
- message = Message (title = "Error" , description = "Failed to delete secret" )
244
- )
221
+ message = Message (title = "Error" , description = "Failed to update secret" )
222
+ )
0 commit comments