From 4ccbd757593e6de41f4fa4a9741e3984726ec5ca Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 26 Jul 2016 18:30:51 -0300 Subject: [PATCH 1/3] Ivan - Add initial settings and initial mail templates [skip ci] --- server/controllers/system.php | 9 +++ server/controllers/system/init-settings.php | 61 +++++++++++++++++++ server/{models => data}/ERRORS.php | 1 + server/{models => data}/EXCEPTIONS.php | 0 server/data/InitialMails.php | 18 ++++++ .../data/mail-templates/user-signup-en.html | 4 ++ .../data/mail-templates/user-signup-es.html | 4 ++ server/index.php | 9 +++ server/models/Comment.php | 4 -- server/models/DataStore.php | 10 ++- server/models/MailTemplate.php | 18 +++--- server/models/SessionCookie.php | 4 -- server/models/Setting.php | 17 ++++++ 13 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 server/controllers/system.php create mode 100644 server/controllers/system/init-settings.php rename server/{models => data}/ERRORS.php (87%) rename server/{models => data}/EXCEPTIONS.php (100%) create mode 100644 server/data/InitialMails.php create mode 100644 server/data/mail-templates/user-signup-en.html create mode 100644 server/data/mail-templates/user-signup-es.html create mode 100644 server/models/Setting.php diff --git a/server/controllers/system.php b/server/controllers/system.php new file mode 100644 index 00000000..cea7f0c1 --- /dev/null +++ b/server/controllers/system.php @@ -0,0 +1,9 @@ +setGroupPath('/system'); + +$systemControllerGroup->addController(new InitSettingsController); + +$systemControllerGroup->finalize(); \ No newline at end of file diff --git a/server/controllers/system/init-settings.php b/server/controllers/system/init-settings.php new file mode 100644 index 00000000..e1a3bbbe --- /dev/null +++ b/server/controllers/system/init-settings.php @@ -0,0 +1,61 @@ + 'any', + 'requestData' => [] + ]; + } + + public function handler() { + if (Setting::isTableEmpty()) { + $this->storeGlobalSettings(); + $this->storeMailTemplates(); + + Response::respondSuccess(); + } else { + Response::respondError(ERRORS::INIT_SETTINGS_DONE); + } + } + + private function storeGlobalSettings() { + $this->storeSettings([ + 'language' => 'en' + ]); + } + + private function storeMailTemplates() { + $mails = InitialMails::retrieve(); + + foreach ($mails as $mailType => $mailLanguages) { + foreach ($mailLanguages as $mailLanguage => $mailContent) { + $mailTemplate = new MailTemplate(); + + $mailTemplate->setProperties([ + 'type' => $mailType, + 'language' => $mailLanguage, + 'subject' => $mailContent['subject'], + 'body' => $mailContent['body'] + ]); + + $mailTemplate->store(); + } + } + } + + private function storeSettings($settings) { + foreach ($settings as $settingName => $settingValue) { + $setting = new Setting(); + + $setting->setProperties([ + 'name' => $settingName, + 'value' => $settingValue + ]); + + $setting->store(); + } + } +} \ No newline at end of file diff --git a/server/models/ERRORS.php b/server/data/ERRORS.php similarity index 87% rename from server/models/ERRORS.php rename to server/data/ERRORS.php index 4c3017ce..52e5ad95 100644 --- a/server/models/ERRORS.php +++ b/server/data/ERRORS.php @@ -8,4 +8,5 @@ class ERRORS { const INVALID_EMAIL = 'Invalid email'; const INVALID_PASSWORD = 'Invalid password'; const INVALID_NAME = 'Invalid name'; + const INIT_SETTINGS_DONE = 'Settings already initialized'; } diff --git a/server/models/EXCEPTIONS.php b/server/data/EXCEPTIONS.php similarity index 100% rename from server/models/EXCEPTIONS.php rename to server/data/EXCEPTIONS.php diff --git a/server/data/InitialMails.php b/server/data/InitialMails.php new file mode 100644 index 00000000..cadfa401 --- /dev/null +++ b/server/data/InitialMails.php @@ -0,0 +1,18 @@ + [ + 'en' => [ + 'subject' => 'Signup {{to}} - OpenSupports', + 'body' => file_get_contents('data/mail-templates/user-signup-en.html') + ], + 'es' => [ + 'subject' => 'Registrado {{to}} - OpenSupports', + 'body' => file_get_contents('data/mail-templates/user-signup-es.html') + ] + ] + ]; + } +} \ No newline at end of file diff --git a/server/data/mail-templates/user-signup-en.html b/server/data/mail-templates/user-signup-en.html new file mode 100644 index 00000000..371a2441 --- /dev/null +++ b/server/data/mail-templates/user-signup-en.html @@ -0,0 +1,4 @@ +
+ Welcome, {{name}} to our support center, + your email is {{to}} +
diff --git a/server/data/mail-templates/user-signup-es.html b/server/data/mail-templates/user-signup-es.html new file mode 100644 index 00000000..0f633383 --- /dev/null +++ b/server/data/mail-templates/user-signup-es.html @@ -0,0 +1,4 @@ +
+ Bienvenido, {{name}} a nuestro centro de soporte, + su email es {{to}} +
\ No newline at end of file diff --git a/server/index.php b/server/index.php index 04edd2e7..7a72813e 100644 --- a/server/index.php +++ b/server/index.php @@ -16,6 +16,15 @@ include_once 'libs/ControllerGroup.php'; include_once 'libs/Hashing.php'; include_once 'libs/MailSender.php'; +// LOAD DATA +spl_autoload_register(function ($class) { + $classPath = "data/{$class}.php"; + + if(file_exists($classPath)) { + include_once $classPath; + } +}); + // LOAD MODELS spl_autoload_register(function ($class) { $classPath = "models/{$class}.php"; diff --git a/server/models/Comment.php b/server/models/Comment.php index da011200..c5dfb3c5 100644 --- a/server/models/Comment.php +++ b/server/models/Comment.php @@ -12,8 +12,4 @@ class Comment extends DataStore { 'date' ); } - - protected function getDefaultProps() { - return array(); - } } \ No newline at end of file diff --git a/server/models/DataStore.php b/server/models/DataStore.php index 7a782707..b2ce2d64 100644 --- a/server/models/DataStore.php +++ b/server/models/DataStore.php @@ -4,8 +4,8 @@ use RedBeanPHP\Facade as RedBean; abstract class DataStore { protected $_bean; - public function getDefaultProps() { - return []; + public static function isTableEmpty() { + return (RedBean::count(static::TABLE) === 0); } public static function getDataStore($value, $property = 'id') { @@ -31,6 +31,10 @@ abstract class DataStore { } } + public function getDefaultProps() { + return []; + } + public function delete() { RedBean::trash($this->getBeanInstance()); unset($this); @@ -65,7 +69,7 @@ abstract class DataStore { $validProp = false; foreach (static::getProps() as $prop) { - if($propToValidate === $prop) { + if ($propToValidate === $prop) { $validProp = true; } } diff --git a/server/models/MailTemplate.php b/server/models/MailTemplate.php index 27742437..2c41041a 100644 --- a/server/models/MailTemplate.php +++ b/server/models/MailTemplate.php @@ -1,4 +1,6 @@ $type, + ':language' => $globalLanguage + )); - $template = new MailTemplate(); - $template->setProperties([ - 'type' => $type, - 'subject' => 'Test Subject for {{to}}', - 'body' => 'Test body for {{to}}' - ]); - return $template; + return ($bean) ? new MailTemplate($bean) : null; } public static function getProps() { diff --git a/server/models/SessionCookie.php b/server/models/SessionCookie.php index 5a9e7f06..94460333 100644 --- a/server/models/SessionCookie.php +++ b/server/models/SessionCookie.php @@ -12,8 +12,4 @@ class SessionCookie extends DataStore { 'expirationDate' ); } - - public function getDefaultProps() { - return array(); - } } diff --git a/server/models/Setting.php b/server/models/Setting.php new file mode 100644 index 00000000..5c961113 --- /dev/null +++ b/server/models/Setting.php @@ -0,0 +1,17 @@ + Date: Wed, 27 Jul 2016 00:44:07 -0300 Subject: [PATCH 2/3] Ivan - Fix issues with mail templating and add it to ruby tests [skip ci] --- server/models/MailTemplate.php | 3 ++- server/models/Setting.php | 2 +- server/tests/controllers/user/loginTest.php | 2 +- tests/init.rb | 1 + tests/libs.rb | 6 +++--- tests/system/init-settings.rb | 10 ++++++++++ 6 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 tests/system/init-settings.rb diff --git a/server/models/MailTemplate.php b/server/models/MailTemplate.php index 2c41041a..2d031e91 100644 --- a/server/models/MailTemplate.php +++ b/server/models/MailTemplate.php @@ -12,7 +12,7 @@ class MailTemplate extends DataStore { $bean = RedBean::findOne(MailTemplate::TABLE, 'type = :type AND language = :language', array( ':type' => $type, - ':language' => $globalLanguage + ':language' => $globalLanguage->value )); return ($bean) ? new MailTemplate($bean) : null; @@ -22,6 +22,7 @@ class MailTemplate extends DataStore { return [ 'type', 'subject', + 'language', 'body' ]; } diff --git a/server/models/Setting.php b/server/models/Setting.php index 5c961113..0df2404b 100644 --- a/server/models/Setting.php +++ b/server/models/Setting.php @@ -4,7 +4,7 @@ class Setting extends DataStore { const TABLE = 'setting'; public static function getSetting($name) { - return parent::getDataStore('name', $name); + return parent::getDataStore($name, 'name'); } public static function getProps() { diff --git a/server/tests/controllers/user/loginTest.php b/server/tests/controllers/user/loginTest.php index 7b80f38b..13d29800 100644 --- a/server/tests/controllers/user/loginTest.php +++ b/server/tests/controllers/user/loginTest.php @@ -5,7 +5,7 @@ include_once 'tests/__mocks__/ResponseMock.php'; include_once 'tests/__mocks__/ControllerMock.php'; include_once 'tests/__mocks__/SessionMock.php'; include_once 'tests/__mocks__/UserMock.php'; -include_once 'models/ERRORS.php'; +include_once 'data/ERRORS.php'; include_once 'controllers/user/login.php'; diff --git a/tests/init.rb b/tests/init.rb index 9a3a25e6..5c5f792b 100644 --- a/tests/init.rb +++ b/tests/init.rb @@ -8,6 +8,7 @@ require './libs.rb' require './scripts.rb' # TESTS +require './system/init-settings.rb' require './user/signup.rb' require './user/login.rb' require './user/send-recover-password.rb' diff --git a/tests/libs.rb b/tests/libs.rb index 7472135a..1da036ee 100644 --- a/tests/libs.rb +++ b/tests/libs.rb @@ -1,5 +1,5 @@ -def request(path, data) +def request(path, data = {}) uri = URI('http://localhost:8080' + path) response = Net::HTTP.post_form(uri, data) @@ -8,8 +8,8 @@ end class Database def initialize() - mysqlUser = ENV['MYSQL_USER'] || 'root'; - mysqlPass = ENV['MYSQL_PASSWORD'] || ''; + mysqlUser = ENV['MYSQL_USER'] || 'root' + mysqlPass = ENV['MYSQL_PASSWORD'] || '' @connection = Mysql.new('localhost', mysqlUser , mysqlPass, 'development') end diff --git a/tests/system/init-settings.rb b/tests/system/init-settings.rb new file mode 100644 index 00000000..e12fd28d --- /dev/null +++ b/tests/system/init-settings.rb @@ -0,0 +1,10 @@ +describe '/system/init-settings' do + it 'should initialize correctly' do + result = request('/system/init-settings') + + lang = $database.getRow('setting', 'language', 'name') + + (result['status']).should.equal('success') + (lang['value']).should.equal('en') + end +end \ No newline at end of file From d23fba451ee0d6e16b32c997f92ced1430b6e737 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 27 Jul 2016 01:04:29 -0300 Subject: [PATCH 3/3] Ivan - Add smtp settings [skip ci] --- server/controllers/system/init-settings.php | 7 ++++++- server/libs/MailSender.php | 22 +++++++++------------ server/models/MailTemplate.php | 2 +- server/models/Setting.php | 4 +++- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/server/controllers/system/init-settings.php b/server/controllers/system/init-settings.php index e1a3bbbe..578791b5 100644 --- a/server/controllers/system/init-settings.php +++ b/server/controllers/system/init-settings.php @@ -23,7 +23,12 @@ class InitSettingsController extends Controller { private function storeGlobalSettings() { $this->storeSettings([ - 'language' => 'en' + 'language' => 'en', + 'no-reply-email' => 'noreply@opensupports.com', + 'smtp-host' => 'localhost', + 'smtp-port' => 7070, + 'smtp-user' => '', + 'smtp-pass' => '', ]); } diff --git a/server/libs/MailSender.php b/server/libs/MailSender.php index e419f07f..869b97c2 100644 --- a/server/libs/MailSender.php +++ b/server/libs/MailSender.php @@ -3,15 +3,13 @@ class MailSender { private $mailOptions = []; - //TODO: Add real initial options when Settings class is available public function __construct() { - $this->mailOptions['from'] = 'noreply@opensupports.com'; + $this->mailOptions['from'] = Setting::getSetting('no-reply-email'); - //SMTP Options - $this->mailOptions['smtp_host'] = 'localhost'; - $this->mailOptions['smtp_port'] = 7070; - $this->mailOptions['smtp_user'] = ''; - $this->mailOptions['smtp_pass'] = ''; + $this->mailOptions['smtp-host'] = Setting::getSetting('smtp-host'); + $this->mailOptions['smtp-port'] = Setting::getSetting('smtp-host'); + $this->mailOptions['smtp-user'] = Setting::getSetting('smtp-host'); + $this->mailOptions['smtp-pass'] = Setting::getSetting('smtp-host'); } public function setTemplate($type, $config) { @@ -29,14 +27,12 @@ class MailSender { $mailer->Subject = $this->mailOptions['subject']; $mailer->Body = $this->mailOptions['body']; - //$mailer->SMTPDebug = 3; $mailer->isSMTP(); $mailer->SMTPAuth = true; - $mailer->Host = $this->mailOptions['smtp_host']; - $mailer->Port = $this->mailOptions['smtp_port']; - $mailer->Username = $this->mailOptions['smtp_user']; - $mailer->Password = $this->mailOptions['smtp_pass']; - //$mailer->SMTPSecure = "tls"; + $mailer->Host = $this->mailOptions['smtp-host']; + $mailer->Port = $this->mailOptions['smtp-port']; + $mailer->Username = $this->mailOptions['smtp-user']; + $mailer->Password = $this->mailOptions['smtp-pass']; $mailer->Timeout = 1000; if ($mailer->smtpConnect()) { diff --git a/server/models/MailTemplate.php b/server/models/MailTemplate.php index 2d031e91..14bf7fa0 100644 --- a/server/models/MailTemplate.php +++ b/server/models/MailTemplate.php @@ -12,7 +12,7 @@ class MailTemplate extends DataStore { $bean = RedBean::findOne(MailTemplate::TABLE, 'type = :type AND language = :language', array( ':type' => $type, - ':language' => $globalLanguage->value + ':language' => $globalLanguage )); return ($bean) ? new MailTemplate($bean) : null; diff --git a/server/models/Setting.php b/server/models/Setting.php index 0df2404b..c6015d8d 100644 --- a/server/models/Setting.php +++ b/server/models/Setting.php @@ -4,7 +4,9 @@ class Setting extends DataStore { const TABLE = 'setting'; public static function getSetting($name) { - return parent::getDataStore($name, 'name'); + $dataStore = parent::getDataStore($name, 'name'); + + return ($dataStore !== null) ? $dataStore->value : null; } public static function getProps() {