]>
Commit | Line | Data |
---|---|---|
bf6c0346 TC |
1 | <?php |
2 | ||
3 | namespace Wallabag\FederationBundle\Command; | |
4 | ||
5 | use Doctrine\ORM\NoResultException; | |
6 | use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; | |
7 | use Symfony\Component\Console\Input\InputArgument; | |
8 | use Symfony\Component\Console\Input\InputInterface; | |
9 | use Symfony\Component\Console\Output\OutputInterface; | |
10 | use Wallabag\FederationBundle\Entity\Account; | |
11 | use Wallabag\FederationBundle\Entity\Instance; | |
12 | use Wallabag\UserBundle\Entity\User; | |
13 | ||
14 | class CreateAccountsCommand extends ContainerAwareCommand | |
15 | { | |
16 | /** @var OutputInterface */ | |
17 | protected $output; | |
18 | ||
19 | protected $created = 0; | |
20 | ||
21 | protected function configure() | |
22 | { | |
23 | $this | |
24 | ->setName('wallabag:federation:create-accounts') | |
25 | ->setDescription('Creates missing federation accounts') | |
26 | ->setHelp('This command creates accounts for federation for missing users') | |
27 | ->addArgument( | |
28 | 'username', | |
29 | InputArgument::OPTIONAL, | |
30 | 'User to create an account for' | |
31 | ); | |
32 | } | |
33 | ||
34 | protected function execute(InputInterface $input, OutputInterface $output) | |
35 | { | |
36 | $this->output = $output; | |
37 | ||
38 | $domainName = $this->getContainer()->getParameter('domain_name'); | |
39 | $instance = $this->checkInstance($domainName); | |
40 | ||
41 | $username = $input->getArgument('username'); | |
42 | ||
43 | if ($username) { | |
44 | try { | |
45 | $user = $this->getUser($username); | |
46 | $this->createAccount($user, $instance); | |
47 | } catch (NoResultException $e) { | |
48 | $output->writeln(sprintf('<error>User "%s" not found.</error>', $username)); | |
49 | ||
50 | return 1; | |
51 | } | |
52 | } else { | |
53 | $users = $this->getDoctrine()->getRepository('WallabagUserBundle:User')->findAll(); | |
54 | ||
55 | $output->writeln(sprintf('Creating through %d user federated accounts', count($users))); | |
56 | ||
57 | foreach ($users as $user) { | |
58 | $output->writeln(sprintf('Processing user %s', $user->getUsername())); | |
59 | $this->createAccount($user, $instance); | |
60 | } | |
61 | $output->writeln(sprintf('Creating user federated accounts. %d accounts created in total', $this->created)); | |
62 | } | |
63 | ||
64 | return 0; | |
65 | } | |
66 | ||
67 | /** | |
68 | * @param User $user | |
69 | * @param $instance | |
70 | */ | |
71 | private function createAccount(User $user, Instance $instance) | |
72 | { | |
73 | $em = $this->getContainer()->get('doctrine.orm.entity_manager'); | |
74 | $repo = $em->getRepository('WallabagFederationBundle:Account'); | |
75 | ||
76 | if ($repo->findBy(['user' => $user->getId()])) { | |
77 | return; | |
78 | } | |
79 | ||
80 | $account = new Account(); | |
81 | $account->setUsername($user->getUsername()) | |
82 | ->setUser($user) | |
83 | ->setServer($instance); | |
84 | ||
85 | $em->persist($account); | |
86 | $em->flush(); | |
87 | ||
88 | $user->setAccount($account); | |
89 | $em->persist($account); | |
90 | $em->flush(); | |
91 | ||
92 | ++$this->created; | |
93 | } | |
94 | ||
95 | private function checkInstance($domainName) | |
96 | { | |
97 | $em = $this->getContainer()->get('doctrine.orm.entity_manager'); | |
98 | $repo = $em->getRepository('WallabagFederationBundle:Instance'); | |
99 | ||
100 | $instance = $repo->findOneByDomain($domainName); | |
101 | if (!$instance) { | |
102 | $instance = new Instance($domainName); | |
103 | ||
104 | $em->persist($instance); | |
105 | $em->flush(); | |
106 | } | |
107 | return $instance; | |
108 | } | |
109 | ||
110 | /** | |
111 | * Fetches a user from its username. | |
112 | * | |
113 | * @param string $username | |
114 | * | |
115 | * @return \Wallabag\UserBundle\Entity\User | |
116 | */ | |
117 | private function getUser($username) | |
118 | { | |
119 | return $this->getDoctrine()->getRepository('WallabagUserBundle:User')->findOneByUserName($username); | |
120 | } | |
121 | ||
122 | private function getDoctrine() | |
123 | { | |
124 | return $this->getContainer()->get('doctrine'); | |
125 | } | |
126 | } |