@@ -291,12 +291,12 @@ public function singleAction(Request $request, string $id): Response
291
291
* Add a new user.
292
292
*/
293
293
#[IsGranted('ROLE_API_WRITER ' )]
294
- #[Rest \Post ]
294
+ #[Rest \Put( "" ) ]
295
295
#[OA \RequestBody(
296
296
required: true ,
297
297
content: [
298
298
new OA \MediaType (
299
- mediaType: 'multipart/form-data ' ,
299
+ mediaType: 'application/json ' ,
300
300
schema: new OA \Schema (ref: new Model (type: AddUser::class))
301
301
),
302
302
]
@@ -311,19 +311,19 @@ public function addAction(
311
311
AddUser $ addUser ,
312
312
Request $ request
313
313
): Response {
314
- return $ this ->addOrUpdateUser ($ addUser , $ request );
314
+ return $ this ->addUser ($ addUser , $ request );
315
315
}
316
316
317
317
/**
318
- * Update an existing User or create one with the given ID
318
+ * Update an existing User
319
319
*/
320
320
#[IsGranted('ROLE_API_WRITER ' )]
321
- #[Rest \Put ('/{id} ' )]
321
+ #[Rest \Patch ('/{id} ' )]
322
322
#[OA \RequestBody(
323
323
required: true ,
324
324
content: [
325
325
new OA \MediaType (
326
- mediaType: 'multipart/form-data ' ,
326
+ mediaType: 'application/json ' ,
327
327
schema: new OA \Schema (ref: new Model (type: UpdateUser::class))
328
328
),
329
329
]
@@ -336,28 +336,19 @@ public function addAction(
336
336
public function updateAction (
337
337
#[MapRequestPayload(validationFailedStatusCode: Response::HTTP_BAD_REQUEST )]
338
338
UpdateUser $ updateUser ,
339
+ string $ id ,
339
340
Request $ request
340
341
): Response {
341
- return $ this ->addOrUpdateUser ($ updateUser , $ request );
342
+ return $ this ->updateUser ($ updateUser, $ id , $ request );
342
343
}
343
344
344
- protected function addOrUpdateUser (AddUser $ addUser , Request $ request ): Response
345
+ protected function addUser (AddUser $ addUser , Request $ request ): Response
345
346
{
346
- if ($ addUser instanceof UpdateUser && !$ addUser ->id ) {
347
- throw new BadRequestHttpException ('`id` field is required ' );
348
- }
349
-
350
347
if ($ this ->em ->getRepository (User::class)->findOneBy (['username ' => $ addUser ->username ])) {
351
348
throw new BadRequestHttpException (sprintf ("User %s already exists " , $ addUser ->username ));
352
349
}
353
350
354
351
$ user = new User ();
355
- if ($ addUser instanceof UpdateUser) {
356
- $ existingUser = $ this ->em ->getRepository (User::class)->findOneBy (['externalid ' => $ addUser ->id ]);
357
- if ($ existingUser ) {
358
- $ user = $ existingUser ;
359
- }
360
- }
361
352
$ user
362
353
->setUsername ($ addUser ->username )
363
354
->setName ($ addUser ->name )
@@ -366,7 +357,8 @@ protected function addOrUpdateUser(AddUser $addUser, Request $request): Response
366
357
->setPlainPassword ($ addUser ->password )
367
358
->setEnabled ($ addUser ->enabled ?? true );
368
359
369
- if ($ addUser instanceof UpdateUser) {
360
+ // if not set let it autogenerate
361
+ if ($ addUser ->id ) {
370
362
$ user ->setExternalid ($ addUser ->id );
371
363
}
372
364
@@ -415,6 +407,76 @@ protected function addOrUpdateUser(AddUser $addUser, Request $request): Response
415
407
return $ this ->renderCreateData ($ request , $ user , 'user ' , $ user ->getUserid ());
416
408
}
417
409
410
+
411
+ protected function updateUser (UpdateUser $ updateUser , string $ id , Request $ request ): Response
412
+ {
413
+ $ user = $ this ->em ->getRepository (User::class)->findOneBy (['externalid ' => $ id ]);
414
+ if (!$ user ) {
415
+ throw new BadRequestHttpException (sprintf ("User does not exist " , $ id ));
416
+ }
417
+ if ($ updateUser ->username !== null ) {
418
+ $ user ->setUsername ($ updateUser ->username );
419
+ }
420
+ if ($ updateUser ->name !== null ) {
421
+ $ user ->setName ($ updateUser ->name );
422
+ }
423
+ if ($ updateUser ->email !== null ) {
424
+ $ user ->setEmail ($ updateUser ->email );
425
+ }
426
+ if ($ updateUser ->ip !== null ) {
427
+ $ user ->setIpAddress ($ updateUser ->ip );
428
+ }
429
+ if ($ updateUser ->password !== null ) {
430
+ $ user ->setPlainPassword ($ updateUser ->password );
431
+ }
432
+ if ($ updateUser ->enabled !== null ) {
433
+ $ user ->setEnabled ($ updateUser ->enabled );
434
+ }
435
+ if ($ updateUser ->teamId ) {
436
+ /** @var Team|null $team */
437
+ $ team = $ this ->em ->createQueryBuilder ()
438
+ ->from (Team::class, 't ' )
439
+ ->select ('t ' )
440
+ ->andWhere ('t.externalid = :team ' )
441
+ ->setParameter ('team ' , $ updateUser ->teamId )
442
+ ->getQuery ()
443
+ ->getOneOrNullResult ();
444
+
445
+ if ($ team === null ) {
446
+ throw new BadRequestHttpException (sprintf ("Team %s not found " , $ updateUser ->teamId ));
447
+ }
448
+ $ user ->setTeam ($ team );
449
+ }
450
+
451
+ $ roles = $ updateUser ->roles ;
452
+ // For the file import we change a CDS user to the roles needed for ICPC CDS.
453
+ if ($ user ->getUsername () === 'cds ' ) {
454
+ $ roles = ['cds ' ];
455
+ }
456
+ if (in_array ('cds ' , $ roles )) {
457
+ $ roles = ['api_source_reader ' , 'api_writer ' , 'api_reader ' , ...array_diff ($ roles , ['cds ' ])];
458
+ }
459
+ foreach ($ roles as $ djRole ) {
460
+ if ($ djRole === '' ) {
461
+ continue ;
462
+ }
463
+ if ($ djRole === 'judge ' ) {
464
+ $ djRole = 'jury ' ;
465
+ }
466
+ $ role = $ this ->em ->getRepository (Role::class)->findOneBy (['dj_role ' => $ djRole ]);
467
+ if ($ role === null ) {
468
+ throw new BadRequestHttpException (sprintf ("Role %s not found " , $ djRole ));
469
+ }
470
+ $ user ->addUserRole ($ role );
471
+ }
472
+
473
+ $ this ->em ->persist ($ user );
474
+ $ this ->em ->flush ();
475
+ $ this ->dj ->auditlog ('user ' , $ user ->getUserid (), 'updated ' );
476
+
477
+ return $ this ->renderCreateData ($ request , $ user , 'user ' , $ user ->getUserid ());
478
+ }
479
+
418
480
protected function getQueryBuilder (Request $ request ): QueryBuilder
419
481
{
420
482
$ queryBuilder = $ this ->em ->createQueryBuilder ()
0 commit comments