Skip to content

Commit ae0843c

Browse files
committed
CABPI-27::Implement Admin Users export from Adobe to Commerce - Import IMS User & role into Adobe commerce
1 parent 91549b9 commit ae0843c

File tree

6 files changed

+359
-3
lines changed

6 files changed

+359
-3
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\AdminAdobeIms\Api;
9+
10+
use Magento\Framework\Exception\CouldNotSaveException;
11+
12+
/**
13+
* Interface SaveImsUserAndRoleInterface
14+
* Save Ims User & Role
15+
*/
16+
interface SaveImsUserAndRoleInterface
17+
{
18+
/**
19+
* Add Admin Adobe IMS User with Default Role i.e "Adobe Ims" & No Permissions
20+
*
21+
* @param array $profile
22+
* @return void
23+
* @throws CouldNotSaveException
24+
*/
25+
public function save(array $profile): void;
26+
}

app/code/Magento/AdminAdobeIms/Model/Authorization/AdobeImsAdminTokenUserService.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Magento\AdobeImsApi\Api\OrganizationMembershipInterface;
1919
use Magento\Framework\App\RequestInterface;
2020
use Magento\Framework\Exception\AuthenticationException;
21+
use Magento\AdminAdobeIms\Api\SaveImsUserAndRoleInterface;
2122

2223
/**
2324
* Adobe IMS Auth Model for getting Admin Token
@@ -63,6 +64,11 @@ class AdobeImsAdminTokenUserService
6364
*/
6465
private RequestInterface $request;
6566

67+
/**
68+
* @var SaveImsUserAndRoleInterface
69+
*/
70+
private SaveImsUserAndRoleInterface $saveImsUserAndRole;
71+
6672
/**
6773
* @param ImsConfig $adminImsConfig
6874
* @param OrganizationMembershipInterface $organizationMembership
@@ -71,6 +77,7 @@ class AdobeImsAdminTokenUserService
7177
* @param RequestInterface $request
7278
* @param GetTokenInterface $token
7379
* @param GetProfileInterface $profile
80+
* @param SaveImsUserAndRoleInterface $saveImsUserAndRole
7481
*/
7582
public function __construct(
7683
ImsConfig $adminImsConfig,
@@ -79,7 +86,8 @@ public function __construct(
7986
AdminReauthProcessService $adminReauthProcessService,
8087
RequestInterface $request,
8188
GetTokenInterface $token,
82-
GetProfileInterface $profile
89+
GetProfileInterface $profile,
90+
SaveImsUserAndRoleInterface $saveImsUserAndRole
8391
) {
8492
$this->adminImsConfig = $adminImsConfig;
8593
$this->organizationMembership = $organizationMembership;
@@ -88,6 +96,7 @@ public function __construct(
8896
$this->request = $request;
8997
$this->token = $token;
9098
$this->profile = $profile;
99+
$this->saveImsUserAndRole = $saveImsUserAndRole;
91100
}
92101

93102
/**
@@ -122,6 +131,7 @@ public function processLoginRequest(bool $isReauthorize = false): void
122131
if ($isReauthorize) {
123132
$this->adminReauthProcessService->execute($tokenResponse);
124133
} else {
134+
$this->saveImsUserAndRole->save($profile);
125135
$this->adminLoginProcessService->execute($tokenResponse, $profile);
126136
}
127137
} catch (AdobeImsAuthorizationException $e) {
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\AdminAdobeIms\Model;
9+
10+
use Magento\AdminAdobeIms\Api\SaveImsUserAndRoleInterface;
11+
use Magento\User\Model\User;
12+
use Magento\User\Model\ResourceModel\User\CollectionFactory as UserCollectionFactory;
13+
use Magento\Authorization\Model\ResourceModel\Role\CollectionFactory as RoleCollectionFactory;
14+
use Magento\Authorization\Model\Acl\Role\User as UserRoleType;
15+
use Magento\AdminAdobeIms\Logger\AdminAdobeImsLogger;
16+
use Exception;
17+
use Magento\Framework\Exception\CouldNotSaveException;
18+
19+
/**
20+
* Class SaveImsUserAndRole
21+
* Save Adobe IMS User with Default Role i.e "Adobe Ims" & No Permissions
22+
*/
23+
class SaveImsUserAndRole implements SaveImsUserAndRoleInterface
24+
{
25+
private const ADMIN_IMS_ROLE = 'Adobe Ims';
26+
27+
/**
28+
* @var User
29+
*/
30+
private User $user;
31+
32+
/**
33+
* @var UserCollectionFactory
34+
*/
35+
private UserCollectionFactory $userCollectionFactory;
36+
37+
/**
38+
* @var RoleCollectionFactory
39+
*/
40+
private RoleCollectionFactory $roleCollectionFactory;
41+
42+
/**
43+
* @var AdminAdobeImsLogger
44+
*/
45+
private AdminAdobeImsLogger $logger;
46+
47+
/**
48+
* SaveImsUserAndRole constructor.
49+
* @param User $user
50+
* @param UserCollectionFactory $userCollectionFactory
51+
* @param RoleCollectionFactory $roleCollectionFactory
52+
* @param AdminAdobeImsLogger $logger
53+
*/
54+
public function __construct(
55+
User $user,
56+
UserCollectionFactory $userCollectionFactory,
57+
RoleCollectionFactory $roleCollectionFactory,
58+
AdminAdobeImsLogger $logger
59+
) {
60+
$this->user = $user;
61+
$this->userCollectionFactory = $userCollectionFactory;
62+
$this->roleCollectionFactory = $roleCollectionFactory;
63+
$this->logger = $logger;
64+
}
65+
66+
/**
67+
* @inheritdoc
68+
*/
69+
public function save(array $profile): void
70+
{
71+
$username = strtolower(strstr($profile['email'], '@', true));
72+
$userCollection = $this->userCollectionFactory->create()
73+
->addFieldToFilter('email', ['eq' => $profile['email']])
74+
->addFieldToFilter('username', ['eq' => $username]);
75+
76+
if (!$userCollection->getSize()) {
77+
$roleId = $this->getImsDefaultRole();
78+
if ($roleId > 0) {
79+
try {
80+
$this->user->setFirstname($profile['first_name'])
81+
->setLastname($profile['last_name'])
82+
->setUsername($username)
83+
->setPassword($this->generateRandomPassword())
84+
->setEmail($profile['email'])
85+
->setRoleType(UserRoleType::ROLE_TYPE)
86+
->setPrivileges("")
87+
->setAssertId(0)
88+
->setRoleId((int)$roleId)
89+
->setPermission('allow')
90+
->save();
91+
unset($this->user);
92+
} catch (Exception $e) {
93+
$this->logger->critical($e->getMessage());
94+
throw new CouldNotSaveException(__('Could not save ims user.'));
95+
}
96+
}
97+
}
98+
$userCollection->clear();
99+
}
100+
101+
/**
102+
* Fetch Default Role "Adobe Ims"
103+
*
104+
* @return int
105+
*/
106+
private function getImsDefaultRole(): int
107+
{
108+
$roleId = 0;
109+
$roleCollection = $this->roleCollectionFactory->create()
110+
->addFieldToFilter('role_name', ['eq' => self::ADMIN_IMS_ROLE])
111+
->addFieldToSelect('role_id');
112+
113+
if ($roleCollection->getSize() > 0) {
114+
$objRole = $roleCollection->fetchItem();
115+
$roleId = (int) $objRole->getId();
116+
}
117+
$roleCollection->clear();
118+
119+
return $roleId;
120+
}
121+
122+
/**
123+
* Generate random password string
124+
*
125+
* @return string
126+
*/
127+
private function generateRandomPassword(): string
128+
{
129+
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-.';
130+
$pass = [];
131+
$alphaLength = strlen($characters) - 1;
132+
for ($i = 0; $i < 100; $i++) {
133+
$n = random_int(0, $alphaLength);
134+
$pass[] = $characters[$n];
135+
}
136+
return implode($pass);
137+
}
138+
}

app/code/Magento/AdminAdobeIms/Test/Unit/Model/Authorization/AdobeImsAdminTokenUserServiceTest.php

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
use Magento\Framework\Exception\AuthenticationException;
2020
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
2121
use PHPUnit\Framework\TestCase;
22+
use Magento\AdminAdobeIms\Service\AdminReauthProcessService;
23+
use Magento\AdminAdobeIms\Api\SaveImsUserAndRoleInterface;
2224

2325
/**
2426
* Tests Magento\AdminAdobeIms\Model\Authorization\AdobeImsAdminTokenUserService
@@ -65,6 +67,16 @@ class AdobeImsAdminTokenUserServiceTest extends TestCase
6567
*/
6668
private $requestInterfaceMock;
6769

70+
/**
71+
* @var AdminReauthProcessService
72+
*/
73+
private $adminReauthProcessService;
74+
75+
/**
76+
* @var SaveImsUserAndRoleInterface
77+
*/
78+
private $saveImsUserAndRole;
79+
6880
protected function setUp(): void
6981
{
7082
$this->objectManager = new ObjectManager($this);
@@ -75,6 +87,8 @@ protected function setUp(): void
7587
$this->organizationMembership = $this->createMock(OrganizationMembershipInterface::class);
7688
$this->adminLoginProcessService = $this->createMock(AdminLoginProcessService::class);
7789
$this->requestInterfaceMock = $this->createMock(RequestInterface::class);
90+
$this->adminReauthProcessService = $this->createMock(AdminReauthProcessService::class);
91+
$this->saveImsUserAndRole = $this->createMock(SaveImsUserAndRoleInterface::class);
7892

7993
$this->adminImsConfigMock->expects($this->any())
8094
->method('enabled')
@@ -86,9 +100,11 @@ protected function setUp(): void
86100
'adminImsConfig' => $this->adminImsConfigMock,
87101
'organizationMembership' => $this->organizationMembership,
88102
'adminLoginProcessService' => $this->adminLoginProcessService,
103+
'adminReauthProcessService' => $this->adminReauthProcessService,
89104
'request' => $this->requestInterfaceMock,
90105
'token' => $this->token,
91-
'profile' => $this->profile
106+
'profile' => $this->profile,
107+
'saveImsUserAndRole' => $this->saveImsUserAndRole
92108
]
93109
);
94110
}
@@ -128,6 +144,14 @@ public function testProcessLoginRequest(string $code, array $responseData)
128144
->method('checkOrganizationMembership')
129145
->with($responseData['access_token']);
130146

147+
$this->saveImsUserAndRole->expects($this->once())
148+
->method('save')
149+
->with($responseData);
150+
151+
$this->adminLoginProcessService->expects($this->once())
152+
->method('execute')
153+
->with($tokenResponse, $responseData);
154+
131155
$this->adobeImsAdminTokenUserService->processLoginRequest();
132156
}
133157

@@ -256,7 +280,9 @@ public function responseDataProvider(): array
256280
'email' => 'user@test.com',
257281
'access_token' => 'kladjflakdjf3423rfzddsf',
258282
'refresh_token' => 'kladjflakdjf3423rfzddsf',
259-
'expires_in' => 1642259230998
283+
'expires_in' => 1642259230998,
284+
'first_name' => 'Test',
285+
'last_name' => 'User'
260286
]
261287
]
262288
];

app/code/Magento/AdminAdobeIms/etc/di.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<preference for="Magento\AdminAdobeIms\Api\Data\ImsWebapiInterface" type="Magento\AdminAdobeIms\Model\ImsWebapi"/>
1212
<preference for="Magento\AdobeImsApi\Api\GetAccessTokenInterface" type="Magento\AdminAdobeIms\Model\GetAccessTokenProxy"/>
1313
<preference for="Magento\AdobeImsApi\Api\UserAuthorizedInterface" type="Magento\AdminAdobeIms\Model\UserAuthorizedProxy"/>
14+
<preference for="Magento\AdminAdobeIms\Api\SaveImsUserAndRoleInterface" type="Magento\AdminAdobeIms\Model\SaveImsUserAndRole"/>
1415

1516
<type name="Magento\Framework\Console\CommandListInterface">
1617
<arguments>

0 commit comments

Comments
 (0)