Ver código fonte

improve the ot:regen-config-files command

Olivier Massot 4 anos atrás
pai
commit
c427506a53

+ 0 - 369
docker/conf/.htaccess

@@ -1,369 +0,0 @@
-#####
-#
-# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver
-#
-# This file includes settings for the following configuration options:
-#
-# - Compression
-# - Caching
-# - MIME types
-# - Cross Origin requests
-# - Rewriting and Access
-# - Miscellaneous
-# - PHP optimisation
-#
-# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its
-# not there already) and rename it to '.htaccess'. To make .htaccess files work, you might need to
-# adjust the 'AllowOverride' directive in your Apache configuration file.
-#
-# IMPORTANT: You may need to change this file depending on your TYPO3 installation!
-#            Consider adding this file's content to your webserver's configuration directly for speed improvement
-#
-# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
-#
-####
-
-SetEnv TYPO3_CONTEXT Development
-SetEnv TYPO3_OPTIMIZE 1
-
-### Begin: Compression ###
-
-# Compressing resource files will save bandwidth and so improve loading speed especially for users
-# with slower internet connections. TYPO3 can compress the .js and .css files for you.
-# *) Uncomment the following lines and
-# *) Set $GLOBALS['TYPO3_CONF_VARS']['BE']['compressionLevel'] = 9 for the Backend
-# *) Set $GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel'] = 9 together with the TypoScript properties
-#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.
-
-<FilesMatch "\.js\.gzip$">
-	AddType "text/javascript" .gzip
-</FilesMatch>
-<FilesMatch "\.css\.gzip$">
-	AddType "text/css" .gzip
-</FilesMatch>
-AddEncoding gzip .gzip
-
-<IfModule mod_deflate.c>
-	# Force compression for mangled `Accept-Encoding` request headers
-	<IfModule mod_setenvif.c>
-		<IfModule mod_headers.c>
-			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
-			RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
-		</IfModule>
-	</IfModule>
-
-	# Compress all output labeled with one of the following media types.
-	#
-	# (!) For Apache versions below version 2.3.7 you don't need to
-	# enable `mod_filter` and can remove the `<IfModule mod_filter.c>`
-	# and `</IfModule>` lines as `AddOutputFilterByType` is still in
-	# the core directives.
-	#
-	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype
-
-	<IfModule mod_filter.c>
-		AddOutputFilterByType DEFLATE application/atom+xml \
-			application/javascript \
-			application/json \
-			application/ld+json \
-			application/manifest+json \
-			application/rdf+xml \
-			application/rss+xml \
-			application/schema+json \
-			application/vnd.geo+json \
-			application/vnd.ms-fontobject \
-			application/x-font-ttf \
-			application/x-javascript \
-			application/x-web-app-manifest+json \
-			application/xhtml+xml \
-			application/xml \
-			font/eot \
-			font/opentype \
-			image/bmp \
-			image/svg+xml \
-			image/vnd.microsoft.icon \
-			image/x-icon \
-			text/cache-manifest \
-			text/css \
-			text/html \
-			text/javascript \
-			text/plain \
-			text/vcard \
-			text/vnd.rim.location.xloc \
-			text/vtt \
-			text/x-component \
-			text/x-cross-domain-policy \
-			text/xml
-	</IfModule>
-
-	<IfModule mod_mime.c>
-		AddEncoding gzip svgz
-	</IfModule>
-</IfModule>
-
-### End: Compression ###
-
-
-
-### Begin: Browser caching of resource files ###
-
-# This affects Frontend and Backend and increases performance.
-<IfModule mod_expires.c>
-
-	ExpiresActive on
-	ExpiresDefault                                      "access plus 1 month"
-
-	ExpiresByType text/css                              "access plus 1 year"
-
-	ExpiresByType application/json                      "access plus 0 seconds"
-	ExpiresByType application/ld+json                   "access plus 0 seconds"
-	ExpiresByType application/schema+json               "access plus 0 seconds"
-	ExpiresByType application/vnd.geo+json              "access plus 0 seconds"
-	ExpiresByType application/xml                       "access plus 0 seconds"
-	ExpiresByType text/xml                              "access plus 0 seconds"
-
-	ExpiresByType image/vnd.microsoft.icon              "access plus 1 week"
-	ExpiresByType image/x-icon                          "access plus 1 week"
-
-	ExpiresByType text/x-component                      "access plus 1 month"
-
-	ExpiresByType text/html                             "access plus 0 seconds"
-
-	ExpiresByType application/javascript                "access plus 1 year"
-	ExpiresByType application/x-javascript              "access plus 1 year"
-	ExpiresByType text/javascript                       "access plus 1 year"
-
-	ExpiresByType application/manifest+json             "access plus 1 week"
-	ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
-	ExpiresByType text/cache-manifest                   "access plus 0 seconds"
-
-	ExpiresByType audio/ogg                             "access plus 1 month"
-	ExpiresByType image/bmp                             "access plus 1 month"
-	ExpiresByType image/gif                             "access plus 1 month"
-	ExpiresByType image/jpeg                            "access plus 1 month"
-	ExpiresByType image/png                             "access plus 1 month"
-	ExpiresByType image/svg+xml                         "access plus 1 month"
-	ExpiresByType image/webp                            "access plus 1 month"
-	ExpiresByType video/mp4                             "access plus 1 month"
-	ExpiresByType video/ogg                             "access plus 1 month"
-	ExpiresByType video/webm                            "access plus 1 month"
-
-	ExpiresByType application/atom+xml                  "access plus 1 hour"
-	ExpiresByType application/rdf+xml                   "access plus 1 hour"
-	ExpiresByType application/rss+xml                   "access plus 1 hour"
-
-	ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
-	ExpiresByType font/eot                              "access plus 1 month"
-	ExpiresByType font/opentype                         "access plus 1 month"
-	ExpiresByType application/x-font-ttf                "access plus 1 month"
-	ExpiresByType application/font-woff                 "access plus 1 month"
-	ExpiresByType application/x-font-woff               "access plus 1 month"
-	ExpiresByType font/woff                             "access plus 1 month"
-	ExpiresByType application/font-woff2                "access plus 1 month"
-
-	ExpiresByType text/x-cross-domain-policy            "access plus 1 week"
-
-</IfModule>
-
-### End: Browser caching of resource files ###
-
-
-### Begin: MIME types ###
-
-# Proper MIME types for all files
-<IfModule mod_mime.c>
-
-	# Data interchange
-	AddType application/atom+xml                        atom
-	AddType application/json                            json map topojson
-	AddType application/ld+json                         jsonld
-	AddType application/rss+xml                         rss
-	AddType application/vnd.geo+json                    geojson
-	AddType application/xml                             rdf xml
-
-	# JavaScript
-	AddType application/javascript                      js
-
-	# Manifest files
-	AddType application/manifest+json                   webmanifest
-	AddType application/x-web-app-manifest+json         webapp
-	AddType text/cache-manifest                         appcache
-
-	# Media files
-
-	AddType audio/mp4                                   f4a f4b m4a
-	AddType audio/ogg                                   oga ogg opus
-	AddType image/bmp                                   bmp
-	AddType image/svg+xml                               svg svgz
-	AddType image/webp                                  webp
-	AddType video/mp4                                   f4v f4p m4v mp4
-	AddType video/ogg                                   ogv
-	AddType video/webm                                  webm
-	AddType video/x-flv                                 flv
-	AddType image/x-icon                                cur ico
-
-	# Web fonts
-	AddType application/font-woff                       woff
-	AddType application/font-woff2                      woff2
-	AddType application/vnd.ms-fontobject               eot
-	AddType application/x-font-ttf                      ttc ttf
-	AddType font/opentype                               otf
-
-	# Other
-	AddType application/octet-stream                    safariextz
-	AddType application/x-bb-appworld                   bbaw
-	AddType application/x-chrome-extension              crx
-	AddType application/x-opera-extension               oex
-	AddType application/x-xpinstall                     xpi
-	AddType text/vcard                                  vcard vcf
-	AddType text/vnd.rim.location.xloc                  xloc
-	AddType text/vtt                                    vtt
-	AddType text/x-component                            htc
-
-</IfModule>
-
-# UTF-8 encoding
-AddDefaultCharset utf-8
-<IfModule mod_mime.c>
-	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml
-</IfModule>
-
-### End: MIME types ###
-
-
-
-### Begin: Cross Origin ###
-
-# Send the CORS header for images when browsers request it.
-<IfModule mod_setenvif.c>
-	<IfModule mod_headers.c>
-		<FilesMatch "\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
-			SetEnvIf Origin ":" IS_CORS
-			Header set Access-Control-Allow-Origin "*" env=IS_CORS
-		</FilesMatch>
-	</IfModule>
-</IfModule>
-
-# Allow cross-origin access to web fonts.
-<IfModule mod_headers.c>
-	<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
-		Header set Access-Control-Allow-Origin "*"
-	</FilesMatch>
-</IfModule>
-
-### End: Cross Origin ###
-
-
-
-### Begin: Rewriting and Access ###
-
-# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).
-
-<IfModule mod_rewrite.c>
-
-	# Enable URL rewriting
-	RewriteEngine On
-
-	# Store the current location in an environment variable CWD to use
-	# mod_rewrite in .htaccess files without knowing the RewriteBase
-	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$
-	RewriteRule ^.*$ - [E=CWD:%2]
-
-	# Rules to set ApplicationContext based on hostname
-	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$
-	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]
-	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$
-	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
-	#RewriteCond %{HTTP_HOST} ^www\.example\.com$
-	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]
-
-	# Rule for versioned static files, configured through:
-	# - $GLOBALS['TYPO3_CONF_VARS']['BE']['versionNumberInFilename']
-	# - $GLOBALS['TYPO3_CONF_VARS']['FE']['versionNumberInFilename']
-	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!
-	RewriteCond %{REQUEST_FILENAME} !-f
-	RewriteCond %{REQUEST_FILENAME} !-d
-	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]
-
-	# Access block for folders
-	RewriteRule _(?:recycler|temp)_/ - [F]
-	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]
-	RewriteRule ^(?:vendor|typo3_src|typo3temp/var) - [F]
-	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]
-
-	# Block access to all hidden files and directories with the exception of
-	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).
-	RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
-	RewriteCond %{SCRIPT_FILENAME} -d [OR]
-	RewriteCond %{SCRIPT_FILENAME} -f
-	RewriteRule (?:^|/)\. - [F]
-
-	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory
-	# NOTE: Add your additional local storages here
-	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]
-
-	# If the file/symlink/directory does not exist => Redirect to index.php.
-	# For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
-	RewriteCond %{REQUEST_FILENAME} !-f
-	RewriteCond %{REQUEST_FILENAME} !-d
-	RewriteCond %{REQUEST_FILENAME} !-l
-	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]
-
-</IfModule>
-
-# Access block for files
-# Apache < 2.3
-<IfModule !mod_authz_core.c>
-	<FilesMatch "(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$">
-		Order allow,deny
-		Deny from all
-		Satisfy All
-	</FilesMatch>
-</IfModule>
-# Apache ≥ 2.3
-<IfModule mod_authz_core.c>
-	<If "%{REQUEST_URI} =~ m#(?i:/\.|/\x23.*\x23|/(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|/composer\.(?:json|lock)|/ext_conf_template\.txt|/ext_typoscript_constants\.txt|/ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$#">
-		Require all denied
-	</If>
-</IfModule>
-
-# Block access to vcs directories
-<IfModule mod_alias.c>
-	RedirectMatch 404 /\.(?:git|svn|hg)/
-</IfModule>
-
-### End: Rewriting and Access ###
-
-
-
-### Begin: Miscellaneous ###
-
-# 404 error prevention for non-existing redirected folders
-Options -MultiViews
-
-# Make sure that directory listings are disabled.
-<IfModule mod_autoindex.c>
-	Options -Indexes
-</IfModule>
-
-<IfModule mod_headers.c>
-	# Force IE to render pages in the highest available mode
-	Header set X-UA-Compatible "IE=edge"
-	<FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$">
-		Header unset X-UA-Compatible
-	</FilesMatch>
-
-	# Reducing MIME type security risks
-	Header set X-Content-Type-Options "nosniff"
-</IfModule>
-
-# ETag removal
-<IfModule mod_headers.c>
-	Header unset ETag
-</IfModule>
-FileETag None
-
-### End: Miscellaneous ###
-
-
-# Add your own rules here.

+ 19 - 0
docker/conf/AdditionalConfiguration.php

@@ -0,0 +1,19 @@
+<?php
+
+if (\TYPO3\CMS\Core\Core\Environment::getContext()->isDevelopment()) {
+    $GLOBALS['TYPO3_CONF_VARS']['BE']['debug'] = '1';
+    $GLOBALS['TYPO3_CONF_VARS']['FE']['debug'] = '1';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['enable_DLOG'] = '1';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '*';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] = '1';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['enableDeprecationLog'] = '';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['sqlDebug'] = '1';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['systemLogLevel'] = '0';
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['exceptionalErrors'] = '28674';
+}
+
+$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['EXT:flux/Resources/Private/Language/locallang.xlf'][0] = 'typo3conf/LFEditor/OverrideFiles/flux/Resources/Private/Language/locallang.xml';
+$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf'][0] = 'typo3conf/LFEditor/OverrideFiles/core/Resources/Private/Language/locallang_mod_web_list.xml';
+$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['EXT:tstemplate/Resources/Private/Language/locallang_info.xlf'][0] = 'typo3conf/LFEditor/OverrideFiles/tstemplate/Resources/Private/Language/locallang_info.xml';
+$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['EXT:frontend/Resources/Private/Language/locallang_tca.xlf'][0] = 'typo3conf/LFEditor/OverrideFiles/frontend/Resources/Private/Language/locallang_tca.xml';
+$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['EXT:core/Resources/Private/Language/locallang_core.xlf'][0] = 'typo3conf/LFEditor/OverrideFiles/core/Resources/Private/Language/locallang_core.xml';

+ 7 - 7
docker/conf/LocalConfiguration.php

@@ -1,8 +1,8 @@
 <?php
 <?php
 return [
 return [
     'BE' => [
     'BE' => [
-        'compressionLevel' => '7',
-        'debug' => false,
+        'compressionLevel' => '5',
+        'debug' => true,
         'enabledBeUserIPLock' => false,
         'enabledBeUserIPLock' => false,
         'installToolPassword' => '$argon2i$v=19$m=65536,t=16,p=1$Z2NIbFRRVlVYZHhoaEUuMg$88qbJUyQLt7mgO0AhyVZIEzLWlX72oJ9oHuvzQHhYBM',
         'installToolPassword' => '$argon2i$v=19$m=65536,t=16,p=1$Z2NIbFRRVlVYZHhoaEUuMg$88qbJUyQLt7mgO0AhyVZIEzLWlX72oJ9oHuvzQHhYBM',
         'interfaces' => 'backend',
         'interfaces' => 'backend',
@@ -144,7 +144,7 @@ return [
                     'writerConfiguration' => [
                     'writerConfiguration' => [
                         5 => [
                         5 => [
                             'TYPO3\CMS\Core\Log\Writer\FileWriter' => [
                             'TYPO3\CMS\Core\Log\Writer\FileWriter' => [
-                                'disabled' => true,
+                                'disabled' => false,
                             ],
                             ],
                         ],
                         ],
                     ],
                     ],
@@ -179,14 +179,14 @@ return [
             ],
             ],
         ],
         ],
         'cookieDomain' => 'opentalent.fr',
         'cookieDomain' => 'opentalent.fr',
-        'devIPmask' => '',
-        'displayErrors' => 0,
+        'devIPmask' => '*',
+        'displayErrors' => 1,
         'encryptionKey' => 'ed7ad07c97e4703bd18aaad78071be42',
         'encryptionKey' => 'ed7ad07c97e4703bd18aaad78071be42',
-        'exceptionalErrors' => 4096,
+        'exceptionalErrors' => 12290,
         'fileCreateMask' => '2660',
         'fileCreateMask' => '2660',
         'folderCreateMask' => '2770',
         'folderCreateMask' => '2770',
         'sitename' => 'Opentalent',
         'sitename' => 'Opentalent',
         'systemLocale' => 'fr_FR.UTF-8',
         'systemLocale' => 'fr_FR.UTF-8',
-        'systemLogLevel' => 2,
+        'systemLogLevel' => 0,
     ],
     ],
 ];
 ];

+ 2 - 3
docker/conf/composer.json

@@ -40,13 +40,12 @@
 		"typo3/cms-tstemplate": "^9.5",
 		"typo3/cms-tstemplate": "^9.5",
 		"fluidtypo3/flux": "^9.4",
 		"fluidtypo3/flux": "^9.4",
 		"fluidtypo3/vhs": "^6.0",
 		"fluidtypo3/vhs": "^6.0",
-		"georgringer/news": "^8.3",
+		"georgringer/news": "^8.4",
 		"helhum/typo3-console": "^5.7",
 		"helhum/typo3-console": "^5.7",
 		"causal/image_autoresize": "^2.0",
 		"causal/image_autoresize": "^2.0",
-		"guzzlehttp/guzzle": "^6",
 		"friendsoftypo3/frontend-editing": "^1.9",
 		"friendsoftypo3/frontend-editing": "^1.9",
 		"sgalinski/lfeditor": "^6.0",
 		"sgalinski/lfeditor": "^6.0",
-		"twig/twig": "^2.13"
+		"twig/twig": "^3.3"
 	},
 	},
 	"scripts":{
 	"scripts":{
 		"typo3-cms-scripts": [
 		"typo3-cms-scripts": [

BIN
docker/conf/sites.tar.gz


+ 55 - 0
ot_admin/Classes/Command/RegenConfigFilesCommand.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace Opentalent\OtAdmin\Command;
+
+
+use Opentalent\OtAdmin\Controller\SiteController;
+use Opentalent\OtCore\Exception\NoSuchOrganizationException;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Object\ObjectManager;
+
+/**
+ * This CLI command create or update the organization config file, and update the identifier field in ot_websites table
+ * This is a light alternative to the update command, designed to be executed on a development env, just after
+ * the databases cloning.
+ *
+ * @package Opentalent\OtAdmin\Command
+ */
+class RegenConfigFilesCommand extends Command
+{
+    /**
+     * -- This method is expected by Typo3, do not rename ou remove --
+     *
+     * Allows to configure the command.
+     * Allows to add a description, a help text, and / or define arguments.
+     *
+     */
+    protected function configure()
+    {
+        $this
+            ->setName("ot:regen-config-files")
+            ->setDescription("Recreate all of the website config files with the Db data");
+    }
+
+    /**
+     * -- This method is expected by Typo3, do not rename ou remove --
+     *
+     * @param InputInterface $input
+     * @param OutputInterface $output
+     * @throws \Exception
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $io = new SymfonyStyle($input, $output);
+        $siteController = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
+        $siteController->regenConfigFilesAction();
+        $io->success(sprintf("The config files were recreated"));
+    }
+}

+ 0 - 106
ot_admin/Classes/Command/UpdateConfigFileCommand.php

@@ -1,106 +0,0 @@
-<?php
-
-namespace Opentalent\OtAdmin\Command;
-
-
-use Opentalent\OtAdmin\Controller\SiteController;
-use Opentalent\OtCore\Exception\NoSuchOrganizationException;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Style\SymfonyStyle;
-use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Object\ObjectManager;
-
-/**
- * This CLI command create or update the organization config file, and update the identifier field in ot_websites table
- * This is a light alternative to the update command, designed to be executed on a development env, just after
- * the databases cloning.
- *
- * @package Opentalent\OtAdmin\Command
- */
-class UpdateConfigFileCommand extends Command
-{
-    /**
-     * -- This method is expected by Typo3, do not rename ou remove --
-     *
-     * Allows to configure the command.
-     * Allows to add a description, a help text, and / or define arguments.
-     *
-     */
-    protected function configure()
-    {
-        $this
-            ->setName("ot:site:gen-config-file")
-            ->setDescription("Update an organization configuration file")
-            ->setHelp("This CLI command creates or updates the organization config file")
-            ->addOption(
-                'all',
-                null,
-                InputOption::VALUE_NONE,
-                "Update all of the organization websites"
-            )
-            ->addArgument(
-                'organization-id',
-                InputArgument::OPTIONAL,
-                "The organization's id in the opentalent DB"
-            );
-    }
-
-    /**
-     * -- This method is expected by Typo3, do not rename ou remove --
-     *
-     * @param InputInterface $input
-     * @param OutputInterface $output
-     * @throws \Exception
-     */
-    protected function execute(InputInterface $input, OutputInterface $output)
-    {
-        $org_id = $input->getArgument('organization-id');
-        $all = $input->getOption('all');
-
-        if ($all && $org_id) {
-            throw new \InvalidArgumentException("You can not pass both an organization id and the --all option");
-        }
-        if (!$all && !$org_id) {
-            throw new \InvalidArgumentException("You shall either pass an organization id or use the --all option");
-        }
-
-        $io = new SymfonyStyle($input, $output);
-
-        $siteController = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
-
-        if ($all) {
-            $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
-            $queryBuilder = $connectionPool->getQueryBuilderForTable('ot_websites');
-            $sites = $queryBuilder
-                ->select('organization_id')
-                ->from('ot_websites')
-                ->where($queryBuilder->expr()->eq('deleted', 0))
-                ->andWhere($queryBuilder->expr()->gt('organization_id', 0))
-                ->execute()
-                ->fetchAll();
-
-            $io->progressStart(count($sites));
-
-            foreach ($sites as $site) {
-                $org_id = $site['organization_id'];
-                try {
-                    $siteController->updateConfigFileAction($org_id);
-                } catch (\Throwable $e) {
-                    $io->error('Organization Id: ' . $org_id . ' - ' . $e->getMessage());
-                }
-                $io->progressAdvance(1);
-            }
-            $io->progressFinish();
-
-            $io->success(sprintf("The websites config files have all been updated"));
-        } else {
-            $identifier = $siteController->updateConfigFileAction($org_id);
-            $io->success(sprintf("The config file with identifier " . $identifier . " has been updated"));
-        }
-    }
-}

+ 32 - 15
ot_admin/Classes/Controller/SiteController.php

@@ -1727,14 +1727,11 @@ class SiteController extends ActionController
     }
     }
 
 
     /**
     /**
-     * Create or update the organization config file, and update the identifier field in ot_websites table
+     * Delete then regenerate all of the typo3 sites yaml config files
      *
      *
-     * This is a light alternative to the updateAction(), designed to be executed on a development env, just after
-     * the databases cloning.
+     * This is a more efficient alternative to the update --all, designed to be executed on a development environment
+     * just after the databases cloning.
      *
      *
-     * @param int $organizationId
-     * @param bool $forceRecreate
-     * @return string
      * @throws NoSuchRecordException
      * @throws NoSuchRecordException
      * @throws NoSuchWebsiteException
      * @throws NoSuchWebsiteException
      * @throws \Doctrine\DBAL\ConnectionException
      * @throws \Doctrine\DBAL\ConnectionException
@@ -1742,18 +1739,37 @@ class SiteController extends ActionController
      * @throws \Opentalent\OtCore\Exception\InvalidWebsiteConfigurationException
      * @throws \Opentalent\OtCore\Exception\InvalidWebsiteConfigurationException
      * @throws \Throwable
      * @throws \Throwable
      */
      */
-    public function updateConfigFileAction(int $organizationId, bool $forceRecreate=false): string
+    public function regenConfigFilesAction()
     {
     {
-        $website = $this->otWebsiteRepository->getWebsiteByOrganizationId($organizationId);
-        $rootUid = $this->otWebsiteRepository->getWebsiteRootUid($website['uid']);
+        $configRootDir = $_ENV['TYPO3_PATH_APP'] . "/config/sites/";
+        $backupConfigDir = $_ENV['TYPO3_PATH_APP'] . "/config/bkp_sites";
+
+        if (file_exists($backupConfigDir)) {
+            throw new \RuntimeException('A directory or a file with this name already exist: ' . $backupConfigDir);
+        }
 
 
         $this->connectionPool->getConnectionByName('Default')->beginTransaction();
         $this->connectionPool->getConnectionByName('Default')->beginTransaction();
         try {
         try {
-            $recorded_identifier = $website['config_identifier'] ?? null;
-            $identifier = $this->writeConfigFile($rootUid, $forceRecreate, $recorded_identifier);
+            // archive the existing files, in case a rollback is needed
+            rename($configRootDir, $backupConfigDir);
+            $this->mkDir($configRootDir);
 
 
-            // ## Update the ot_website identifier
-            if ($recorded_identifier != $identifier) {
+            $websites = $this->otWebsiteRepository->getAll();
+
+            foreach ($websites as $website) {
+                $identifier = $website['subdomain'] . '_' . $website['organization_id'];
+                $configDir = $configRootDir . $identifier;
+                $configFilename = $configDir . "/config.yaml";
+
+                $siteConfig = $this->otWebsiteRepository->generateWebsiteConfiguration($website, $identifier);
+                $config = $siteConfig->getConfiguration();
+
+                $yamlConfig = Yaml::dump($config, 99, 2);
+
+                $this->mkDir($configDir);
+                $this->writeFile($configFilename, $yamlConfig);
+
+                // ## Update the ot_website identifier
                 $queryBuilder = $this->connectionPool->getQueryBuilderForTable('ot_websites');
                 $queryBuilder = $this->connectionPool->getQueryBuilderForTable('ot_websites');
                 $queryBuilder->update('ot_websites')
                 $queryBuilder->update('ot_websites')
                     ->set('config_identifier', $identifier)
                     ->set('config_identifier', $identifier)
@@ -1763,12 +1779,13 @@ class SiteController extends ActionController
 
 
             $commitSuccess = $this->connectionPool->getConnectionByName('Default')->commit();
             $commitSuccess = $this->connectionPool->getConnectionByName('Default')->commit();
             if (!$commitSuccess) {
             if (!$commitSuccess) {
-                throw new \RuntimeException('Something went wrong while commiting the result');
+                throw new \RuntimeException('Something went wrong while committing the result');
             }
             }
-            return $identifier;
         }
         }
         catch (\Throwable $e) {
         catch (\Throwable $e) {
             // rollback
             // rollback
+            rmdir($configRootDir);
+            rename($backupConfigDir, $configRootDir);
             $this->connectionPool->getConnectionByName('Default')->rollback();
             $this->connectionPool->getConnectionByName('Default')->rollback();
             throw $e;
             throw $e;
         }
         }

+ 3 - 3
ot_admin/Configuration/Commands.php

@@ -22,9 +22,6 @@ return [
     'ot:site:update' => [
     'ot:site:update' => [
         'class' => Opentalent\OtAdmin\Command\UpdateSiteCommand::class
         'class' => Opentalent\OtAdmin\Command\UpdateSiteCommand::class
     ],
     ],
-    'ot:site:gen-config-file' => [
-        'class' => Opentalent\OtAdmin\Command\UpdateConfigFileCommand::class
-    ],
     'ot:site:clear-cache' => [
     'ot:site:clear-cache' => [
         'class' => Opentalent\OtAdmin\Command\ClearSiteCacheCommand::class
         'class' => Opentalent\OtAdmin\Command\ClearSiteCacheCommand::class
     ],
     ],
@@ -48,6 +45,9 @@ return [
     ],
     ],
     'ot:scan' => [
     'ot:scan' => [
         'class' => Opentalent\OtAdmin\Command\ScanCommand::class
         'class' => Opentalent\OtAdmin\Command\ScanCommand::class
+    ],
+    'ot:regen-config-files' => [
+        'class' => Opentalent\OtAdmin\Command\RegenConfigFilesCommand::class
     ]
     ]
 ];
 ];
 
 

+ 17 - 0
ot_core/Classes/Website/OtWebsiteRepository.php

@@ -28,6 +28,23 @@ class OtWebsiteRepository
         $this->connectionPool = $connectionPool;
         $this->connectionPool = $connectionPool;
     }
     }
 
 
+    /**
+     * Get an all of the OtWebsite records
+     *
+     */
+    public function getAll(bool $withRestrictions = true): array
+    {
+        $queryBuilder = $this->connectionPool->getQueryBuilderForTable('ot_websites');
+        if (!$withRestrictions) {
+            $queryBuilder->getRestrictions()->removeAll();
+        }
+        return $queryBuilder
+            ->select('*')
+            ->from('ot_websites')
+            ->execute()
+            ->fetchAll();
+    }
+
     /**
     /**
      * Get an OtWebsite by uid
      * Get an OtWebsite by uid
      *
      *