@@ -52,17 +52,13 @@ impl IntoResponse for RouteError {
52
52
}
53
53
54
54
/// # JSON payload for the `POST /api/admin/v1/users/:id/deactivate` endpoint
55
- #[ derive( Deserialize , JsonSchema ) ]
55
+ #[ derive( Default , Deserialize , JsonSchema ) ]
56
56
#[ serde( rename = "DeactivateUserRequest" ) ]
57
57
pub struct Request {
58
- /// Whether the user should be GDPR-erased from the homeserver.
59
- erase : bool ,
60
- }
61
-
62
- impl Default for Request {
63
- fn default ( ) -> Self {
64
- Self { erase : true }
65
- }
58
+ /// Whether to skip requesting the homeserver to GDPR-erase the user upon
59
+ /// deactivation.
60
+ #[ serde( default ) ]
61
+ skip_erase : bool ,
66
62
}
67
63
68
64
pub fn doc ( mut operation : TransformOperation ) -> TransformOperation {
@@ -120,7 +116,7 @@ pub async fn handler(
120
116
. schedule_job (
121
117
& mut rng,
122
118
& clock,
123
- DeactivateUserJob :: new ( & user, params. erase ) ,
119
+ DeactivateUserJob :: new ( & user, ! params. skip_erase ) ,
124
120
)
125
121
. await ?;
126
122
@@ -142,7 +138,7 @@ mod tests {
142
138
143
139
use crate :: test_utils:: { RequestBuilderExt , ResponseExt , TestState , setup} ;
144
140
145
- async fn test_deactivate_user_helper ( pool : PgPool , erase : Option < bool > ) {
141
+ async fn test_deactivate_user_helper ( pool : PgPool , skip_erase : Option < bool > ) {
146
142
setup ( ) ;
147
143
let mut state = TestState :: from_pool ( pool. clone ( ) ) . await . unwrap ( ) ;
148
144
let token = state. token_with_scope ( "urn:mas:admin" ) . await ;
@@ -157,10 +153,10 @@ mod tests {
157
153
158
154
let request =
159
155
Request :: post ( format ! ( "/api/admin/v1/users/{}/deactivate" , user. id) ) . bearer ( & token) ;
160
- let request = match erase {
156
+ let request = match skip_erase {
161
157
None => request. empty ( ) ,
162
- Some ( erase ) => request. json ( serde_json:: json!( {
163
- "erase " : erase ,
158
+ Some ( skip_erase ) => request. json ( serde_json:: json!( {
159
+ "skip_erase " : skip_erase ,
164
160
} ) ) ,
165
161
} ;
166
162
let response = state. request ( request) . await ;
@@ -182,7 +178,10 @@ mod tests {
182
178
. await
183
179
. expect ( "Deactivation job to be scheduled" ) ;
184
180
assert_eq ! ( job[ "user_id" ] , serde_json:: json!( user. id) ) ;
185
- assert_eq ! ( job[ "hs_erase" ] , serde_json:: json!( erase. unwrap_or( true ) ) ) ;
181
+ assert_eq ! (
182
+ job[ "hs_erase" ] ,
183
+ serde_json:: json!( !skip_erase. unwrap_or( false ) )
184
+ ) ;
186
185
187
186
// Make sure to run the jobs in the queue
188
187
state. run_jobs_in_queue ( ) . await ;
@@ -223,45 +222,10 @@ mod tests {
223
222
}
224
223
225
224
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
226
- async fn test_deactivate_user_with_explicit_erase ( pool : PgPool ) {
225
+ async fn test_deactivate_user_skip_erase ( pool : PgPool ) {
227
226
test_deactivate_user_helper ( pool, Option :: Some ( true ) ) . await ;
228
227
}
229
228
230
- #[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
231
- async fn test_deactivate_user_without_erase ( pool : PgPool ) {
232
- test_deactivate_user_helper ( pool, Option :: Some ( false ) ) . await ;
233
- }
234
-
235
- #[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
236
- async fn test_deactivate_user_missing_erase ( pool : PgPool ) {
237
- setup ( ) ;
238
- let mut state = TestState :: from_pool ( pool. clone ( ) ) . await . unwrap ( ) ;
239
- let token = state. token_with_scope ( "urn:mas:admin" ) . await ;
240
-
241
- let mut repo = state. repository ( ) . await . unwrap ( ) ;
242
- let user = repo
243
- . user ( )
244
- . add ( & mut state. rng ( ) , & state. clock , "alice" . to_owned ( ) )
245
- . await
246
- . unwrap ( ) ;
247
- repo. save ( ) . await . unwrap ( ) ;
248
-
249
- let request = Request :: post ( format ! ( "/api/admin/v1/users/{}/deactivate" , user. id) )
250
- . bearer ( & token)
251
- . json ( serde_json:: json!( { } ) ) ;
252
- let response = state. request ( request) . await ;
253
- response. assert_status ( StatusCode :: UNPROCESSABLE_ENTITY ) ;
254
-
255
- // It should have not scheduled a deactivation job for the user
256
- let count: i64 = sqlx:: query_scalar (
257
- "SELECT COUNT(1) FROM queue_jobs WHERE queue_name = 'deactivate-user'" ,
258
- )
259
- . fetch_one ( & pool)
260
- . await
261
- . unwrap ( ) ;
262
- assert_eq ! ( count, 0 ) ;
263
- }
264
-
265
229
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
266
230
async fn test_deactivate_locked_user ( pool : PgPool ) {
267
231
setup ( ) ;
0 commit comments