diff options
Diffstat (limited to 'src/Wallabag/FederationBundle/Command/CreateAccountsCommand.php')
-rw-r--r-- | src/Wallabag/FederationBundle/Command/CreateAccountsCommand.php | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/Wallabag/FederationBundle/Command/CreateAccountsCommand.php b/src/Wallabag/FederationBundle/Command/CreateAccountsCommand.php new file mode 100644 index 00000000..f2ca3b06 --- /dev/null +++ b/src/Wallabag/FederationBundle/Command/CreateAccountsCommand.php | |||
@@ -0,0 +1,126 @@ | |||
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 | } | ||