repman-io/repman

View on GitHub
src/Controller/Admin/OrganizationController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace Buddy\Repman\Controller\Admin;

use Buddy\Repman\Entity\Organization\Member;
use Buddy\Repman\Message\Organization\Member\InviteUser;
use Buddy\Repman\Message\Organization\RemoveOrganization;
use Buddy\Repman\Query\Admin\OrganizationQuery;
use Buddy\Repman\Query\Filter;
use Buddy\Repman\Query\User\Model\Organization;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;

final class OrganizationController extends AbstractController
{
    private OrganizationQuery $organizationQuery;
    private MessageBusInterface $messageBus;

    public function __construct(
        OrganizationQuery $organizationQuery,
        MessageBusInterface $messageBus
    ) {
        $this->organizationQuery = $organizationQuery;
        $this->messageBus = $messageBus;
    }

    /**
     * @Route("/admin/organization", name="admin_organization_list", methods={"GET"})
     */
    public function list(Request $request): Response
    {
        $filter = Filter::fromRequest($request);

        return $this->render('admin/organization/list.html.twig', [
            'organizations' => $this->organizationQuery->findAll($filter),
            'count' => $this->organizationQuery->count(),
            'filter' => $filter,
        ]);
    }

    /**
     * @Route("/admin/organization/{organization}", name="admin_organization_remove", methods={"DELETE"}, requirements={"organization"="%organization_pattern%"})
     */
    public function remove(Organization $organization, Request $request): Response
    {
        $this->messageBus->dispatch(new RemoveOrganization($organization->id()));
        $this->addFlash('success', sprintf('Organization %s has been successfully removed', $organization->name()));

        return $this->redirectToRoute('admin_organization_list');
    }

    /**
     * @Route("/admin/organization/{organization}", name="admin_organization_add_admin", methods={"POST"}, requirements={"organization"="%organization_pattern%"})
     */
    public function addAdmin(Organization $organization, Request $request): Response
    {
        /** @var \Buddy\Repman\Security\Model\User $user */
        $user = $this->getUser();

        $this->messageBus->dispatch(new InviteUser(
            $user->email(),
            Member::ROLE_OWNER,
            $organization->id(),
            Uuid::uuid4()->toString()
        ));

        $this->addFlash('success', sprintf('The user %s has been successfully invited for %s', $user->email(), $organization->name()));

        return $this->redirectToRoute('admin_organization_list');
    }

    /**
     * @Route("/admin/stats", name="admin_stats", methods={"GET"})
     */
    public function stats(Request $request): Response
    {
        $days = min(max((int) $request->get('days', 30), 7), 365);

        return $this->render('admin/stats.html.twig', [
            'installs' => $this->organizationQuery->getInstalls($days),
            'days' => $days,
        ]);
    }
}