Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ public function register(IRegistrationContext $context): void
$container->get('Psr\Log\LoggerInterface'),
$container,
$container->get('OCP\App\IAppManager'),
$container->get(IAppConfig::class)
$container->get(IAppConfig::class),
$container->get(IUserManager::class),
$container->get(SymfonyEmailService::class),
);
});

Expand Down
86 changes: 51 additions & 35 deletions lib/Service/OrganisatieService.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@
namespace OCA\SoftwareCatalog\Service;

use OCA\SoftwareCatalog\Service\SoftwareCatalogue\OrganizationHandler;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;
use Psr\Container\ContainerInterface;
use OCP\App\IAppManager;
use OCP\IAppConfig;

/**
* Service for handling organization-specific operations
*
*
* This service provides functionality for organization entity creation,
* status management, and integration with OpenRegister.
*
*
* @category Service
* @package OCA\SoftwareCatalog\Service
* @author Conduction b.v. <info@conduction.nl>
Expand All @@ -53,15 +54,17 @@ public function __construct(
private readonly LoggerInterface $logger,
private readonly ContainerInterface $container,
private readonly IAppManager $appManager,
private readonly IAppConfig $config
private readonly IAppConfig $config,
private readonly IUserManager $userManager,
private readonly SymfonyEmailService $emailService,
) {
}

/**
* Creates an organization entity in OpenRegister
*
* @param array $objectData The organization object data
*
*
* @return object|null The created organisation entity or null on failure
*/
public function createOrganisationInOpenRegister(array $objectData): ?object
Expand All @@ -72,34 +75,34 @@ public function createOrganisationInOpenRegister(array $objectData): ?object
$this->logger->error('OrganisatieService: No organization UUID provided for creation');
return null;
}

$this->logger->info('OrganisatieService: Creating organization entity in OpenRegister', [
'organizationUuid' => $organizationUuid,
'naam' => $objectData['naam'] ?? 'Unknown'
]);

// Map the data for OpenRegister
$mappedData = $this->mapOrganizationDataForOpenRegister($objectData);

// Get organisation service
$organisationService = $this->getOrganisationService();
if (!$organisationService) {
$this->logger->error('OrganisatieService: OrganisationService not available');
return null;
}

// Create the organization entity
$organisationEntity = $this->createOrganisationEntityInternal($organisationService, $mappedData, $organizationUuid);

if ($organisationEntity) {
$this->logger->info('OrganisatieService: Successfully created organization entity', [
'organizationUuid' => $organizationUuid,
'entityId' => $organisationEntity->getId()
]);
}

return $organisationEntity;

} catch (\Exception $e) {
$this->logger->error('OrganisatieService: Error creating organization entity', [
'error' => $e->getMessage(),
Expand All @@ -115,7 +118,7 @@ public function createOrganisationInOpenRegister(array $objectData): ?object
*
* @param string $organizationUuid The organization UUID
* @param array $objectData The organization object data
*
*
* @return bool True if update was successful
*/
public function updateOrganizationStatus(string $organizationUuid, array $objectData): bool
Expand All @@ -129,21 +132,21 @@ public function updateOrganizationStatus(string $organizationUuid, array $object
// Get the organization entity
$organisationMapper = $this->container->get('OCA\OpenRegister\Db\OrganisationMapper');
$organisationEntity = $organisationMapper->findByUuid($organizationUuid);

// Map status from SoftwareCatalog to OpenRegister
$active = $this->mapStatus($objectData['beoordeling'] ?? 'actief');

// Update the entity
$organisationEntity->setActive($active);
$organisationMapper->save($organisationEntity);

$this->logger->info('OrganisatieService: Successfully updated organization status', [
'organizationUuid' => $organizationUuid,
'active' => $active
]);

return true;

} catch (\Exception $e) {
$this->logger->error('OrganisatieService: Failed to update organization status', [
'organizationUuid' => $organizationUuid,
Expand Down Expand Up @@ -176,7 +179,7 @@ private function getOrganisationService(): ?\OCA\OpenRegister\Service\Organisati
* Maps organization data for OpenRegister format
*
* @param array $objectData The organization object data
*
*
* @return array The mapped data for OpenRegister
*/
private function mapOrganizationDataForOpenRegister(array $objectData): array
Expand All @@ -195,13 +198,13 @@ private function mapOrganizationDataForOpenRegister(array $objectData): array
* Maps status from Software Catalog to OpenRegister format
*
* @param string $status The status from Software Catalog
*
*
* @return bool The mapped active status for OpenRegister
*/
private function mapStatus(string $status): bool
{
$normalizedStatus = strtolower(trim($status));

return match ($normalizedStatus) {
'actief', 'active' => true,
'inactief', 'inactive', 'deactief' => false,
Expand All @@ -215,15 +218,15 @@ private function mapStatus(string $status): bool
* @param \OCA\OpenRegister\Service\OrganisationService $organisationService The organisation service
* @param array $mappedData The mapped data
* @param string $organizationUuid The organization UUID
*
*
* @return \OCA\OpenRegister\Db\Organisation The created organisation entity
*/
private function createOrganisationEntityInternal(
\OCA\OpenRegister\Service\OrganisationService $organisationService,
array $mappedData,
string $organizationUuid
): \OCA\OpenRegister\Db\Organisation {

$this->logger->info('OrganisatieService: Creating organisation entity', [
'uuid' => $organizationUuid,
'name' => $mappedData['naam'],
Expand All @@ -235,21 +238,21 @@ private function createOrganisationEntityInternal(
// Let me check what parameters are actually expected and use a simpler approach
$organisationEntity = $organisationService->createOrganisation(
$mappedData['naam'], // name (string)
$mappedData['type'] ?? '', // description (string)
$mappedData['type'] ?? '', // description (string)
false, // addCurrentUser (bool) - don't auto-add current user
$organizationUuid // uuid (string) - might be 4th parameter
);

// Set additional properties after creation
if ($organisationEntity) {
$organisationEntity->setActive($mappedData['active']);
$organisationEntity->setUsers([]); // Will be populated by contact person processing

// Save the updated entity
$organisationMapper = $this->container->get('OCA\OpenRegister\Db\OrganisationMapper');
$organisationMapper->save($organisationEntity);
}

$this->logger->info('OrganisatieService: Organisation entity created successfully', [
'uuid' => $organizationUuid,
'entityId' => $organisationEntity->getId(),
Expand All @@ -264,7 +267,7 @@ private function createOrganisationEntityInternal(
*
* @param string $organizationUuid The organization UUID
* @param array $usernames Array of usernames to add
*
*
* @return bool True if successful
*/
public function addUsersToOrganization(string $organizationUuid, array $usernames): bool
Expand All @@ -278,28 +281,41 @@ public function addUsersToOrganization(string $organizationUuid, array $username
// Get the organization entity
$organisationMapper = $this->container->get('OCA\OpenRegister\Db\OrganisationMapper');
$organisationEntity = $organisationMapper->findByUuid($organizationUuid);

// Get current users and merge with new ones
$currentUsers = $organisationEntity->getUsers() ?? [];
$allUsers = array_unique(array_merge($currentUsers, $usernames));


foreach($usernames as $username) {
$user = $this->userManager->get($username);

$userData = [
'username' => $user->getUID(),
'email' => $user->getEMailAddress(),
'name' => $user->getDisplayName(),
];

$this->emailService->sendUserUpdateEmail($userData, $organisationEntity->jsonSerialize());
}

// Update the entity
$organisationEntity->setUsers($allUsers);
$organisationMapper->save($organisationEntity);

$this->logger->info('OrganisatieService: Successfully added users to organization', [
'organizationUuid' => $organizationUuid,
'totalUsers' => count($allUsers),
'addedUsers' => array_diff($allUsers, $currentUsers)
]);

return true;

} catch (\Exception $e) {
$this->logger->error('OrganisatieService: Failed to add users to organization', [
'organizationUuid' => $organizationUuid,
'error' => $e->getMessage()
]);
var_dump($e->getMessage(), $e->getTraceAsString());
return false;
}
}
Expand All @@ -314,7 +330,7 @@ public function getAdminGroupUsernames(): array
try {
$groupManager = \OC::$server->get('OCP\IGroupManager');
$adminGroup = $groupManager->get('admin');

if ($adminGroup) {
$adminUsers = $adminGroup->getUsers();
$adminUsernames = [];
Expand All @@ -323,7 +339,7 @@ public function getAdminGroupUsernames(): array
}
return $adminUsernames;
}

return [];
} catch (\Exception $e) {
$this->logger->error('OrganisatieService: Failed to get admin users', [
Expand All @@ -332,4 +348,4 @@ public function getAdminGroupUsernames(): array
return [];
}
}
}
}
7 changes: 6 additions & 1 deletion lib/Service/OrganizationSyncService.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ public function performOrganizationsSync(): array

$org = $this->ensureOrganisationEntity($object,$stats);


}

return $stats;
Expand Down Expand Up @@ -247,6 +248,8 @@ public function performUserSync(): array
$sql = $qb->getSQL();
// var_dump($sql);
$users = $qb->execute()->fetchAll();

// var_dump(count($users));
// var_dump('hello');
foreach($users as $user) {
$this->organisatieService->addUsersToOrganization($user['organisation'], [$user['username']]);
Expand Down Expand Up @@ -496,12 +499,14 @@ private function ensureOrganisationEntity(object $organisatieObject, array &$sta
'newActive' => $shouldBeActive
]);

$isActive = $organisationEntity->getActive();

$organisationEntity->setActive($shouldBeActive);
$organisationMapper->save($organisationEntity);
$stats['entitiesUpdated']++;

// Send activation email if organization became active
if ($shouldBeActive && !$organisationEntity->getActive()) {
if ($shouldBeActive && !$isActive) {
$emailSent = $this->sendOrganizationActivationEmail($objectData);
if ($emailSent) {
$this->logger->info('OrganizationSyncService: Organization activation email sent successfully', [
Expand Down
Loading