nineskeletor/src/Command/InitCommand.php

648 lines
32 KiB
PHP
Executable File

<?php
namespace App\Command;
use App\Entity\Childattribut;
use App\Entity\Childtype;
use App\Entity\Childtypeattribut;
use App\Entity\Config;
use App\Entity\Cron;
use App\Entity\Group;
use App\Entity\Menu;
use App\Entity\Niveau01;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Id\AssignedGenerator;
use Doctrine\ORM\Mapping\ClassMetadata;
use Ramsey\Uuid\Uuid;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Filesystem\Filesystem;
class InitCommand extends Command
{
private $container;
private $em;
private $output;
private $filesystem;
private $rootmedias;
private $rootlog;
private $appname;
public function __construct(ContainerInterface $container, EntityManagerInterface $em)
{
parent::__construct();
$this->container = $container;
$this->em = $em;
}
protected function configure()
{
$this
->setName('app:Init')
->setDescription('Init Data for App')
->setHelp('This command Init Data App')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->output = $output;
$this->filesystem = new Filesystem();
$this->rootmedias = $this->container->get('kernel')->getProjectDir().'/public/medias';
$this->rootlog = $this->container->get('kernel')->getLogDir().'/';
$this->appname = $this->container->getParameter('appName');
$this->writeln('APP = Default Data');
$metadata = $this->em->getClassMetaData('App\Entity\Group');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
$metadata = $this->em->getClassMetaData('App\Entity\Niveau01');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
$metadata = $this->em->getClassMetaData('App\Entity\User');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
$metadata = $this->em->getClassMetaData('App\Entity\Menu');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
// == ORGANISATION ========================================================================================================================================
// On s'assure que le groupe tout le monde existe
$group = $this->em->getRepository('App\Entity\Group')->findOneBy(['id' => '-1']);
if (!$group) {
$group = new Group();
$group->setId(-1);
$group->setLabel('Tout le monde');
$group->setIsopen(false);
$group->setIsworkgroup(false);
$group->setApikey(Uuid::uuid4());
$this->em->persist($group);
$this->em->flush();
}
// On s'assure qu'il exite un niveau01
$niveau01 = $this->em->getRepository('App\Entity\Niveau01')->findOneBy(['id' => '-1']);
if (!$niveau01) {
$niveau01 = new Niveau01();
$niveau01->setId(-1);
$niveau01->setLabel($this->appname);
$niveau01->setApikey(Uuid::uuid4());
$this->em->persist($niveau01);
$this->em->flush();
}
// On s'assure que le user admin existe
$user = $this->em->getRepository('App\Entity\User')->findOneBy(['id' => '-1']);
if (!$user) {
$user = new User();
$user->setId(-1);
$user->setUsername('admin');
$user->setFirstname('admin');
$user->setLastname($this->appname);
$user->setPassword($this->container->getParameter('appSecret'));
$user->setEmail($this->container->getParameter('appMailnoreply'));
$user->setApikey(Uuid::uuid4());
$user->setAvatar('admin.jpg');
$user->setIsVisible(true);
$user->setIsActive(true);
$user->setNiveau01($niveau01);
$this->em->persist($user);
$this->em->flush();
}
// On s'assure que les appAdmins sont bien admin
foreach ($this->container->getParameter('appAdmins') as $admin) {
$user = $this->em->getRepository('App\Entity\User')->findOneBy(['username' => $admin]);
if ($user && !$user->hasRole('ROLE_ADMIN')) {
$user->setRole('ROLE_ADMIN');
$this->em->flush();
}
}
// == CONFIG ==============================================================================================================================================
// colorbgbody = Couleur des fonds de page
$this->insertConfig(
1, // order
'site', // category
'appname', // id
'Titre de votre site', // title
'', // value
$this->appname, // default
'string', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Titre de votre site'
);
$this->insertConfig(
2, // order
'site', // category
'appsubname', // id
'Sous-titre de votre site', // title
'', // value
'', // default
'string', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Sous-titre de votre site'
);
$this->insertConfig(
3, // order
'site', // category
'appdescription', // id
'Description de votre site', // title
'', // value
'', // default
'editor', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Description de votre site'
);
$this->insertConfig(
10, // order
'site', // category
'appimage', // id
'Image home de votre site', // title
'', // value
'header/body.jpg', // default
'image', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Image home de votre site'
);
$this->insertConfig(
100, // order
'site', // category
'fgforceconnect', // id
'Forcer la connexion', // title
'', // value
'0', // default
'boolean', // type,
true, // visible
true, // changeable
true, // required
'', // grouped
'Forcer la connexion afin de rendre votre site privé'
);
$this->insertConfig(
500, // order
'site', // category
'apptheme', // id
'Thème de votre site', // title
'', // value
'', // default
'string', // type,
false, // visible
true, // changeable
false, // required
'', // grouped
'Thème de votre site'
);
// colorbgbody = Couleur des fonds de page
$this->insertConfig(
1, // order
'colorbgbody', // category
'colorbgbodydark', // id
'Couleur de fond fonçée', // title
'', // value
'#2e3131', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond foncée"
);
$this->insertConfig(
2, // order
'colorbgbody', // category
'colorbgbodylight', // id
'Couleur de fond claire', // title
'', // value
'#ffffff', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond claire"
);
$this->insertConfig(
3, // order
'colorbgbody', // category
'colorbgbodyimportant', // id
'Couleur de fond important', // title
'', // value
'#078eb5', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond important"
);
// colorfttitle = Couleur des fontes titre
$this->insertConfig(
1, // order
'colorfttitle', // category
'colorfttitledark', // id
'Couleur des titres sur fond fonçé', // title
'', // value
'#ffffff', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'La couleur des titres sur fond fonçé'
);
$this->insertConfig(
2, // order
'colorfttitle', // category
'colorfttitlelight', // id
'Couleur des titres sur fond claire', // title
'', // value
'#2e3131', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'La couleur des titres sur fond claire'
);
// colorftbody = Couleur des fontes titre
$this->insertConfig(
1, // order
'colorftbody', // category
'colorftbodydark', // id
'Couleur de la police sur fond fonçé', // title
'', // value
'#ffffff', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'La couleur de la police sur fond fonçé'
);
$this->insertConfig(
2, // order
'colorftbody', // category
'colorftbodylight', // id
'Couleur de la police sur fond claire', // title
'', // value
'#343a40', // default
'color', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'La couleur de la police sur fond claire'
);
// font = nom des polices
$this->insertConfig(
1, // order
'font', // category
'fonttitle', // id
'Police pour les titres', // title
'', // value
'Theboldfont', // default
'font', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'La couleur de la police de votre site'
);
$this->insertConfig(
2, // order
'font', // category
'fontbody', // id
'Police principale', // title
'', // value
'Roboto-Regular', // default
'font', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Nom de la police principale'
);
$this->insertConfig(
3, // order
'font', // category
'fontsizeh1', // id
'Taille des titres h1', // title
'', // value
'40', // default
'integer', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Taille des titres h1 en px'
);
$this->insertConfig(
4, // order
'font', // category
'fontsizeh2', // id
'Taille des titres h2', // title
'', // value
'32', // default
'integer', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Taille des titres h2 en px'
);
$this->insertConfig(
5, // order
'font', // category
'fontsizeh3', // id
'Taille des titres h3', // title
'', // value
'28', // default
'integer', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Taille des titres h3 en px'
);
$this->insertConfig(
6, // order
'font', // category
'fontsizeh4', // id
'Taille des titres h4', // title
'', // value
'24', // default
'integer', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Taille des titres h4 en px'
);
// logo =
$this->insertConfig(
1, // order
'logo', // category
'logodark', // id
'Logo sur fond fonçé', // title
'', // value
'logo.png', // default
'logo', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Logo sur fond fonçé'
);
$this->insertConfig(
2, // order
'logo', // category
'logolight', // id
'Logo sur fond clair', // title
'', // value
'logo.png', // default
'logo', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Logo sur fond clair'
);
// header =
$this->insertConfig(
1, // order
'header', // category
'headerimage', // id
'Image de fond de la bannière', // title
'', // value
'header.jpg', // default
'header', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Image appnamede fond de la bannière'
);
$this->insertConfig(
1, // order
'header', // category
'headerheight', // id
'Hauteur de la bannière', // title
'', // value
'100', // default
'integer', // type,
true, // visible
true, // changeable
false, // required
'', // grouped
'Image de fond de la bannière'
);
// == CRON ================================================================================================================================================
// Job synchronisation des comptes utilisateur
// Toute les 24h à 3h00
$entity = $this->em->getRepository('App\Entity\Cron')->findOneBy(['command' => 'app:Synchro']);
if (!$entity) {
$entity = new Cron();
$nextdate = $entity->getSubmitdate();
$nextdate->setTime(4, 0);
$entity->setCommand('app:Synchro');
$entity->setDescription('Synchronisation des comptes utilisateurs');
$entity->setStatut(1);
$entity->setRepeatinterval(86400);
$entity->setNextexecdate($nextdate);
$this->em->persist($entity);
}
// Job purge des registrations obsolètes
// Toute les 5mn
$entity = $this->em->getRepository('App\Entity\Cron')->findOneBy(['command' => 'app:CleanRegistration']);
if (!$entity) {
$entity = new Cron();
$entity->setCommand('app:CleanRegistration');
$entity->setDescription('Nettoyage des Inscriptions obsolètes');
$entity->setStatut(1);
$entity->setRepeatinterval(300);
$entity->setNextexecdate($entity->getSubmitdate());
$this->em->persist($entity);
}
$this->em->flush();
$output->writeln('');
// == CHILDTYPE ==============================================================================================================================================
// Création des childtypes
$this->insertChildtype(1, 'Articles', 1, 'app_child_submit', true, false, false, false);
$this->insertChildtype(12, 'Images', 12, 'app_child_submit_image', false, true, false, false);
$this->insertChildtype(13, 'Embed Images', 13, 'app_child_submit', false, false, true, false);
$this->insertChildtype(14, 'Vidéos', 14, 'app_child_submit_video', false, true, false, false);
$this->insertChildtype(15, 'Embed Vidéos', 15, 'app_child_submit', false, false, true, false);
$this->insertChildtype(16, 'Ressources', 16, 'app_child_submit_file', true, true, false, false);
$this->insertChildtype(17, 'Embed Ressources', 17, 'app_child_submit', true, false, true, false);
$this->insertChildtype(21, 'Liens Externes', 21, 'app_child_submit', false, false, true, false);
$this->insertChildtype(22, 'Bibliographies', 22, 'app_child_submit', false, false, true, false);
// == MENU ==============================================================================================================================================
$this->insertMenu(-1, 'Entête');
$this->insertMenu(-2, 'Accueil');
return Command::SUCCESS;
}
// == FUNCTIONS ===========================================================================================================================================
private function insertConfig($order, $category, $id, $title, $value, $default, $type, $visible, $changeable, $required, $grouped, $help)
{
$entity = $this->em->getRepository("App\Entity\Config")->find($id);
if (!$entity) {
$entity = new Config();
$entity->setId($id);
$entity->setValue($value);
}
$entity->setDefault($default);
$entity->setCategory($category);
$entity->setOrder($order);
$entity->setTitle($title);
$entity->setType($type);
$entity->setVisible($visible);
$entity->setChangeable($changeable);
$entity->setRequired($required);
$entity->setGrouped($grouped);
$entity->setHelp($help);
$this->em->persist($entity);
$this->em->flush();
}
protected function insertChildtype($id, $name, $roworder, $submitroute, $havechildheader, $havefile, $haveurl, $havepin)
{
$entity = $this->em->getRepository("App\Entity\Childtype")->find($id);
if (!$entity) {
$entity = new Childtype();
$entity->setId($id);
}
$entity->setName($name);
$entity->setRoworder($roworder);
$entity->setSubmitroute($submitroute);
$entity->setHavechildheader($havechildheader);
$entity->setHavefile($havefile);
$entity->setHaveurl($haveurl);
$entity->setHavepin($havepin);
$this->em->persist($entity);
$this->em->flush();
}
protected function insertChildattribut($id, $name, $label, $required, $type, $extra = [])
{
$entity = $this->em->getRepository("App\Entity\Childattribut")->find($id);
if (!$entity) {
$entity = new Childattribut();
$entity->setId($id);
}
$entity->setName($name);
$entity->setLabel($label);
$entity->setRequired($required);
$entity->setType($type);
$entity->setExtra($extra);
$this->em->persist($entity);
$this->em->flush();
}
protected function insertChildtypeattribut($id, $name, $roworder)
{
$type = $this->em->getRepository("App\Entity\Childtype")->find($id);
$attribut = $this->em->getRepository("App\Entity\Childattribut")->findOneBy(['name' => $name]);
$entity = $this->em->getRepository("App\Entity\Childtypeattribut")->findOneBy(['childtype' => $type, 'childattribut' => $attribut]);
if (!$entity) {
$entity = new Childtypeattribut();
}
$entity->setChildtype($type);
$entity->setChildattribut($attribut);
$entity->setRoworder($roworder);
$this->em->persist($entity);
$this->em->flush();
}
private function insertMenu($id, $name)
{
$entity = $this->em->getRepository("App\Entity\Menu")->find($id);
if (!$entity) {
$entity = new Menu();
$entity->setId($id);
}
$entity->setName($name);
$this->em->persist($entity);
$this->em->flush();
}
private function writelnred($string)
{
$this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
}
private function writeln($string)
{
$this->output->writeln($string);
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
}
}