diff --git a/README b/README index 62937bae7..d6a7e9ebb 100644 --- a/README +++ b/README @@ -1,35 +1,36 @@ # ocs-fileserver LICENSE: GNU AGPLv3+ Copyright 2016 by pling GmbH. ## Dependencies The following directories need full access rights in the file system: "project_root"/cache/ "project_root"/cache/data "project_root"/cache/sessions "project_root"/application/log "project_root"/httpdocs/img/cache "project_root"/httpdocs/img/cache/rendered "project_root"/httpdocs/img/cache/request "project_root"/httpdocs/img/data "project_root"/httpdocs/img/data/tmp ## Dependencies sudo apt-get install apache2 php5 php5-mysql sudo apt-get install git sudo apt-get install php5-memcached sudo apt-get install php5-curl sudo apt-get install php5-apcu sudo apt-get install php5-mcrypt sudo php5enmod mcrypt sudo service apache2 restart + diff --git a/application/configs/application.ini b/application/configs/application.ini index 9c1c8ec39..483deab3f 100644 --- a/application/configs/application.ini +++ b/application/configs/application.ini @@ -1,412 +1,411 @@ [production] version = "v1.93" ;phpSettings.date.timezone = "America/New_York" phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 resources.frontController.params.displayExceptions = 0 includePaths.library = APPLICATION_PATH "/../library" autoloaderNamespaces[] = "Local_" autoloaderNamespaces[] = "Ppload_" autoloaderNamespaces[] = "Crontab_" autoloaderNamespaces[] = "Cgsmith" bootstrap.path = APPLICATION_PATH "/modules/default/Bootstrap.php" bootstrap.class = "Bootstrap" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.defaultModule = "default" resources.frontController.baseurl = "/" resources.modules[] = resources.layout.layout = "flat_ui_template" resources.layout.layoutPath = APPLICATION_PATH "/modules/default/views/layout" resources.view[] = resources.view.encoding = "UTF-8" resources.view.doctype = "XHTML5" resources.view.contentType = "text/html;charset=utf-8" resources.locale.default = "en_US" resources.locale.force = false resources.locale.registry_key = "Zend_Locale" resources.db.adapter = "pdo_mysql" resources.db.params.host = "host" resources.db.params.username = "uname" resources.db.params.password = "pass" resources.db.params.dbname = "dbname" resources.db.params.charset = "utf8" resources.db.params.type = "pdo_mysql" resources.db.params.driver_options.1002 = "SET NAMES utf8" resources.db.isDefaultTableAdapter = true resources.mail.transport.type = Zend_Mail_Transport_Smtp resources.mail.transport.host = "email-host" resources.mail.transport.port = 587 resources.mail.transport.auth = "login" resources.mail.transport.username = "uname" resources.mail.transport.password = "pass" resources.mail.transport.ssl = "tls" resources.mail.defaultFrom.email = from@ocs-webserver.org resources.mail.defaultFrom.name = "ocs-webserver.org" resources.mail.defaultReplyTo.email = contact@ocs-webserver.org resources.mail.defaultReplyTo.name = "ocs-webserver.org" resources.translate.registry_key = "Zend_Translate" resources.translate.adapter = array resources.translate.options.scan = "directory" resources.translate.locale = "en_US" resources.translate.data.de_DE = APPLICATION_DATA "/locales/de_DE.php" resources.translate.data.en_US = APPLICATION_DATA "/locales/en_US.php" resources.translate.data.zh_CN = APPLICATION_DATA "/locales/zh_CN.php" resources.log.stream.writerName = "Stream" resources.log.stream.writerParams.stream = APPLICATION_PATH "/../data/logs/application.log" resources.log.stream.writerParams.mode = "a" ;resources.log.stream.filterName = "Priority" ;resources.log.stream.filterParams.priority = 8 queue.validate.name = "website_validate" queue.validate.dbAdapter = "Local_Queue_Adapter_Db" queue.validate.messageAdapter = "Local_Queue_Adapter_Db_Message" queue.validate.maxMessages = 1 images.upload.path = APPLICATION_PATH "/../httpdocs/img/data/" images.media.server = "http://cn.ocs-webserver.org" images.media.upload = "http://cn.ocs-webserver.org/image_bucket_upload.php" videos.upload.path = APPLICATION_PATH "/../httpdocs/video/data/" videos.media.server = "http://video.ocs-webserver.org" videos.media.upload = "http://video.ocs-webserver.org/video_upload.php" videos.media.cdnserver = "http://cdn.ocs-webserver.org/" third_party.paypal.sandbox.active = 0 third_party.paypal.security.userid = "ppuid" third_party.paypal.security.password = "pppass" third_party.paypal.security.signature = "ppsig" third_party.paypal.facilitator_fee_receiver = "receiver@mail.com" third_party.paypal.facilitator_fee = 0 third_party.paypal.application.id = "APP-ID" third_party.paypal.api.endpoint = "https://svcs.paypal.com" third_party.paypal.form.endpoint = "https://ic.paypal.com" third_party.paypal.ipn.endpoint = "https://www.paypal.com" third_party.paypal.masspay.endpoint = "https://api-3t.paypal.com/nvp" third_party.paypal.masspay.ipn.endpoint = "https://ipnpb.paypal.com/cgi-bin" third_party.paypal.service.version = "1.2.0" third_party.paypal.request.data.format = "NV" third_party.paypal.response.data.format = "NV" third_party.paypal.client.auth = "Nocert" third_party.paypal.client.application_id = "app" third_party.paypal.client.partner_name = "partner" third_party.paypal.merchantid = 0 third_party.dwolla.consumer.access_key = "key" third_party.dwolla.consumer.access_secret = "sec" third_party.dwolla.consumer.token = "token" third_party.dwolla.api.endpoint = "https://www.dwolla.com" third_party.dwolla.facilitator_fee = 0 third_party.github.client_id = "" third_party.github.client_secret = "" third_party.github.client_callback = $_SERVER['HTTP_HOST'] "/oauth/github" third_party.ocs.client_id = "" third_party.ocs.client_secret = "" third_party.ocs.client_callback = $_SERVER['HTTP_HOST'] "/oauth/ocs" ; ppload third_party.ppload.server = "https://www.ocs-fileserver.org" third_party.ppload.api_uri = "https://www.ocs-fileserver.org/api/" third_party.ppload.client_id = "clientid" third_party.ppload.secret = "sec" third_party.ppload.download_secret = "sec" admin.email = "contact@ocs-webserver.org" website.tracking.chartbeat = "/js/tracking/chartbeat.js" website.tracking.google = "/js/tracking/goggle.js" settings.cache.path = APPLICATION_CACHE settings.log.path = APPLICATION_DATA "/logs/" settings.search.path = APPLICATION_DATA "/indexes/" phpSettings.session.name = "OcsWebserverId" phpSettings.session.save_path = APPLICATION_DATA "/sessions" phpSettings.session.cookie_httponly = true phpSettings.session.cookie_lifetime = 31536000 phpSettings.session.gc_maxlifetime = 7776000 settings.session.remember_me.name = "OcsWebserverRememberMe" settings.session.remember_me.cookie_lifetime = 31536000 settings.session.remember_me.cookie_httponly = true settings.session.auth.name = "OcsWebserverSession" settings.session.auth.cookie_lifetime = 31536000 settings.session.auth.cookie_path = "/" settings.session.auth.cookie_httponly = true settings.session.filter_browse_original = 'FilterBrowseOriginalSession' settings.session.saveHandler.replace.enabled = true settings.session.saveHandler.cache.type = "Libmemcached" settings.session.saveHandler.class = "Local_Session_Handler_Memcache" settings.session.saveHandler.options.servers.0.host = "memcachehost" settings.session.saveHandler.options.servers.0.port = 11211 settings.session.saveHandler.options.servers.0.persistent = true settings.session.saveHandler.options.servers.0.status = true settings.session.saveHandler.options.compression = true settings.cache.enabled = true settings.cache.frontend.type = Core settings.cache.frontend.options.lifetime = 600 settings.cache.frontend.options.automatic_serialization = true settings.cache.frontend.options.cache_id_prefix = "[some string]" settings.cache.frontend.options.cache = true settings.cache.backend.type = "Libmemcached" settings.cache.backend.options.servers.0.host = "memcachehost" settings.cache.backend.options.servers.0.port = 11211 settings.cache.backend.options.servers.0.persistent = true settings.cache.backend.options.servers.0.weight = 1 settings.cache.backend.options.servers.0.timeout = 5 settings.cache.backend.options.servers.0.retry_interval = 15 ; alternative backend file cache, if no memcache installed (only for development environments) ;settings.cache.backend.type = "File" ;settings.cache.backend.options.cache_dir = APPLICATION_CACHE ;settings.cache.backend.options.file_locking = true ;settings.cache.backend.options.read_control = true ;settings.cache.backend.options.read_control_type = 'crc32' ;settings.cache.backend.options.hashed_directory_level = 1 ;settings.cache.backend.options.hashed_directory_perm = 0700 ;settings.cache.backend.options.file_name_prefix = 'ocs' ;settings.cache.backend.options.cache_file_perm = 0700 settings.search.host = 'localhost' settings.search.port = '8983' settings.search.http_path = '/solr/opendesktop/' settings.client.default.name = 'default' settings.client.config.path = APPLICATION_PATH "/configs/" settings.client.default.baseurl = 'opendesktop.org' settings.client.default.baseurl_store = 'www.pling.com' settings.client.default.baseurl_meta = 'opendesktop.org' settings.client.default.baseurl_member = 'opendesktop.org' settings.client.default.baselogo = 'images/system/storeLogo.png' settings.client.default.url_forum = "" settings.client.default.url_blog = "" settings.client.default.url_gitlab = "" settings.client.default.url_myopendesktop = "" settings.client.default.url_cloudopendesktop = "" settings.client.default.url_musicopendesktop = "" settings.client.default.url_mastodon = "" settings.client.default.url_riot = "" settings.client.default.collection_cat_id = '' settings.client.default.ranking_cat_id = '' settings.client.default.tag_group_collection_type_id = '' settings.client.default.tag_collection_type_collection_id = '' settings.client.default.tag_collection_type_ranking_id = '' ;ebook tag config settings.client.default.tag_group_ebook = '' settings.client.default.tag_group_ebook_author = '' settings.client.default.tag_group_ebook_editor = '' settings.client.default.tag_group_ebook_illustrator = '' settings.client.default.tag_group_ebook_translator = '' settings.client.default.tag_group_ebook_subject = '' settings.client.default.tag_group_ebook_shelf = '' settings.client.default.tag_group_ebook_language = '' settings.client.default.tag_group_ebook_type = '' settings.client.default.tag_is_ebook = '' ;os-user tag config settings.client.default.tag_group_osuser = '' settings.client.default.tag_type_osuser = '' settings.static.include_path = APPLICATION_PATH "/../httpdocs/partials/" settings.static.include.contact = "contact.phtml" settings.static.include.privacy = "privacy.phtml" settings.static.include.terms = "terms.phtml" settings.static.include.terms-general = "terms-general.phtml" settings.static.include.terms-publishing = "terms-publishing.phtml" settings.static.include.terms-payout = "terms-payout.phtml" settings.static.include.terms-dmca = "terms-dmca.phtml" settings.static.include.faq = "faq.phtml" settings.static.include.gitfaq = "gitfaq.phtml" settings.static.include.faqold = "faqold.phtml" settings.static.include.about = "about.phtml" settings.queue.general.name = "ocs_jobs" ; timeout in microseconds settings.queue.general.timeout = 600000 settings.queue.general.message_count = 1 settings.noLESScompile = 1 ; set it 1 to prevent that the LESS files are processed and dont forget to kill the cache. otherwise 0 to process less files. settings.savePageView = 1 ; in some server environment we don't want to store the page views. I this case set this value to 0. settings.dwh.db.adapter = "pdo_mysql" settings.dwh.db.params.host = "host" settings.dwh.db.params.username = "uname" settings.dwh.db.params.password = "pass" settings.dwh.db.params.dbname = "dbname" settings.dwh.db.params.charset = "utf8" settings.dwh.db.params.type = "pdo_mysql" settings.dwh.db.params.driver_options.1002 = "SET NAMES utf8" settings.dwh.db.isDefaultTableAdapter = false settings.server.oauth.authorize_url = "" settings.server.oauth.token_url = "" settings.server.oauth.callback = $_SERVER['HTTP_HOST'] "/oauth/ocs" settings.server.oauth.client_id = "" settings.server.oauth.client_secret = "" settings.server.oauth.create_user_url = "" settings.server.oauth.profile_user_url = "" settings.server.opencode.host = "" settings.server.opencode.user_logfilename = "opencode" settings.server.opencode.user_sudo = "" settings.server.opencode.user_agent = "OCS Opendesktop" settings.server.opencode.private_token = "" -settings.server.opencode.url.user_create = "" settings.server.opencode.provider_name = "oauth_opendesktop" settings.server.ldap.host = "" settings.server.ldap.port = "389" settings.server.ldap.username = "" settings.server.ldap.password = "" settings.server.ldap.bindRequiresDn = true settings.server.ldap.accountDomainName = "" settings.server.ldap.baseDn = "" settings.server.ldap.accountFilterFormat = "(objectClass=account)" settings.server.ldap.tryUsernameSplit = false settings.server.ldap_group.baseDn = "" settings.server.forum.host = "" settings.server.forum.user_logfilename = "forum" settings.server.forum.user_sudo = "" settings.server.forum.user_agent = "OCS Opendesktop" settings.server.forum.private_token = "" settings.server.chat.host = "" settings.server.chat.user_logfilename = "chat" settings.server.chat.sudo_user = "" settings.server.chat.sudo_user_pw = "" settings.server.chat.home_server = "" settings.server.chat.user_agent = "OCS Opendesktop" settings.ocs_server.apiUri = "http://ocs-server.org" settings.jwt.secret = "" settings.jwt.expire.accessToken = "2 hours" settings.jwt.expire.refreshToken = "180 days" settings.jwt.expire.cookie = "30 days" settings.jwt.expire.authorizationCode = "10 minutes" settings.jwt.expire.resetCode = "2 hours" settings.jwt.issuer_ident = "http://localhost:80" settings.domain.base.host = "www.example.com" settings.domain.forum.host = "forum.example.com" settings.domain.forum.cookie_name = "_t" settings.domain.openid.host = "id.example.com" settings.domain.openid.cookie_name = "ltat" settings.domain.opencode.host = "git.example.com" settings.domain.opencode.cookie_name = "_example.com_session" settings.domain.mastodon.host = "mastodon.example.com" [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1 resources.db.adapter = "pdo_mysql" resources.db.params.host = "dev-host" resources.db.params.username = "uname" resources.db.params.password = "pass" resources.db.params.dbname = "db" resources.db.params.charset = "utf8" resources.db.isDefaultTableAdapter = true ;resources.db.params.profiler.enabled = "true" ;resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug" third_party.paypal.security.userid = "pp.sandbox.uid" third_party.paypal.security.password = "pppass" third_party.paypal.security.signature = "ppsig" third_party.paypal.sandbox.email = "sanbaox@mail.com" third_party.paypal.facilitator_fee_receiver = "sanbaox@mail.com" third_party.paypal.facilitator_fee = 0 third_party.paypal.application.id = "SANDBOX-APP-ID" third_party.paypal.api.endpoint = "https://svcs.sandbox.paypal.com" third_party.paypal.form.endpoint = "https://www.sandbox.paypal.com" third_party.paypal.ipn.endpoint = "https://www.sandbox.paypal.com" third_party.dwolla.consumer.access_key = "sandbox.key" third_party.dwolla.consumer.access_secret = "sandbox.sec" third_party.dwolla.consumer.token = "sandbox.token" third_party.dwolla.api.endpoint = "https://uat.dwolla.com" third_party.dwolla.facilitator_fee = 0 settings.noLESScompile = 0 ; set it 1 to prevent that the LESS files are processed and dont forget to kill the cache [testing : development] [cronjob : production] resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.defaultControllerName = "cron" resources.frontController.defaultAction = "run" resources.modules[] = resources.frontController.params.displayExceptions = 1 phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 third_party.paypal.sandbox.active = 0 third_party.paypal.security.userid = "ppuid" third_party.paypal.security.password = "pppass" third_party.paypal.security.signature = "ppsig" third_party.paypal.facilitator_fee_receiver = "receiver@mail.com" third_party.paypal.facilitator_fee = 0 third_party.paypal.application.id = "APP-ID" third_party.paypal.api.endpoint = "https://svcs.paypal.com" third_party.paypal.form.endpoint = "https://ic.paypal.com" third_party.paypal.ipn.endpoint = "https://www.paypal.com" third_party.paypal.masspay.endpoint = "https://api-3t.paypal.com/nvp" third_party.paypal.service.version = "1.2.0" third_party.paypal.request.data.format = "NV" third_party.paypal.response.data.format = "NV" third_party.paypal.client.auth = "Nocert" third_party.paypal.client.application_id = "app" third_party.paypal.client.partner_name = "partner" third_party.paypal.test = Live settings.cache.enabled = true settings.cache.frontend.type = Core settings.cache.frontend.options.lifetime = 600 settings.cache.frontend.options.automatic_serialization = true settings.cache.frontend.options.cache_id_prefix = "[some string]" settings.cache.frontend.options.cache = true settings.cache.backend.type = File settings.cache.backend.options.cache_dir = APPLICATION_CACHE settings.cache.backend.options.file_locking = true settings.cache.backend.options.read_control = true settings.cache.backend.options.read_control_type = 'crc32' settings.cache.backend.options.hashed_directory_level = 1 settings.cache.backend.options.hashed_directory_perm = 0700 settings.cache.backend.options.file_name_prefix = '[some string]' settings.cache.backend.options.cache_file_perm = 0700 [searchbotenv : production] resources.frontController.params.displayExceptions = 0 phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 diff --git a/application/modules/default/controllers/AuthorizationController.php b/application/modules/default/controllers/AuthorizationController.php index b6837380e..d07dd7f17 100644 --- a/application/modules/default/controllers/AuthorizationController.php +++ b/application/modules/default/controllers/AuthorizationController.php @@ -1,913 +1,923 @@ . **/ class AuthorizationController extends Local_Controller_Action_DomainSwitch { const DEFAULT_ROLE_ID = 300; const PROFILE_IMG_SRC_LOCAL = 'local'; public function githubAction() { require_once APPLICATION_LIB . '/Local/CrawlerDetect.php'; if (crawlerDetect($_SERVER['HTTP_USER_AGENT'])) { $this->getResponse()->setHttpResponseCode(404); $this->forward('index', 'explore'); return; } - $this->forward('login', 'oauth', 'default', array('provider' => 'github', 'redirect' => $this->getParam('redirect'))); + $this->forward('login', 'oauth', 'default', + array('provider' => 'github', 'redirect' => $this->getParam('redirect'))); } public function ocsAction() { require_once APPLICATION_LIB . '/Local/CrawlerDetect.php'; if (crawlerDetect($_SERVER['HTTP_USER_AGENT'])) { $this->getResponse()->setHttpResponseCode(404); $this->forward('index', 'explore'); return; } - $this->forward('login', 'oauth', 'default', array('provider' => 'ocs', 'redirect' => $this->getParam('redirect'))); + $this->forward('login', 'oauth', 'default', + array('provider' => 'ocs', 'redirect' => $this->getParam('redirect'))); } public function redirectAction() { $param = null; if (preg_match("/redirect\/(.*?)$/i", $this->getRequest()->getRequestUri(), $result)) { $param = array('redirect' => $result[1]); } $this->forward('login', null, null, $param); } /** * login from cookie * * @throws Zend_Auth_Storage_Exception * @throws Zend_Form_Exception * @throws Zend_Session_Exception * @throws exception */ public function lfcAction() { $this->view->success = 0; $this->view->noPopup = true; //TODO: check redirect for a local valid url. $this->view->redirect = $this->getParam('redirect'); $formLogin = new Default_Form_Login(); $formLogin->setAction('/login/lfc/'); $formLogin->getElement('remember_me')->setValue(true); if ($this->_request->isGet()) { // not a POST request $this->view->form = $formLogin->populate(array('redirect' => $this->view->redirect)); $this->view->error = 0; return; } Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - authentication attempt on host: ' . Zend_Registry::get('store_host') - . PHP_EOL . ' - param redirect: ' . $this->getParam('redirect') - . PHP_EOL . ' - from ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - authentication attempt on host: ' . Zend_Registry::get('store_host') + . PHP_EOL . ' - param redirect: ' . $this->getParam('redirect') + . PHP_EOL . ' - from ip: ' . $this->_request->getClientIp() ); if (false === $formLogin->isValid($_POST)) { // form not valid Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() - . PHP_EOL . ' - form not valid:' - . PHP_EOL . print_r($formLogin->getMessages(), true)) - ; + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - form not valid:' + . PHP_EOL . print_r($formLogin->getMessages(), true)); $this->view->form = $formLogin; $this->view->errorText = 'index.login.error.auth'; $this->view->error = 1; return; } $values = $formLogin->getValues(); $authModel = new Default_Model_Authorization(); $authResult = $authModel->authenticateUser($values['mail'], $values['password'], $values['remember_me']); if (false == $authResult->isValid()) { // authentication fail Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() - . PHP_EOL . ' - authentication fail: ' - . PHP_EOL . print_r($authResult->getMessages(), true) + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - authentication fail: ' + . PHP_EOL . print_r($authResult->getMessages(), true) ); $this->view->errorText = 'index.login.error.auth'; $this->view->form = $formLogin; $this->view->error = 1; $this->_helper->viewRenderer('login'); return; } $auth = Zend_Auth::getInstance(); $userId = $auth->getStorage()->read()->member_id; // handle redirect if (false === empty($this->view->redirect)) { $redirect = $this->decodeString($this->view->redirect); if (false !== strpos('/register', $redirect)) { $redirect = '/member/' . $userId . '/activities/'; } $this->redirect($redirect); } else { $this->redirect('/member/' . $userId . '/activities/'); } } /** * @param string $string * * @return string */ protected function decodeString($string) { $decodeFilter = new Local_Filter_Url_Decrypt(); return $decodeFilter->filter($string); } /** * @throws Zend_Auth_Storage_Exception * @throws Zend_Exception * @throws Zend_Session_Exception * @throws exception */ public function propagateAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); if (Zend_Auth::getInstance()->hasIdentity()) { $this->_helper->json(array('status' => 'ok', 'message' => 'Already logged in.')); } Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - token: ' . $this->getParam('token') - . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - token: ' . $this->getParam('token') + . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() ); $modelAuthToken = new Default_Model_SingleSignOnToken(); $token_data = $modelAuthToken->getData($this->getParam('token')); if (false === $token_data) { Zend_Registry::get('logger')->warn(__METHOD__ - . PHP_EOL . ' - Login failed: no token exists' - . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - Login failed: no token exists' + . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() ); $this->_helper->json(array('status' => 'fail', 'message' => 'Login failed.')); } $remember_me = isset($token_data['remember_me']) ? (boolean)$token_data['remember_me'] : false; $member_id = isset($token_data['member_id']) ? (int)$token_data['member_id'] : null; $modelAuth = new Default_Model_Authorization(); - $authResult = $modelAuth->authenticateUser($member_id, null, $remember_me, Local_Auth_AdapterFactory::LOGIN_SSO); + $authResult = $modelAuth->authenticateUser($member_id, null, $remember_me, + Local_Auth_AdapterFactory::LOGIN_SSO); if ($authResult->isValid()) { Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - authentication successful: ' - . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - authentication successful: ' + . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() ); $this->getResponse()->setHeader('Access-Control-Allow-Origin', $this->getParam('origin')) ->setHeader('Access-Control-Allow-Credentials', 'true') ->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS') - ->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept') - ; + ->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept'); $this->_helper->json(array('status' => 'ok', 'message' => 'Login successful.')); } else { Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - authentication fail: ' - . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() - . PHP_EOL . print_r($authResult->getMessages(), true) + . PHP_EOL . ' - authentication fail: ' + . PHP_EOL . ' - host: ' . Zend_Registry::get('store_host') + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . print_r($authResult->getMessages(), true) ); $this->_helper->json(array('status' => 'fail', 'message' => 'Login failed.')); } } public function checkuserAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $this->getResponse()->setHeader('Access-Control-Allow-Origin', 'https://gitlab.pling.cc') - ->setHeader('Access-Control-Allow-Credentials', 'true')->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS') - ->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept') - ; + ->setHeader('Access-Control-Allow-Credentials', 'true')->setHeader('Access-Control-Allow-Methods', + 'POST, GET, OPTIONS') + ->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept'); $formLogin = new Default_Form_Login(); if (false === $formLogin->isValid($_GET)) { // form not valid $this->_helper->json(array('status' => 'error', 'message' => 'not valid')); return; } $values = $formLogin->getValues(); $authModel = new Default_Model_Authorization(); $authResult = $authModel->authenticateUser($values['mail'], $values['password'], $values['remember_me']); if (false == $authResult->isValid()) { // authentication fail $this->_helper->json(array('status' => 'error', 'message' => 'not valid')); return; } $auth = Zend_Auth::getInstance(); $userId = $auth->getStorage()->read()->member_id; - - + + //Send user to LDAP try { $ldap_server = new Default_Model_Ocs_Ldap(); $ldap_server->createUser($userId); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL." - ", $ldap_server->getMessages())); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL . " - ", + $ldap_server->getMessages())); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } //If the user is a hive user, we have to update his password $this->changePasswordIfNeeded($userId, $values['password']); $this->_helper->json(array('status' => 'ok', 'message' => 'User is OK.')); } private function changePasswordIfNeeded($member_id, $password) { $userTabel = new Default_Model_Member(); $showMember = $userTabel->fetchMember($member_id); $memberSettings = $showMember; //User with OCS Password if ($showMember->password_type == Default_Model_Member::PASSWORD_TYPE_OCS) { return; } //Hive User if ($memberSettings->password_type == Default_Model_Member::PASSWORD_TYPE_HIVE) { //Save old data $memberSettings->password_old = $memberSettings->password; $memberSettings->password_type_old = Default_Model_Member::PASSWORD_TYPE_HIVE; //Change type and password $memberSettings->password_type = Default_Model_Member::PASSWORD_TYPE_OCS; - $memberSettings->password = Local_Auth_Adapter_Ocs::getEncryptedPassword($password, $memberSettings->password_type); + $memberSettings->password = Local_Auth_Adapter_Ocs::getEncryptedPassword($password, + $memberSettings->password_type); $memberSettings->save(); //Update Auth-Services try { $id_server = new Default_Model_Ocs_OAuth(); $id_server->updatePasswordForUser($memberSettings->member_id); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } try { $ldap_server = new Default_Model_Ocs_Ldap(); $ldap_server->updatePassword($memberSettings->member_id); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } } return; } /** * @throws Zend_Auth_Storage_Exception * @throws Zend_Exception * @throws Zend_Form_Exception * @throws Zend_Session_Exception * @throws exception */ public function loginAction() { //TODO: check redirect for a local valid url. $this->view->redirect = $this->getParam('redirect'); // if the user is still logged in, we do not show the login page. They should log out first. if (Zend_Auth::getInstance()->hasIdentity()) { $this->_helper->flashMessenger->addMessage('

You are still logged in. Please click here to log out first.

'); $this->handleRedirect(Zend_Auth::getInstance()->getIdentity()->member_id); } $formLogin = new Default_Form_Login(); if ($this->_request->isGet()) { // not a POST request $this->view->formLogin = $formLogin->populate(array('redirect' => $this->view->redirect)); $this->view->error = 0; return; } Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - authentication attempt on host: ' . Zend_Registry::get('store_host') - . PHP_EOL . ' - param redirect: ' . $this->getParam('redirect') - . PHP_EOL . ' - from ip: ' . $this->_request->getClientIp() - . PHP_EOL . ' - http method: ' . $this->_request->getMethod() - . PHP_EOL . ' - csrf string: ' . (isset($_POST['login_csrf']) ? $_POST['login_csrf'] : '') + . PHP_EOL . ' - authentication attempt on host: ' . Zend_Registry::get('store_host') + . PHP_EOL . ' - param redirect: ' . $this->getParam('redirect') + . PHP_EOL . ' - from ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - http method: ' . $this->_request->getMethod() + . PHP_EOL . ' - csrf string: ' . (isset($_POST['login_csrf']) ? $_POST['login_csrf'] : '') ); if (false === Default_Model_CsrfProtection::validateCsrfToken($_POST['login_csrf'])) { Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() - . PHP_EOL . ' - validate CSRF token failed:' - . PHP_EOL . ' - received token: ' . $_POST['login_csrf'] - . PHP_EOL . ' - stored token: ' . Default_Model_CsrfProtection::getCsrfToken() + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - validate CSRF token failed:' + . PHP_EOL . ' - received token: ' . $_POST['login_csrf'] + . PHP_EOL . ' - stored token: ' . Default_Model_CsrfProtection::getCsrfToken() ); $this->view->error = 0; $this->view->formLogin = $formLogin; if ($this->_request->isXmlHttpRequest()) { $viewLoginForm = $this->view->render('authorization/partials/loginForm.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $viewLoginForm)); } return; } if (false === $formLogin->isValid($_POST)) { // form not valid Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() - . PHP_EOL . ' - form not valid:' - . PHP_EOL . print_r($formLogin->getMessages(), true) + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - form not valid:' + . PHP_EOL . print_r($formLogin->getMessages(), true) ); $this->view->formLogin = $formLogin; $this->view->errorText = 'index.login.error.auth'; $this->view->error = 1; if ($this->_request->isXmlHttpRequest()) { $viewLoginForm = $this->view->render('authorization/partials/loginForm.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $viewLoginForm)); } return; } $values = $formLogin->getValues(); $authModel = new Default_Model_Authorization(); $authResult = $authModel->authenticateUser($values['mail'], $values['password'], $values['remember_me']); if (false == $authResult->isValid()) { // authentication fail Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - authentication fail.' - . PHP_EOL . ' - user: ' . $values['mail'] - . PHP_EOL . ' - remember_me: ' . $values['remember_me'] - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() - . PHP_EOL . print_r($authResult->getMessages(), true) + . PHP_EOL . ' - authentication fail.' + . PHP_EOL . ' - user: ' . $values['mail'] + . PHP_EOL . ' - remember_me: ' . $values['remember_me'] + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . print_r($authResult->getMessages(), true) ); if ($authResult->getCode() == Local_Auth_Result::MAIL_ADDRESS_NOT_VALIDATED) { $session = new Zend_Session_Namespace(); $session->mail_verify_member_id = $authResult->getIdentity(); if ($this->_request->isXmlHttpRequest()) { $viewMessage = $this->view->render('verify/resend.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $viewMessage)); } } $this->view->errorText = 'index.login.error.auth'; $this->view->formLogin = $formLogin; $this->view->error = 1; if ($this->_request->isXmlHttpRequest()) { $viewLoginForm = $this->view->render('authorization/partials/loginForm.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $viewLoginForm)); } return; } Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - authentication successful.' - . PHP_EOL . ' - user: ' . $values['mail'] - . PHP_EOL . ' - user_id: ' . isset(Zend_Auth::getInstance()->getStorage()->read()->member_id) ? Zend_Auth::getInstance()->getStorage()->read()->member_id : '' - . PHP_EOL . ' - remember_me: ' . $values['remember_me'] - . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() + . PHP_EOL . ' - authentication successful.' + . PHP_EOL . ' - user: ' . $values['mail'] + . PHP_EOL . ' - user_id: ' . isset(Zend_Auth::getInstance()->getStorage()->read()->member_id) ? Zend_Auth::getInstance()->getStorage()->read()->member_id : '' + . PHP_EOL . ' - remember_me: ' . $values['remember_me'] + . PHP_EOL . ' - ip: ' . $this->_request->getClientIp() ); - - + + $filter = new Local_Filter_Url_Encrypt(); $p = $filter->filter($values['password']); $sess = new Zend_Session_Namespace('ocs_meta'); $sess->phash = $p; $auth = Zend_Auth::getInstance(); $userId = $auth->getStorage()->read()->member_id; $jwt = Default_Model_Jwt::encode($userId); $sess->openid = $jwt; //If the user is a hive user, we have to update his password $this->changePasswordIfNeeded($userId, $values['password']); //$modelToken = new Default_Model_SingleSignOnToken(); //$data = array( // 'remember_me' => $values['remember_me'], // //'redirect' => $this->getParam('redirect'), // 'redirect' => $this->view->redirect, // 'action' => Default_Model_SingleSignOnToken::ACTION_LOGIN, // 'member_id' => $userId //); //$token_id = $modelToken->createToken($data); //setcookie(Default_Model_SingleSignOnToken::ACTION_LOGIN, $token_id, time() + 120, '/', // Local_Tools_ParseDomain::get_domain($this->getRequest()->getHttpHost()), null, true); - + //user has to correct his data? $modelReviewProfile = new Default_Model_ReviewProfileData(); if (false === $modelReviewProfile->hasValidProfile($auth->getStorage()->read())) { Zend_Registry::get('logger')->info(__METHOD__ - . PHP_EOL . ' - User has to change user data!' - . PHP_EOL . ' - error code: ' . print_r($modelReviewProfile->getErrorCode(), true) + . PHP_EOL . ' - User has to change user data!' + . PHP_EOL . ' - error code: ' . print_r($modelReviewProfile->getErrorCode(), + true) ); - + if ($this->_request->isXmlHttpRequest()) { $redirect = $this->getParam('redirect') ? '/redirect/' . $this->getParam('redirect') : ''; - $this->_helper->json(array('status' => 'ok', - 'redirect' => '/r/change/e/' . $modelReviewProfile->getErrorCode() . $redirect + $this->_helper->json(array( + 'status' => 'ok', + 'redirect' => '/r/change/e/' . $modelReviewProfile->getErrorCode() . $redirect )); } else { $this->getRequest()->setParam('member_id', $userId); $this->redirect("/r/change/e/" . $modelReviewProfile->getErrorCode(), $this->getAllParams()); } - + return; } // handle redirect $this->view->loginok = true; $this->handleRedirect($userId); } /** * @param int $userId * - * @throws Zend_Controller_Action_Exception + * @throws Zend_Exception * @throws Zend_Filter_Exception */ protected function handleRedirect($userId) { if (empty($this->view->redirect)) { Zend_Registry::get('logger')->info(__METHOD__ . PHP_EOL . ' - user_id: ' . $userId . PHP_EOL . ' - redirect: empty'); if ($this->_request->isXmlHttpRequest()) { $redirect_url = $this->encodeString('/member/' . $userId . '/activities/'); $redirect = '/home/redirectme?redirect=' . $redirect_url; $this->_helper->json(array('status' => 'ok', 'redirect' => $redirect)); return; } $this->getRequest()->setParam('member_id', $userId); $redirect_url = $this->encodeString('/member/' . $userId . '/activities/'); $redirect = '/home/redirectme?redirect=' . $redirect_url; $this->redirect($redirect, $this->getAllParams()); return; } $redirect = $this->decodeString($this->view->redirect); Zend_Registry::get('logger')->info(__METHOD__ . PHP_EOL . ' - user_id: ' . $userId . PHP_EOL . ' - redirect: ' . $redirect); if (false !== strpos('/register', $redirect)) { $redirect = '/member/' . $userId . '/activities/'; } $redirect = '/home/redirectme?redirect=' . $this->encodeString($redirect); if ($this->_request->isXmlHttpRequest()) { $this->_helper->json(array('status' => 'ok', 'redirect' => $redirect)); return; } $this->redirect($redirect); return; } + /** + * @param string $string + * + * @return string + * @throws Zend_Filter_Exception + */ + protected function encodeString($string) + { + $encodeFilter = new Local_Filter_Url_Encrypt(); + + return $encodeFilter->filter($string); + } + /** * @throws Exception * @throws Zend_Exception * @throws Zend_Form_Exception */ public function registerAction() { $this->view->redirect = $this->getParam('redirect'); $this->view->headScript()->appendFile('//www.google.com/recaptcha/api.js'); $this->view->addHelperPath(APPLICATION_LIB . '/Cgsmith/View/Helper', 'Cgsmith\\View\\Helper\\'); $formRegister = new Default_Form_Register(); if ($this->_request->isGet()) { $this->view->formRegister = $formRegister->populate(array('redirect' => urlencode($this->view->redirect))); $this->view->error = 0; return; } if (false === $formRegister->isValid($_POST)) { $this->view->formRegister = $formRegister; $this->view->error = 1; if ($this->_request->isXmlHttpRequest()) { $viewRegisterForm = $this->view->render('authorization/partials/registerForm.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $viewRegisterForm)); return; } return; } $formRegisterValues = $formRegister->getValues(); unset($formRegisterValues['g-recaptcha-response']); $formRegisterValues['password'] = $formRegisterValues['password1']; $formRegisterValues['username'] = Default_Model_HtmlPurify::purify($formRegisterValues['username']); $formRegisterValues['mail'] = strtolower($formRegisterValues['mail']); $newUserData = $this->createNewUser($formRegisterValues); Default_Model_ActivityLog::logActivity($newUserData['main_project_id'], null, $newUserData['member_id'], Default_Model_ActivityLog::MEMBER_JOINED, array()); $this->sendConfirmationMail($formRegisterValues, $newUserData['verificationVal']); Zend_Registry::get('logger')->debug(__METHOD__ . ' - member_id: ' . $newUserData['member_id'] . ' - Link for verification: ' - . 'http://' . $this->getServerName() . '/verification/' . $newUserData['verificationVal']) - ; + . 'http://' . $this->getServerName() . '/verification/' . $newUserData['verificationVal']); if ($this->_request->isXmlHttpRequest()) { $viewRegisterForm = $this->view->render('authorization/partials/registerSuccess.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $viewRegisterForm)); } else { $this->view->overlay = $this->view->render('authorization/registerSuccess.phtml'); $this->forward('index', 'explore', 'default'); } } /** * @param array $userData * * @return array * @throws Exception */ protected function createNewUser($userData) { $userTable = new Default_Model_Member(); $userData = $userTable->createNewUser($userData); return $userData; } /** * @param array $val * @param string $verificationVal */ protected function sendConfirmationMail($val, $verificationVal) { $confirmMail = new Default_Plugin_SendMail('tpl_verify_user'); $confirmMail->setTemplateVar('servername', $this->getServerName()); $confirmMail->setTemplateVar('username', $val['username']); $confirmMail->setTemplateVar('verificationlinktext', 'Click here to verify your email address'); $confirmMail->setTemplateVar('verificationlink', 'https://' . $this->getServerName() . '/verification/' . $verificationVal . ''); - $confirmMail->setTemplateVar('verificationurl', 'https://' . $this->getServerName() . '/verification/' . $verificationVal); + $confirmMail->setTemplateVar('verificationurl', + 'https://' . $this->getServerName() . '/verification/' . $verificationVal); $confirmMail->setReceiverMail($val['mail']); $confirmMail->setFromMail('registration@opendesktop.org'); $confirmMail->send(); } /** * @return mixed */ protected function getServerName() { /** @var Zend_Controller_Request_Http $request */ $request = $this->getRequest(); return $request->getHttpHost(); } /** * @throws Zend_Controller_Action_Exception * @throws Zend_Exception * @throws Zend_Session_Exception */ public function propagatelogoutAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); if (false == Zend_Auth::getInstance()->hasIdentity()) { $this->_helper->json(array('status' => 'ok', 'message' => 'Already logged out.')); } $modelAuth = new Default_Model_Authorization(); $modelAuth->logout(); $this->_helper->json(array('status' => 'ok', 'message' => 'Logout successful.')); } /** * @throws Zend_Cache_Exception * @throws Zend_Controller_Action_Exception * @throws Zend_Exception * @throws Zend_Session_Exception */ public function logoutAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); if (Zend_Auth::getInstance()->hasIdentity()) { $modelAuth = new Default_Model_Authorization(); $modelAuth->logout(); $modelToken = new Default_Model_SingleSignOnToken(); $data = array( 'remember_me' => false, 'redirect' => $this->getParam('redirect'), 'action' => Default_Model_SingleSignOnToken::ACTION_LOGOUT ); $token_id = $modelToken->createToken($data); setcookie(Default_Model_SingleSignOnToken::ACTION_LOGOUT, $token_id, time() + 120, '/', Local_Tools_ParseDomain::get_domain($this->getRequest()->getHttpHost()), null, true); } if ($this->_request->isXmlHttpRequest()) { $this->_helper->json(array('status' => 'ok', 'message' => 'Logout successful.')); } else { $this->redirect('/'); } } public function init() { parent::init(); // TODO: Change the autogenerated stub - $this->getResponse()->clearHeaders(array('Expires', 'Pragma', 'Cache-Control'))->setHeader('Pragma', 'no-cache', true) - ->setHeader('Cache-Control', 'private, no-cache, must-revalidate', true) - ; + $this->getResponse()->clearHeaders(array('Expires', 'Pragma', 'Cache-Control'))->setHeader('Pragma', 'no-cache', + true) + ->setHeader('Cache-Control', 'private, no-cache, must-revalidate', true); } /** * @throws Zend_Auth_Storage_Exception * @throws Zend_Controller_Action_Exception * @throws Zend_Exception * @throws exception */ public function verificationAction() { $filterInput = new Zend_Filter_Input(array('*' => 'StringTrim', 'vid' => 'Alnum'), array('vid' => array('Alnum', 'presence' => 'required')), $this->getAllParams()); $_vId = $filterInput->getEscaped('vid'); if (!$_vId) { $this->redirect('/'); } $translate = Zend_Registry::get('Zend_Translate'); $this->view->title = $translate->_('member.email.verification.title'); $authModel = new Default_Model_Authorization(); $authUser = $authModel->getAuthUserDataFromUnverified($_vId); if (empty($authUser)) { throw new Zend_Controller_Action_Exception('This member account could not activated. verification id:' - . print_r($this->getParam('vid'), true)); + . print_r($this->getParam('vid'), true)); } if ($authUser AND (false == empty($authUser->email_checked))) { $this->view->headScript()->appendFile('//www.google.com/recaptcha/api.js'); $this->view->addHelperPath(APPLICATION_LIB . '/Cgsmith/View/Helper', 'Cgsmith\\View\\Helper\\'); $this->view->formRegister = new Default_Form_Register(); $this->view->registerErrMsg = "

Your account has already been activated.

Log in or try to generate a new password for your account.

"; $this->view->overlay = $this->view->render('authorization/registerError.phtml'); $this->_helper->viewRenderer('register'); return; } Zend_Registry::get('logger')->info(__METHOD__ . ' - activate user from email link. (member_id, username): (' - . print_r($authUser->member_id, true) . ', ' . print_r($authUser->username, true) . ')') - ; + . print_r($authUser->member_id, true) . ', ' . print_r($authUser->username, + true) . ')'); $modelMember = new Default_Model_Member(); $result = $modelMember->activateMemberFromVerification($authUser->member_id, $_vId); if (false == $result) { throw new Zend_Controller_Action_Exception('Your member account could not activated.'); } - Zend_Registry::get('logger')->info(__METHOD__ . ' - user activated. member_id: ' . print_r($authUser->member_id, true)); + Zend_Registry::get('logger')->info(__METHOD__ . ' - user activated. member_id: ' . print_r($authUser->member_id, + true)); $modelMember = new Default_Model_Member(); $record = $modelMember->fetchMemberData($authUser->member_id, false); try { $oauth = new Default_Model_Ocs_OAuth(); $oauth->createUserFromArray($record->toArray()); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . implode(PHP_EOL." - ", $oauth->getMessages())); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . implode(PHP_EOL . " - ", + $oauth->getMessages())); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } try { $ldap = new Default_Model_Ocs_Ldap(); $ldap->createUserFromArray($record->toArray()); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL." - ", $ldap->getMessages())); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL . " - ", + $ldap->getMessages())); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } try { $openCode = new Default_Model_Ocs_Gitlab(); $openCode->createUserFromArray($record->toArray()); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL." - ", $openCode->getMessages())); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL . " - ", + $openCode->getMessages())); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } try { $forum = new Default_Model_Ocs_Forum(); $forum->createUserFromArray($record->toArray()); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL." - ", $forum->getMessages())); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL . " - ", + $forum->getMessages())); } catch (Exception $e) { Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); } Default_Model_ActivityLog::logActivity($authUser->member_id, null, $authUser->member_id, Default_Model_ActivityLog::MEMBER_EMAIL_CONFIRMED, array()); $this->view->member = $authUser; $this->view->username = $authUser->username; $this->view->headScript()->appendFile('//www.google.com/recaptcha/api.js'); $this->view->addHelperPath(APPLICATION_LIB . '/Cgsmith/View/Helper', 'Cgsmith\\View\\Helper\\'); $this->view->form = new Default_Form_Register(); $this->view->overlay = $this->view->render('authorization/registerWelcome.phtml'); $this->storeAuthSessionData($authUser->member_id); $tableProduct = new Default_Model_Project(); $this->view->products = $tableProduct->fetchAllProjectsForMember($authUser->member_id); $this->forward('index', 'settings', 'default', array('member_id' => $authUser->member_id)); } /** * @param string|int $identity * * @throws Zend_Auth_Storage_Exception * @throws exception */ protected function storeAuthSessionData($identity) { $authDataModel = new Default_Model_Authorization(); $authDataModel->storeAuthSessionDataByIdentity($identity); } /** * ppload */ public function pploadloginAction() { $this->_helper->layout()->disableLayout(); // Init identity and credential $identity = null; $credential = null; if (!empty($_REQUEST['identity'])) { $identity = $_REQUEST['identity']; } else { if (!empty($_SERVER['PHP_AUTH_USER'])) { $identity = $_SERVER['PHP_AUTH_USER']; } } if (!empty($_REQUEST['credential'])) { $credential = $_REQUEST['credential']; } else { if (!empty($_SERVER['PHP_AUTH_PW'])) { $credential = $_SERVER['PHP_AUTH_PW']; } } // Authenticate and get user data $response = array('status' => 'error'); if ($identity && $credential) { $authModel = new Default_Model_Authorization(); $authData = $authModel->getAuthDataFromApi($identity, $credential); if (!empty($authData->member_id)) { $response = array( 'status' => 'ok', 'member_id' => $authData->member_id ); } } $this->_helper->json($response); } public function htmlloginAction() { $this->_helper->layout()->disableLayout(); //$this->_helper->viewRenderer->setNoRender(true); } public function validateAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $this->view->headScript()->appendFile('//www.google.com/recaptcha/api.js'); $this->view->addHelperPath(APPLICATION_LIB . '/Cgsmith/View/Helper', 'Cgsmith\\View\\Helper\\'); $formRegister = new Default_Form_Register(); $name = $this->getParam('name'); $value = $this->getParam('value'); $result = $formRegister->getElement($name)->isValid($value); $this->_helper->json(array('status' => $result, $name => $formRegister->getElement($name)->getMessages())); } - /** - * @param string $string - * - * @return string - * @throws Zend_Filter_Exception - */ - protected function encodeString($string) - { - $encodeFilter = new Local_Filter_Url_Encrypt(); - - return $encodeFilter->filter($string); - } - /** * @param array $val * * @throws Zend_Exception */ protected function sendAdminNotificationMail($val) { $config = Zend_Registry::get('config'); $receiver = $config->admin->email; $oNotificationMail = new Default_Plugin_SendMail('tpl_newuser_notification'); $oNotificationMail->setReceiverMail($receiver); $oNotificationMail->setTemplateVar('username', $val['username']); $oNotificationMail->send(); } /** * @param array $userData * * @return int */ protected function storeNewUser($userData) { $userTable = new Default_Model_Member(); $userData = $userTable->storeNewUser($userData); return $userData->member_id; } /** * @param int $identity */ protected function updateUsersLastOnline($identity) { $authModel = new Default_Model_Authorization(); $authModel->updateUserLastOnline('member_id', $identity); } } \ No newline at end of file diff --git a/application/modules/default/controllers/ProductController.php b/application/modules/default/controllers/ProductController.php index cab9b8cf3..8727a0b0d 100644 --- a/application/modules/default/controllers/ProductController.php +++ b/application/modules/default/controllers/ProductController.php @@ -1,3042 +1,3042 @@ . **/ class ProductController extends Local_Controller_Action_DomainSwitch { const IMAGE_SMALL_UPLOAD = 'image_small_upload'; const IMAGE_BIG_UPLOAD = 'image_big_upload'; /** * Zend_Controller_Request_Abstract object wrapping the request environment * * @var Zend_Controller_Request_Http */ protected $_request = null; /** @var int */ protected $_projectId; /** @var int */ protected $_collectionId; /** @var Zend_Auth */ protected $_auth; /** @var string */ protected $_browserTitlePrepend; public function init() { parent::init(); $this->_projectId = (int)$this->getParam('project_id'); $this->_collectionId = (int)$this->getParam('collection_id'); $this->_auth = Zend_Auth::getInstance(); $this->_browserTitlePrepend = $this->templateConfigData['head']['browser_title_prepend']; $action = $this->getRequest()->getActionName(); $title = $action; if($action =='add') { $title = 'add product'; }else { $title = $action; } $this->view->headTitle($title . ' - ' . $this->getHeadTitle(), 'SET'); } public function ratingAction() { $this->_helper->layout()->disableLayout(); if (array_key_exists($this->_projectId, $this->_authMember->projects)) { return; } $userRating = (int)$this->getParam('rate', 0); $modelRating = new Default_Model_DbTable_ProjectRating(); $modelRating->rateForProject($this->_projectId, $this->_authMember->member_id, $userRating); } public function pploadAction() { $this->_helper->layout->disableLayout(); $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); //create ppload download hash: secret + collection_id + expire-timestamp $salt = PPLOAD_DOWNLOAD_SECRET; $collectionID = $productInfo->ppload_collection_id; $timestamp = time() + 3600; // one hour valid //20181009 ronald: change hash from MD5 to SHA512 //$hash = md5($salt . $collectionID . $timestamp); // order isn't important at all... just do the same when verifying $hash = hash('sha512',$salt . $collectionID . $timestamp); // order isn't important at all... just do the same when verifying $this->view->download_hash = $hash; $this->view->download_timestamp = $timestamp; $this->view->product = $productInfo; $this->_helper->viewRenderer('/partials/pploadajax'); } public function gettaggroupsforcatajaxAction() { $this->_helper->layout()->disableLayout(); $catId = null; $fileId = null; if($this->hasParam('file_id')) { $fileId = $this->getParam('file_id'); } if($this->hasParam('project_cat_id')) { $catId = $this->getParam('project_cat_id'); $catTagModel = new Default_Model_Tags(); $catTagGropuModel = new Default_Model_TagGroup(); $tagGroups = $catTagGropuModel->fetchTagGroupsForCategory($catId); $tableTags = new Default_Model_DbTable_Tags(); $result = array(); $resultGroup = array(); foreach ($tagGroups as $group) { $tags = $tableTags->fetchForGroupForSelect($group['tag_group_id']); $selectedTags = null; if(!empty($fileId)) { $selectedTags = $catTagModel->getTagsArray($fileId, Default_Model_DbTable_Tags::TAG_TYPE_FILE,$group['tag_group_id']); } $group['tag_list'] = $tags; $group['selected_tags'] = $selectedTags; $result[] = $group; } $this->_helper->json(array('status' => 'ok', 'ResultSize' => count($tagGroups), 'tag_groups' => $result)); return; } $this->_helper->json(array('status' => 'error')); } private function getTagGroupsForCat($fileId) { $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); $catId = $productInfo->project_category_id; if(!empty($catId)) { $catTagModel = new Default_Model_Tags(); $catTagGropuModel = new Default_Model_TagGroup(); $tagGroups = $catTagGropuModel->fetchTagGroupsForCategory($catId); $tableTags = new Default_Model_DbTable_Tags(); $result = array(); foreach ($tagGroups as $group) { $tags = $tableTags->fetchForGroupForSelect($group['tag_group_id']); $selectedTags = null; if(!empty($fileId)) { $selectedTags = $catTagModel->getTagsArray($fileId, Default_Model_DbTable_Tags::TAG_TYPE_FILE,$group['tag_group_id']); } $group['tag_list'] = $tags; $group['selected_tags'] = $selectedTags; $result[] = $group; } return $result; } return null; } private function getFileDownloadCount($collection_id, $fileId) { $modelFiles = new Default_Model_DbTable_PploadFiles(); $countAll = $modelFiles->fetchCountDownloadsForFileAllTime($collection_id, $fileId); $countToday = $modelFiles->fetchCountDownloadsForFileToday($collection_id, $fileId); $count = (int)$countAll+ (int)$countToday; return $count; } public function listsamesourceurlAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); $result = $modelProduct->getSourceUrlProjects($productInfo->source_url); $r = '
'; foreach ($result as $value) { $r=$r.'
' .'
'.$value['title'].'
' .'' .'
'.$value['created_at'].'
' .'
'.$value['changed_at'].'
' .'
'; } $r = $r.'
'; /*$response='';*/ echo $r; } public function getfilesajaxAction() { $this->_helper->layout()->disableLayout(); $collection_id = null; $file_status = null; $ignore_status_code = null; if($this->hasParam('status')) { $file_status = $this->getParam('status'); } if($this->hasParam('ignore_status_code')) { $ignore_status_code = $this->getParam('ignore_status_code'); } $filesTable = new Default_Model_DbTable_PploadFiles(); if($this->hasParam('collection_id')) { $collection_id = $this->getParam('collection_id'); $result = array(); //Load files from DB if($ignore_status_code == 0 && $file_status == 'active') { $files = $filesTable->fetchAllActiveFilesForProject($collection_id); } else { $files = $filesTable->fetchAllFilesForProject($collection_id); } //Check, if the project category has tag-grous $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); $catTagGropuModel = new Default_Model_TagGroup(); $tagGroups = $catTagGropuModel->fetchTagGroupsForCategory($productInfo->project_category_id); foreach ($files as $file) { //add tag grous, if needed if(!empty($tagGroups)) { $groups = $this->getTagGroupsForCat($file['id']); $file['tag_groups'] = $groups; } //Download Counter $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); //new counter IP based $counterUkAll = $file['count_dl_all_uk']; $counterNoUkAll = $file['count_dl_all_nouk']; $counterNew = 0; if(!empty($counterUkAll)) { $counterNew = $counterNew + $counterUkAll; } if(!empty($counterNoUkAll)) { $counterNew = $counterNew + $counterNoUkAll; } $file['downloaded_count_uk'] = $counterNew; if ($userRoleName == Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN) { //$file['downloaded_count_live'] = $this->getFileDownloadCount($collection_id, $file['id']); $counterToday = $file['count_dl_today']; $counterAll = $file['count_dl_all']; $counter = 0; if(!empty($counterToday)) { $counter = $counterToday; } if(!empty($counterAll)) { $counter = $counter + $counterAll; } $file['downloaded_count_live'] = $counter; } else { unset($file['count_dl_all']); unset($file['count_dl_all_nouk']); unset($file['count_dl_all_uk']); unset($file['count_dl_today']); unset($file['downloaded_count']); } $result[] = $file; } $this->_helper->json(array('status' => 'success', 'ResultSize' => count($result), 'files' => $result)); return; } $this->_helper->json(array('status' => 'error')); } public function getfiletagsajaxAction() { $this->_helper->layout()->disableLayout(); $fileId = null; if($this->hasParam('file_id')) { $fileId = $this->getParam('file_id'); $tagModel = new Default_Model_Tags(); $fileTags = $tagModel->getFileTags($fileId); $this->_helper->json(array('status' => 'ok', 'ResultSize' => count($fileTags), 'file_tags' => $fileTags)); return; } $this->_helper->json(array('status' => 'error')); } public function initJsonForReact(){ $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); $this->view->product = $productInfo; if (empty($this->view->product)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } if(null != $this->_authMember) { $this->view->authMemberJson = Zend_Json::encode( $this->_authMember ); } $helpAddDefaultScheme = new Default_View_Helper_AddDefaultScheme(); $this->view->product->title = Default_Model_HtmlPurify::purify($this->view->product->title); $this->view->product->description = Default_Model_BBCode::renderHtml(Default_Model_HtmlPurify::purify($this->view->product->description)); $this->view->product->version = Default_Model_HtmlPurify::purify($this->view->product->version); $this->view->product->link_1 = Default_Model_HtmlPurify::purify($helpAddDefaultScheme->addDefaultScheme($this->view->product->link_1),Default_Model_HtmlPurify::ALLOW_URL); $this->view->product->source_url = Default_Model_HtmlPurify::purify($this->view->product->source_url,Default_Model_HtmlPurify::ALLOW_URL); $this->view->product->facebook_code = Default_Model_HtmlPurify::purify($this->view->product->facebook_code,Default_Model_HtmlPurify::ALLOW_URL); $this->view->product->twitter_code = Default_Model_HtmlPurify::purify($this->view->product->twitter_code,Default_Model_HtmlPurify::ALLOW_URL); $this->view->product->google_code = Default_Model_HtmlPurify::purify($this->view->product->google_code,Default_Model_HtmlPurify::ALLOW_URL); $this->view->productJson = Zend_Json::encode($this->view->product ); $fmodel =new Default_Model_DbTable_PploadFiles(); $files = $fmodel->fetchFilesForProject($this->view->product->ppload_collection_id); $salt = PPLOAD_DOWNLOAD_SECRET; $filesList = array(); foreach ($files as $file) { $timestamp = time() + 3600; // one hour valid $hash = hash('sha512',$salt . $file['collection_id'] . $timestamp); // order isn't important at all... just do the same when verifying $url = PPLOAD_API_URI . 'files/download/id/' . $file['id'] . '/s/' . $hash . '/t/' . $timestamp; if(null != $this->_authMember) { $url .= '/u/' . $this->_authMember->member_id; } $url .= '/lt/filepreview/' . $file['name']; $file['url'] = urlencode($url); $filesList[] = $file; } $this->view->filesJson = Zend_Json::encode($filesList); $this->view->filesCntJson = Zend_Json::encode($fmodel->fetchFilesCntForProject($this->view->product->ppload_collection_id)); $tableProjectUpdates = new Default_Model_ProjectUpdates(); $this->view->updatesJson = Zend_Json::encode($tableProjectUpdates->fetchProjectUpdates($this->_projectId)); $tableProjectRatings = new Default_Model_DbTable_ProjectRating(); $ratings = $tableProjectRatings->fetchRating($this->_projectId); $cntRatingsActive = 0; foreach ($ratings as $p) { if($p['rating_active']==1) $cntRatingsActive =$cntRatingsActive+1; } $this->view->ratingsJson = Zend_Json::encode($ratings); $this->view->cntRatingsActiveJson = Zend_Json::encode($cntRatingsActive); $identity = Zend_Auth::getInstance()->getStorage()->read(); if (Zend_Auth::getInstance()->hasIdentity()){ $ratingOfUserJson = $tableProjectRatings->getProjectRateForUser($this->_projectId,$identity->member_id); $this->view->ratingOfUserJson = Zend_Json::encode($ratingOfUserJson); }else{ $this->view->ratingOfUserJson = Zend_Json::encode(null); } $tableProjectFollower = new Default_Model_DbTable_ProjectFollower(); $likes = $tableProjectFollower->fetchLikesForProject($this->_projectId); $this->view->likeJson = Zend_Json::encode($likes); $projectplings = new Default_Model_ProjectPlings(); $plings = $projectplings->fetchPlingsForProject($this->_projectId); $this->view->projectplingsJson = Zend_Json::encode($plings); $tableProject = new Default_Model_Project(); $galleryPictures = $tableProject->getGalleryPictureSources($this->_projectId); $this->view->galleryPicturesJson = Zend_Json::encode($galleryPictures); $tagmodel = new Default_Model_Tags(); $tagsuser = $tagmodel->getTagsUser($this->_projectId, Default_Model_Tags::TAG_TYPE_PROJECT); $tagssystem = $tagmodel->getTagsSystemList($this->_projectId); $this->view->tagsuserJson = Zend_Json::encode($tagsuser); $this->view->tagssystemJson = Zend_Json::encode($tagssystem); $modelComments = new Default_Model_ProjectComments(); $offset = 0; $testComments = $modelComments->getCommentTreeForProjectList($this->_projectId); $this->view->commentsJson = Zend_Json::encode($testComments); $modelClone = new Default_Model_ProjectClone(); $origins = $modelClone->fetchOrigins($this->_projectId); $this->view->originsJson = Zend_Json::encode($origins); $related = $modelClone->fetchRelatedProducts($this->_projectId); $this->view->relatedJson = Zend_Json::encode($related); $moreProducts = $tableProject->fetchMoreProjects($this->view->product, 8); $this->view->moreProductsJson = Zend_Json::encode($moreProducts); $moreProducts = $tableProject->fetchMoreProjectsOfOtherUsr($this->view->product, 8); $this->view->moreProductsOfOtherUsrJson = Zend_Json::encode($moreProducts); } public function indexAction() { if (!empty($this->_collectionId)) { $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductForCollectionId($this->_collectionId); $this->_projectId = $productInfo->project_id; } if (empty($this->_projectId)) { $this->redirect('/explore'); } $this->view->paramPageId = (int)$this->getParam('page'); $this->view->member_id = null; if(null != $this->_authMember && null != $this->_authMember->member_id) { $this->view->member_id = $this->_authMember->member_id; } // $this->fetchDataForIndexView(); $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); if (empty($productInfo)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } //Check if this is a collection if($productInfo->type_id == $modelProduct::PROJECT_TYPE_COLLECTION) { $this->redirect('/c/'.$this->_projectId); } $this->view->product = $productInfo; $this->view->headTitle($productInfo->title . ' - ' . $this->getHeadTitle(), 'SET'); $this->view->cat_id = $this->view->product->project_category_id; //create ppload download hash: secret + collection_id + expire-timestamp $salt = PPLOAD_DOWNLOAD_SECRET; $collectionID = $this->view->product->ppload_collection_id; $timestamp = time() + 3600; // one hour valid //20181009 ronald: change hash from MD5 to SHA512 //$hash = md5($salt . $collectionID . $timestamp); // order isn't important at all... just do the same when verifying $hash = hash('sha512',$salt . $collectionID . $timestamp); // order isn't important at all... just do the same when verifying $this->view->download_hash = $hash; $this->view->download_timestamp = $timestamp; $helperUserIsOwner = new Default_View_Helper_UserIsOwner(); $helperIsProjectActive = new Default_View_Helper_IsProjectActive(); if ((false === $helperIsProjectActive->isProjectActive($this->view->product->project_status)) AND (false === $helperUserIsOwner->UserIsOwner($this->view->product->member_id)) ) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } if (APPLICATION_ENV != 'searchbotenv') { $tablePageViews = new Default_Model_DbTable_StatPageViews(); $tablePageViews->savePageView($this->_projectId, $this->getRequest()->getClientIp(), $this->_authMember->member_id); } $fmodel =new Default_Model_DbTable_PploadFiles(); $filesList = array(); if(isset($this->view->product->ppload_collection_id)) { $files = $fmodel->fetchFilesForProject($this->view->product->ppload_collection_id); if(!empty($files)) { foreach ($files as $file) { $timestamp = time() + 3600; // one hour valid $hash = hash('sha512',$salt . $file['collection_id'] . $timestamp); // order isn't important at all... just do the same when verifying $url = PPLOAD_API_URI . 'files/download/id/' . $file['id'] . '/s/' . $hash . '/t/' . $timestamp; if(null != $this->_authMember) { $url .= '/u/' . $this->_authMember->member_id; } $url .= '/lt/filepreview/' . $file['name']; $file['url'] = urlencode($url); //If this file is a video, we have to convert it for preview if(!empty($file['type']) && in_array($file['type'], Backend_Commands_ConvertVideo::$VIDEO_FILE_TYPES) && empty($file['ppload_file_preview_id'])) { $queue = Local_Queue_Factory::getQueue(); $command = new Backend_Commands_ConvertVideo($file['collection_id'], $file['id'], $file['type']); $queue->send(serialize($command)); } if(!empty($file['url_preview'])) { $file['url_preview'] = urlencode($file['url_preview']); } if(!empty($file['url_thumb'])) { $file['url_thumb'] = urlencode($file['url_thumb']); } $filesList[] = $file; } } } $this->view->filesJson = Zend_Json::encode($filesList); //gitlab if($this->view->product->is_gitlab_project) { $gitProject = $this->fetchGitlabProject($this->view->product->gitlab_project_id); if(null == $gitProject) { $this->view->product->is_gitlab_project = 0; $this->view->product->show_gitlab_project_issues = 0; $this->view->product->use_gitlab_project_readme = 0; $this->view->product->gitlab_project_id = null; } else { $this->view->gitlab_project = $gitProject; //show issues? if($this->view->product->show_gitlab_project_issues) { $issues = $this->fetchGitlabProjectIssues($this->view->product->gitlab_project_id); $this->view->gitlab_project_issues = $issues; $this->view->gitlab_project_issues_url = $this->view->gitlab_project['web_url'] . '/issues/'; } //show readme.md? if($this->view->product->use_gitlab_project_readme && null != $this->view->gitlab_project['readme_url']) { $config = Zend_Registry::get('config')->settings->server->opencode; $readme = $this->view->gitlab_project['web_url'].'/raw/master/README.md?inline=false'; $httpClient = new Zend_Http_Client($readme, array('keepalive' => true, 'strictredirects' => true)); $httpClient->resetParameters(); $httpClient->setUri($readme); $httpClient->setHeaders('Private-Token', $config->private_token); $httpClient->setHeaders('Sudo', $config->user_sudo); $httpClient->setHeaders('User-Agent', $config->user_agent); $httpClient->setMethod(Zend_Http_Client::GET); $response = $httpClient->request(); $body = $response->getRawBody(); if (count($body) == 0) { return array(); } include_once('Parsedown.php'); $Parsedown = new Parsedown(); $this->view->readme = $Parsedown->text($body); } else { $this->view->readme = null; } } } $storeConfig = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') : null; if($storeConfig->layout_pagedetail && $storeConfig->isRenderReact()){ $this->initJsonForReact(); $this->_helper->viewRenderer('index-react'); } } public function showAction() { $this->view->authMember = $this->_authMember; $this->_helper->viewRenderer('index'); $this->indexAction(); } public function addAction() { $this->view->member = $this->_authMember; $this->view->mode = 'add'; $form = new Default_Form_Product(array('member_id' => $this->view->member->member_id)); $this->view->form = $form; if ($this->_request->isGet()) { return; } if (isset($_POST['cancel'])) { // user cancel function $this->redirect('/member/' . $this->_authMember->member_id . '/news/'); } if (false === $form->isValid($_POST)) { // form not valid $this->view->form = $form; $this->view->error = 1; return; } $values = $form->getValues(); $imageModel = new Default_Model_DbTable_Image(); try { $values['image_small'] = $imageModel->saveImage($form->getElement(self::IMAGE_SMALL_UPLOAD)); } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ERROR upload productPicture - ' . print_r($e, true)); } // form was valid, so we can set status to active $values['status'] = Default_Model_DbTable_Project::PROJECT_ACTIVE; // save new project $modelProject = new Default_Model_Project(); Zend_Registry::get('logger')->info(__METHOD__ . ' - $post: ' . print_r($_POST, true)); Zend_Registry::get('logger')->info(__METHOD__ . ' - $files: ' . print_r($_FILES, true)); - Zend_Registry::get('logger')->info(__METHOD__ . ' _ input values: ' . print_r($values, true)); + Zend_Registry::get('logger')->info(__METHOD__ . ' - input values: ' . print_r($values, true)); $newProject = null; try { if (isset($values['project_id'])) { $newProject = $modelProject->updateProject($values['project_id'], $values); } else { $newProject = $modelProject->createProject($this->_authMember->member_id, $values, $this->_authMember->username); //$this->createSystemPlingForNewProject($newProject->project_id); } } catch (Exception $exc) { Zend_Registry::get('logger')->warn(__METHOD__ . ' - traceString: ' . $exc->getTraceAsString()); } if (!$newProject) { $this->_helper->flashMessenger->addMessage('

You did not choose a Category in the last level.

'); $this->forward('add'); return; } //update the gallery pics $mediaServerUrls = $this->saveGalleryPics($form->gallery->upload->upload_picture); $modelProject->updateGalleryPictures($newProject->project_id, $mediaServerUrls); //If there is no Logo, we take the 1. gallery pic if (!isset($values['image_small']) || $values['image_small'] == '') { $values['image_small'] = $mediaServerUrls[0]; $newProject = $modelProject->updateProject($newProject->project_id, $values); } //New Project in Session, for AuthValidation (owner) $this->_auth->getIdentity()->projects[$newProject->project_id] = array('project_id' => $newProject->project_id); $modelTags = new Default_Model_Tags(); if ($values['tagsuser']) { $modelTags->processTagsUser($newProject->project_id, implode(',', $values['tagsuser']),Default_Model_Tags::TAG_TYPE_PROJECT); } else { $modelTags->processTagsUser($newProject->project_id, null, Default_Model_Tags::TAG_TYPE_PROJECT); } if ($values['is_original']) { $modelTags->processTagProductOriginal($newProject->project_id, $values['is_original']); } //set license, if needed $licenseTag = $form->getElement('license_tag_id')->getValue(); //only set/update license tags if something was changed if ($licenseTag && count($licenseTag) > 0) { $modelTags->saveLicenseTagForProject($newProject->project_id, $licenseTag); $activityLog = new Default_Model_ActivityLog(); $activityLog->logActivity($newProject->project_id, $newProject->project_id, $this->_authMember->member_id,Default_Model_ActivityLog::PROJECT_LICENSE_CHANGED, array('title' => 'Set new License Tag', 'description' => 'New TagId: ' . $licenseTag)); } $isGitlabProject = $form->getElement('is_gitlab_project')->getValue(); $gitlabProjectId = $form->getElement('gitlab_project_id')->getValue(); if ($isGitlabProject && $gitlabProjectId == 0) { $values['gitlab_project_id'] = null; } $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($newProject->project_id, $newProject->member_id, Default_Model_ActivityLog::PROJECT_CREATED, $newProject->toArray()); // ppload $this->processPploadId($newProject); try { if (100 < $this->_authMember->roleId) { if (Default_Model_Spam::hasSpamMarkers($newProject->toArray())) { $tableReportComments = new Default_Model_DbTable_ReportProducts(); $tableReportComments->save(array('project_id' => $newProject->project_id, 'reported_by' => 24, 'text' => "System: automatic spam detection")); } Default_Model_DbTable_SuspicionLog::logProject($newProject, $this->_authMember, $this->getRequest()); } } catch (Zend_Exception $e) { Zend_Registry::get('logger')->err($e->getMessage()); } $this->redirect('/member/' . $newProject->member_id . '/products/'); } private function saveGalleryPics($form_element) { $imageModel = new Default_Model_DbTable_Image(); return $imageModel->saveImages($form_element); } /** * @param $projectData * * @throws Zend_Exception * @throws Zend_Queue_Exception */ protected function createTaskWebsiteOwnerVerification($projectData) { if (empty($projectData->link_1)) { return; } $checkAuthCode = new Local_Verification_WebsiteProject(); $authCode = $checkAuthCode->generateAuthCode(stripslashes($projectData->link_1)); $queue = Local_Queue_Factory::getQueue(); $command = new Backend_Commands_CheckProjectWebsite($projectData->project_id, $projectData->link_1, $authCode); $queue->send(serialize($command)); } /** * @param $projectData */ protected function processPploadId($projectData) { if ($projectData->ppload_collection_id) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); // Update collection information $collectionCategory = $projectData->project_category_id; if (Default_Model_Project::PROJECT_ACTIVE == $projectData->status) { $collectionCategory .= '-published'; } $collectionRequest = array( 'title' => $projectData->title, 'description' => $projectData->description, 'category' => $collectionCategory, 'content_id' => $projectData->project_id ); $collectionResponse = $pploadApi->putCollection($projectData->ppload_collection_id, $collectionRequest); // Store product image as collection thumbnail $this->_updatePploadMediaCollectionthumbnail($projectData); } } /** * ppload */ protected function _updatePploadMediaCollectionthumbnail($projectData) { if (empty($projectData->ppload_collection_id) || empty($projectData->image_small) ) { return false; } $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $filename = sys_get_temp_dir() . '/' . $projectData->image_small; if (false === file_exists(dirname($filename))) { mkdir(dirname($filename), 0777, true); } $viewHelperImage = new Default_View_Helper_Image(); $uri = $viewHelperImage->Image($projectData->image_small, array( 'width' => 600, 'height' => 600 )); file_put_contents($filename, file_get_contents($uri)); $mediaCollectionthumbnailResponse = $pploadApi->postMediaCollectionthumbnail($projectData->ppload_collection_id, array('file' => $filename)); unlink($filename); if (isset($mediaCollectionthumbnailResponse->status) && $mediaCollectionthumbnailResponse->status == 'success' ) { return true; } return false; } public function editAction() { if (empty($this->_projectId)) { $this->redirect($this->_helper->url('add')); return; } $this->_helper->viewRenderer('add'); // we use the same view as you can see at add a product $this->view->mode = 'edit'; $projectTable = new Default_Model_DbTable_Project(); $projectModel = new Default_Model_Project(); $modelTags = new Default_Model_Tags(); $tagTable = new Default_Model_DbTable_Tags(); //check if product with given id exists $projectData = $projectTable->find($this->_projectId)->current(); if (empty($projectData)) { $this->redirect($this->_helper->url('add')); return; } $member = null; if (isset($this->_authMember) AND (false === empty($this->_authMember->member_id))) { $member = $this->_authMember; } else { throw new Zend_Controller_Action_Exception('no authorization found'); } if (("admin" == $this->_authMember->roleName)) { $modelMember = new Default_Model_Member(); $member = $modelMember->fetchMember($projectData->member_id, false); } //set ppload-collection-id in view $this->view->ppload_collection_id = $projectData->ppload_collection_id; $this->view->project_id = $projectData->project_id; $this->view->product = $projectData; //create ppload download hash: secret + collection_id + expire-timestamp $salt = PPLOAD_DOWNLOAD_SECRET; $collectionID = $projectData->ppload_collection_id; $timestamp = time() + 3600; // one hour valid //20181009 ronald: change hash from MD5 to SHA512 //$hash = md5($salt . $collectionID . $timestamp); // order isn't important at all... just do the same when verifying $hash = hash('sha512',$salt . $collectionID . $timestamp); // order isn't important at all... just do the same when verifying $this->view->download_hash = $hash; $this->view->download_timestamp = $timestamp; $this->view->member_id = $member->member_id; $this->view->member = $member; //read the already existing gallery pics and add them to the form $sources = $projectModel->getGalleryPictureSources($this->_projectId); //get the gitlab projects for this user //setup form $form = new Default_Form_Product(array('pictures' => $sources, 'member_id' => $this->view->member_id)); if (false === empty($projectData->image_small)) { $form->getElement('image_small_upload')->setRequired(false); } $form->getElement('preview')->setLabel('Save'); $form->removeElement('project_id'); // we don't need this field in edit mode if ($this->_request->isGet()) { $form->populate($projectData->toArray()); // $form->populate(array('tags' => $modelTags->getTags($projectData->project_id, Default_Model_Tags::TAG_TYPE_PROJECT))); $form->populate(array('tagsuser' => $modelTags->getTagsUser($projectData->project_id, Default_Model_Tags::TAG_TYPE_PROJECT))); $form->getElement('image_small')->setValue($projectData->image_small); //Bilder voreinstellen $form->getElement(self::IMAGE_SMALL_UPLOAD)->setValue($projectData->image_small); $licenseTags = $tagTable->fetchLicenseTagsForProject($this->_projectId); $licenseTag = null; if($licenseTags) { $licenseTag = $licenseTags[0]['tag_id']; } $form->getElement('license_tag_id')->setValue($licenseTag); $is_original = $modelTags->isProuductOriginal($projectData->project_id); if($is_original){ $form->getElement('is_original')->checked= true; } $this->view->form = $form; return; } if (isset($_POST['cancel'])) { // user cancel function $this->redirect('/member/' . $member->member_id . '/news/'); } if (false === $form->isValid($_POST, $this->_projectId)) { // form not valid $this->view->form = $form; $this->view->error = 1; return; } $values = $form->getValues(); //set license, if needed $tagList = $modelTags->getTagsArray($this->_projectId, $modelTags::TAG_TYPE_PROJECT, $modelTags::TAG_LICENSE_GROUPID); $oldLicenseTagId = null; if($tagList && count($tagList) == 1) { $oldLicenseTagId = $tagList[0]['tag_id']; } $licenseTag = $form->getElement('license_tag_id')->getValue(); //only set/update license tags if something was changed if($licenseTag <> $oldLicenseTagId) { $modelTags->saveLicenseTagForProject($this->_projectId, $licenseTag); $activityLog = new Default_Model_ActivityLog(); $activityLog->logActivity($this->_projectId, $this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_LICENSE_CHANGED, array('title' => 'License Tag', 'description' => 'Old TagId: '.$oldLicenseTagId.' - New TagId: '.$licenseTag)); } //gitlab project $isGitlabProject = $form->getElement('is_gitlab_project')->getValue(); $gitlabProjectId = $form->getElement('gitlab_project_id')->getValue(); if($isGitlabProject && $gitlabProjectId == 0) { $values['gitlab_project_id'] = null; } $imageModel = new Default_Model_DbTable_Image(); try { $uploadedSmallImage = $imageModel->saveImage($form->getElement(self::IMAGE_SMALL_UPLOAD)); $values['image_small'] = $uploadedSmallImage ? $uploadedSmallImage : $values['image_small']; } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ERROR upload productPicture - ' . print_r($e, true)); } // save changes - $projectData->setFromArray($values); + $projectModel->updateProject($this->_projectId, $values); //update the gallery pics $pictureSources = array_merge($values['gallery']['online_picture'], $this->saveGalleryPics($form->gallery->upload->upload_picture)); $projectModel->updateGalleryPictures($this->_projectId, $pictureSources); //If there is no Logo, we take the 1. gallery pic if (!isset($projectData->image_small) || $projectData->image_small == '') { $projectData->image_small = $pictureSources[0]; } //20180219 ronald: we set the changed_at only by new files or new updates //$projectData->changed_at = new Zend_Db_Expr('NOW()'); $projectData->save(); $modelTags->processTagProductOriginal($this->_projectId,$values['is_original']); if($values['tagsuser']) { $modelTags->processTagsUser($this->_projectId,implode(',',$values['tagsuser']), Default_Model_Tags::TAG_TYPE_PROJECT); }else { $modelTags->processTagsUser($this->_projectId,null, Default_Model_Tags::TAG_TYPE_PROJECT); } $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_EDITED, $projectData->toArray()); // ppload $this->processPploadId($projectData); try { if (100 < $this->_authMember->roleId) { if (Default_Model_Spam::hasSpamMarkers($projectData->toArray())) { $tableReportComments = new Default_Model_DbTable_ReportProducts(); $tableReportComments->save(array('project_id' => $projectData->project_id, 'reported_by' => 24, 'text' => "System: automatic spam detection on product edit")); } Default_Model_DbTable_SuspicionLog::logProject($projectData, $this->_authMember, $this->getRequest()); } } catch (Zend_Exception $e) { Zend_Registry::get('logger')->err($e->getMessage()); } $helperBuildMemberUrl = new Default_View_Helper_BuildMemberUrl(); $this->redirect($helperBuildMemberUrl->buildMemberUrl($member->username, 'products')); } public function getupdatesajaxAction() { $this->view->authMember = $this->_authMember; $tableProject = new Default_Model_ProjectUpdates(); $updates = $tableProject->fetchProjectUpdates($this->_projectId); foreach ($updates as $key => $update) { $updates[$key]['title'] = Default_Model_HtmlPurify::purify($update['title']); $updates[$key]['text'] = Default_Model_BBCode::renderHtml(Default_Model_HtmlPurify::purify(htmlentities($update['text'], ENT_QUOTES | ENT_IGNORE))); $updates[$key]['raw_title'] = $update['title']; $updates[$key]['raw_text'] = $update['text']; } $result['status'] = 'success'; $result['ResultSize'] = count($updates); $result['updates'] = $updates; $this->_helper->json($result); } public function saveupdateajaxAction() { $filter = new Zend_Filter_Input( array( '*' => 'StringTrim' ), array( '*' => array(), 'title' => array( new Zend_Validate_StringLength(array('min' => 3, 'max' => 200)), 'presence' => 'required', 'allowEmpty' => false ), 'text' => array( new Zend_Validate_StringLength(array('min' => 3, 'max' => 16383)), 'presence' => 'required', 'allowEmpty' => false ), 'update_id' => array('digits', 'allowEmpty' => true) ), $this->getAllParams(), array('allowEmpty' => true)); if ($filter->hasInvalid() OR $filter->hasMissing() OR $filter->hasUnknown()) { $result['status'] = 'error'; $result['messages'] = $filter->getMessages(); $result['update_id'] = null; $this->_helper->json($result); } $update_id = $filter->getEscaped('update_id'); $tableProjectUpdates = new Default_Model_ProjectUpdates(); //Save update if (!empty($update_id)) { //Update old update $updateArray = array(); $updateArray['title'] = $filter->getUnescaped('title'); $updateArray['text'] = $filter->getUnescaped('text'); $updateArray['changed_at'] = new Zend_Db_Expr('Now()'); $countUpdated = $tableProjectUpdates->update($updateArray, 'project_update_id = ' . $update_id); } else { //Add new update $updateArray = array(); $updateArray['title'] = $filter->getUnescaped('title'); $updateArray['text'] = $filter->getUnescaped('text'); $updateArray['public'] = 1; $updateArray['project_id'] = $this->_projectId; $updateArray['member_id'] = $this->_authMember->member_id; $updateArray['created_at'] = new Zend_Db_Expr('Now()'); $updateArray['changed_at'] = new Zend_Db_Expr('Now()'); $rowset = $tableProjectUpdates->save($updateArray); $update_id = $rowset->project_update_id; //20180219 ronald: we set the changed_at only by new files or new updates $projectTable = new Default_Model_Project(); $projectUpdateRow = $projectTable->find($this->_projectId)->current(); if (count($projectUpdateRow) == 1) { $projectUpdateRow->changed_at = new Zend_Db_Expr('NOW()'); $projectUpdateRow->save(); } } $result['status'] = 'success'; $result['update_id'] = $update_id; $this->_helper->json($result); } public function deleteupdateajaxAction() { $this->view->authMember = $this->_authMember; $tableProject = new Default_Model_ProjectUpdates(); $params = $this->getAllParams(); $project_update_id = $params['update_id']; $updateArray = array(); $updateArray['public'] = 0; $updateArray['changed_at'] = new Zend_Db_Expr('Now()'); $tableProject->update($updateArray, 'project_update_id = ' . $project_update_id); $result['status'] = 'success'; $result['update_id'] = $project_update_id; $this->_helper->json($result); } public function updatesAction() { $this->view->authMember = $this->_authMember; $tableProject = new Default_Model_Project(); $this->view->product = $tableProject->fetchProductInfo($this->_projectId); if (false === isset($this->view->product)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } $this->view->relatedProducts = $tableProject->fetchSimilarProjects($this->view->product, 6); $this->view->supporter = $tableProject->fetchProjectSupporter($this->_projectId); $this->view->product_views = $tableProject->fetchProjectViews($this->_projectId); $modelPlings = new Default_Model_DbTable_Plings(); $this->view->comments = $modelPlings->getCommentsForProject($this->_projectId, 10); $tableMember = new Default_Model_Member(); $this->view->member = $tableMember->fetchMemberData($this->view->product->member_id); $this->view->updates = $tableProject->fetchProjectUpdates($this->_projectId); $tablePageViews = new Default_Model_DbTable_StatPageViews(); $tablePageViews->savePageView($this->_projectId, $this->getRequest()->getClientIp(), $this->_authMember->member_id); } public function updateAction() { $this->_helper->layout()->setLayout('flat_ui'); $this->view->headScript()->setFile(''); $this->view->headLink()->setStylesheet(''); $this->_helper->viewRenderer('add'); $form = new Default_Form_ProjectUpdate(); $projectTable = new Default_Model_Project(); $projectData = null; $projectUpdateId = (int)$this->getParam('upid'); $this->view->member = $this->_authMember; $this->view->title = 'Add an update for your product'; $activityLogType = Default_Model_ActivityLog::PROJECT_ITEM_CREATED; if (false === empty($projectUpdateId)) { $this->view->title = 'Edit an product update'; $projectData = $projectTable->find($projectUpdateId)->current(); $form->populate($projectData->toArray()); $form->getElement('upid')->setValue($projectUpdateId); $activityLogType = Default_Model_ActivityLog::PROJECT_ITEM_EDITED; } $this->view->form = $form; if ($this->_request->isGet()) { return; } if (isset($_POST['cancel'])) { // user cancel function $this->_redirect('/member/' . $this->_authMember->member_id . '/news/'); } if (false === $form->isValid($_POST)) { // form not valid $this->view->form = $form; $this->view->error = 1; return; } $values = $form->getValues(); $projectUpdateRow = $projectTable->find($values['upid'])->current(); if (count($projectUpdateRow) == 0) { $projectUpdateRow = $projectTable->createRow($values); $projectUpdateRow->project_id = $values['upid']; $projectUpdateRow->created_at = new Zend_Db_Expr('NOW()'); $projectUpdateRow->start_date = new Zend_Db_Expr('NOW()'); $projectUpdateRow->member_id = $this->_authMember->member_id; $projectUpdateRow->creator_id = $this->_authMember->member_id; $projectUpdateRow->status = Default_Model_Project::PROJECT_ACTIVE; $projectUpdateRow->type_id = 2; $projectUpdateRow->pid = $this->_projectId; } else { $projectUpdateRow->setFromArray($values); //20180219 ronald: we set the changed_at only by new files or new updates //$projectUpdateRow->changed_at = new Zend_Db_Expr('NOW()'); } $lastId = $projectUpdateRow->save(); //New Project in Session, for AuthValidation (owner) $this->_auth->getIdentity()->projects[$lastId] = array('project_id' => $lastId); $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLogValues = $projectUpdateRow->toArray(); $activityLogValues['image_small'] = $product->image_small; $activityLog = new Default_Model_ActivityLog(); //$activityLog->writeActivityLog($lastId, $projectUpdateRow->member_id, $activityLogType, $activityLogValues); $activityLog->writeActivityLog($lastId, $this->_authMember->member_id, $activityLogType, $activityLogValues); $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); $urlProjectShow = $helperBuildProductUrl->buildProductUrl($this->_projectId); $this->redirect($urlProjectShow); } public function previewAction() { $this->view->authMember = $this->_authMember; $form = new Default_Form_ProjectConfirm(); if ($this->_request->isGet()) { $form->populate(get_object_vars($this->_authMember)); $this->view->form = $form; $this->fetchDataForIndexView(); $this->view->preview = $this->view->render('product/index.phtml'); return; } if (isset($_POST['save'])) { $projectTable = new Default_Model_Project(); $projectTable->setStatus(Default_Model_Project::PROJECT_INACTIVE, $this->_projectId); //todo: maybe we have to delete the project data from database otherwise we produce many zombies $this->redirect('/member/' . $this->_authMember->member_id . '/products/'); } if (isset($_POST['back'])) { $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); $this->redirect($helperBuildProductUrl->buildProductUrl($this->_projectId, 'edit')); } if (false === $form->isValid($_POST)) { // form not valid $this->view->form = $form; $this->fetchDataForIndexView(); $this->view->preview = $this->view->render('product/index.phtml'); $this->view->error = 1; return; } $projectTable = new Default_Model_Project(); $projectTable->setStatus(Default_Model_Project::PROJECT_ACTIVE, $this->_projectId); // add to search index $modelProject = new Default_Model_Project(); $productInfo = $modelProject->fetchProductInfo($this->_projectId); $modelSearch = new Default_Model_Search_Lucene(); $modelSearch->addDocument($productInfo->toArray()); $this->redirect('/member/' . $this->_authMember->member_id . '/products/'); } protected function fetchDataForIndexView() { $tableProject = new Default_Model_Project(); $this->view->product = $tableProject->fetchProductInfo($this->_projectId); if (false === isset($this->view->product)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } $desc = $this->view->product->description; $newDesc = $this->bbcode2html($desc); $this->view->product->description = $newDesc; // switch off temporally 02.05.2017 //$this->view->supporting = $tableProject->fetchProjectSupporterWithPlings($this->_projectId); //$orgUpdates = $tableProjectUpdates->fetchLastProjectUpdate($this->_projectId); $tableProjectUpdates = new Default_Model_ProjectUpdates(); $orgUpdates = $tableProjectUpdates->fetchProjectUpdates($this->_projectId); $newUpdates = array(); foreach ($orgUpdates as $update) { $desc = $update['text']; $newDesc = $this->bbcode2html($desc); $update['text'] = $newDesc; $newUpdates[] = $update; } $this->view->updates = $newUpdates; // switch off temporally 02.05.2017 //$this->view->supporter = $tableProject->fetchProjectSupporter($this->_projectId); $this->view->galleryPictures = $tableProject->getGalleryPictureSources($this->_projectId); $this->view->product_views = $tableProject->fetchProjectViews($this->_projectId); $helperFetchCategory = new Default_View_Helper_CatTitle(); $helperFetchCatParent = new Default_View_Helper_CatParent(); $this->view->catId = $this->view->product->project_category_id; $this->view->catTitle = $helperFetchCategory->catTitle($this->view->product->project_category_id); $this->view->catParentId = $helperFetchCatParent->getCatParentId(array('project_category_id' => $this->view->product->project_category_id)); if ($this->view->catParentId) { $this->view->catParentTitle = $helperFetchCategory->catTitle($this->view->catParentId); } $AuthCodeExist = new Local_Verification_WebsiteProject(); $this->view->websiteAuthCode = $AuthCodeExist->generateAuthCode(stripslashes($this->view->product->link_1)); // switch off temporally 02.05.2017 //$modelPlings = new Default_Model_DbTable_Plings(); //$this->view->plings = $modelPlings->getDonationsForProject($this->_projectId, 10); $tableMember = new Default_Model_Member(); $this->view->member = $tableMember->fetchMemberData($this->view->product->member_id); $this->view->more_products = $tableProject->fetchMoreProjects($this->view->product, 8); $this->view->more_products_otheruser = $tableProject->fetchMoreProjectsOfOtherUsr($this->view->product, 8); $widgetDefaultModel = new Default_Model_DbTable_ProjectWidgetDefault(); $widgetDefault = $widgetDefaultModel->fetchConfig($this->_projectId); $widgetDefault->text->headline = $this->view->product->title; //$widgetDefault->amounts->current = $this->view->product->amount_received; $widgetDefault->amounts->goal = $this->view->product->amount; $widgetDefault->project = $this->_projectId; $this->view->widgetConfig = $widgetDefault; $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); $this->view->permaLink = $helperBuildProductUrl->buildProductUrl($this->_projectId, null, null, true); $this->view->urlPay = $helperBuildProductUrl->buildProductUrl($this->_projectId, 'pay'); $referrerUrl = $this->readExploreUrlFromReferrer(); if (false === empty($referrerUrl)) { $this->view->referrerUrl = $referrerUrl; } } /** * transforms a string with bbcode markup into html * * @param string $txt * @param bool $nl2br * * @return string */ private function bbcode2html($txt, $nl2br = true, $forcecolor = '') { if (!empty($forcecolor)) { $fc = ' style="color:' . $forcecolor . ';"'; } else { $fc = ''; } $newtxt = htmlspecialchars($txt); if ($nl2br) { $newtxt = nl2br($newtxt); } $patterns = array( '`\[b\](.+?)\[/b\]`is', '`\[i\](.+?)\[/i\]`is', '`\[u\](.+?)\[/u\]`is', '`\[li\](.+?)\[/li\]`is', '`\[strike\](.+?)\[/strike\]`is', '`\[url\]([a-z0-9]+?://){1}([\w\-]+\.([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^ \"\n\r\t<]*)?)\[/url\]`si', '`\[quote\](.+?)\[/quote\]`is', '`\[indent](.+?)\[/indent\]`is' ); $replaces = array( '\\1', '\\1', '\\1', '\\1', '\\1', '\1\2', 'Quote:
\1
', '\\1' ); $newtxt = preg_replace($patterns, $replaces, $newtxt); return ($newtxt); } protected function readExploreUrlFromReferrer() { $helperBuildExploreUrl = new Default_View_Helper_BuildExploreUrl(); $referrerExplore = $helperBuildExploreUrl->buildExploreUrl(null, null, null, null, true); /** @var Zend_Controller_Request_Http $request */ $request = $this->getRequest(); if (strpos($request->getHeader('referer'), $referrerExplore) !== false) { return $request->getHeader('referer'); } } public function plingAction() { if (empty($this->_projectId)) { $this->redirect('/explore'); } $this->view->authMember = $this->_authMember; $this->fetchDataForIndexView(); $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); $this->view->urlPay = $helperBuildProductUrl->buildProductUrl($this->_projectId, 'pay'); $this->view->amount = (float)$this->getParam('amount', 1); $this->view->comment = html_entity_decode(strip_tags($this->getParam('comment'), null), ENT_QUOTES, 'utf-8'); $this->view->provider = mb_strtolower(html_entity_decode(strip_tags($this->getParam('provider'), null), ENT_QUOTES, 'utf-8'), 'utf-8'); $this->view->headTitle($this->_browserTitlePrepend . $this->view->product->title, 'SET'); $helperUserIsOwner = new Default_View_Helper_UserIsOwner(); $helperIsProjectActive = new Default_View_Helper_IsProjectActive(); if ((false === $helperIsProjectActive->isProjectActive($this->view->product->project_status)) AND (false === $helperUserIsOwner->UserIsOwner($this->view->product->member_id)) ) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } $tableProject = new Default_Model_Project(); $this->view->supporting = $tableProject->fetchProjectSupporterWithPlings($this->_projectId); } public function payAction() { $this->_helper->layout()->disableLayout(); $tableProject = new Default_Model_Project(); $project = $tableProject->fetchProductInfo($this->_projectId); //get parameter $amount = (float)$this->getParam('amount', 1); $comment = Default_Model_HtmlPurify::purify($this->getParam('comment')); $paymentProvider = mb_strtolower(html_entity_decode(strip_tags($this->getParam('provider'), null), ENT_QUOTES, 'utf-8'), 'utf-8'); $hideIdentity = (int)$this->getParam('hideId', 0); $paymentGateway = $this->createPaymentGateway($paymentProvider); $paymentGateway->getUserDataStore()->generateFromArray($project->toArray()); $requestMessage = 'Thank you for supporting: ' . $paymentGateway->getUserDataStore()->getProductTitle(); $response = null; try { $response = $paymentGateway->requestPayment($amount, $requestMessage); $this->view->checkoutEndpoint = $paymentGateway->getCheckoutEndpoint(); $this->view->paymentKey = $response->getPaymentId(); $this->_helper->viewRenderer->setRender('pay_' . $paymentProvider); } catch (Exception $e) { throw new Zend_Controller_Action_Exception('payment error', 500, $e); } if (false === $response->isSuccessful()) { throw new Zend_Controller_Action_Exception('payment failure', 500); } if (empty($this->_authMember->member_id) or ($hideIdentity == 1)) { $memberId = 1; } else { $memberId = $this->_authMember->member_id; } //Add pling $modelPlings = new Default_Model_DbTable_Plings(); $plingId = $modelPlings->createNewPlingFromResponse($response, $memberId, $project->project_id, $amount); if (false == empty($comment)) { $modelComments = new Default_Model_ProjectComments(); $dataComment = array( 'comment_type' => Default_Model_DbTable_Comments::COMMENT_TYPE_PLING, 'comment_target_id' => $project->project_id, 'comment_member_id' => $memberId, 'comment_pling_id' => $plingId, 'comment_text' => $comment ); $modelComments->save($dataComment); } $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $memberId, Default_Model_ActivityLog::PROJECT_PLINGED, $project->toArray()); } /** * @param string $paymentProvider * * @return Local_Payment_GatewayInterface * @throws Exception * @throws Local_Payment_Exception * @throws Zend_Controller_Exception * @throws Zend_Exception */ protected function createPaymentGateway($paymentProvider) { $httpHost = $this->getRequest()->getHttpHost(); /** @var Zend_Config $config */ $config = Zend_Registry::get('config'); $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); switch ($paymentProvider) { case 'paypal': $paymentGateway = new Default_Model_PayPal_Gateway($config->third_party->paypal); $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/paypal'); // $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/paypal?XDEBUG_SESSION_START=1'); $paymentGateway->setCancelUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'paymentcancel', null, true)); $paymentGateway->setReturnUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'paymentok', null, true)); break; case 'dwolla': $paymentGateway = new Default_Model_Dwolla_Gateway($config->third_party->dwolla); $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/dwolla'); // $paymentGateway->setIpnNotificationUrl('http://' . $_SERVER ['HTTP_HOST'] . '/gateway/dwolla?XDEBUG_SESSION_START=1'); $paymentGateway->setReturnUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'dwolla', null, true)); break; case 'amazon': $paymentGateway = new Default_Model_Amazon_Gateway($config->third_party->amazon); $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/amazon'); // $paymentGateway->setIpnNotificationUrl('http://' . $httpHost . '/gateway/amazon?XDEBUG_SESSION_START=1'); $paymentGateway->setCancelUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'paymentcancel', null, true)); $paymentGateway->setReturnUrl($helperBuildProductUrl->buildProductUrl($this->_projectId, 'paymentok', null, true)); break; default: throw new Zend_Controller_Exception('No known payment provider found in parameters.'); break; } return $paymentGateway; } public function dwollaAction() { $modelPling = new Default_Model_DbTable_Plings(); $plingData = $modelPling->fetchRow(array('payment_reference_key = ?' => $this->getParam('checkoutId'))); $plingData->payment_transaction_id = (int)$this->getParam('transaction'); $plingData->save(); if ($this->_getParam('status') == 'Completed') { $this->_helper->viewRenderer('paymentok'); $this->paymentokAction(); } else { $this->_helper->viewRenderer('paymentcancel'); $this->paymentcancelAction(); } } public function paymentokAction() { $this->_helper->layout()->disableLayout(); $this->view->paymentStatus = 'success'; $this->view->paymentMessage = 'Payment successful.'; $this->fetchDataForIndexView(); } public function paymentcancelAction() { $this->_helper->layout()->disableLayout(); $this->view->paymentStatus = 'danger'; $this->view->paymentMessage = 'Payment cancelled.'; $this->fetchDataForIndexView(); } public function deleteAction() { $this->_helper->layout()->setLayout('flat_ui'); $memberId = (int)$this->getParam('m'); if ((empty($this->_authMember->member_id)) OR (empty($memberId)) OR ($this->_authMember->member_id != $memberId) ) { $this->forward('products', 'user', 'default'); return; } $tableProduct = new Default_Model_Project(); $tableProduct->setDeleted($this->_authMember->member_id,$this->_projectId); $product = $tableProduct->find($this->_projectId)->current(); // delete product from search index $modelSearch = new Default_Model_Search_Lucene(); $modelSearch->deleteDocument($product->toArray()); // $command = new Backend_Commands_DeleteProductExtended($product); // $command->doCommand(); // $queue = Local_Queue_Factory::getQueue('search'); // $command = new Backend_Commands_DeleteProductFromIndex($product->project_id, $product->project_category_id); // $msg = $queue->send(serialize($command)); // ppload // Delete collection if ($product->ppload_collection_id) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $collectionResponse = $pploadApi->deleteCollection($product->ppload_collection_id); } $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_DELETED, $product->toArray()); $this->forward('products', 'user', 'default'); } public function unpublishAction() { $this->_helper->layout()->setLayout('flat_ui'); $memberId = (int)$this->getParam('m'); if ( (empty($this->_authMember->member_id)) OR (empty($memberId)) OR ($this->_authMember->member_id != $memberId) ) { return; } $tableProduct = new Default_Model_Project(); $tableProduct->setInActive($this->_projectId, $memberId); $product = $tableProduct->find($this->_projectId)->current(); if (isset($product->type_id) && $product->type_id == Default_Model_Project::PROJECT_TYPE_UPDATE) { $parentProduct = $tableProduct->find($product->pid)->current(); $product->image_small = $parentProduct->image_small; } $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_UNPUBLISHED, $product->toArray()); // remove unpublished project from search index $modelSearch = new Default_Model_Search_Lucene(); $modelSearch->deleteDocument($product); // ppload if ($product->ppload_collection_id) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); // Update collection information $collectionRequest = array( 'category' => $product->project_category_id ); $collectionResponse = $pploadApi->putCollection($product->ppload_collection_id, $collectionRequest); } $this->forward('products', 'user', 'default', array('member_id' => $memberId)); //$this->redirect('/member/'.$memberId.'/products'); } public function publishAction() { $memberId = (int)$this->getParam('m'); if ((empty($this->_authMember->member_id)) OR (empty($memberId)) OR ($this->_authMember->member_id != $memberId) ) { return; } $tableProduct = new Default_Model_Project(); $tableProduct->setActive($this->_authMember->member_id,$this->_projectId); $product = $tableProduct->find($this->_projectId)->current(); if (isset($product->type_id) && $product->type_id == Default_Model_Project::PROJECT_TYPE_UPDATE) { $parentProduct = $tableProduct->find($product->pid)->current(); $product->image_small = $parentProduct->image_small; } $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_PUBLISHED, $product->toArray()); // add published project to search index $productInfo = $tableProduct->fetchProductInfo($this->_projectId); $modelSearch = new Default_Model_Search_Lucene(); $modelSearch->addDocument($productInfo); // ppload if ($product->ppload_collection_id) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); // Update collection information $collectionRequest = array( 'category' => $product->project_category_id . '-published' ); $collectionResponse = $pploadApi->putCollection($product->ppload_collection_id, $collectionRequest); } $this->forward('products', 'user', 'default', array('member_id' => $memberId)); //$this->redirect('/member/'.$memberId.'/products'); } public function loadratingsAction() { $this->_helper->layout->disableLayout(); $tableProjectRatings = new Default_Model_DbTable_ProjectRating(); $ratings = $tableProjectRatings->fetchRating($this->_projectId); $this->_helper->json($ratings); } public function loadinstallinstructionAction() { $this->_helper->layout->disableLayout(); $infomodel = new Default_Model_Info(); $text = $infomodel->getOCSInstallInstruction(); $this->_helper->json(array( 'status' => 'ok', 'data' => $text )); } public function followAction() { $this->_helper->layout()->disableLayout(); // $this->_helper->viewRenderer->setNoRender(true); $this->view->project_id = $this->_projectId; $this->view->authMember = $this->_authMember; if (array_key_exists($this->_projectId, $this->_authMember->projects)) { return; } $projectFollowTable = new Default_Model_DbTable_ProjectFollower(); $newVals = array('project_id' => $this->_projectId, 'member_id' => $this->_authMember->member_id); $where = $projectFollowTable->select()->where('member_id = ?', $this->_authMember->member_id) ->where('project_id = ?', $this->_projectId, 'INTEGER') ; $result = $projectFollowTable->fetchRow($where); if (null === $result) { $projectFollowTable->createRow($newVals)->save(); $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_FOLLOWED, $product->toArray()); } // ppload //Add collection to favorite // $projectTable = new Default_Model_DbTable_Project(); // $projectData = $projectTable->find($this->_projectId)->current(); // if ($projectData->ppload_collection_id) { // $pploadApi = new Ppload_Api(array( // 'apiUri' => PPLOAD_API_URI, // 'clientId' => PPLOAD_CLIENT_ID, // 'secret' => PPLOAD_SECRET // )); // // $favoriteRequest = array( // 'user_id' => $this->_authMember->member_id, // 'collection_id' => $projectData->ppload_collection_id // ); // // $favoriteResponse = $pploadApi->postFavorite($favoriteRequest); // } } public function unfollowAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer('follow'); $this->view->project_id = $this->_projectId; $this->view->authMember = $this->_authMember; $projectFollowTable = new Default_Model_DbTable_ProjectFollower(); $projectFollowTable->delete('member_id=' . $this->_authMember->member_id . ' AND project_id=' . $this->_projectId); $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_UNFOLLOWED, $product->toArray()); // ppload // Delete collection from favorite // $projectTable = new Default_Model_DbTable_Project(); // $projectData = $projectTable->find($this->_projectId)->current(); // if ($projectData->ppload_collection_id) { // $pploadApi = new Ppload_Api(array( // 'apiUri' => PPLOAD_API_URI, // 'clientId' => PPLOAD_CLIENT_ID, // 'secret' => PPLOAD_SECRET // )); // // $favoriteRequest = array( // 'user_id' => $this->_authMember->member_id, // 'collection_id' => $projectData->ppload_collection_id // ); // // $favoriteResponse = // $pploadApi->postFavorite($favoriteRequest); // This post call will retrieve existing favorite info // if (!empty($favoriteResponse->favorite->id)) { // $favoriteResponse = $pploadApi->deleteFavorite($favoriteResponse->favorite->id); // } // } } public function followpAction() { $this->_helper->layout()->disableLayout(); // $this->_helper->viewRenderer->setNoRender(true); $this->view->project_id = $this->_projectId; $this->view->authMember = $this->_authMember; if (array_key_exists($this->_projectId, $this->_authMember->projects)) { return; } $projectFollowTable = new Default_Model_DbTable_ProjectFollower(); $newVals = array('project_id' => $this->_projectId, 'member_id' => $this->_authMember->member_id); $where = $projectFollowTable->select()->where('member_id = ?', $this->_authMember->member_id) ->where('project_id = ?', $this->_projectId, 'INTEGER') ; $result = $projectFollowTable->fetchRow($where); if (null === $result) { $projectFollowTable->createRow($newVals)->save(); $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_FOLLOWED, $product->toArray()); } } public function unfollowpAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer('followp'); $this->view->project_id = $this->_projectId; $this->view->authMember = $this->_authMember; $projectFollowTable = new Default_Model_DbTable_ProjectFollower(); $projectFollowTable->delete('member_id=' . $this->_authMember->member_id . ' AND project_id=' . $this->_projectId); $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_UNFOLLOWED, $product->toArray()); } protected function logActivity($logId) { $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, $logId, $product->toArray()); } public function followprojectAction() { $this->_helper->layout()->disableLayout(); $this->view->project_id = $this->_projectId; $this->view->authMember = $this->_authMember; // not allow to pling himself if (array_key_exists($this->_projectId, $this->_authMember->projects)) { $this->_helper->json(array( 'status' => 'error', 'msg' => 'not allowed' )); return; } $projectFollowTable = new Default_Model_DbTable_ProjectFollower(); $newVals = array('project_id' => $this->_projectId, 'member_id' => $this->_authMember->member_id); $where = $projectFollowTable->select()->where('member_id = ?', $this->_authMember->member_id) ->where('project_id = ?', $this->_projectId, 'INTEGER') ; $result = $projectFollowTable->fetchRow($where); if (null === $result) { $projectFollowTable->createRow($newVals)->save(); $this->logActivity(Default_Model_ActivityLog::PROJECT_FOLLOWED); $cnt = $projectFollowTable->countForProject($this->_projectId); $this->_helper->json(array( 'status' => 'ok', 'msg' => 'Success.', 'cnt' => $cnt, 'action' =>'insert' )); }else{ $projectFollowTable->delete('member_id=' . $this->_authMember->member_id . ' AND project_id=' . $this->_projectId); $this->logActivity(Default_Model_ActivityLog::PROJECT_UNFOLLOWED); $cnt = $projectFollowTable->countForProject($this->_projectId); $this->_helper->json(array( 'status' => 'ok', 'msg' => 'Success.', 'cnt' => $cnt, 'action' => 'delete' )); } } public function plingprojectAction() { $this->_helper->layout()->disableLayout(); $this->view->project_id = $this->_projectId; $this->view->authMember = $this->_authMember; // not allow to pling himself if (array_key_exists($this->_projectId, $this->_authMember->projects)) { $this->_helper->json(array( 'status' => 'error', 'msg' => 'not allowed' )); return; } // not allow to pling if not supporter $helperIsSupporter = new Default_View_Helper_IsSupporter(); if(!$helperIsSupporter->isSupporter($this->_authMember->member_id)) { $this->_helper->json(array( 'status' => 'error', 'msg' => 'become a supporter first please. ' )); return; } $projectplings = new Default_Model_ProjectPlings(); $newVals = array('project_id' => $this->_projectId, 'member_id' => $this->_authMember->member_id); $sql = $projectplings->select() ->where('member_id = ?', $this->_authMember->member_id) ->where('is_deleted = ?',0) ->where('project_id = ?', $this->_projectId, 'INTEGER') ; $result = $projectplings->fetchRow($sql); if (null === $result) { $projectplings->createRow($newVals)->save(); //$this->logActivity(Default_Model_ActivityLog::PROJECT_PLINGED_2); $cnt = $projectplings->getPlingsAmount($this->_projectId); $this->_helper->json(array( 'status' => 'ok', 'msg' => 'Success.', 'cnt' => $cnt, 'action' =>'insert' )); }else{ // delete pling $projectplings->setDelete($result->project_plings_id); //$this->logActivity(Default_Model_ActivityLog::PROJECT_DISPLINGED_2); $cnt = $projectplings->getPlingsAmount($this->_projectId); $this->_helper->json(array( 'status' => 'ok', 'msg' => 'Success.', 'cnt' => $cnt, 'action' => 'delete' )); } } /** public function unplingprojectAction() { $this->_helper->layout()->disableLayout(); $projectplings = new Default_Model_ProjectPlings(); $pling = $projectplings->getPling($this->_projectId,$this->_authMember->member_id); if($pling) { $projectplings->setDelete($pling->project_plings_id); $cnt = count($projectplings->getPlings($this->_projectId)); $this->_helper->json(array( 'status' => 'ok', 'deleted' => $pling->project_plings_id, 'msg' => 'Success. ', 'cnt' => $cnt )); $tableProduct = new Default_Model_Project(); $product = $tableProduct->find($this->_projectId)->current(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $this->_authMember->member_id, Default_Model_ActivityLog::PROJECT_DISPLINGED_2, $product->toArray()); }else{ $this->_helper->json(array( 'status' => 'error', 'msg' => 'not existing.' )); } } **/ public function followsAction() { $projectFollowTable = new Default_Model_Member(); $memberId = $this->_authMember->member_id; $this->view->productList = $projectFollowTable->fetchFollowedProjects($memberId); $projectArray = $this->generateFollowedProjectsViewData($this->view->productList); $this->view->productArray['followedProjects'] = $projectArray; } /** * @param $list * * @return array */ protected function generateFollowedProjectsViewData($list) { $viewArray = array(); if (count($list) == 0) { return $viewArray; } $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); foreach ($list as $element) { $arr = array(); $arr['id'] = $element->project_id; $arr['name'] = $element->title; $arr['image'] = $element->image_small; $arr['url'] = $helperBuildProductUrl->buildProductUrl($element->project_id); $arr['urlUnFollow'] = $helperBuildProductUrl->buildProductUrl($element->project_id, 'unfollow'); #$arr['showUrlUnFollow'] = $this->view->isMember; $viewArray[] = $arr; } return $viewArray; } public function verifycodeAction() { $this->_helper->layout()->disableLayout(); if ($this->_request->isXmlHttpRequest()) { $tabProject = new Default_Model_DbTable_Project(); $dataProject = $tabProject->find($this->_projectId)->current(); $this->createTaskWebsiteOwnerVerification($dataProject); $this->view->message = 'Your product page is stored for validation.'; return; } $this->view->message = 'This service is not available at the moment. Please try again later.'; } /** * @throws Zend_Controller_Action_Exception * @deprecated */ public function fetchAction() { $this->_helper->layout()->disableLayout(); if ($this->_request->isXmlHttpRequest()) { $this->view->authMember = $this->_authMember; $this->fetchDataForIndexView(); $tableProject = new Default_Model_Project(); $this->view->supporting = $tableProject->fetchProjectSupporterWithPlings($this->_projectId); if (false === isset($this->view->product)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } $helperUserIsOwner = new Default_View_Helper_UserIsOwner(); $helperIsProjectActive = new Default_View_Helper_IsProjectActive(); if ((false === $helperIsProjectActive->isProjectActive($this->view->product->project_status)) AND (false === $helperUserIsOwner->UserIsOwner($this->view->product->member_id)) ) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } $tablePageViews = new Default_Model_DbTable_StatPageViews(); $tablePageViews->savePageView($this->_projectId, $this->getRequest()->getClientIp(), $this->_authMember->member_id); } $this->_helper->json(get_object_vars($this->view)); } public function claimAction() { $modelProduct = new Default_Model_Project(); $productInfo = $modelProduct->fetchProductInfo($this->_projectId); if ($productInfo->claimable != Default_Model_Project::PROJECT_CLAIMABLE) { throw new Zend_Controller_Action_Exception('Method not available', 404); } $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); if (empty($productInfo->claimed_by_member)) { $modelProduct->setClaimedByMember($this->_authMember->member_id, $this->_projectId); $claimMail = new Default_Plugin_SendMail('tpl_mail_claim_product'); $claimMail->setTemplateVar('sender', $this->_authMember->mail); $claimMail->setTemplateVar('productid', $productInfo->project_id); $claimMail->setTemplateVar('producttitle', $productInfo->title); $claimMail->setTemplateVar('userid', $this->_authMember->member_id); $claimMail->setTemplateVar('username', $this->_authMember->username); $claimMail->setTemplateVar('usermail', $this->_authMember->mail); $claimMail->setReceiverMail(array('contact@opendesktop.org')); $claimMail->send(); $claimMailConfirm = new Default_Plugin_SendMail('tpl_mail_claim_confirm'); $claimMailConfirm->setTemplateVar('sender', 'contact@opendesktop.org'); $claimMailConfirm->setTemplateVar('producttitle', $productInfo->title); $claimMailConfirm->setTemplateVar('productlink', 'http://' . $this->getRequest()->getHttpHost() . $helperBuildProductUrl->buildProductUrl($productInfo->project_id)); $claimMailConfirm->setTemplateVar('username', $this->_authMember->username); $claimMailConfirm->setReceiverMail($this->_authMember->mail); $claimMailConfirm->send(); } $this->_helper->viewRenderer('index'); $this->indexAction(); } public function makerconfigAction() { $this->_helper->layout()->disableLayout(); $widgetProjectId = (int)$this->getParam('project_id'); if (false == isset($widgetProjectId)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } $widgetDefaultModel = new Default_Model_DbTable_ProjectWidgetDefault(); $widgetDefault = $widgetDefaultModel->fetchConfig($widgetProjectId); if (!isset($widgetDefault)) { throw new Zend_Controller_Action_Exception('This page does not exist', 404); } else { $this->view->widgetConfig = $widgetDefault; $productModel = new Default_Model_Project(); $this->view->product = $productModel->fetchProductDataFromMV($widgetProjectId); $this->view->supporting = $productModel->fetchProjectSupporterWithPlings($widgetProjectId); $plingModel = new Default_Model_DbTable_Plings(); $this->view->comments = $plingModel->getCommentsForProject($widgetProjectId, 10); $websiteOwner = new Local_Verification_WebsiteProject(); $this->view->authCode = ''; } } /** * ppload */ public function addpploadfileAction() { $this->_helper->layout()->disableLayout(); $log = Zend_Registry::get('logger'); $log->debug('**********' . __CLASS__ . '::' . __FUNCTION__ . '**********' . "\n"); $projectTable = new Default_Model_DbTable_Project(); $projectData = $projectTable->find($this->_projectId)->current(); $error_text = ''; // Add file to ppload collection if (!empty($_FILES['file_upload']['tmp_name']) && $_FILES['file_upload']['error'] == UPLOAD_ERR_OK ) { $tmpFilename = dirname($_FILES['file_upload']['tmp_name']) . '/' . basename($_FILES['file_upload']['name']); $log->debug(__CLASS__ . '::' . __FUNCTION__ . '::' . print_r($tmpFilename, true) . "\n"); move_uploaded_file($_FILES['file_upload']['tmp_name'], $tmpFilename); $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $fileRequest = array( 'file' => $tmpFilename, 'owner_id' => $this->_authMember->member_id ); //Admins can upload files for users $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $member_id = $projectData->member_id; $fileRequest = array( 'file' => $tmpFilename, 'owner_id' => $member_id ); } if ($projectData->ppload_collection_id) { // Append to existing collection $fileRequest['collection_id'] = $projectData->ppload_collection_id; } //if (isset($_POST['file_description'])) { // $fileRequest['description'] = mb_substr($_POST['file_description'], 0, 140); //} $fileResponse = $pploadApi->postFile($fileRequest); $log->debug(__CLASS__ . '::' . __FUNCTION__ . '::' . print_r($fileResponse, true) . "\n"); unlink($tmpFilename); if (!empty($fileResponse->file->collection_id)) { if (!$projectData->ppload_collection_id) { // Save collection ID $projectData->ppload_collection_id = $fileResponse->file->collection_id; //20180219 ronald: we set the changed_at only by new files or new updates if((int)$this->_authMember->member_id==(int)$projectData->member_id) { $projectData->changed_at = new Zend_Db_Expr('NOW()'); } else { $log->info('********** ' . __CLASS__ . '::' . __FUNCTION__ . ' Project ChangedAt is not set: Auth-Member ('.$this->_authMember->member_id.') != Project-Owner ('.$projectData->member_id.'): **********' . "\n"); } $projectData->ghns_excluded = 0; $projectData->save(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog($this->_projectId, $projectData->member_id, Default_Model_ActivityLog::PROJECT_EDITED, $projectData->toArray()); // Update profile information $memberTable = new Default_Model_DbTable_Member(); $memberSettings = $memberTable->find($this->_authMember->member_id)->current(); $mainproject = $projectTable->find($memberSettings->main_project_id)->current(); $profileName = ''; if ($memberSettings->firstname || $memberSettings->lastname ) { $profileName = trim($memberSettings->firstname . ' ' . $memberSettings->lastname); } else { if ($memberSettings->username) { $profileName = $memberSettings->username; } } $profileRequest = array( 'owner_id' => $this->_authMember->member_id, 'name' => $profileName, 'email' => $memberSettings->mail, 'homepage' => $memberSettings->link_website, 'description' => $mainproject->description ); $profileResponse = $pploadApi->postProfile($profileRequest); // Update collection information $collectionCategory = $projectData->project_category_id; if (Default_Model_Project::PROJECT_ACTIVE == $projectData->status) { $collectionCategory .= '-published'; } $collectionRequest = array( 'title' => $projectData->title, 'description' => $projectData->description, 'category' => $collectionCategory, 'content_id' => $projectData->project_id ); $collectionResponse = $pploadApi->putCollection($projectData->ppload_collection_id, $collectionRequest); // Store product image as collection thumbnail $this->_updatePploadMediaCollectionthumbnail($projectData); } else { //20180219 ronald: we set the changed_at only by new files or new updates if((int)$this->_authMember->member_id==(int)$projectData->member_id) { $projectData->changed_at = new Zend_Db_Expr('NOW()'); } else { $log->info('********** ' . __CLASS__ . '::' . __FUNCTION__ . ' Project ChangedAt is not set: Auth-Member ('.$this->_authMember->member_id.') != Project-Owner ('.$projectData->member_id.'): **********' . "\n"); } $projectData->ghns_excluded = 0; $projectData->save(); } //If this file is a video, we have to convert it for preview if(!empty($fileResponse->file->type) && in_array($fileResponse->file->type, Backend_Commands_ConvertVideo::$VIDEO_FILE_TYPES)) { $queue = Local_Queue_Factory::getQueue(); $command = new Backend_Commands_ConvertVideo($projectData->ppload_collection_id, $fileResponse->file->id, $fileResponse->file->type); $queue->send(serialize($command)); } $this->_helper->json(array( 'status' => 'ok', 'file' => $fileResponse->file )); return; } } $log->debug('********** END ' . __CLASS__ . '::' . __FUNCTION__ . '**********' . "\n"); $this->_helper->json(array('status' => 'error', 'error_text' => $error_text)); } /** * ppload */ public function updatepploadfileAction() { $this->_helper->layout()->disableLayout(); $log = Zend_Registry::get('logger'); $log->debug('**********' . __CLASS__ . '::' . __FUNCTION__ . '**********' . "\n"); $projectTable = new Default_Model_DbTable_Project(); $projectData = $projectTable->find($this->_projectId)->current(); $error_text = ''; // Update a file in ppload collection if (!empty($_POST['file_id'])) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $fileResponse = $pploadApi->getFile($_POST['file_id']); if (isset($fileResponse->file->collection_id) && $fileResponse->file->collection_id == $projectData->ppload_collection_id ) { $fileRequest = array(); $tmpFilename = ''; if (!empty($_FILES['file_upload']['tmp_name']) && $_FILES['file_upload']['error'] == UPLOAD_ERR_OK ) { $tmpFilename = dirname($_FILES['file_upload']['tmp_name']) . '/' . basename($_FILES['file_upload']['name']); $log->debug(__CLASS__ . '::' . __FUNCTION__ . '::' . print_r($tmpFilename, true) . "\n"); move_uploaded_file($_FILES['file_upload']['tmp_name'], $tmpFilename); $fileRequest['file'] = $tmpFilename; //20180219 ronald: we set the changed_at only by new files or new updates if((int)$this->_authMember->member_id==(int)$projectData->member_id) { $projectData->changed_at = new Zend_Db_Expr('NOW()'); } else { $log->info('********** ' . __CLASS__ . '::' . __FUNCTION__ . ' Project ChangedAt is not set: Auth-Member ('.$this->_authMember->member_id.') != Project-Owner ('.$projectData->member_id.'): **********' . "\n"); } $projectData->ghns_excluded = 0; $projectData->save(); } if (isset($_POST['file_description'])) { $fileRequest['description'] = mb_substr($_POST['file_description'], 0, 140); } if (isset($_POST['file_category'])) { $fileRequest['category'] = $_POST['file_category']; } if (isset($_POST['file_tags'])) { $fileRequest['tags'] = $_POST['file_tags']; } if (isset($_POST['ocs_compatible'])) { $fileRequest['ocs_compatible'] = $_POST['ocs_compatible']; } if (isset($_POST['file_version'])) { $fileRequest['version'] = $_POST['file_version']; } $fileResponse = $pploadApi->putFile($_POST['file_id'], $fileRequest); $log->debug(__CLASS__ . '::' . __FUNCTION__ . '::' . print_r($fileResponse, true) . "\n"); if ($tmpFilename) { unlink($tmpFilename); } if (isset($fileResponse->status) && $fileResponse->status == 'success' ) { $this->_helper->json(array( 'status' => 'ok', 'file' => $fileResponse->file )); return; } else { $error_text .= 'Response: $pploadApi->putFile(): ' . json_encode($fileResponse) . '; $fileResponse->status: ' . $fileResponse->status; } } else { $error_text .= 'PPload Response: ' . json_encode($fileResponse) . '; fileResponse->file->collection_id: ' . $fileResponse->file->collection_id . ' != $projectData->ppload_collection_id: ' . $projectData->ppload_collection_id; } } else { $error_text .= 'No CollectionId or no FileId. CollectionId: ' . $projectData->ppload_collection_id . ', FileId: ' . $_POST['file_id']; } $log->debug('********** END ' . __CLASS__ . '::' . __FUNCTION__ . '**********' . "\n"); $this->_helper->json(array('status' => 'error', 'error_text' => $error_text)); } public function updatefiletagAction() { $this->_helper->layout()->disableLayout(); $error_text = ''; // Update a file information in ppload collection if (!empty($_POST['file_id'])) { $tagId = null; if (isset($_POST['tag_id'])) { $tagId = $_POST['tag_id']; } $tagGroupId = null; if (isset($_POST['tag_group_id'])) { $tagGroupId = $_POST['tag_group_id']; } //set architecture $modelTags = new Default_Model_Tags(); $modelTags->saveFileTagForProjectAndTagGroup($this->_projectId, $_POST['file_id'], $tagId, $tagGroupId); $this->_helper->json(array('status' => 'ok')); return; } else { $error_text .= 'No FileId. , FileId: ' . $_POST['file_id']; } $this->_helper->json(array('status' => 'error', 'error_text' => $error_text)); } public function deletefiletagAction() { $this->_helper->layout()->disableLayout(); $error_text = ''; // Update a file information in ppload collection if (!empty($_POST['file_id'])) { $tagId = null; if (isset($_POST['tag_id'])) { $tagId = $_POST['tag_id']; } //set architecture $modelTags = new Default_Model_Tags(); $modelTags->deleteFileTagForProject($this->_projectId, $_POST['file_id'], $tagId); $this->_helper->json(array('status' => 'ok')); return; } else { $error_text .= 'No FileId. , FileId: ' . $_POST['file_id']; } $this->_helper->json(array('status' => 'error', 'error_text' => $error_text)); } public function updatecompatibleAction() { $this->_helper->layout()->disableLayout(); $error_text = ''; // Update a file information in ppload collection if (!empty($_POST['file_id'])) { $typeId = null; if (isset($_POST['is_compatible'])) { $is_compatible = $_POST['is_compatible']; } return; } else { $error_text .= 'No FileId. , FileId: ' . $_POST['file_id']; } $this->_helper->json(array('status' => 'error', 'error_text' => $error_text)); } public function startdownloadAction() { $this->_helper->layout()->disableLayout(); /** * Save Download-Data in Member_Download_History */ $file_id = $this->getParam('file_id'); $file_type = $this->getParam('file_type'); $file_name = $this->getParam('file_name'); $file_size = $this->getParam('file_size'); $projectId = $this->_projectId; $this->redirect('/dl?file_id='.$file_id.'&file_type='.$file_type.'&file_name='.$file_name.'&file_size='.$file_size.'&project_id='.$projectId); // if ($_SERVER['REQUEST_METHOD'] == 'POST') { /* if(isset($file_id) && isset($projectId) && isset($memberId)) { $memberDlHistory = new Default_Model_DbTable_MemberDownloadHistory(); $data = array('project_id' => $projectId, 'member_id' => $memberId, 'file_id' => $file_id, 'file_type' => $file_type, 'file_name' => $file_name, 'file_size' => $file_size); $memberDlHistory->createRow($data)->save(); } $url = urldecode($urltring); $this->redirect($url); * */ // } else { // $this->redirect('/ads?file_id='.$file_id); // } } /** * ppload */ public function deletepploadfileAction() { $this->_helper->layout()->disableLayout(); $projectTable = new Default_Model_DbTable_Project(); $projectData = $projectTable->find($this->_projectId)->current(); $error_text = ''; // Delete file from ppload collection if (!empty($_POST['file_id'])) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $fileResponse = $pploadApi->getFile($_POST['file_id']); if (isset($fileResponse->file->collection_id) && $fileResponse->file->collection_id == $projectData->ppload_collection_id ) { $fileResponse = $pploadApi->deleteFile($_POST['file_id']); if (isset($fileResponse->status) && $fileResponse->status == 'success' ) { $this->_helper->json(array('status' => 'ok')); return; } else { $error_text .= 'Response: $pploadApi->putFile(): ' . json_encode($fileResponse); } } } $this->_helper->json(array('status' => 'error', 'error_text' => $error_text)); } /** * ppload */ public function deletepploadfilesAction() { $this->_helper->layout()->disableLayout(); $projectTable = new Default_Model_DbTable_Project(); $projectData = $projectTable->find($this->_projectId)->current(); // Delete all files in ppload collection if ($projectData->ppload_collection_id) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $filesRequest = array( 'collection_id' => $projectData->ppload_collection_id, 'perpage' => 1000 ); $filesResponse = $pploadApi->getFiles($filesRequest); if (isset($filesResponse->status) && $filesResponse->status == 'success' ) { foreach ($filesResponse->files as $file) { $fileResponse = $pploadApi->deleteFile($file->id); if (!isset($fileResponse->status) || $fileResponse->status != 'success' ) { $this->_helper->json(array('status' => 'error')); return; } } } $this->_helper->json(array('status' => 'ok')); return; } $this->_helper->json(array('status' => 'error')); } /** * ppload */ /*public function deletepploadcollectionAction() { $this->_helper->layout()->disableLayout(); $projectTable = new Default_Model_DbTable_Project(); $projectData = $projectTable->find($this->_projectId)->current(); // Delete ppload collection if ($projectData->ppload_collection_id) { $pploadApi = new Ppload_Api(array( 'apiUri' => PPLOAD_API_URI, 'clientId' => PPLOAD_CLIENT_ID, 'secret' => PPLOAD_SECRET )); $collectionResponse = $pploadApi->deleteCollection($projectData->ppload_collection_id); if (isset($collectionResponse->status) && $collectionResponse->status == 'success' ) { $projectData->ppload_collection_id = null; $projectData->changed_at = new Zend_Db_Expr('NOW()'); $projectData->save(); $activityLog = new Default_Model_ActivityLog(); $activityLog->writeActivityLog( $this->_projectId, $projectData->member_id, Default_Model_ActivityLog::PROJECT_EDITED, $projectData->toArray() ); $this->_helper->json(array('status' => 'ok')); return; } } $this->_helper->json(array('status' => 'error')); }*/ public function saveproductAction() { $form = new Default_Form_Product(); // we don't need to test a file which doesn't exist in this case. The Framework stumbles if $_FILES is empty. if ($this->_request->isXmlHttpRequest() AND (count($_FILES) == 0)) { $form->removeElement('image_small_upload'); // $form->removeElement('image_big_upload'); $form->removeSubForm('gallery'); $form->removeElement('project_id'); //(workaround: Some Browsers send "0" in some cases.) } if (false === $form->isValid($_POST)) { $errors = $form->getMessages(); $messages = $this->getErrorMessages($errors); $this->_helper->json(array('status' => 'error', 'messages' => $messages)); } $formValues = $form->getValues(); $formValues['status'] = Default_Model_Project::PROJECT_INCOMPLETE; $modelProject = new Default_Model_Project(); $newProject = $modelProject->createProject($this->_authMember->member_id, $formValues, $this->_authMember->username); //$this->createSystemPlingForNewProject($newProject->project_id); //New Project in Session, for AuthValidation (owner) $this->_auth->getIdentity()->projects[$newProject->project_id] = array('project_id' => $newProject->project_id); $this->_helper->json(array('status' => 'ok', 'project_id' => $newProject->project_id)); } protected function createPling($member_id,$project_id) { $projectplings = new Default_Model_ProjectPlings(); $newVals = array('project_id' =>$project_id, 'member_id' => $member_id); $sql = $projectplings->select() ->where('member_id = ?', $this->_authMember->member_id) ->where('is_deleted = ?',0) ->where('project_id = ?', $this->_projectId, 'INTEGER'); $result = $projectplings->fetchRow($sql); if (null === $result) { $projectplings->createRow($newVals)->save(); } } /** * @param $errors * * @return array */ protected function getErrorMessages($errors) { $messages = array(); foreach ($errors as $element => $row) { if (!empty($row) && $element != 'submit') { foreach ($row as $validator => $message) { $messages[$element][] = $message; } } } return $messages; } public function searchAction() { // Filter-Parameter $filterInput = new Zend_Filter_Input( array( '*' => 'StringTrim', 'projectSearchText' => array(new Zend_Filter_Callback('stripslashes'),'StripTags'), 'page' => 'digits', 'pci' => 'digits', 'ls' => 'digits', 't' => array(new Zend_Filter_Callback('stripslashes'),'StripTags'), 'pkg'=> array(new Zend_Filter_Callback('stripslashes'),'StripTags'), 'lic'=> array(new Zend_Filter_Callback('stripslashes'),'StripTags'), 'arch'=> array(new Zend_Filter_Callback('stripslashes'),'StripTags') ), array( 'projectSearchText' => array( new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), 'presence' => 'required' ), 'page' => array('digits', 'default' => '1'), 'f' => array( new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), //new Zend_Validate_InArray(array('f'=>'tags')), 'allowEmpty' => true ), 'pci' => array('digits', 'allowEmpty' => true ), 'ls' => array('digits', 'allowEmpty' => true ), 't' => array(new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), 'allowEmpty' => true ), 'pkg' => array(new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), 'allowEmpty' => true ), 'lic' => array(new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), 'allowEmpty' => true ), 'arch' => array(new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), 'allowEmpty' => true) ), $this->getAllParams()); if ($filterInput->hasInvalid()) { $this->_helper->flashMessenger->addMessage('

There was an error. Please check your input and try again.

'); return; } $this->view->searchText = $filterInput->getEscaped('projectSearchText'); $this->view->page = $filterInput->getEscaped('page'); $this->view->searchField = $filterInput->getEscaped('f'); $this->view->pci = $filterInput->getEscaped('pci'); $this->view->ls = $filterInput->getEscaped('ls'); $this->view->t = $filterInput->getEscaped('t'); $this->view->pkg = $filterInput->getEscaped('pkg'); $this->view->arch = $filterInput->getEscaped('arch'); $this->view->lic = $filterInput->getEscaped('lic'); $this->view->store = $this->getParam('domain_store_id'); } /** * @param $memberId * * @throws Zend_Db_Table_Exception */ protected function setViewDataForMyProducts($memberId) { $tableMember = new Default_Model_Member(); $this->view->member = $tableMember->find($memberId)->current(); $tableProduct = new Default_Model_Project(); $this->view->products = $tableProduct->fetchAllProjectsForMember($memberId); } protected function _initResponseHeader() { $duration = 1800; // in seconds $expires = gmdate("D, d M Y H:i:s", time() + $duration) . " GMT"; $this->getResponse()->setHeader('X-FRAME-OPTIONS', 'ALLOWALL', true)// ->setHeader('Last-Modified', $modifiedTime, true) ->setHeader('Expires', $expires, true)->setHeader('Pragma', 'no-cache', true) ->setHeader('Cache-Control', 'private, no-cache, must-revalidate', true) ; } /** * @param $hits * * @return array */ protected function generateProjectsArrayForView($hits) { $viewArray = array(); $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl(); /** @var $hit Zend_Search_Lucene_Search_QueryHit */ foreach ($hits as $hit) { $project = $hit->getDocument(); if (null != $project->username) { $isUpdate = ($project->type_id == 2); if ($isUpdate) { $showUrl = $helperBuildProductUrl->buildProductUrl($project->pid) . '#anker_' . $project->project_id; $plingUrl = $helperBuildProductUrl->buildProductUrl($project->pid, 'pling'); } else { $showUrl = $helperBuildProductUrl->buildProductUrl($project->project_id); $plingUrl = $helperBuildProductUrl->buildProductUrl($project->project_id, 'pling'); } $projectArr = array( 'score' => $hit->score, 'id' => $project->project_id, 'type_id' => $project->type_id, 'title' => $project->title, 'description' => $project->description, 'image' => $project->image_small, 'plings' => 0, 'urlGoal' => $showUrl, 'urlPling' => $plingUrl, 'showUrlPling' => ($project->paypal_mail != null), 'member' => array( 'name' => $project->username, 'url' => 'member/' . $project->member_id, 'image' => $project->profile_image_url, 'id' => $project->member_id ) ); $viewArray[] = $projectArr; } } return $viewArray; } protected function setLayout() { $layoutName = 'flat_ui_template'; $storeConfig = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') : null; if($storeConfig && $storeConfig->layout_pagedetail) { $this->_helper->layout()->setLayout($storeConfig->layout_pagedetail); }else{ $this->_helper->layout()->setLayout($layoutName); } } private function fetchGitlabProject($gitProjectId) { $gitlab = new Default_Model_Ocs_Gitlab(); try { $gitProject = $gitlab->getProject($gitProjectId); } catch (Exception $exc) { //Project is gone $modelProject = new Default_Model_Project(); $modelProject->updateProject($this->_projectId, array('is_gitlab_project' => 0, 'gitlab_project_id' => null, 'show_gitlab_project_issues' => 0, 'use_gitlab_project_readme' => 0)); $gitProject = null; } return $gitProject; } private function fetchGitlabProjectIssues($gitProjectId) { $gitlab = new Default_Model_Ocs_Gitlab(); try { $gitProjectIssues = $gitlab->getProjectIssues($gitProjectId); } catch (Exception $exc) { //Project is gone $modelProject = new Default_Model_Project(); $modelProject->updateProject($this->_projectId, array('is_gitlab_project' => 0, 'gitlab_project_id' => null, 'show_gitlab_project_issues' => 0, 'use_gitlab_project_readme' => 0)); $gitProjectIssues = null; } return $gitProjectIssues; } public function startvideoajaxAction() { $this->_helper->layout()->disableLayout(); $collection_id = null; $file_id = null; $memberId = $this->_authMember->member_id; if($this->hasParam('collection_id') && $this->hasParam('file_id')) { $collection_id = $this->getParam('collection_id'); $file_id = $this->getParam('file_id'); $id = null; //Log media view try { $mediaviewsTable = new Default_Model_DbTable_MediaViews(); $id = $mediaviewsTable->getNewId(); $data = array('media_view_id' => $id, 'media_view_type_id' => $mediaviewsTable::MEDIA_TYPE_VIDEO, 'project_id' => $this->_projectId, 'collection_id' => $collection_id, 'file_id' => $file_id, 'start_timestamp' => new Zend_Db_Expr ('Now()'), 'ip' => $this->getRealIpAddr(), 'referer' => $this->getReferer()); if(!empty($memberId)) { $data['member_id'] = $memberId; } $data['source'] = 'OCS-Webserver'; $mediaviewsTable->createRow($data)->save(); } catch (Exception $exc) { //echo $exc->getTraceAsString(); $errorLog = Zend_Registry::get('logger'); $errorLog->err(__METHOD__ . ' - ' . $exc->getMessage() . ' ---------- ' . PHP_EOL); } $this->_helper->json(array('status' => 'success', 'MediaViewId' => $id)); return; } $this->_helper->json(array('status' => 'error')); } public function stopvideoajaxAction() { $this->_helper->layout()->disableLayout(); $view_id = null; if($this->hasParam('media_view_id')) { $view_id = $this->getParam('media_view_id'); //Log media view stop try { $mediaviewsTable = new Default_Model_DbTable_MediaViews(); $data = array('stop_timestamp' => new Zend_Db_Expr ('Now()')); $mediaviewsTable->update($data, 'media_view_id = '. $view_id); } catch (Exception $exc) { //echo $exc->getTraceAsString(); $errorLog = Zend_Registry::get('logger'); $errorLog->err(__METHOD__ . ' - ' . $exc->getMessage() . ' ---------- ' . PHP_EOL); } $this->_helper->json(array('status' => 'success', 'MediaViewId' => $view_id)); return; } $this->_helper->json(array('status' => 'error')); } function getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet { $ip=$_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } return $ip; } function getReferer() { $referer = null; if (!empty($_SERVER['HTTP_REFERER'])) { $referer = $_SERVER['HTTP_REFERER']; } return $referer; } } diff --git a/application/modules/default/forms/Product.php b/application/modules/default/forms/Product.php index 5447cc8af..7d7d0425b 100644 --- a/application/modules/default/forms/Product.php +++ b/application/modules/default/forms/Product.php @@ -1,728 +1,718 @@ . **/ class Default_Form_Product extends Zend_Form { protected $onlineGalleryImageSources = array(); private $member_id = null; public function __construct($options = null) { if (isset($options['pictures'])) { $this->onlineGalleryImageSources = $options['pictures']; } if (isset($options['member_id'])) { $this->member_id = $options['member_id']; } parent::__construct($options); } /** * @param $sources array */ public function setOnlineGalleryImageSources($sources) { $this->onlineGalleryImageSources = $sources; $this->init(); } public function init() { $this->setAction(''); $this->setAttrib('enctype', 'multipart/form-data'); $this->addPrefixPath('Default_Form_Element', APPLICATION_PATH . '/modules/default/forms/elements/', Zend_Form::ELEMENT); $this->addElement($this->getTitleElement()) ->addElement($this->getCategoryIdElement()) ->addElement($this->getDescriptionElement()) ->addElement($this->getVersionElement()) ->addElement($this->getSmallImageElement()) ->addElement($this->getImageUploadElement()) - // ->addElement($this->getBigImageElement()) - // ->addElement($this->getBigImageUploadElement()) ->addSubForm($this->getGalleryElement(), 'gallery') - // ->addElement($this->getAmountElement()) - // ->addElement($this->getAmountPeriodElement()) ->addElement($this->getEmbedCodeElement()) ->addElement($this->getProjectHomepageElement()) ->addElement($this->getSourceElement()) ->addElement($this->getFacebookElement()) ->addElement($this->getTwitterElement()) ->addElement($this->getGoogleElement()) ->addElement($this->getTagElement()) ->addElement($this->getTagUserElement()) ->addElement($this->getHiddenProjectId()) ->addElement($this->getSubmitElement()) ->addElement($this->getCancelElement()) ->addElement($this->getLicenseIdElement()) ->addElement($this->getIsOriginal()) ->addElement($this->getIsGitlab()) ->addElement($this->getGitlabProjectId()) ->addElement($this->getShowGitlabProjectIssues()) ->addElement($this->getUseGitlabProjectReadme()) - - //->addElement($this->getCCAttribution()) - //->addElement($this->getCCComercial()) - //->addElement($this->getCCDerivateWorks()) - //->addElement($this->getCCShareAlike()) - //->addElement($this->getCCLicense()) ; } private function getTitleElement() { // $validatorRegEx = new Zend_Validate_Regex(array('pattern' => "/^[ \/\[\]\.\-_A-Za-z0-9'\pL]{1,}$/iu")); // with unicode character class $validatorRegEx = new Zend_Validate_Regex(array('pattern' => "/^[ \/\[\]\.\-_A-Za-z0-9']{1,}$/iu")); $validatorRegEx->setMessages(array(Zend_Validate_Regex::NOT_MATCH => "'%value%' is not valid. Please use only alphanumeric characters or /, [, ], -, _, ' ")); return $this->createElement('text', 'title') ->setRequired(true) ->addValidators(array( array('StringLength', true, array(4, 60)), $validatorRegEx )) ->setFilters(array('StringTrim')) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_title.phtml', 'placement' => false ) ) )) ; } private function getCategoryIdElement() { $validatorCategory = new Default_Form_Validator_Category(); return $this->createElement('number', 'project_category_id', array()) ->setRequired(true) ->addValidator('Digits') ->addValidator($validatorCategory) ->addFilter('Digits') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_cat_id.phtml', 'placement' => false ) ) )) ; } private function getDescriptionElement() { return $this->createElement('textarea', 'description', array('cols' => 30, 'rows' => 9)) ->setRequired(true) ->setFilters(array('StringTrim')) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_description.phtml', 'placement' => false ) ) )) ; } private function getVersionElement() { return $this->createElement('text', 'version') ->setRequired(false) ->addValidators(array( array('StringLength', false, array(0, 50)), )) ->setFilters(array('StringTrim')) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_version.phtml', 'placement' => false ) ) )) ; } private function getSmallImageElement() { return $this->createElement('hidden', 'image_small') ->setFilters(array('StringTrim')) ->addValidators(array( array( 'Regex', false, array('/^[A-Za-z0-9.\/_-]{1,}$/i') ) )) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_image_small.phtml', 'placement' => false ) ) )) ; } private function getImageUploadElement() { $modelImage = new Default_Model_DbTable_Image(); return $this->createElement('file', 'image_small_upload') ->setDisableLoadDefaultDecorators(true) ->setValueDisabled(true) ->setTransferAdapter(new Local_File_Transfer_Adapter_Http()) ->setRequired(false) ->setMaxFileSize(2097152) ->addValidator('Count', false, 1) ->addValidator('Size', false, array('min' => '500B', 'max' => '2MB')) ->addValidator('Extension', false, $modelImage->getAllowedFileExtension()) ->addValidator('ImageSize', false, array( 'minwidth' => 20, 'maxwidth' => 2000, 'minheight' => 20, 'maxheight' => 2000 )) ->addValidator('MimeType', false, $modelImage->getAllowedMimeTypes()) ->setDecorators(array( array('File' => new Local_Form_Decorator_File()), array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_image_small_upload.phtml', 'placement' => false ) ) )) ; } private function getGalleryElement() { $gallerySubform = new Default_Form_GallerySubForm(array('pictures' => $this->onlineGalleryImageSources)); $gallerySubform->setMaxGalleryPics(5); return $gallerySubform; } private function getEmbedCodeElement() { return $this->createElement('textarea', 'embed_code', array('cols' => 30, 'rows' => 3)) ->setRequired(false) ->setFilters(array('StringTrim')) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_embedcode.phtml', 'placement' => false ) ) )) ; } private function getProjectHomepageElement() { return $this->createElement('text', 'link_1', array()) ->setRequired(false) ->setFilters(array('StringTrim')) ->addPrefixPath('Local_Validate', 'Local/Validate', Zend_Form_Element::VALIDATE) ->addValidator('PartialUrl') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_link.phtml', 'placement' => false ) ) )) ; } private function getSourceElement() { return $this->createElement('text', 'source_url', array()) ->setRequired(false) ->setFilters(array('StringTrim')) ->addPrefixPath('Local_Validate', 'Local/Validate', Zend_Form_Element::VALIDATE) ->addValidator('PartialUrl') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_source_url.phtml', 'placement' => false ) ) )) ; } private function getFacebookElement() { return $this->createElement('text', 'facebook_code', array()) ->setRequired(false) ->setFilters(array('StringTrim')) ->addPrefixPath('Local_Validate', 'Local/Validate', Zend_Form_Element::VALIDATE) ->addValidator('PartialUrl') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_facebook.phtml', 'placement' => false ) ) )) ; } private function getTwitterElement() { return $this->createElement('text', 'twitter_code', array()) ->setRequired(false) ->setFilters(array('StringTrim')) ->addPrefixPath('Local_Validate', 'Local/Validate', Zend_Form_Element::VALIDATE) ->addValidator('PartialUrl') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_twitter.phtml', 'placement' => false ) ) )) ; } private function getGoogleElement() { return $this->createElement('text', 'google_code', array()) ->setRequired(false) ->setFilters(array('StringTrim')) ->addPrefixPath('Local_Validate', 'Local/Validate', Zend_Form_Element::VALIDATE) ->addValidator('PartialUrl') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_google.phtml', 'placement' => false ) ) )) ; } private function getTagElement() { $element = new Zend_Form_Element_Multiselect('tags', array('registerInArrayValidator' => false)); return $element->setFilters(array('StringTrim'))->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_tags_multiselect.phtml', 'placement' => false ) ) )) ; } private function getTagUserElement() { $element = new Zend_Form_Element_Multiselect('tagsuser', array('registerInArrayValidator' => false)); return $element->setFilters(array('StringTrim'))->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_tags_user.phtml', 'placement' => false ) ) )) ; } private function getHiddenProjectId() { return $this->createElement('hidden', 'project_id')->setFilters(array('StringTrim'))->addValidators(array('Digits')) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_hidden.phtml', 'placement' => false ) ) )) ; } private function getSubmitElement() { $submit = $this->createElement('button', 'preview')->setDecorators(array( 'ViewHelper' )) ; $submit->setLabel('Preview'); $submit->setAttrib('type', 'submit'); return $submit; } private function getCancelElement() { $cancel = $this->createElement('button', 'cancel')->setDecorators(array( 'ViewHelper' )) ; $cancel->setLabel('Cancel'); $cancel->setAttrib('type', 'submit'); return $cancel; } private function getLicenseIdElement() { //$element = new Zend_Form_Element_Multiselect('project_license_id', array('registerInArrayValidator' => false)); $element = new Zend_Form_Element_Select('license_tag_id', array('multiple' => false)); $element->setIsArray(true); $tagTable = new Default_Model_DbTable_Tags(); $options = $tagTable->fetchLicenseTagsForSelect(); return $element->setFilters(array('StringTrim'))->setMultiOptions($options)->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_select_license.phtml', 'placement' => false ) ) )) ; } private function getIsOriginal() { $element = new Zend_Form_Element_Checkbox('is_original'); return $element->setOptions(array( 'label' => ' Product original ', 'use_hidden_element' => false, 'checked_value' => 1, 'unchecked_value' => 0 )); } private function getIsGitlab() { $element = new Zend_Form_Element_Checkbox('is_gitlab_project'); return $element->setOptions(array( 'label' => ' Git-Project ', 'use_hidden_element' => false, 'checked_value' => 1, 'unchecked_value' => 0 )); } private function getGitlabProjectId() { $element = new Zend_Form_Element_Select('gitlab_project_id', array('multiple' => false)); $element->setIsArray(true); $gitlab = new Default_Model_Ocs_Gitlab(); $optionArray = array(); if ($this->member_id) { $memberTable = new Default_Model_Member(); $member = $memberTable->fetchMemberData($this->member_id); $gitlab_user_id = null; if(!empty($member->gitlab_user_id)) { //get gitlab user id from db $gitlab_user_id = $member->gitlab_user_id; } else { //get gitlab user id from gitlab API and save in DB $gitUser = $gitlab->getUserWithName($member->username); if ($gitUser && null != $gitUser) { $gitlab_user_id = $gitUser['id']; $memberTableExternal = new Default_Model_DbTable_MemberExternalId(); $memberTableExternal->updateGitlabUserId($this->member_id, $gitlab_user_id); } } if ($gitlab_user_id && null != $gitlab_user_id) { try { //now get his projects $gitProjects = $gitlab->getUserProjects($gitlab_user_id); foreach ($gitProjects as $proj) { $optionArray[$proj['id']] = $proj['name']; } } catch (Exception $exc) { //Error getting USerProjects, } } } return $element->setFilters(array('StringTrim'))->setMultiOptions($optionArray)->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_gitlab_project_id.phtml', 'placement' => false ) ) )) ; } private function getShowGitlabProjectIssues() { $element = new Zend_Form_Element_Checkbox('show_gitlab_project_issues'); return $element->setOptions(array( 'label' => ' Git-Issues ', 'use_hidden_element' => false, 'checked_value' => 1, 'unchecked_value' => 0 )); } private function getUseGitlabProjectReadme() { $element = new Zend_Form_Element_Checkbox('use_gitlab_project_readme'); return $element->setOptions(array( 'label' => 'README.md', 'use_hidden_element' => false, 'checked_value' => 1, 'unchecked_value' => 0 )); } public function initSubCatElement($projectCatId) { if (false === isset($projectCatId)) { return; } $tableSubCategory = new Default_Model_SubCategory(); $subcategories = $tableSubCategory->fetchAllSubCategories($projectCatId); $this->getElement('project_subcategory_id')->setMultiOptions($subcategories); } public function initSubSubCatElement($projectSubCatId) { if (false === isset($projectCatId)) { return; } $modelSubSubCategories = new Default_Model_SubSubCategory(); $subSubCategories = $modelSubSubCategories->fetchAllSubCategories($projectSubCatId); $this->getElement('project_subcategory_id')->setMultiOptions($subSubCategories); } /** * Validate the form * * @param array $data * @param null $project_id * * @return bool * @throws Zend_Exception * @throws Zend_Form_Exception */ public function isValid($data, $project_id = null) { $sqlExclude = 'status > ' . Default_Model_DbTable_Project::PROJECT_DELETED; if (isset($project_id)) { $db = Zend_Registry::get('db'); $sqlExclude .= $db->quoteInto(' AND project_id <> ?', $project_id, 'INTEGER'); } /* $checkTitleExist = new Zend_Validate_Db_NoRecordExists(array( 'table' => 'project', 'field' => 'title', 'exclude' => $sqlExclude )); $checkTitleExist->setMessage('This title already exists.', Zend_Validate_Db_NoRecordExists::ERROR_RECORD_FOUND); $this->getElement('title') ->addValidator($checkTitleExist); */ return parent::isValid($data); } /** * Validate a partial form * * Does not check for required flags. * * @param array $data * * @return boolean */ public function isValidPartial(array $data) { return parent::isValidPartial($data); // TODO: Change the autogenerated stub } private function getAmountElement() { return $this->createElement('number', 'amount', array()) ->setRequired(false) ->addValidator('Digits') ->addFilter('Digits') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_amount.phtml', 'placement' => false ) ) )) ; } private function getAmountPeriodElement() { return $this->createElement('radio', 'amount_period', array()) ->setRequired(false) ->addMultiOptions(array('yearly' => 'yearly (will run continuously each year)', 'one-time' => 'one-time')) ->setValue('yearly') ->setSeparator(' ') ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_amount_period.phtml', 'placement' => false ) ) )) ; } private function getBigImageElement() { return $this->createElement('hidden', 'image_big') ->setFilters(array('StringTrim')) ->addValidators(array( array( 'Regex', false, array('/^[A-Za-z0-9.\/_-]{1,}$/i') ) )) ->setDecorators(array( array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_image_big.phtml', 'placement' => false ) ) )) ; } private function getBigImageUploadElement() { $modelImage = new Default_Model_DbTable_Image(); return $this->createElement('file', 'image_big_upload')->setDisableLoadDefaultDecorators(true) ->setTransferAdapter(new Local_File_Transfer_Adapter_Http())->setRequired(false)->setMaxFileSize(2097152) ->addValidator('Count', false, 1)->addValidator('Size', false, 2097152)->addValidator('FilesSize', false, 2000000) ->addValidator('Extension', false, $modelImage->getAllowedFileExtension())->addValidator('ImageSize', false, array( 'minwidth' => 100, 'maxwidth' => 2000, 'minheight' => 100, 'maxheight' => 1200 ))->addValidator('MimeType', false, $modelImage->getAllowedMimeTypes())->setDecorators(array( array('File' => new Local_Form_Decorator_File()), array( 'ViewScript', array( 'viewScript' => 'product/viewscripts/input_image_big_upload.phtml', 'placement' => false ) ) )) ; } private function getCCAttribution() { return $this->createElement('checkbox', 'by'); } private function getCCComercial() { return $this->createElement('checkbox', 'nc'); } private function getCCDerivateWorks() { return $this->createElement('checkbox', 'nd'); } private function getCCShareAlike() { return $this->createElement('checkbox', 'sa'); } private function getCCLicense() { return $this->createElement('checkbox', 'cc_license'); } } \ No newline at end of file diff --git a/application/modules/default/forms/Register.php b/application/modules/default/forms/Register.php index e4e5a48a1..d6a85bd4a 100644 --- a/application/modules/default/forms/Register.php +++ b/application/modules/default/forms/Register.php @@ -1,146 +1,140 @@ . **/ class Default_Form_Register extends Zend_Form { /** * @throws Zend_Exception * @throws Zend_Form_Exception * @throws Zend_Validate_Exception */ public function init() { $this->setMethod('POST'); $this->setAction('/register/'); $this->addElementPrefixPath('Local', 'Local/'); $this->setAttrib('id', 'registerForm'); $this->setAttrib('class', 'standard-form row-fluid center'); $redir = $this->createElement('hidden', 'redirect')->setDecorators(array('ViewHelper')); $this->addElement($redir); $usernameValidChars = new Zend_Validate_Regex('/^(?=.{4,20}$)(?![-])(?!.*[-]{2})[a-z0-9-]+(?setMessage('This username already exists.', Local_Validate_UsernameExists::EXISTS); $userExistCheck->setMessage('This username already exists.'); $userEmptyCheck = new Zend_Validate_NotEmpty(); $userEmptyCheck->setMessage('RegisterFormUsernameErr', Zend_Validate_NotEmpty::IS_EMPTY); $userNameLength = new Zend_Validate_StringLength(array('min' => 4, 'max' => 20)); $groupNameExists = new Local_Validate_GroupnameExistsInOpenCode(); $fname = $this->createElement('text', 'username') ->setDecorators(array('ViewHelper', 'Errors')) ->setRequired(true) ->addFilter(new Zend_Filter_StringTrim()) ->addFilter(new Zend_Filter_StripNewlines()) ->addValidator($userEmptyCheck, true) ->addValidator($userNameLength, true) ->addValidator($usernameValidChars, true) ->addValidator($userExistCheck, true) ->addValidator($groupNameExists, true) ->setAttrib('placeholder', 'Username (4 chars minimum)') - ->setAttrib('class', 'form-control') - ; + ->setAttrib('class', 'form-control'); $mailValidCheck = new Zend_Validate_EmailAddress(); $mailValidCheck->setMessage('RegisterFormEmailErrNotValid', Zend_Validate_EmailAddress::INVALID) ->setMessage('RegisterFormEmailErrNotValid', Zend_Validate_EmailAddress::INVALID_FORMAT) ->setMessage('RegisterFormEmailErrNotValid', Zend_Validate_EmailAddress::INVALID_LOCAL_PART) ->setMessage("RegisterFormEmailErrWrongHost", Zend_Validate_EmailAddress::INVALID_HOSTNAME) ->setMessage("RegisterFormEmailErrWrongHost2", Zend_Validate_Hostname::INVALID_HOSTNAME) ->setMessage("RegisterFormEmailErrHostLocal", Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED) - ->setOptions(array('domain' => true)) - ; + ->setOptions(array('domain' => true)); $mailExistCheck = new Local_Validate_EmailExists(); $mailExistCheck->setMessage('RegisterFormEmailErrAlreadyRegistered', Local_Validate_EmailExists::EXISTS); $mailEmpty = new Zend_Validate_NotEmpty(); $mailEmpty->setMessage('RegisterFormEmailErrEmpty', Zend_Validate_NotEmpty::IS_EMPTY); $mailValidatorChain = new Zend_Validate(); $mailValidatorChain->addValidator($mailEmpty, true) ->addValidator($mailValidCheck, true) - ->addValidator($mailExistCheck, true) - ; + ->addValidator($mailExistCheck, true); $mail = $this->createElement('text', 'mail') ->setLabel('RegisterFormEmailLabel') ->addValidator($mailEmpty, true) ->addValidator($mailValidCheck, true) ->addValidator($mailExistCheck, true) ->setDecorators(array('ViewHelper', 'Errors')) ->setRequired(true) ->setAttrib('placeholder', 'Email') - ->setAttrib('class', 'form-control') - ; + ->setAttrib('class', 'form-control'); $pass1 = $this->createElement('password', 'password1') ->setLabel('RegisterFormPasswordLabel') ->setRequired(true)//->addErrorMessage('RegisterFormPasswordErr') ->setDecorators(array('ViewHelper', 'Errors')) ->setAttrib('placeholder', 'Password') ->addValidator('stringLength', true, array(6, 200)) ->setAttrib('placeholder', 'Password (6 chars minimum)') - ->setAttrib('class', 'form-control') - ; + ->setAttrib('class', 'form-control'); $pass2 = $this->createElement('password', 'password2') ->setLabel('RegisterFormPassword2Label') ->setRequired(true) ->addErrorMessage('RegisterFormPassword2Err') ->setDecorators(array('ViewHelper', 'Errors')) ->setAttrib('placeholder', 'Confirm Password') - ->setAttrib('class', 'form-control') - ; + ->setAttrib('class', 'form-control'); $passValid = new Local_Validate_PasswordConfirm($pass2->getValue()); $pass1->addValidator($passValid, true); $submit = $this->createElement('button', 'login'); $submit->setLabel('Register'); $submit->setDecorators(array('ViewHelper')); $submit->setAttrib('class', 'btn btn-native btn-min-width'); $submit->setAttrib('type', 'submit'); $this->addElement($fname) ->addElement($mail) ->addElement($pass1) ->addElement($pass2) - ->addElement($submit) - ; + ->addElement($submit); if (APPLICATION_ENV == 'development') { return; } $this->addPrefixPath('Cgsmith\\Form\\Element', APPLICATION_LIB . '/Cgsmith/Form/Element', Zend_Form::ELEMENT); - $this->addElementPrefixPath('Cgsmith\\Validate\\', APPLICATION_LIB . '/Cgsmith/Validate/', Zend_Form_Element::VALIDATE); + $this->addElementPrefixPath('Cgsmith\\Validate\\', APPLICATION_LIB . '/Cgsmith/Validate/', + Zend_Form_Element::VALIDATE); $captcha = $this->createElement('recaptcha', 'g-recaptcha-response', array( 'siteKey' => Zend_Registry::get('config')->recaptcha->sitekey, 'secretKey' => Zend_Registry::get('config')->recaptcha->secretkey, )); $this->addElement($captcha); } } \ No newline at end of file diff --git a/application/modules/default/models/DbTable/Image.php b/application/modules/default/models/DbTable/Image.php index 196092b80..51df047f4 100644 --- a/application/modules/default/models/DbTable/Image.php +++ b/application/modules/default/models/DbTable/Image.php @@ -1,455 +1,456 @@ . **/ class Default_Model_DbTable_Image extends Zend_Db_Table_Abstract { protected $_name = "image"; protected $_fields = array( 'id' => null, 'filename' => null, 'code' => null, 'name' => null, 'member_id' => null, 'model' => null, 'foreign_key' => null, 'foreign_id' => null, 'created' => null ); protected $_allowed = array( 'image/jpeg' => '.jpg', 'image/jpg' => '.jpg', 'image/png' => '.png', 'image/gif' => '.gif', 'application/x-empty' => '.png' ); protected $_allowedFileExtension = array( 'jpg', 'jpeg', 'png', 'gif' ); // protected $_maxsize = array( // 'width' => 1024, // 'height' => 768 // ); protected $_maxsize = array( 'width' => 2000, 'height' => 2000 ); protected $_errorMsg = null; public function getMemberImages($member_id) { $images = $this->select()->where('member_id = ?', $member_id)->query()->fetchAll(); return $images; } public function storeExternalImage($url, $fileExtension = null) { Zend_Registry::get('logger')->debug(__METHOD__ . ' - ' . print_r(func_get_args(), true)); $tmpFileName = $this->storeRemoteImage($url, $fileExtension); if (file_exists(IMAGES_UPLOAD_PATH . 'tmp/' . $tmpFileName)) { $content_type = mime_content_type(IMAGES_UPLOAD_PATH . 'tmp/' . $tmpFileName); $filePath = $this->saveImageOnMediaServer($tmpFileName); $filename = $filePath; $file_info['size'] = filesize(IMAGES_UPLOAD_PATH . '/' . $filename); $this->save(array('code' => $content_type, 'filename' => $filename)); } return $filename; } public function storeRemoteImage($url, $fileExtention = null, &$file_info = null) { //$host = parse_url( $url, PHP_URL_HOST ); //$path = parse_url($url, PHP_URL_PATH); //$query = parse_url($url, PHP_URL_QUERY); //$url = 'http://'.$host.$path.'?'.urlencode($query); $limit = 4194304; #4Mb $filename = md5($url); if ($fileExtention) { $filename .= '.' . $fileExtention; } $file_info = array(); if (file_exists(IMAGES_UPLOAD_PATH . 'tmp/' . $filename)) { // Delete old file. Maybe an updated version is available. if (false == unlink(IMAGES_UPLOAD_PATH . 'tmp/' . $filename)) { throw new Exception('Cannot delete file: ' . IMAGES_UPLOAD_PATH . 'tmp/' . $filename); } } try { #$file = file_get_contents($url, NULL, NULL, -1, $limit); $file = $this->file_get_contents_curl($url); } catch (Exception $e) { $file = null; } if (file_put_contents(IMAGES_UPLOAD_PATH . 'tmp/' . $filename, $file)) { $content_type = $this->_get_mime_content_type(IMAGES_UPLOAD_PATH . 'tmp/' . $filename); if (!in_array($content_type, array_keys($this->_allowed))) { throw new Exception('Format not allowed ' . $content_type . ' for url ' . $url); } touch(IMAGES_UPLOAD_PATH . 'tmp/' . $filename); } else { throw new Exception('Error storing remote image'); } $file_info['size'] = filesize(IMAGES_UPLOAD_PATH . 'tmp/' . $filename); return $filename; } public function file_get_contents_curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $data = curl_exec($ch); curl_close($ch); return $data; } public function _get_mime_content_type($filename) { if (!function_exists('mime_content_type')) { $mime_types = array( 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', // images 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', // archives 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', // audio/video 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); $ext = strtolower(array_pop(explode('.', $filename))); if (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } else if (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME); $mimetype = finfo_file($finfo, $filename); finfo_close($finfo); return $mimetype; } else { return 'application/octet-stream'; } } else { return mime_content_type($filename); } } public function saveImageOnMediaServer($filePathName) { if (empty($filePathName)) { return null; } $content_type = mime_content_type($filePathName); if (!in_array($content_type, array_keys($this->_allowed))) { throw new Exception('Format not allowed: ' . $content_type . ' for img: ' . $filePathName); } // Generate filename $generatedFilename = $this->_generateFilename($filePathName); $destinationFile = IMAGES_UPLOAD_PATH . $generatedFilename . $this->_allowed[$content_type]; if (copy($filePathName, $destinationFile)) { if (file_exists($filePathName)) { if (false === unlink($filePathName)) { Zend_Registry::get('logger')->warn(__METHOD__ . ' - can not delete temp file: ' . $filePathName); } } Zend_Registry::get('logger')->debug(__METHOD__ . ' - Start upload picture - ' . print_r($destinationFile, true)) ; $srcPathOnMediaServer = $this->sendImageToMediaServer($destinationFile, $content_type); if (file_exists($destinationFile)) { if (false === unlink($destinationFile)) { Zend_Registry::get('logger')->warn(__METHOD__ . ' - can not delete file: ' . $destinationFile); } } if (!$srcPathOnMediaServer) { throw new Exception("Error in upload to CDN-Server. \n Server message:\n" . $this->_errorMsg); } Zend_Registry::get('logger')->debug(__METHOD__ . ' - End upload picture - ' . print_r(IMAGES_UPLOAD_PATH . $srcPathOnMediaServer, true)) ; return $srcPathOnMediaServer; } } private function _generateFilename($filePathName) { return sha1_file($filePathName); } /** * @param $fullFilePath * @param $mimeType * * @return string + * @throws Zend_Exception + * @throws Zend_Http_Client_Exception + * @throws Zend_Uri_Exception */ protected function sendImageToMediaServer($fullFilePath, $mimeType) { $config = Zend_Registry::get('config'); $url = $config->images->media->upload; $client = new Zend_Http_Client($url); $client->setFileUpload($fullFilePath, basename($fullFilePath), null, $mimeType); $response = $client->request('POST'); if ($response->getStatus() > 200) { - $this->_errorMsg = $response->getBody(); - - return null; + throw new Default_Model_Exception_Image('Could not upload file to ' . $url . ' - server response: ' . $response->getBody()); } return $response->getBody(); } public function save($image) { foreach ($image as $key => $value) { if (!in_array($key, array_keys($this->_fields))) { unset($image[$key]); } } if (isset($image['filename']) && !isset($image['code'])) { $image['code'] = $this->_trimExtension($image['filename']); } if (isset($image['id'])) { return $this->_update($image); } else { return $this->_add($image); } } private function _update($image) { if (!isset($image['id'])) { throw new Exception('Invalid update without an id'); } else { $id = (int)$image['id']; } return $this->update($image, array('id = ?' => $id)); } private function _add($image) { return $this->insert($image); } /** * @param Zend_Form_Element_File $formFileElement * * @return string * @throws Zend_Exception * @todo wrong place for this method */ public function saveImage($formFileElement) { if (empty($formFileElement)) { Zend_Registry::get('logger')->err(__METHOD__ . ' - form file element empty'); return null; } $filesInfo = $formFileElement->getFileInfo(); if (1 < count($filesInfo)) { throw new Zend_Exception('Element contains more than one file elements'); } foreach ($filesInfo as $file => $fileInfo) { if (null == $fileInfo['size']) { return null; } $contentType = mime_content_type($fileInfo['tmp_name']); if (false === in_array($contentType, array_keys($this->_allowed))) { throw new Zend_Exception('Format not allowed: ' . $contentType . ' for img: ' . $fileInfo['name']); } $generatedFilename = $this->_generateFilename($fileInfo['tmp_name']); $destinationFile = IMAGES_UPLOAD_PATH . $generatedFilename . $this->_allowed[$contentType]; Zend_Registry::get('logger')->info(__METHOD__ . ' - destination file path: ' . $destinationFile); if (copy($fileInfo['tmp_name'], $destinationFile)) { if (file_exists($fileInfo['tmp_name'])) { if (false === unlink($fileInfo['tmp_name'])) { Zend_Registry::get('logger')->warn(__METHOD__ . ' - can not delete temp file: ' . $fileInfo['tmp_name']) ; } } Zend_Registry::get('logger')->debug(__METHOD__ . ' - Start upload picture - ' . print_r($destinationFile, true)) ; $srcPathOnMediaServer = $this->sendImageToMediaServer($destinationFile, $contentType); if (file_exists($destinationFile)) { if (false === unlink($destinationFile)) { Zend_Registry::get('logger')->warn(__METHOD__ . ' - can not delete file: ' . $destinationFile); } } if (!$srcPathOnMediaServer) { throw new Zend_Exception("Error in upload to CDN-Server. \n Server message:\n" . $this->_errorMsg); } Zend_Registry::get('logger')->debug(__METHOD__ . ' - End upload a picture - ' . print_r(IMAGES_UPLOAD_PATH . $srcPathOnMediaServer, true)) ; return $srcPathOnMediaServer; } } } /** * @param Zend_Form_Element_File $formFileElement * * @return array * @throws Zend_Exception */ public function saveImages($formFileElement) { if (empty($formFileElement)) { return array(); } $resultPath = array(); $filesInfo = $formFileElement->getFileInfo(); foreach ($filesInfo as $file => $fileInfo) { if (null == $fileInfo['size']) { continue; } $contentType = mime_content_type($fileInfo['tmp_name']); if (!in_array($contentType, array_keys($this->_allowed))) { throw new Zend_Exception('Format not allowed: ' . $contentType . ' for img: ' . $fileInfo['name']); } $generatedFilename = $this->_generateFilename($fileInfo['tmp_name']); $destinationFile = IMAGES_UPLOAD_PATH . $generatedFilename . $this->_allowed[$contentType]; if (copy($fileInfo['tmp_name'], $destinationFile)) { Zend_Registry::get('logger')->debug(__METHOD__ . ' - Start upload picture - ' . print_r($destinationFile, true)) ; $srcPathOnMediaServer = $this->sendImageToMediaServer($destinationFile, $contentType); if (!$srcPathOnMediaServer) { throw new Zend_Exception("Error in upload to CDN-Server. \n Server message:\n" . $this->_errorMsg); } Zend_Registry::get('logger')->debug(__METHOD__ . ' - End upload a picture - ' . print_r(IMAGES_UPLOAD_PATH . $srcPathOnMediaServer, true)) ; $resultPath[] = $srcPathOnMediaServer; } } return $resultPath; } public function getAllowedFileExtension() { return $this->_allowedFileExtension; } public function getAllowedMimeTypes() { return array_keys($this->getAllowed()); } public function getAllowed() { return $this->_allowed; } public function setAllowed($allowed) { $this->_allowed = $allowed; } public function getMaxsize() { return $this->_maxsize; } public function setMaxsize($maxsize) { $this->_maxsize = $maxsize; } } \ No newline at end of file diff --git a/application/modules/default/models/Exception/Image.php b/application/modules/default/models/Exception/Image.php new file mode 100644 index 000000000..3e9d691b0 --- /dev/null +++ b/application/modules/default/models/Exception/Image.php @@ -0,0 +1,27 @@ +. + **/ + +class Default_Model_Exception_Image extends Zend_Exception +{ + +} \ No newline at end of file diff --git a/application/modules/default/models/Member.php b/application/modules/default/models/Member.php index a6e8e4433..2b020622b 100644 --- a/application/modules/default/models/Member.php +++ b/application/modules/default/models/Member.php @@ -1,1331 +1,1341 @@ . - - **/ -use YoHang88\LetterAvatar\LetterAvatar; + +use YoHang88\LetterAvatar\LetterAvatar; + class Default_Model_Member extends Default_Model_DbTable_Member { const CASE_INSENSITIVE = 1; /** * @param int $count * @param string $orderBy * @param string $dir * * @return Zend_Db_Table_Rowset * @throws Zend_Exception */ public function fetchNewActiveMembers($count = 100, $orderBy = 'created_at', $dir = 'DESC') { if (empty($count)) { return $this->generateRowSet($this->createRow()); } $allowedDirection = array('desc' => true, 'asc' => true); if (false == isset($allowedDirection[strtolower($dir)])) { $dir = null; } /** @var Zend_Cache_Core $cache */ $cache = Zend_Registry::get('cache'); $cacheName = __FUNCTION__ . md5($count . $orderBy . $dir); $members = $cache->load($cacheName); if ($members) { return $members; } else { $sql = ' SELECT count(*) AS `total_count` FROM `member` WHERE `is_active` = :activeVal AND `type` = :typeVal AND `profile_image_url` <> :defaultImgUrl AND `profile_image_url` LIKE :likeImgUrl '; $resultCnt = $this->_db->fetchRow($sql, array( 'activeVal' => Default_Model_Member::MEMBER_ACTIVE, 'typeVal' => Default_Model_Member::MEMBER_TYPE_PERSON, 'defaultImgUrl' => 'hive/user-pics/nopic.png', 'likeImgUrl' => 'hive/user-bigpics/0/%' )); $totalcnt = $resultCnt['total_count']; if ($totalcnt > $count) { $offset = ' offset ' . rand(0, $totalcnt - $count); } else { $offset = ''; } $sql = ' SELECT * FROM `member` WHERE `is_active` = :activeVal AND `type` = :typeVal AND `profile_image_url` <> :defaultImgUrl AND `profile_image_url` LIKE :likeImgUrl '; //$sql .= ' ORDER BY ' . $this->_db->quoteIdentifier($orderBy) . ' ' . $dir; $sql .= ' LIMIT ' . $this->_db->quote($count, Zend_Db::INT_TYPE); $sql .= $offset; $resultMembers = $this->getAdapter()->query($sql, array( 'activeVal' => Default_Model_Member::MEMBER_ACTIVE, 'typeVal' => Default_Model_Member::MEMBER_TYPE_PERSON, 'defaultImgUrl' => 'hive/user-pics/nopic.png', 'likeImgUrl' => 'hive/user-bigpics/0/%' - ))->fetchAll() - ; + ))->fetchAll(); $resultSet = $this->generateRowSet($resultMembers); $cache->save($resultSet, $cacheName, array(), 14400); return $resultSet; } } /** * @param $data * * @return Zend_Db_Table_Rowset */ protected function generateRowSet($data) { $classRowSet = $this->getRowsetClass(); $returnRowSet = new $classRowSet(array( 'table' => $this, 'rowClass' => $this->getRowClass(), 'stored' => true, 'data' => $data )); return $returnRowSet; } /** * @return array * @deprecated */ public function getMembersForSelectList() { $selectArr = $this->_db->fetchAll("SELECT `member_id`,`username`,`firstname`, `lastname` FROM {$this->_name} WHERE is_active=1 AND is_deleted=0 ORDER BY username"); $arrayModified = array(); $arrayModified[0] = "Benutzer wählen"; foreach ($selectArr as $item) { $tmpStr = ($item['firstname']) ? $item['firstname'] : ""; $tmpStr .= ($item['lastname']) ? ", " . $item['lastname'] : ""; $tmpStr = ($tmpStr != "") ? " (" . $tmpStr . ")" : ""; $arrayModified[$item['member_id']] = stripslashes($item['username'] . $tmpStr); } return $arrayModified; } /** * @param int $member_id * * @param $verification_value * * @return boolean returns true if successful * @throws Zend_Db_Statement_Exception */ public function activateMemberFromVerification($member_id, $verification_value) { $sql = " UPDATE `member` STRAIGHT_JOIN `member_email` ON `member`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_checked` IS NULL AND `member`.`is_deleted` = 0 AND `member_email`.`email_deleted` = 0 SET `member`.`mail_checked` = 1, `member`.`is_active` = 1, `member`.`changed_at` = NOW(), `member_email`.`email_checked` = NOW() WHERE `member`.`member_id` = :memberId AND `member_email`.`email_verification_value` = :verificationValue; "; $stmnt = $this->_db->query($sql, array('memberId' => $member_id, 'verificationValue' => $verification_value)); return $stmnt->rowCount() > 0 ? true : false; } /** * @param int $member_id * * @throws Zend_Exception */ public function setDeleted($member_id) { $updateValues = array( 'is_active' => 0, 'is_deleted' => 1, 'deleted_at' => new Zend_Db_Expr('Now()'), ); $this->update($updateValues, $this->_db->quoteInto('member_id=?', $member_id, 'INTEGER')); - + $memberLog = new Default_Model_MemberDeactivationLog(); $memberLog->logMemberAsDeleted($member_id); - + $this->setMemberProjectsDeleted($member_id); $this->setMemberCommentsDeleted($member_id); $this->setMemberRatingsDeleted($member_id); $this->setMemberReportingsDeleted($member_id); $this->setMemberEmailsDeleted($member_id); //$this->setMemberPlingsDeleted($member_id); //$this->removeMemberProjectsFromSearch($member_id); $this->setDeletedInMaterializedView($member_id); $this->setDeletedInSubSystems($member_id); } //User ist mind. 1 jahr alt, user ist supporter, user hat minimum 20 kommentare - public function validDeleteMemberFromSpam($member_id) - { - $sql ='select - m.created_at - , (m.created_at+ INTERVAL 12 MONTH < NOW()) is_old - ,(select count(1) from comments c where c.comment_member_id = m.member_id and comment_active = 1) comments - ,(select (DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now()) from support s where s.status_id = 2 AND s.member_id =m.member_id) is_supporter - from member m where member_id = :member_id'; - $result = $this->_db->fetchRow($sql, array( - 'member_id' => $member_id, - )); - if($result['is_supporter'] && $result['is_supporter'] ==1) - { - return false; - } - if($result['is_old'] ==1 || $result['comments']>20) - { - return false; - } - return true; - } private function setMemberProjectsDeleted($member_id) { $modelProject = new Default_Model_Project(); $modelProject->setAllProjectsForMemberDeleted($member_id); } private function setMemberCommentsDeleted($member_id) { $modelComments = new Default_Model_ProjectComments(); $modelComments->setAllCommentsForUserDeleted($member_id); } private function setMemberRatingsDeleted($member_id) { $modelRatings = new Default_Model_DbTable_ProjectRating(); $affectedRows = $modelRatings->setDeletedByMemberId($member_id); if (false === empty($affectedRows)) { $modelProject = new Default_Model_DbTable_Project(); $modelProject->deleteLikes($affectedRows); } } private function setMemberReportingsDeleted($member_id) { $modelReportsProject = new Default_Model_DbTable_ReportProducts(); $modelReportsProject->setDeleteByMember($member_id); $modelReportsComments = new Default_Model_DbTable_ReportComments(); $modelReportsComments->setDeleteByMember($member_id); } private function setMemberEmailsDeleted($member_id) { $modelEmail = new Default_Model_DbTable_MemberEmail(); $modelEmail->setDeletedByMember($member_id); } - - private function setMemberEmailsActivated($member_id) - { - $modelEmail = new Default_Model_DbTable_MemberEmail(); - $modelEmail->setActivatedByMember($member_id); - } private function setDeletedInMaterializedView($member_id) { $sql = "UPDATE `stat_projects` SET `status` = :new_status WHERE `member_id` = :member_id"; - $this->_db->query($sql, array('new_status' => Default_Model_DbTable_Project::PROJECT_DELETED, 'member_id' => $member_id)) - ->execute() - ; + $this->_db->query($sql, + array('new_status' => Default_Model_DbTable_Project::PROJECT_DELETED, 'member_id' => $member_id)) + ->execute(); + } + + private function setDeletedInSubSystems($member_id) + { + try { + $id_server = new Default_Model_Ocs_OAuth(); + $id_server->deleteUser($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . implode(PHP_EOL . " - ", + $id_server->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + try { + $ldap_server = new Default_Model_Ocs_Ldap(); + $ldap_server->deleteUser($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL . " - ", + $ldap_server->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + try { + $openCode = new Default_Model_Ocs_Gitlab(); + $openCode->blockUser($member_id); + $openCode->blockUserProjects($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL . " - ", + $openCode->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + try { + $forum = new Default_Model_Ocs_Forum(); + $forum->blockUser($member_id); + $forum->blockUserPosts($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL . " - ", + $forum->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + } + + public function validDeleteMemberFromSpam($member_id) + { + $sql = 'SELECT + `m`.`created_at` + , (`m`.`created_at`+ INTERVAL 12 MONTH < NOW()) `is_old` + ,(SELECT count(1) FROM `comments` `c` WHERE `c`.`comment_member_id` = `m`.`member_id` AND `comment_active` = 1) `comments` + ,(SELECT (DATE_ADD(max(`active_time`), INTERVAL 1 YEAR) > now()) FROM `support` `s` WHERE `s`.`status_id` = 2 AND `s`.`member_id` =`m`.`member_id`) `is_supporter` + FROM `member` `m` WHERE `member_id` = :member_id'; + $result = $this->_db->fetchRow($sql, array( + 'member_id' => $member_id, + )); + if ($result['is_supporter'] && $result['is_supporter'] == 1) { + return false; + } + if ($result['is_old'] == 1 || $result['comments'] > 20) { + return false; + } + + return true; } /** * @param int $member_id * * @throws Zend_Db_Exception */ public function setActivated($member_id) { $updateValues = array( 'is_active' => 1, 'is_deleted' => 0, 'changed_at' => new Zend_Db_Expr('Now()'), 'deleted_at' => null ); $this->update($updateValues, $this->_db->quoteInto('member_id=?', $member_id, 'INTEGER')); - + $memberLog = new Default_Model_MemberDeactivationLog(); $memberLog->removeLogMemberAsDeleted($member_id); - + $this->setMemberProjectsActivated($member_id); $this->setMemberCommentsActivated($member_id); $this->setMemberEmailsActivated($member_id); $this->setActivatedInSubsystems($member_id); - + //$this->setMemberPlingsActivated($member_id); } private function setMemberProjectsActivated($member_id) { $modelProject = new Default_Model_Project(); $modelProject->setAllProjectsForMemberActivated($member_id); } private function setMemberCommentsActivated($member_id) { $modelComment = new Default_Model_ProjectComments(); $modelComment->setAllCommentsForUserActivated($member_id); } + private function setMemberEmailsActivated($member_id) + { + $modelEmail = new Default_Model_DbTable_MemberEmail(); + $modelEmail->setActivatedByMember($member_id); + } + + private function setActivatedInSubsystems($member_id) + { + try { + $id_server = new Default_Model_Ocs_OAuth(); + $id_server->updateUser($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . print_r($id_server->getMessages(), true)); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + try { + $ldap_server = new Default_Model_Ocs_Ldap(); + $ldap_server->createUser($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL . " - ", + $ldap_server->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + try { + $openCode = new Default_Model_Ocs_Gitlab(); + $openCode->unblockUser($member_id); + $openCode->unblockUserProjects($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL . " - ", + $openCode->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + try { + $forum = new Default_Model_Ocs_Forum(); + $forum->unblockUser($member_id); + $forum->unblockUserPosts($member_id); + Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL." - ", $forum->getMessages())); + } catch (Exception $e) { + Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + } + } + /** * @param int $member_id * * @param bool $onlyNotDeleted * * @return Zend_Db_Table_Row * @throws Zend_Db_Statement_Exception */ public function fetchMemberData($member_id, $onlyNotDeleted = true) { if (null === $member_id) { return null; } $sql = ' - SELECT m.*, `member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked`, `member_email`.`email_address`, `mei`.`external_id`, `mei`.`gitlab_user_id` + SELECT `m`.*, `member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked`, `member_email`.`email_address`, `mei`.`external_id`, `mei`.`gitlab_user_id` FROM `member` AS `m` JOIN `member_email` ON `m`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_primary` = 1 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id` WHERE - (m.member_id = :memberId) + (`m`.`member_id` = :memberId) '; if ($onlyNotDeleted) { $sql .= " AND (m.is_deleted = " . self::MEMBER_NOT_DELETED . ")"; } $result = $this->getAdapter()->query($sql, array('memberId' => $member_id))->fetch(); $classRow = $this->getRowClass(); return new $classRow(array('table' => $this, 'stored' => true, 'data' => $result)); } /** * @param $member_id * @param bool $onlyActive * * @return null|Zend_Db_Table_Row_Abstract * @throws Zend_Db_Statement_Exception */ public function fetchMember($member_id, $onlyActive = true) { if (empty($member_id)) { return null; } $sql = " SELECT `m`.*, `member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked`, `member_email`.`email_address`, `mei`.`external_id` FROM `member` AS `m` JOIN `member_email` ON `m`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_primary` = 1 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id` WHERE `m`.`member_id` = :memberId"; if ($onlyActive) { $sql .= " AND `m`.`is_deleted` = " . self::MEMBER_NOT_DELETED . " AND `m`.`is_active` = " . self::MEMBER_ACTIVE; } $stmnt = $this->_db->query($sql, array('memberId' => $member_id)); if ($stmnt->rowCount() == 0) { return null; } return $this->generateRowClass($stmnt->fetch()); } /** * @param string $user_name * * @return Zend_Db_Table_Row */ public function fetchMemberFromHiveUserName($user_name) { $sql = " SELECT * FROM `member` WHERE `source_id` = :sourceId AND `username` = :userName "; - return $this->_db->fetchRow($sql, array('sourceId' => Default_Model_Member::SOURCE_HIVE, 'userName' => $user_name)); + return $this->_db->fetchRow($sql, + array('sourceId' => Default_Model_Member::SOURCE_HIVE, 'userName' => $user_name)); } - + /** * @param string $user_name * * @return Zend_Db_Table_Row */ public function fetchMemberFromHiveUserId($user_id) { $sql = " SELECT * FROM `member` WHERE `source_id` = :sourceId AND `source_pk` = :userId "; return $this->_db->fetchRow($sql, array('sourceId' => Default_Model_Member::SOURCE_HIVE, 'userId' => $user_id)); } /** * @param int $member_id * @param int $limit * * @return Zend_Db_Table_Rowset */ public function fetchFollowedMembers($member_id, $limit = null) { $sql = " SELECT member_follower.member_id, member_follower.follower_id, member.* FROM member_follower LEFT JOIN member ON member_follower.member_id = member.member_id WHERE member_follower.follower_id = :followerId AND member.is_active = :activeVal GROUP BY member_follower.member_id ORDER BY max(member_follower.member_follower_id) DESC "; if (null != $limit) { $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER'); } $result = $this->_db->fetchAll($sql, array('followerId' => $member_id, 'activeVal' => self::MEMBER_ACTIVE)); return $this->generateRowSet($result); } - /** * @param int $member_id * @param null $limit * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchFollowedProjects($member_id, $limit = null) { $sql = " SELECT `project_follower`.`project_id`, `project`.`title`, `project`.`image_small` FROM `project_follower` JOIN `project` ON `project_follower`.`project_id` = `project`.`project_id` WHERE `project_follower`.`member_id` = :member_id AND `project`.`status` = :project_status AND `project`.`type_id` = 1 ORDER BY `project_follower`.`project_follower_id` DESC "; if (null != $limit) { $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER'); } $result = - $this->_db->fetchAll($sql, array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); + $this->_db->fetchAll($sql, + array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); return $this->generateRowSet($result); } public function fetchPlingedProjects($member_id, $limit = null) { $sql = " SELECT project_category.title AS catTitle, project.*, member.*, plings.* FROM plings LEFT JOIN project ON plings.project_id = project.project_id LEFT JOIN project_category ON project.project_category_id = project_category.project_category_id LEFT JOIN member ON project.member_id = member.member_id WHERE plings.member_id = :member_id AND plings.status_id = 2 AND project.status = :project_status AND project.type_id = 1 ORDER BY plings.create_time DESC "; if (null != $limit) { $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER'); } $result = - $this->_db->fetchAll($sql, array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); + $this->_db->fetchAll($sql, + array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); return $this->generateRowSet($result); } public function fetchProjectsSupported($member_id, $limit = null) { $sql = " SELECT `project_category`.`title` AS `catTitle`, `project`.`project_id`, `project`.`title`, `project`.`image_small`, `plings`.`member_id`, `plings`.`amount`, `plings`.`create_time`, `member`.`profile_image_url`, `member`.`username` FROM `plings` JOIN `project` ON `plings`.`project_id` = `project`.`project_id` JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` JOIN `member` ON `plings`.`member_id` = `member`.`member_id` WHERE `project`.`member_id` = :member_id AND `plings`.`status_id` = 2 AND `project`.`status` = :project_status AND `project`.`type_id` = 1 ORDER BY `plings`.`create_time` DESC "; if (null != $limit) { $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER'); } $result = - $this->_db->fetchAll($sql, array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); + $this->_db->fetchAll($sql, + array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); return $this->generateRowSet($result); } /** * @param $userData * * @return array * @throws Exception */ public function createNewUser($userData) { $uuidMember = Local_Tools_UUID::generateUUID(); if (false == isset($userData['password'])) { throw new Exception(__METHOD__ . ' - user password is not set.'); } $userData['password'] = - Local_Auth_Adapter_Ocs::getEncryptedPassword($userData['password'], Default_Model_DbTable_Member::SOURCE_LOCAL); + Local_Auth_Adapter_Ocs::getEncryptedPassword($userData['password'], + Default_Model_DbTable_Member::SOURCE_LOCAL); if (false == isset($userData['roleId'])) { $userData['roleId'] = self::ROLE_ID_DEFAULT; } if ((false == isset($userData['avatar'])) OR (false == isset($userData['profile_image_url']))) { $imageFilename = $this->generateIdentIcon($userData, $uuidMember); $userData['avatar'] = $imageFilename; $userData['profile_image_url'] = IMAGES_MEDIA_SERVER . '/cache/200x200-2/img/' . $imageFilename; } if (false == isset($userData['uuid'])) { $userData['uuid'] = $uuidMember; } if (false == isset($userData['mail_checked'])) { $userData['mail_checked'] = 0; } - + //email is allways lower case - $userData['mail'] = strtolower( trim( $userData['mail'] ) ); + $userData['mail'] = strtolower(trim($userData['mail'])); $newUser = $this->storeNewUser($userData)->toArray(); $memberMail = $this->createPrimaryMailAddress($newUser); $externalId = $this->createExternalId($newUser['member_id']); $newUser['verificationVal'] = $memberMail->email_verification_value; $newUser['externalId'] = $externalId; return $newUser; } - /** - * @param $userData - * @param $uuidMember - * - * @return string - * @throws Exception - */ - protected function generateIdentIcon_old($userData, $uuidMember) - { - $identIcon = new Local_Tools_Identicon(); - $tmpImagePath = IMAGES_UPLOAD_PATH . 'tmp/' . $uuidMember . '.png'; - imagepng($identIcon->renderIdentIcon(sha1($userData['mail']), 1100), $tmpImagePath); - - $imageService = new Default_Model_DbTable_Image(); - $imageFilename = $imageService->saveImageOnMediaServer($tmpImagePath); - - return $imageFilename; - } - /** * @param $userData * @param $uuidMember * * @return string * @throws Exception */ protected function generateIdentIcon($userData, $uuidMember) { require_once 'vendor/autoload.php'; - // $name = substr($userData['username'],0,1).' '.substr($userData['username'],1); - $name = $userData['username'].' '; - $avatar = new LetterAvatar($name,'square', 400); + // $name = substr($userData['username'],0,1).' '.substr($userData['username'],1); + $name = $userData['username'] . ' '; + $avatar = new LetterAvatar($name, 'square', 400); $tmpImagePath = IMAGES_UPLOAD_PATH . 'tmp/' . $uuidMember . '.png'; - $avatar->saveAs($tmpImagePath, LetterAvatar::MIME_TYPE_PNG); + $avatar->saveAs($tmpImagePath, LetterAvatar::MIME_TYPE_PNG); $imageService = new Default_Model_DbTable_Image(); $imageFilename = $imageService->saveImageOnMediaServer($tmpImagePath); + return $imageFilename; } /** * @param array $userData * * @return Zend_Db_Table_Row_Abstract */ public function storeNewUser($userData) { $newUserData = $this->createRow($userData); $newUserData->save(); //create a user specified main project in project table $projectId = $this->createPersonalProject($newUserData->toArray()); //and save the id in member table $newUserData->main_project_id = $projectId; $newUserData->save(); return $newUserData; } /** * @param array $userData * * @return mixed $projectId */ protected function createPersonalProject($userData) { $tableProject = new Default_Model_Project(); /** @var Default_Model_DbRow_Project $newPersonalProject */ $newPersonalProject = $tableProject->createRow($userData); $newPersonalProject->uuid = Local_Tools_UUID::generateUUID(); $newPersonalProject->project_category_id = $newPersonalProject::CATEGORY_DEFAULT_PROJECT; $newPersonalProject->status = $newPersonalProject::STATUS_PROJECT_ACTIVE; $newPersonalProject->image_big = $newPersonalProject::DEFAULT_AVATAR_IMAGE; $newPersonalProject->image_small = $newPersonalProject::DEFAULT_AVATAR_IMAGE; $newPersonalProject->creator_id = $userData['member_id']; $newPersonalProject->title = $newPersonalProject::PERSONAL_PROJECT_TITLE; $projectId = $newPersonalProject->save(); return $projectId; } /** * @param array $newUser * @param bool $isVerified * * @return Zend_Db_Table_Row_Abstract * @throws Exception */ private function createPrimaryMailAddress($newUser) { $modelEmail = new Default_Model_MemberEmail(); $userMail = $modelEmail->saveEmailAsPrimary($newUser['member_id'], $newUser['mail'], $newUser['mail_checked']); return $userMail; } /** * @param int $member_id * * @return string */ private function createExternalId($member_id) { $modelExternalId = new Default_Model_DbTable_MemberExternalId(); $externalId = $modelExternalId->createExternalId($member_id); return $externalId; } public function fetchTotalMembersCount() { $sql = " SELECT count(1) AS `total_member_count` FROM `member` "; $result = $this->_db->fetchRow($sql); return $result['total_member_count']; } public function fetchTotalMembersInStoreCount() { $sql = " SELECT count(1) AS `total_member_count` FROM `member` "; $result = $this->_db->fetchRow($sql); return $result['total_member_count']; } /** * @param string $email * * @return null|Zend_Db_Table_Row_Abstract * @deprecated */ public function fetchCheckedActiveLocalMemberByEmail($email) { - $sel = $this->select()->where('mail=?', $email)->where('is_deleted = ?', Default_Model_DbTable_Member::MEMBER_NOT_DELETED) + $sel = $this->select()->where('mail=?', $email)->where('is_deleted = ?', + Default_Model_DbTable_Member::MEMBER_NOT_DELETED) ->where('is_active = ?', Default_Model_DbTable_Member::MEMBER_ACTIVE) ->where('mail_checked = ?', Default_Model_DbTable_Member::MEMBER_MAIL_CHECKED) - ->where('login_method = ?', Default_Model_DbTable_Member::MEMBER_LOGIN_LOCAL) - ; + ->where('login_method = ?', Default_Model_DbTable_Member::MEMBER_LOGIN_LOCAL); return $this->fetchRow($sel); } public function fetchEarnings($member_id, $limit = null) { $sql = " SELECT `project_category`.`title` AS `catTitle`, `project`.*, `member`.*, `plings`.* FROM `plings` JOIN `project` ON `plings`.`project_id` = `project`.`project_id` JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` JOIN `member` ON `project`.`member_id` = `member`.`member_id` WHERE `plings`.`status_id` = 2 AND `project`.`status` = :status AND `project`.`type_id` = 1 AND `project`.`member_id` = :memberId ORDER BY `plings`.`create_time` DESC "; if (null != $limit) { $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER'); } - $result = $this->_db->fetchAll($sql, array('memberId' => $member_id, 'status' => Default_Model_Project::PROJECT_ACTIVE)); + $result = $this->_db->fetchAll($sql, + array('memberId' => $member_id, 'status' => Default_Model_Project::PROJECT_ACTIVE)); return $this->generateRowSet($result); } /** * Finds an active user by given username or email ($identity) * Returns an empty rowset when no user found. * * @param string $identity could be the username or users mail address * @param bool $withLoginLocal * * @return Zend_Db_Table_Row_Abstract */ public function findActiveMemberByIdentity($identity, $withLoginLocal = false) { $sqlName = "SELECT * FROM `member` WHERE `is_active` = :active AND `is_deleted` = :deleted AND `username` = :identity"; $sqlMail = "SELECT * FROM `member` WHERE `is_active` = :active AND `is_deleted` = :deleted AND `mail` = :identity"; if ($withLoginLocal) { $sqlName .= " AND login_method = '" . self::MEMBER_LOGIN_LOCAL . "'"; $sqlMail .= " AND login_method = '" . self::MEMBER_LOGIN_LOCAL . "'"; } // test identity as username $resultName = $this->getAdapter()->fetchRow($sqlName, - array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity)) - ; + array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity)); if ((false !== $resultName) AND (count($resultName) > 0)) { return $this->generateRowClass($resultName); } // test identity as mail $resultMail = $this->getAdapter()->fetchRow($sqlMail, - array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity)) - ; + array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity)); if ((false !== $resultMail) AND (count($resultMail) > 0)) { return $this->generateRowClass($resultMail); } return $this->createRow(); } - + /** * @param string $value * * @return mixed */ - public function findActiveMemberByName($username){ - $sql = ' + public function findActiveMemberByName($username) + { + $sql = ' select m.member_id,m.username,profile_image_url from member m where m.is_active=1 and m.is_deleted = 0 - and m.username like "'.$username.'%" + and m.username like "' . $username . '%" limit 20 '; - $result = $this->getAdapter()->fetchAll($sql); - return $result; - } + $result = $this->getAdapter()->fetchAll($sql); + return $result; + } /** * @param string $value * * @return mixed */ public function findMemberForMailHash($value) { $sql = " SELECT `m`.* FROM `member_email` `me` JOIN `member` `m` ON `m`.`member_id` = `me`.`email_member_id` WHERE `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 AND `me`.`email_hash` = :email_hash "; $result = $this->getAdapter()->fetchAll($sql, array('email_hash' => $value)); if ($result && count($result) > 0) { $member = $result[0]; return $member; } } - /** * @param Zend_Db_Table_Row_Abstract $memberData * * @return bool */ public function isHiveUser($memberData) { if (empty($memberData)) { return false; } - //20180801 ronald: If a hive user change his password, he gets the ocs password type and we do + //20180801 ronald: If a hive user change his password, he gets the ocs password type and we do //have to check against the old hive password style //if ($memberData->source_id == self::SOURCE_HIVE) { // return true; //} if ($memberData->password_type == self::PASSWORD_TYPE_HIVE) { return true; } return false; } public function fetchActiveHiveUserByUsername($username) { $sql = 'SELECT * FROM member WHERE username = :username AND is_active = 1 AND member.source_id = 1 AND member.is_deleted = 0'; $result = $this->getAdapter()->query($sql, array('username' => $username))->fetch(); return $result; } - + public function fetchActiveUserByUsername($username) { - $sql = 'SELECT DISTINCT member.member_id - FROM member - WHERE LOWER(username) = :username - AND is_active = 1 - AND member.is_deleted = 0'; + $sql = 'SELECT DISTINCT `member`.`member_id` + FROM `member` + WHERE LOWER(`username`) = :username + AND `is_active` = 1 + AND `member`.`is_deleted` = 0'; $result = $this->getAdapter()->query($sql, array('username' => strtolower($username)))->fetchAll(); - - if($result && count($result)>0) { + + if ($result && count($result) > 0) { $member_id = $result[0]['member_id']; + return $member_id; } return null; } public function fetchCommentsCount($member_id) { $sql = " SELECT count(1) AS count FROM comments where comment_target_id <> 0 and comment_member_id = :member_id and comment_active = :comment_status "; $result = $this->_db->fetchRow($sql, array( 'member_id' => $member_id, 'comment_status' => Default_Model_DbTable_Comments::COMMENT_ACTIVE )); return $result['count']; } /** * @param $member_id * @param null $limit * * @return Zend_Paginator * @throws Zend_Paginator_Exception */ public function fetchComments($member_id, $limit = null) { $result = $this->fetchCommentsList($member_id, $limit); if (count($result) > 0) { return new Zend_Paginator(new Zend_Paginator_Adapter_Array($result)); } else { return new Zend_Paginator(new Zend_Paginator_Adapter_Array(array())); } } /** * @param $member_id * @param null $limit * * @return Zend_Paginator * @throws Zend_Paginator_Exception */ public function fetchCommentsList($member_id, $limit = null) { $sql = ' SELECT - comment_id - ,comment_text - ,member.member_id - ,member.profile_image_url - ,comment_created_at - ,stat_projects.username - ,stat_projects.project_member_id - ,comment_target_id - ,stat_projects.title - ,stat_projects.project_id - ,stat_projects.laplace_score - ,stat_projects.count_likes - ,stat_projects.count_dislikes - ,stat_projects.image_small - ,stat_projects.version - ,stat_projects.cat_title - ,stat_projects.count_comments - ,stat_projects.changed_at - ,stat_projects.created_at - FROM comments - inner join member ON comments.comment_member_id = member.member_id - inner JOIN stat_projects ON comments.comment_target_id = stat_projects.project_id AND comments.comment_type = 0 - WHERE comments.comment_active = :comment_status - AND stat_projects.status = :project_status - AND comments.comment_member_id = :member_id - ORDER BY comments.comment_created_at DESC + `comment_id` + ,`comment_text` + ,`member`.`member_id` + ,`member`.`profile_image_url` + ,`comment_created_at` + ,`stat_projects`.`username` + ,`stat_projects`.`project_member_id` + ,`comment_target_id` + ,`stat_projects`.`title` + ,`stat_projects`.`project_id` + ,`stat_projects`.`laplace_score` + ,`stat_projects`.`count_likes` + ,`stat_projects`.`count_dislikes` + ,`stat_projects`.`image_small` + ,`stat_projects`.`version` + ,`stat_projects`.`cat_title` + ,`stat_projects`.`count_comments` + ,`stat_projects`.`changed_at` + ,`stat_projects`.`created_at` + FROM `comments` + INNER JOIN `member` ON `comments`.`comment_member_id` = `member`.`member_id` + INNER JOIN `stat_projects` ON `comments`.`comment_target_id` = `stat_projects`.`project_id` AND `comments`.`comment_type` = 0 + WHERE `comments`.`comment_active` = :comment_status + AND `stat_projects`.`status` = :project_status + AND `comments`.`comment_member_id` = :member_id + ORDER BY `comments`.`comment_created_at` DESC '; if (isset($limit)) { $sql .= ' limit ' . (int)$limit; } $result = $this->_db->fetchAll($sql, array( 'member_id' => $member_id, 'project_status' => Default_Model_DbTable_Project::PROJECT_ACTIVE, 'comment_status' => Default_Model_DbTable_Comments::COMMENT_ACTIVE )); return $result; } public function fetchCntSupporters($member_id) { $sql = ' SELECT DISTINCT `plings`.`member_id` FROM `plings` JOIN `project` ON `plings`.`project_id` = `project`.`project_id` JOIN `member` ON `project`.`member_id` = `member`.`member_id` WHERE `plings`.`status_id` = 2 AND `project`.`status` = :project_status AND `project`.`type_id` = 1 AND `project`.`member_id` = :member_id '; $result = - $this->_db->fetchAll($sql, array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); + $this->_db->fetchAll($sql, + array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); return count($result); } public function fetchSupporterDonationInfo($member_id) { - /*$sql = 'SELECT max(active_time) AS active_time_max - ,min(active_time) AS active_time_min + /*$sql = 'SELECT max(active_time) AS active_time_max + ,min(active_time) AS active_time_min ,(DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now()) AS issupporter ,count(1) AS cnt from support where status_id = 2 AND type_id = 0 AND member_id = :member_id ';*/ $sql = " select member_id, max(active_time_max) as active_time_max, min(active_time_min) as active_time_min, max(is_valid) as issupporter, count(1) AS cnt from v_support where member_id = :member_id "; $result = $this->getAdapter()->fetchRow($sql, array('member_id' => $member_id)); return $result; } - - public function fetchSupporterSubscriptionInfo($member_id) { $sql = 'SELECT create_time,amount,period,period_frequency from support where status_id = 2 AND type_id = 1 AND member_id = :member_id ORDER BY create_time desc LIMIT 1'; $result = $this->getAdapter()->fetchRow($sql, array('member_id' => $member_id)); return $result; } public function fetchLastActiveTime($member_id) { $sql_page_views = "SELECT `created_at` AS `lastactive` FROM `stat_page_views` WHERE `member_id` = :member_id ORDER BY `created_at` DESC LIMIT 1"; $sql_activities = "SELECT `time` AS lastactive FROM activity_log WHERE member_id = :member_id ORDER BY `time` DESC LIMIT 1"; $result_page_views = $this->getAdapter()->fetchRow($sql_page_views, array('member_id' => $member_id)); $result_activities = $this->getAdapter()->fetchRow($sql_activities, array('member_id' => $member_id)); if (count($result_page_views) > 0 AND count($result_activities) > 0) { return $result_page_views['lastactive'] > $result_activities['lastactive'] ? $result_page_views['lastactive'] : $result_activities['lastactive']; } if (count($result_page_views) > count($result_activities)) { return $result_page_views['lastactive']; } if (count($result_activities) > count($result_page_views)) { return $result_activities['lastactive']; } return null; } /** * @param int $member_id * * @return array */ public function fetchContributedProjectsByCat($member_id) { $projects = $this->fetchSupportedProjects($member_id); $catArray = array(); if (count($projects) == 0) { return $catArray; } foreach ($projects as $pro) { $catArray[$pro->catTitle] = array(); } $helperProductUrl = new Default_View_Helper_BuildProductUrl(); foreach ($projects as $pro) { $projArr = array(); $projArr['id'] = $pro->project_id; $projArr['name'] = $pro->title; $projArr['image'] = $pro->image_small; $projArr['url'] = $helperProductUrl->buildProductUrl($pro->project_id, '', null, true); $projArr['sumAmount'] = $pro->sumAmount; array_push($catArray[$pro->catTitle], $projArr); } return $catArray; } /** * @param int $member_id * @param null $limit * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchSupportedProjects($member_id, $limit = null) { $sql = " SELECT plings.project_id, project.title, project.image_small, project_category.title AS catTitle, (SELECT SUM(amount) FROM plings WHERE plings.project_id=project.project_id AND plings.status_id=2) AS sumAmount FROM plings JOIN project ON plings.project_id = project.project_id JOIN project_category ON project.project_category_id = project_category.project_category_id WHERE plings.status_id IN (2,3,4) AND plings.member_id = :member_id AND project.status = :project_status AND project.type_id = 1 GROUP BY plings.project_id ORDER BY sumAmount DESC "; if (null != $limit) { $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER'); } $result = - $this->_db->fetchAll($sql, array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); + $this->_db->fetchAll($sql, + array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE)); return $this->generateRowSet($result); } /** * @param string $value * @param int $test_case_sensitive * * @param array $omitMember * * @return array */ public function findUsername($value, $test_case_sensitive = self::CASE_INSENSITIVE, $omitMember = array()) { $sql = " SELECT * FROM `member` "; if ($test_case_sensitive == self::CASE_INSENSITIVE) { $sql .= "WHERE LCASE(member.username) = LCASE(:username)"; } else { $sql .= "WHERE member.username = :username"; } if (count($omitMember) > 0) { $sql .= " AND member.member_id NOT IN (" . implode(',', $omitMember) . ")"; } return $this->_db->fetchAll($sql, array('username' => $value)); } /** * @param string $login * * @return int */ public function generateUniqueUsername($login) { $sql = "SELECT COUNT(*) AS `counter` FROM `member` WHERE `username` REGEXP CONCAT(:user_name,'[_0-9]*$')"; $result = $this->_db->fetchRow($sql, array('user_name' => $login)); return $login . '_' . $result['counter']; } /** - * @param int $member_id + * @param int $member_id * @param string $email * * @return bool * @throws Zend_Db_Statement_Exception */ public function setActive($member_id, $email) { $sql = " UPDATE `member` STRAIGHT_JOIN `member_email` ON `member`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_checked` IS NULL AND `member`.`is_deleted` = 0 AND `member_email`.`email_deleted` = 0 SET `member`.`mail_checked` = 1, `member`.`is_active` = 1, `member`.`changed_at` = NOW(), `member_email`.`email_checked` = NOW() WHERE `member`.`member_id` = :memberId AND `member_email`.`email_address` = :mailAddress; "; $stmnt = $this->_db->query($sql, array('memberId' => $member_id, 'mailAddress' => $email)); return $stmnt->rowCount() > 0 ? true : false; } - /** - * @param int $member_id - * - * @throws Exception - * @deprecated since we're using solr server for searching - */ - private function removeMemberProjectsFromSearch($member_id) - { - $modelProject = new Default_Model_Project(); - $memberProjects = $modelProject->fetchAllProjectsForMember($member_id); - $modelSearch = new Default_Model_Search_Lucene(); - foreach ($memberProjects as $memberProject) { - $product = array(); - $product['project_id'] = $memberProject->project_id; - $product['project_category_id'] = $memberProject->project_category_id; - $modelSearch->deleteDocument($product); - } - } - /** * @param string $identity * * @return Zend_Db_Table_Row_Abstract */ public function findActiveMemberByMail($identity) { $sqlMail = " SELECT `m`.*, `me`.`email_address` AS `mail`, IF(ISNULL(`me`.`email_checked`),0,1) AS `mail_checked` FROM `member` AS `m` JOIN `member_email` AS `me` ON `me`.`email_member_id` = `m`.`member_id` AND `me`.`email_primary` = 1 WHERE `is_active` = :active AND `is_deleted` = :deleted AND `me`.`email_address` = :identity "; // test identity as mail $resultMail = $this->getAdapter()->fetchRow($sqlMail, - array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity)) - ; + array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity)); if ((false !== $resultMail) AND (count($resultMail) > 0)) { return $this->generateRowClass($resultMail); } return $this->createRow(); } - private function setDeletedInSubSystems($member_id) + public function getMembersAvatarOldAutogenerated($orderby = 'member_id desc', $limit = null, $offset = null) { - try { - $id_server = new Default_Model_Ocs_OAuth(); - $id_server->deleteUser($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . implode(PHP_EOL." - ", $id_server->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - try { - $ldap_server = new Default_Model_Ocs_Ldap(); - $ldap_server->deleteUser($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL." - ", $ldap_server->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - try { - $openCode = new Default_Model_Ocs_Gitlab(); - $openCode->blockUser($member_id); - $openCode->blockUserProjects($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL." - ", $openCode->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - try { - $forum = new Default_Model_Ocs_Forum(); - $forum->blockUser($member_id); - $forum->blockUserPosts($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL." - ", $forum->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - } + $sql = " + SELECT * FROM `tmp_member_avatar_unknow` + "; - public function getMembersAvatarOldAutogenerated($orderby='member_id desc',$limit = null, $offset = null) - { - $sql = " - select * from tmp_member_avatar_unknow - "; - + if (isset($orderby)) { + $sql = $sql . ' order by ' . $orderby; + } - if(isset($orderby)){ - $sql = $sql.' order by '.$orderby; - } + if (isset($limit)) { + $sql .= ' limit ' . (int)$limit; + } - if (isset($limit)) { - $sql .= ' limit ' . (int)$limit; - } + if (isset($offset)) { + $sql .= ' offset ' . (int)$offset; + } - if (isset($offset)) { - $sql .= ' offset ' . (int)$offset; - } + $resultSet = $this->_db->fetchAll($sql); - $resultSet = $this->_db->fetchAll($sql); - return $resultSet; - } + return $resultSet; + } - public function getMembersAvatarOldAutogeneratedTotalCount() + public function getMembersAvatarOldAutogeneratedTotalCount() { $sql = " select count(1) as cnt from tmp_member_avatar_unknow "; - $result = $this->getAdapter()->query($sql, array())->fetchAll(); - return $result[0]['cnt']; + $result = $this->getAdapter()->query($sql, array())->fetchAll(); + + return $result[0]['cnt']; } public function updateAvatarTypeId($member_id, $type_id) { $sql = " update member set avatar_type_id = :type_id where member_id = :member_id "; - $this->getAdapter()->query($sql, array('type_id'=>$type_id,'member_id'=>$member_id)); + $this->getAdapter()->query($sql, array('type_id' => $type_id, 'member_id' => $member_id)); } - private function setActivatedInSubsystems($member_id) + /** + * @param $userData + * @param $uuidMember + * + * @return string + * @throws Exception + */ + protected function generateIdentIcon_old($userData, $uuidMember) { - try { - $id_server = new Default_Model_Ocs_OAuth(); - $id_server->updateUser($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . print_r($id_server->getMessages(), true)); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - try { - $ldap_server = new Default_Model_Ocs_Ldap(); - $ldap_server->createUser($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL." - ", $ldap_server->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - try { - $openCode = new Default_Model_Ocs_Gitlab(); - $openCode->unblockUser($member_id); - $openCode->unblockUserProjects($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL." - ", $openCode->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); - } - try { - $forum = new Default_Model_Ocs_Forum(); - $forum->unblockUser($member_id); - $forum->unblockUserPosts($member_id); - Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL." - ", $forum->getMessages())); - } catch (Exception $e) { - Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString()); + $identIcon = new Local_Tools_Identicon(); + $tmpImagePath = IMAGES_UPLOAD_PATH . 'tmp/' . $uuidMember . '.png'; + imagepng($identIcon->renderIdentIcon(sha1($userData['mail']), 1100), $tmpImagePath); + + $imageService = new Default_Model_DbTable_Image(); + $imageFilename = $imageService->saveImageOnMediaServer($tmpImagePath); + + return $imageFilename; + } + + /** + * @param int $member_id + * + * @throws Exception + * @deprecated since we're using solr server for searching + */ + private function removeMemberProjectsFromSearch($member_id) + { + $modelProject = new Default_Model_Project(); + $memberProjects = $modelProject->fetchAllProjectsForMember($member_id); + $modelSearch = new Default_Model_Search_Lucene(); + foreach ($memberProjects as $memberProject) { + $product = array(); + $product['project_id'] = $memberProject->project_id; + $product['project_category_id'] = $memberProject->project_category_id; + $modelSearch->deleteDocument($product); } } } \ No newline at end of file diff --git a/application/modules/default/models/Ocs/Gitlab.php b/application/modules/default/models/Ocs/Gitlab.php index a59cc2c43..dca8ab07a 100644 --- a/application/modules/default/models/Ocs/Gitlab.php +++ b/application/modules/default/models/Ocs/Gitlab.php @@ -1,1348 +1,1381 @@ . * * Created: 19.06.2018 */ class Default_Model_Ocs_Gitlab { /** @var Zend_Cache_Core */ protected $cache; protected $config; protected $messages; + /** @var Zend_Http_Client */ protected $httpClient; /** * @inheritDoc */ public function __construct($config = null) { if (isset($config)) { $this->config = $config; } else { $this->config = Zend_Registry::get('config')->settings->server->opencode; } $uri = $this->config->host; - $this->httpClient = new Zend_Http_Client($uri, array('keepalive' => true, 'strictredirects' => true)); + $this->httpClient = $this->getHttpClient($uri); $this->cache = Zend_Registry::get('cache'); $this->messages = array(); } + /** + * @param $uri + * @return Zend_Http_Client + * @throws Default_Model_Ocs_Gitlab_Exception + */ + protected function getHttpClient($uri) + { + try { + return new Zend_Http_Client($uri, array('keepalive' => true, 'strictredirects' => true)); + } catch (Zend_Exception $e) { + throw new Default_Model_Ocs_Gitlab_Exception('Can not create http client for uri: ' . $uri, 0, $e); + } + } + /** * @param int|array $member_data * * @return bool * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function unblockUserProjects($member_data) { if (is_int($member_data)) { $member_data = $this->getMemberData($member_data, false); } if (empty($member_data)) { return false; } $user = $this->getUser($member_data['external_id'], $member_data['username']); if (false === $user) { return false; } $uri = $this->config->host . "/api/v4/users/{$user['id']}/projects"; $method = Zend_Http_Client::GET; $uid = $member_data['member_id']; try { $response = $this->httpRequest($uri, $uid, $method); if (false === $response) { $this->messages[] = "Fail "; return false; } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $memberLog = new Default_Model_MemberDeactivationLog(); foreach ($response as $project) { $log_data = - $memberLog->getLogEntries($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_PROJECT, + $memberLog->getLogEntries($member_data['member_id'], + Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_PROJECT, $project['id']); if (false === $log_data) { continue; } $object_data = json_decode($log_data['object_data'], true); $visibility = $object_data['visibility']; $uri = $this->config->host . "/api/v4/projects/{$project['id']}"; $method = Zend_Http_Client::PUT; $uid = $member_data['member_id']; $data = array('visibility' => $visibility); try { $response = $this->httpRequest($uri, $uid, $method, $data); if (false === $response) { $this->messages[] = "Fail " . $uri; continue; } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "Successful unblock user project: {$project['id']}"; - $memberLog->deleteLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_PROJECT, + $memberLog->deleteLog($member_data['member_id'], + Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_PROJECT, $project['id']); } return true; } /** * @param int $member_id * * @param bool $onlyActive * * @return array * @throws Default_Model_Ocs_Exception */ private function getMemberData($member_id, $onlyActive = true) { $onlyActiveFilter = ''; if ($onlyActive) { $onlyActiveFilter = " AND `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 AND `me`.`email_checked` IS NOT NULL AND `me`.`email_deleted` = 0"; } $sql = " SELECT `mei`.`external_id`,`m`.`member_id`, `m`.`username`, `me`.`email_address`, `m`.`password`, `m`.`roleId`, `m`.`firstname`, `m`.`lastname`, `m`.`profile_image_url`, `m`.`biography`, `m`.`created_at`, `m`.`changed_at`, `m`.`source_id` FROM `member` AS `m` LEFT JOIN `member_email` AS `me` ON `me`.`email_member_id` = `m`.`member_id` AND `me`.`email_primary` = 1 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id` WHERE `m`.`member_id` = :memberId {$onlyActiveFilter} ORDER BY `m`.`member_id` DESC "; $result = Zend_Db_Table::getDefaultAdapter()->fetchRow($sql, array('memberId' => $member_id)); if (count($result) == 0) { throw new Default_Model_Ocs_Exception('member with id ' . $member_id . ' could not found.'); } return $result; } /** * @param $extern_uid * @param $username * * @return array|false * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUser($extern_uid, $username) { $user_by_uid = $this->getUserByExternUid($extern_uid); if (false === empty($user_by_uid)) { return $user_by_uid; } $this->messages[] = "external id not found. external_id: " . $extern_uid; $user_by_dn = $this->getUserByDN(urlencode($username)); if (false === empty($user_by_dn)) { return $user_by_dn; } $this->messages[] = "ldap dn not found. username: " . $username; $user_by_name = $this->getUserWithName(urlencode($username)); if (false === empty($user_by_name)) { return $user_by_name; } $this->messages[] = "username not found. username: " . $username; return false; } /** * @param string $extern_uid * * @return array * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUserByExternUid($extern_uid) { - $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/users?extern_uid={$extern_uid}&provider=" . $this->config->provider_name; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } Zend_Registry::get('logger')->debug(__METHOD__ . " - body: " . $response->getRawBody()); return $body[0]; } /** * @param $username * * @return array * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUserByDN($username) { $user_id = $this->buildUserDn($username); $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/users?extern_uid={$user_id}&provider=ldapmain"; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } Zend_Registry::get('logger')->debug(__METHOD__ . " - body: " . $response->getRawBody()); return $body[0]; } /** * @param string $extern_uid * * @return string * @throws Zend_Exception */ private function buildUserDn($extern_uid) { $username = mb_strtolower($extern_uid); $baseDn = Default_Model_Ocs_Ldap::getBaseDn(); $dn = "cn={$username},{$baseDn}"; return $dn; } /** * @param string $username * * @return array * @throws Default_Model_Ocs_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUserWithName($username) { $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/users?username=" . $username; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } return $body[0]; } /** * @param string $uri * @param string $uid * @param string $method * @param array|null $post_param * * @return bool|array * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception + * @throws Zend_Uri_Exception */ protected function httpRequest($uri, $uid, $method = Zend_Http_Client::GET, $post_param = null) { $this->httpClient->resetParameters(); $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod($method); if (isset($post_param)) { $this->httpClient->setParameterPost($post_param); } $response = $this->httpClient->request(); if ($response->getStatus() < 200 OR $response->getStatus() >= 500) { $this->messages[] = 'Request failed.(' . $uri . ') OCS Forum server send message: ' . $response->getBody(); return false; } $body = Zend_Json::decode($response->getBody()); if ($body && is_array($body) && array_key_exists("message", $body)) { $this->messages[] = "id: {$uid} ($uri) - " . Zend_Json::encode($body["message"]); } return $body; } public function blockUserProjects($member_data) { if (is_int($member_data)) { $member_data = $this->getMemberData($member_data, false); } if (empty($member_data)) { return false; } $user = $this->getUser($member_data['external_id'], $member_data['username']); if (false === $user) { return false; } $uri = $this->config->host . "/api/v4/users/{$user['id']}/projects"; $method = Zend_Http_Client::GET; $uid = $member_data['member_id']; try { $response = $this->httpRequest($uri, $uid, $method); if (false === $response) { $this->messages[] = "Fail "; return false; } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } foreach ($response as $project) { $memberLog = new Default_Model_MemberDeactivationLog(); - $memberLog->addLogData($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_PROJECT, + $memberLog->addLogData($member_data['member_id'], + Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_PROJECT, $project['id'], json_encode($project)); $uri = $this->config->host . "/api/v4/projects/{$project['id']}"; $method = Zend_Http_Client::PUT; $uid = $member_data['member_id']; $data = array('visibility' => 'private'); try { $response = $this->httpRequest($uri, $uid, $method, $data); if (false === $response) { $this->messages[] = "Fail " . $uri; continue; } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "Successful block user project: {$project['id']}"; } return true; } /** * @param int|array $member_data * * @return bool * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function blockUser($member_data) { if (is_int($member_data)) { $member_data = $this->getMemberData($member_data, false); } if (empty($member_data)) { return false; } $user = $this->getUser($member_data['external_id'], $member_data['username']); if (false === $user) { return false; } $uri = $this->config->host . "/api/v4/users/{$user['id']}/block"; $method = Zend_Http_Client::POST; $uid = $member_data['member_id']; try { $response = $this->httpRequest($uri, $uid, $method); if (false === $response) { $this->messages[] = "Fail "; return false; } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "Successful block user: {$member_data['username']}"; $memberLog = new Default_Model_MemberDeactivationLog(); - $memberLog->addLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_USER, $user['id']); + $memberLog->addLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_USER, + $user['id']); return true; } /** * @param int|array $member_data * * @return bool * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function unblockUser($member_data) { if (is_int($member_data)) { $member_data = $this->getMemberData($member_data, false); } if (empty($member_data)) { return false; } $user = $this->getUser($member_data['external_id'], $member_data['username']); if (false === $user) { return false; } $uri = $this->config->host . "/api/v4/users/{$user['id']}/unblock"; $method = Zend_Http_Client::POST; $uid = $member_data['member_id']; try { $response = $this->httpRequest($uri, $uid, $method); if (false === $response) { $this->messages[] = "Fail "; return false; } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "Successful unblock user: {$member_data['username']}"; $memberLog = new Default_Model_MemberDeactivationLog(); - $memberLog->deleteLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_USER, $user['id']); + $memberLog->deleteLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_GITLAB_USER, + $user['id']); return true; } /** * @param $member_data * @param $oldUsername * * @return array|bool|null * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function updateUserFromArray($member_data, $oldUsername) { if (empty($member_data)) { return false; } $this->messages = array(); $data = $this->mapUserData($member_data); $user = $this->getUser($data['extern_uid'], $oldUsername); if (false === $user) { $this->messages[] = "Fail"; return false; } // $data['skip_reconfirmation'] = 'true'; // unset($data['password']); try { foreach ($data as $datum) { $datum['skip_reconfirmation'] = 'true'; unset($datum['password']); $this->httpUserUpdate($data, $user['id']); } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "overwritten : " . json_encode($user); return $user; } /** * @param array $user * * @return array * @throws Zend_Exception */ protected function mapUserData($user) { $paramEmail = ''; if (isset($user['email_address'])) { $paramEmail = $user['email_address']; - } else if (isset($user['mail'])) { - $paramEmail = $user['mail']; + } else { + if (isset($user['mail'])) { + $paramEmail = $user['mail']; + } } if (strlen($user['biography']) > 254) { $helperTruncate = new Default_View_Helper_Truncate(); $bio = $helperTruncate->truncate($user['biography'], 250); } else { $bio = empty($user['biography']) ? '' : $user['biography']; } $data = array( array( 'email' => $paramEmail, 'username' => mb_strtolower($user['username']), // 'name' => (false == empty($user['lastname'])) ? trim($user['firstname'] . ' ' . $user['lastname']) : $user['username'], 'name' => $user['username'], 'password' => $user['password'], 'provider' => $this->config->provider_name, 'extern_uid' => $user['external_id'], 'bio' => $bio, 'admin' => $user['roleId'] == 100 ? 'true' : 'false', 'can_create_group' => 'true' ), array( 'email' => $paramEmail, 'username' => mb_strtolower($user['username']), // 'name' => (false == empty($user['lastname'])) ? trim($user['firstname'] . ' ' . $user['lastname']) : $user['username'], 'name' => $user['username'], 'password' => $user['password'], 'provider' => "ldapmain", 'extern_uid' => $this->buildUserDn($user['username']), 'bio' => $bio, 'admin' => $user['roleId'] == 100 ? 'true' : 'false', 'can_create_group' => 'true' ) ); return $data; } /** * @param $data * * @param $id * * @return bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Http_Exception */ private function httpUserUpdate($data, $id) { $this->httpClient->resetParameters(); - $uri = $this->config->host . $this->config->url->user_create . '/' . $id; + $uri = $this->config->host . '/api/v4/users/' . $id; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::PUT); $this->httpClient->setParameterPost($data); $response = $this->httpClient->request(); if ($response->getStatus() < 200 OR $response->getStatus() >= 300) { throw new Default_Model_Ocs_Exception('update user data failed. OCS OpenCode server send message: ' - . $response->getRawBody()); + . $response->getRawBody()); } $body = Zend_Json::decode($response->getRawBody()); if (array_key_exists("message", $body)) { throw new Default_Model_Ocs_Exception($body["message"]); } Zend_Registry::get('logger')->debug(__METHOD__ . ' - request: ' . $uri); Zend_Registry::get('logger')->debug(__METHOD__ . ' - response: ' . $response->getRawBody()); return $body; } /** * @param string $email * * @return array * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUserByEmail($email) { $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/users?search={$email}"; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } Zend_Registry::get('logger')->debug(__METHOD__ . " - body: " . $response->getRawBody()); return $body; } /** * @param array $member * @param array $userSubsystem * * @return array * @throws Zend_Exception */ public function validateUserData($member, $userSubsystem) { $userDn = $this->buildUserDn(strtolower($member['username'])); $result = array(); if (mb_strtolower($member['email_address']) != $userSubsystem['email']) { $result[] = 'email_address<=>email'; $result[] = $member['email_address'] . '<=>' . $userSubsystem['email']; } if (mb_strtolower($member['username']) != $userSubsystem['username']) { $result[] = 'username<=>username'; $result[] = mb_strtolower($member['username']) . '<=>' . $userSubsystem['username']; } if ($member['username'] != $userSubsystem['name']) { $result[] = 'username<=>name'; $result[] = $member['username'] . '<=>' . $userSubsystem['name']; } if (($member['roleId'] == 100 ? true : false) != $userSubsystem['is_admin']) { $result[] = 'roleId<=>admin'; $result[] = $member['roleId'] . '<=>' . $userSubsystem['admin']; } if ("active" != $userSubsystem['state']) { $result[] = 'is_active<=>state'; $result[] = ($member['is_active'] ? 'active' : 'inactive') . '<=>' . $userSubsystem['state']; } if (false === array_search('oauth_opendesktop', array_column($userSubsystem['identities'], 'provider'))) { $result[] = 'oauth_opendesktop missing'; } $provider = array_column($userSubsystem['identities'], 'extern_uid', 'provider'); $providerOauth = isset($provider['oauth_opendesktop']) ? $provider['oauth_opendesktop'] : ''; if ($member['external_id'] != $providerOauth) { $result[] = 'external_id<=>oauth_opendesktop->extern_uid'; $result[] = $member['external_id'] . '<=>' . $providerOauth; } if (false === array_search('ldapmain', array_column($userSubsystem['identities'], 'provider'))) { $result[] = 'ldapmain missing'; } $providerLdap = isset($provider['ldapmain']) ? $provider['ldapmain'] : ''; if ($userDn != $providerLdap) { $result[] = 'userDn<=>ldapmain->extern_uid'; $result[] = $userDn . '<=>' . $providerLdap; } return $result; } public function resetMessages() { $this->messages = array(); } /** * @param $member_data * * @param bool $force * * @return array|bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function createUserFromArray($member_data, $force = false) { if (empty($member_data)) { return false; } $this->messages = array(); $data = $this->mapUserData($member_data); $user = $this->getUser($member_data['external_id'], $member_data['username']); $updatedUser = null; if (false === $user) { try { $data[0]['skip_confirmation'] = 'true'; $user = $this->httpUserCreate($data[0]); $this->messages[] = "created : " . json_encode($user); $data[1]['skip_reconfirmation'] = 'true'; $updatedUser = $this->httpUserUpdate($data[1], $user['id']); $this->messages[] = "updated : " . json_encode($updatedUser); } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } return $updatedUser; } if ($force === true) { try { foreach ($data as $datum) { $datum['skip_reconfirmation'] = 'true'; unset($datum['password']); $updatedUser = $this->httpUserUpdate($datum, $user['id']); } } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "overwritten : " . json_encode($updatedUser); return $updatedUser; } $this->messages[0] = 'user already exists.'; return false; } /** * @param $data * * @return bool * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ private function httpUserCreate($data) { $this->httpClient->resetParameters(); - $uri = $this->config->host . $this->config->url->user_create; + $uri = $this->config->host . '/api/v4/users'; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::POST); $this->httpClient->setParameterPost($data); $response = $this->httpClient->request(); if ($response->getStatus() < 200 OR $response->getStatus() >= 300) { throw new Default_Model_Ocs_Exception('push user data failed. OCS OpenCode server send message: ' - . $response->getRawBody()); + . $response->getRawBody()); } $body = Zend_Json::decode($response->getRawBody()); if (array_key_exists("message", $body)) { throw new Default_Model_Ocs_Exception(Zend_Json::encode($body["message"])); } Zend_Registry::get('logger')->debug(__METHOD__ . ' - request: ' . $uri); Zend_Registry::get('logger')->debug(__METHOD__ . ' - response: ' . $response->getRawBody()); return $body; } /** - * @param int $member_id + * @param int $member_id * * @return bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Http_Exception * @throws Zend_Json_Exception */ public function deleteUser($member_id) { if (empty($member_id)) { return false; } $member_data = $this->getMemberData($member_id, false); $user = $this->getUser($member_data['external_id'], mb_strtolower($member_data['username'])); if (false === $user) { $this->messages[0] = 'Not deleted. User not exists. '; return false; } return $this->httpUserDelete($user['id']); } /** * @param $id * * @return bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Http_Exception */ private function httpUserDelete($id) { $this->httpClient->resetParameters(); $uri = $this->config->host . '/api/v4/users/' . $id; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::DELETE); $response = $this->httpClient->request(); if (204 == $response->getStatus()) { $this->messages[0] = ' - response : ' . $response->getRawBody() . " - user id: {$id}"; return true; } if ($response->getStatus() < 200 AND $response->getStatus() >= 300) { throw new Default_Model_Ocs_Exception('delete user failed. OCS OpenCode server send message: ' . $response->getRawBody() - . PHP_EOL . " - OpenCode user id: {$id}"); + . PHP_EOL . " - OpenCode user id: {$id}"); } $body = Zend_Json::decode($response->getRawBody()); if (array_key_exists("message", $body)) { throw new Default_Model_Ocs_Exception($body["message"]); } Zend_Registry::get('logger')->debug(__METHOD__ . ' - request: ' . $uri); Zend_Registry::get('logger')->debug(__METHOD__ . ' - response: ' . $response->getRawBody()); $this->messages[0] = ' - response : ' . $response->getRawBody() . " - user id: {$id}"; return true; } /** * @param string $username * * @return bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function userExists($username) { $this->httpClient->resetParameters(); $uri = $this->config->host . '/api/v4/users?username=' . $username; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (array_key_exists("message", $body)) { throw new Default_Model_Ocs_Exception($body["message"]); } if (count($body) == 0) { return false; } Zend_Registry::get('logger')->debug(__METHOD__ . ' - request: ' . $uri); Zend_Registry::get('logger')->debug(__METHOD__ . ' - response: ' . $response->getBody()); if ($response->getStatus() < 200 AND $response->getStatus() >= 300) { throw new Zend_Exception('exists user failed. OCS OpenCode server send message: ' . $response->getBody() . PHP_EOL - . " - OpenCode user id: {$username}"); + . " - OpenCode user id: {$username}"); } $this->messages[0] = ' - response for user exists request: ' . $response->getBody() . PHP_EOL . " - OpenCode user id: {$username}" . PHP_EOL; return $body[0]['id']; } /** * @return array|null */ public function getMessages() { return $this->messages; } /** * @param int $member_id * * @return array|bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function createUser($member_id) { if (empty($member_id)) { return false; } $member_data = $this->getMemberData($member_id); $data = $this->mapUserData($member_data); $userId = $this->getUser($data['extern_uid'], $data['username']); if (false === $userId) { try { $data[0]['skip_confirmation'] = 'true'; $user = $this->httpUserCreate($data[0]); $this->messages[] = "created : " . json_encode($user); $data[1]['skip_reconfirmation'] = 'true'; $updatedUser = $this->httpUserUpdate($data[1], $user['id']); $this->messages[] = "updated : " . json_encode($updatedUser); } catch (Zend_Exception $e) { $this->messages[] = "Fail " . $e->getMessage(); return false; } $this->messages[] = "Success"; return $data; } $this->messages[0] = 'user already exists.'; return false; } /** * @param string $name * * @return bool * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function groupExists($name) { $this->httpClient->resetParameters(); $uri = $this->config->host . '/api/v4/groups?search=' . $name; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); - $body = Zend_Json::decode($response->getRawBody()); + try { + $body = Zend_Json::decode($response->getRawBody()); + } catch (Zend_Json_Exception $e) { + throw new Default_Model_Ocs_Exception($e,0, $e); + } catch (Zend_Http_Client_Exception $e) { + // Gitlab send empty response when group not found, this cause an Exception in http client + // we cannot distinguish between a real error and a successful empty response + // so we catch this exception and log only + // TODO: maybe use plain curl request + error_log($e->getMessage()); + } if (count($body) > 0) { return true; } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } if (array_key_exists("error_description", $body)) { throw new Default_Model_Ocs_Exception($body["error_description"]); } return false; } /** * @param $member_id * * @return bool * @throws Default_Model_Ocs_Exception * @throws Zend_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Http_Exception * @throws Zend_Json_Exception */ public function updateMail($member_id) { if (empty($member_id)) { throw new Default_Model_Ocs_Exception('given member_id is empty'); } $member_data = $this->getMemberData($member_id, false); $entry = $this->getUser($member_data['external_id'], $member_data['username']); if (false === $entry) { $this->messages[] = "Failed. User not found;"; return false; } $entry['skip_reconfirmation'] = 'true'; $entry['email'] = $member_data['email_address']; unset($entry['password']); $this->httpUserUpdate($entry, $entry['id']); $this->messages[] = "Success"; return true; } /** * @return array|mixed * @throws Default_Model_Ocs_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUsers() { $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/users"; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } return $body; } /** * @param int $id * * @return array|mixed * @throws Default_Model_Ocs_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUserWithId($id) { $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/users/" . $id; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } return $body; } /** * @param int $page * @param int $limit * @param string $order_by * @param string $sort * * @return array|false|mixed * @throws Zend_Http_Client_Exception */ public function getProjects($page = 1, $limit = 5, $order_by = 'created_at', $sort = 'desc') { $cache = $this->cache; $cacheName = __FUNCTION__; if (!($body = $cache->load($cacheName))) { $this->httpClient->resetParameters(); $uri = $this->config->host . '/api/v4/projects?order_by=' . $order_by . '&sort=' . $sort . '&visibility=public&page=' . $page . '&per_page=' . $limit; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); try { $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } //fetch also user data $returnArray = array(); foreach ($body as $git_project) { $gituser = $this->getUserWithName($git_project['namespace']['name']); $git_project['namespace']['avatar_url'] = $gituser['avatar_url']; $returnArray[] = $git_project; } $body = $returnArray; } catch (Exception $exc) { return array(); } } return $body; } /** * @param int $id * * @return mixed|null * @throws Default_Model_Ocs_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getProject($id) { $this->httpClient->resetParameters(); $uri = $this->config->host . "/api/v4/projects/" . $id . "/"; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if ($body['visibility'] <> 'public') { throw new Default_Model_Ocs_Exception('Project not found in gitlab'); } if (count($body) == 0) { return null; } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } return $body; } /** * @param int $id * @param string $state * @param int $page * @param int $limit * * @return array|mixed * @throws Default_Model_Ocs_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getProjectIssues($id, $state = 'opened', $page = 1, $limit = 5) { $this->httpClient->resetParameters(); $uri = $this->config->host . '/api/v4/projects/' . $id . '/issues?state=' . $state . '&page=' . $page . '&per_page=' . $limit; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = $this->httpClient->request(); $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } return $body; } /** * @param int $user_id * @param int $page * @param int $limit * * @return array|mixed * @throws Default_Model_Ocs_Exception * @throws Zend_Http_Client_Exception * @throws Zend_Json_Exception */ public function getUserProjects($user_id, $page = 1, $limit = 50) { $this->httpClient->resetParameters(); $uri = $this->config->host . '/api/v4/users/' . $user_id . '/projects?visibility=public&page=' . $page . '&per_page=' . $limit; $this->httpClient->setUri($uri); $this->httpClient->setHeaders('Private-Token', $this->config->private_token); $this->httpClient->setHeaders('Sudo', $this->config->user_sudo); $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); $this->httpClient->setMethod(Zend_Http_Client::GET); $response = null; try { $response = $this->httpClient->request(); - + } catch (Exception $ex) { $response = null; } - - if($response && !empty($response)) { + + if ($response && !empty($response)) { $body = Zend_Json::decode($response->getRawBody()); if (count($body) == 0) { return array(); } if (array_key_exists("message", $body)) { $result_code = substr(trim($body["message"]), 0, 3); if ((int)$result_code >= 300) { throw new Default_Model_Ocs_Exception($body["message"]); } } + return $body; } return null; } } \ No newline at end of file diff --git a/application/modules/default/models/Ocs/Gitlab/Exception.php b/application/modules/default/models/Ocs/Gitlab/Exception.php new file mode 100644 index 000000000..9b109c5ab --- /dev/null +++ b/application/modules/default/models/Ocs/Gitlab/Exception.php @@ -0,0 +1,28 @@ +. + * + * Created: 19.06.2018 + */ +class Default_Model_Ocs_Gitlab_Exception extends Zend_Exception +{ + +} \ No newline at end of file diff --git a/application/modules/default/models/Project.php b/application/modules/default/models/Project.php index e07879d4e..d5f79185a 100644 --- a/application/modules/default/models/Project.php +++ b/application/modules/default/models/Project.php @@ -1,1882 +1,1884 @@ . **/ class Default_Model_Project extends Default_Model_DbTable_Project { const FILTER_NAME_PROJECT_ID_NOT_IN = 'project_id_not_in'; const FILTER_NAME_RANKING = 'ranking'; const FILTER_NAME_CATEGORY = 'category'; const FILTER_NAME_TAG = 'tag'; const FILTER_NAME_ORIGINAL = 'original'; const FILTER_NAME_MEMBER = 'member'; const FILTER_NAME_ORDER = 'order'; const FILTER_NAME_LOCATION = 'location'; const ITEM_TYPE_DUMMY = 0; const ITEM_TYPE_PRODUCT = 1; const ITEM_TYPE_UPDATE = 2; const TAG_LICENCE_GID = 7; const TAG_TYPE_ID = 1; /** * @param int $status * @param int $id * * @throws Exception */ public function setStatus($status, $id) { if (false === in_array($status, $this->_allowedStatusTypes)) { throw new Exception('Wrong value for project status.'); } $updateValues = array( 'status' => $status, 'changed_at' => new Zend_Db_Expr('Now()') ); if (self::PROJECT_DELETED == $status) { $updateValues['deleted_at'] = new Zend_Db_Expr('NOW()'); } $this->update($updateValues, $this->_db->quoteInto('project_id=?', $id, 'INTEGER')); } /** * @param int $member_id * @param int $id */ public function setClaimedByMember($member_id, $id) { $updateValues = array( 'claimed_by_member' => $member_id, 'changed_at' => new Zend_Db_Expr('Now()') ); $this->update($updateValues, $this->_db->quoteInto('project_id=?', $id, 'INTEGER')); } /** * @param int $id */ public function resetClaimedByMember($id) { $updateValues = array( 'claimed_by_member' => new Zend_Db_Expr('NULL'), 'changed_at' => new Zend_Db_Expr('Now()') ); $this->update($updateValues, $this->_db->quoteInto('project_id=?', $id, 'INTEGER')); } /** * @param int $id */ public function transferClaimToMember($id) { $project = $this->fetchProductInfo($id); //Update ppload $pploadFiles = new Default_Model_DbTable_PploadFiles(); $updateValues = array( 'owner_id' => $project->claimed_by_member ); $pploadFiles->update($updateValues, "collection_id = ".$project->ppload_collection_id); $pploadCollection = new Default_Model_DbTable_PploadCollections(); $updateValues = array( 'owner_id' => $project->claimed_by_member ); $pploadCollection->update($updateValues, "id = ".$project->ppload_collection_id); //And prohect $updateValues = array( 'member_id' => new Zend_Db_Expr('claimed_by_member'), 'claimable' => new Zend_Db_Expr('NULL'), 'claimed_by_member' => new Zend_Db_Expr('NULL') ); $this->update($updateValues, $this->_db->quoteInto('project_id=? and claimable = 1', $id, 'INTEGER')); } /** * @param int $project_id * @param $member_id * * @throws Zend_Db_Statement_Exception * @throws Zend_Exception */ public function setInActive($project_id, $member_id) { $project_id = (int)$project_id; $updateValues = array( 'status' => self::PROJECT_INACTIVE, 'deleted_at' => new Zend_Db_Expr('Now()') ); $this->update($updateValues, 'status > 40 AND project_id=' . $project_id); $this->setInActiveForUpdates($project_id); $this->setDeletedForComments($member_id,$project_id); } /** * @param int $id */ protected function setInActiveForUpdates($id) { $id = (int)$id; $updateValues = array( 'status' => self::PROJECT_INACTIVE, 'changed_at' => new Zend_Db_Expr('Now()') ); $this->update($updateValues, 'status > 40 AND pid=' . $id); } /** * @param int $member_id * @param int $id * * @throws Zend_Db_Statement_Exception * @throws Zend_Exception */ private function setDeletedForComments($member_id, $id) { $modelComments = new Default_Model_ProjectComments(); $modelComments->setAllCommentsForProjectDeleted($member_id, $id); } /** * @param int $id * * @return mixed * @throws Zend_Db_Statement_Exception */ public function fetchActiveBySourcePk($id) { $q = $this->select()->where('status = ?', self::PROJECT_ACTIVE)->where('source_pk = ?', (int)$id) ->where('source_type = "project"') ; return $q->query()->fetch(); } /** * @param int $member_id * @param bool $onlyActiveProjects * * @return mixed */ public function countAllProjectsForMember($member_id, $onlyActiveProjects = false) { $q = $this->select()->from($this, array('countAll' => new Zend_Db_Expr('count(*)')))->setIntegrityCheck(false) ->where('project.status >= ?', ($onlyActiveProjects ? self::PROJECT_ACTIVE : self::PROJECT_INACTIVE)) ->where('project.member_id = ?', $member_id, 'INTEGER')->where('project.type_id = ?', self::PROJECT_TYPE_STANDARD) ; $resultSet = $q->query()->fetchAll(); return $resultSet[0]['countAll']; } /** * @param int $member_id * @param bool $onlyActiveProjects * @param $catids * * @return mixed * @throws Zend_Cache_Exception * @throws Zend_Db_Statement_Exception */ public function countAllProjectsForMemberCatFilter($member_id, $onlyActiveProjects = false, $catids = null) { $q = $this->select()->from($this, array('countAll' => new Zend_Db_Expr('count(*)')))->setIntegrityCheck(false) ->where('project.status >= ?', ($onlyActiveProjects ? self::PROJECT_ACTIVE : self::PROJECT_INACTIVE)) ->where('project.member_id = ?', $member_id, 'INTEGER')->where('project.type_id = ?', self::PROJECT_TYPE_STANDARD) ; if (isset($catids)) { $q->where('project_category_id in (' . $this->_getCatIds($catids) . ')'); } $resultSet = $q->query()->fetchAll(); return $resultSet[0]['countAll']; } /** * @param $catids * * @return string * @throws Zend_Cache_Exception * @throws Zend_Db_Statement_Exception */ protected function _getCatIds($catids) { $sqlwhereCat = ""; $sqlwhereSubCat = ""; $idCategory = explode(',', $catids); if (false === is_array($idCategory)) { $idCategory = array($idCategory); } $sqlwhereCat .= implode(',', $idCategory); $modelCategory = new Default_Model_DbTable_ProjectCategory(); $subCategories = $modelCategory->fetchChildElements($idCategory); if (count($subCategories) > 0) { foreach ($subCategories as $element) { $sqlwhereSubCat .= "{$element['project_category_id']},"; } } return $sqlwhereSubCat . $sqlwhereCat; } /** * By default it will show all projects for a member included the unpublished elements. * * @param int $member_id * @param int|null $limit * @param int|null $offset * @param bool $onlyActiveProjects * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchAllProjectsForMember($member_id, $limit = null, $offset = null, $onlyActiveProjects = false) { $q = $this->select()->from($this, array( '*', 'project_validated' => 'project.validated', 'project_uuid' => 'project.uuid', 'project_status' => 'project.status', 'project_created_at' => 'project.created_at', 'project_changed_at' => 'project.changed_at', 'member_type' => 'member.type', 'project_member_id' => 'member_id', 'laplace_score' => new Zend_Db_Expr('laplace_score(count_likes,count_dislikes)'), 'catTitle' => new Zend_Db_Expr('(SELECT title FROM project_category WHERE project_category_id = project.project_category_id)') ))->setIntegrityCheck(false)->join('member', 'project.member_id = member.member_id', array('username')) ->where('project.status >= ?', ($onlyActiveProjects ? self::PROJECT_ACTIVE : self::PROJECT_INACTIVE)) ->where('project.member_id = ?', $member_id, 'INTEGER')->where('project.type_id = ?', self::PROJECT_TYPE_STANDARD) ->order('project_changed_at DESC') ; if (isset($limit)) { $q->limit($limit, $offset); } return $this->generateRowSet($q->query()->fetchAll()); } /** * @param array $data * * @return Zend_Db_Table_Rowset_Abstract */ protected function generateRowSet($data) { $classRowSet = $this->getRowsetClass(); return new $classRowSet(array( 'table' => $this, 'rowClass' => $this->getRowClass(), 'stored' => true, 'data' => $data )); } /** * By default it will show all projects for a member included the unpublished elements. * * @param int $member_id * @param int|null $limit * @param int|null $offset * @param bool $onlyActiveProjects * * @param null $catids * * @return Zend_Db_Table_Rowset_Abstract * @throws Zend_Cache_Exception * @throws Zend_Db_Statement_Exception */ public function fetchAllProjectsForMemberCatFilter( $member_id, $limit = null, $offset = null, $onlyActiveProjects = false, $catids = null ) { $q = $this->select()->from($this, array( '*', 'project_validated' => 'project.validated', 'project_uuid' => 'project.uuid', 'project_status' => 'project.status', 'project_created_at' => 'project.created_at', 'project_changed_at' => 'project.changed_at', 'member_type' => 'member.type', 'project_member_id' => 'member_id', 'laplace_score' => new Zend_Db_Expr('laplace_score(count_likes,count_dislikes)'), 'catTitle' => new Zend_Db_Expr('(SELECT title FROM project_category WHERE project_category_id = project.project_category_id)') ))->setIntegrityCheck(false)->join('member', 'project.member_id = member.member_id', array('username')) ->where('project.status >= ?', ($onlyActiveProjects ? self::PROJECT_ACTIVE : self::PROJECT_INACTIVE)) ->where('project.member_id = ?', $member_id, 'INTEGER')->where('project.type_id = ?', self::PROJECT_TYPE_STANDARD) ->order('project_changed_at DESC') ; if (isset($catids)) { $q->where('project_category_id in (' . $this->_getCatIds($catids) . ')'); } if (isset($limit)) { $q->limit($limit, $offset); } return $this->generateRowSet($q->query()->fetchAll()); } /** * @param $collection_id * * @return null|Zend_Db_Table_Row_Abstract */ public function fetchProductForCollectionId($collection_id) { $sql = ' SELECT `p`.* FROM `project` AS `p` WHERE `p`.`ppload_collection_id` = :collectionId AND `p`.`status` >= :projectStatus AND `p`.`type_id` = :typeId '; $result = $this->_db->fetchRow($sql, array( 'collectionId' => $collection_id, 'projectStatus' => self::PROJECT_INACTIVE, 'typeId' => self::PROJECT_TYPE_STANDARD )); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @param int $project_id * * @return null|Zend_Db_Table_Row_Abstract */ public function fetchProductInfo($project_id) { $sql = ' SELECT `p`.*, `p`.`validated` AS `project_validated`, `p`.`uuid` AS `project_uuid`, `p`.`status` AS `project_status`, `p`.`created_at` AS `project_created_at`, `p`.`major_updated_at` AS `project_major_updated_at`, `p`.`changed_at` AS `project_changed_at`, `p`.`member_id` AS `project_member_id`, `p`.`source_pk` AS `project_source_pk`, `p`.`version` AS `project_version`, `pc`.`title` AS `cat_title`, `m`.`username`, `m`.`avatar`, `m`.`profile_image_url`, `m`.`roleId`, `m`.`mail`, `m`.`paypal_mail`, `m`.`dwolla_id`, IFNULL(pr.score_with_pling, 500) AS laplace_score, `view_reported_projects`.`amount_reports` AS `amount_reports`, (SELECT `tag`.`tag_fullname` FROM `tag_object`, `tag` WHERE `tag_object`.`tag_id`=`tag`.`tag_id` AND `tag_object_id` = `p`.`project_id` AND `tag_object`.`is_deleted`=0 AND `tag_group_id` = :tag_licence_gid AND `tag_type_id` = :tag_type_id ORDER BY `tag_object`.`tag_created` DESC LIMIT 1) AS `project_license_title` FROM `project` AS `p` JOIN `member` AS `m` ON `p`.`member_id` = `m`.`member_id` AND `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 JOIN `project_category` AS `pc` ON `p`.`project_category_id` = `pc`.`project_category_id` LEFT join stat_rating_project AS pr ON p.project_id = pr.project_id LEFT JOIN `view_reported_projects` ON ((`view_reported_projects`.`project_id` = `p`.`project_id`)) WHERE `p`.`project_id` = :projectId AND `p`.`status` >= :projectStatus AND (`p`.`type_id` = :typeIdStd OR `p`.`type_id` = :typeIdColl) '; $result = $this->_db->fetchRow($sql, array( 'projectId' => $project_id, 'projectStatus' => self::PROJECT_INACTIVE, 'typeIdStd' => self::PROJECT_TYPE_STANDARD, 'typeIdColl' => self::PROJECT_TYPE_COLLECTION, 'tag_licence_gid' => self::TAG_LICENCE_GID, 'tag_type_id' => self::TAG_TYPE_ID )); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @param int $project_id * * @return null|Zend_Db_Table_Row_Abstract */ public function fetchProductInfo_($project_id) { $sql = ' SELECT `p`.*, `p`.`validated` AS `project_validated`, `p`.`uuid` AS `project_uuid`, `p`.`status` AS `project_status`, `p`.`created_at` AS `project_created_at`, `p`.`changed_at` AS `project_changed_at`, `p`.`member_id` AS `project_member_id`, `p`.`source_pk` AS `project_source_pk`, `p`.`version` AS `project_version`, `pc`.`title` AS `cat_title`, `m`.`username`, `m`.`avatar`, `m`.`profile_image_url`, `m`.`roleId`, `m`.`mail`, `m`.`paypal_mail`, `m`.`dwolla_id`, IFNULL(pr.score_with_pling, 500) AS laplace_score, `view_reported_projects`.`amount_reports` AS `amount_reports`, `project_license`.`title` AS `project_license_title` FROM `project` AS `p` JOIN `member` AS `m` ON `p`.`member_id` = `m`.`member_id` AND `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 JOIN `project_category` AS `pc` ON `p`.`project_category_id` = `pc`.`project_category_id` LEFT join stat_rating_project AS pr ON p.project_id = pr.project_id LEFT JOIN `view_reported_projects` ON ((`view_reported_projects`.`project_id` = `p`.`project_id`)) LEFT JOIN `project_license` ON ((`project_license`.`project_license_id` = `p`.`project_license_id`)) WHERE `p`.`project_id` = :projectId AND `p`.`status` >= :projectStatus AND `p`.`type_id` = :typeId '; $result = $this->_db->fetchRow($sql, array( 'projectId' => $project_id, 'projectStatus' => self::PROJECT_INACTIVE, 'typeId' => self::PROJECT_TYPE_STANDARD )); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @param $project_id * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchProjectUpdates($project_id) { $projectSel = $this->select()->setIntegrityCheck(false)->from($this->_name) ->join('member', 'project.member_id = member.member_id', array('*')) ->where('project.pid=?', $project_id, 'INTEGER')->where('project.status>?', self::PROJECT_INACTIVE) ->where('project.type_id=?', self::PROJECT_TYPE_UPDATE)->order('RAND()') ; return $this->fetchAll($projectSel); } /** * @param $project_id * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchAllProjectUpdates($project_id) { $projectSel = $this->select()->setIntegrityCheck(false)->from($this->_name)->where('project.pid=?', $project_id, 'INTEGER') ->where('project.status>?', self::PROJECT_INACTIVE)->where('project.type_id=?', self::PROJECT_TYPE_UPDATE) ; return $this->fetchAll($projectSel); } /** * @param $project * @param int $count * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchSimilarProjects($project, $count = 10) { $count = (int)$count; $sql = " SELECT * FROM `stat_projects` AS `p` WHERE `p`.`project_category_id` = :cat_id AND `project_id` <> :project_id ORDER BY `p`.`changed_at` DESC LIMIT {$count} "; $result = $this->_db->fetchAll($sql, array( 'cat_id' => $project->project_category_id, 'project_id' => $project->project_id )); return $this->generateRowSet($result); } /** * @param Zend_Db_Table_Row $project * @param int $count * * @return Zend_Db_Table_Rowset_Abstract * @throws Zend_Exception */ public function fetchMoreProjects($project, $count = 6) { $q = $this->select()->from(array('project' => 'stat_projects'), array( 'project_id', 'image_small', 'title', 'catTitle' => 'cat_title', 'changed_at' ))->setIntegrityCheck(false) ->where('project.status = ?', self::PROJECT_ACTIVE) ->where('project.member_id = ?', $project->member_id, 'INTEGER') ->where('project.project_id != ?', $project->project_id, 'INTEGER') ->where('project.type_id = ?', self::PROJECT_TYPE_STANDARD) ->where('project.amount_reports is null') ->where('project.project_category_id = ?', $project->project_category_id, 'INTEGER') ->limit($count) ->order('project.project_created_at DESC') ; $tagFilter = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; if ($tagFilter) { $q = $this->generateTagFilter($q, array(self::FILTER_NAME_TAG => $tagFilter)); } $result = $this->fetchAll($q); return $result; } /** * @param Zend_Db_Select $statement * @param array $filterArrayValue * * @return Zend_Db_Select */ protected function generateTagFilter(Zend_Db_Select $statement, $filterArrayValue) { if (false == isset($filterArrayValue[self::FILTER_NAME_TAG])) { return $statement; } $filter = $filterArrayValue[self::FILTER_NAME_TAG]; if (is_array($filter)) { $tagList = $filter; //build where statement für projects $selectAnd = $this->select()->from(array('project' => 'stat_projects')); foreach($tagList as $item) { #and $selectAnd->where('find_in_set(?, tag_ids)', $item); } $statement->where(implode(' ', $selectAnd->getPart('where'))); /* $statement->join(array( 'tags' => new Zend_Db_Expr('(SELECT DISTINCT project_id FROM stat_project_tagids WHERE tag_id in (' . implode(',', $filter) . '))') ), 'project.project_id = tags.project_id', array()); * */ } else { $statement->where('find_in_set(?, tag_ids)', $filter); } return $statement; } /** * @param $project * @param int $count * * @return Zend_Db_Table_Rowset_Abstract * @throws Zend_Db_Statement_Exception * @throws Zend_Exception * @todo improve processing speed */ public function fetchMoreProjectsOfOtherUsr($project, $count = 8) { $sql = " SELECT count(1) AS `count` FROM `stat_projects` WHERE `status` = :current_status AND `member_id` <> :current_member_id AND `project_category_id` = :category_id AND `type_id` = :project_type "; $result = $this->_db->query($sql, array( 'current_status' => self::PROJECT_ACTIVE, 'current_member_id' => $project->member_id, 'category_id' => $project->project_category_id, 'project_type' => self::PROJECT_TYPE_STANDARD ))->fetch() ; if ($result['count'] > $count) { $offset = rand(0, $result['count'] - $count); } else { $offset = 0; } $q = $this->select()->from(array('project' => 'stat_projects'), array( 'project_id', 'image_small', 'title', 'catTitle' => 'cat_title', 'changed_at' ))->setIntegrityCheck(false)->where('status = ?', self::PROJECT_ACTIVE) ->where('member_id != ?', $project->member_id, 'INTEGER')->where('type_id = ?', 1) ->where('amount_reports is null') ->where('project_category_id = ?', $project->project_category_id, 'INTEGER')->limit($count, $offset) ->order('project_created_at DESC') ; $tagFilter = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; if ($tagFilter) { $q = $this->generateTagFilter($q, array(self::FILTER_NAME_TAG => $tagFilter)); } $result = $this->fetchAll($q); return $result; } /** * @param int $project_id * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchProjectSupporter($project_id) { $plingTable = new Default_Model_DbTable_Plings(); return $plingTable->getSupporterForProjectId($project_id); } /** * @param int $project_id * * @return Zend_Db_Table_Rowset_Abstract */ public function fetchProjectSupporterWithPlings($project_id) { $plingTable = new Default_Model_DbTable_Plings(); return $plingTable->getSupporterWithPlingsForProjectId($project_id); } /** * @param $projectId * @param $sources */ public function updateGalleryPictures($projectId, $sources) { $galleryPictureTable = new Default_Model_DbTable_ProjectGalleryPicture(); $galleryPictureTable->clean($projectId); $galleryPictureTable->insertAll($projectId, $sources); } /** * @param $projectId * * @return array */ public function getGalleryPictureSources($projectId) { $galleryPictureTable = new Default_Model_DbTable_ProjectGalleryPicture(); $stmt = $galleryPictureTable->select()->where('project_id = ?', $projectId)->order(array('sequence')); $pics = array(); foreach ($galleryPictureTable->fetchAll($stmt) as $pictureRow) { $pics[] = $pictureRow['picture_src']; } return $pics; } /** * @param int $project_id * * @return array * @throws Zend_Db_Statement_Exception */ public function fetchProjectViews($project_id) { $sql = " SELECT `project_id`, `count_views`, `count_visitor`, `last_view` FROM `stat_page_views_mv` WHERE `project_id` = ? "; $database = Zend_Db_Table::getDefaultAdapter(); $sql = $database->quoteInto($sql, $project_id, 'INTEGER', 1); $resultSet = $database->query($sql)->fetchAll(); if (count($resultSet) > 0) { $result = $resultSet[0]['count_views']; } else { $result = 0; } return $result; } /** * @param int $member_id * * @return int * @throws Zend_Db_Statement_Exception */ public function fetchOverallPageViewsByMember($member_id) { $sql = " SELECT sum(`stat`.`amount`) AS `page_views` FROM `project` JOIN (SELECT `project_id`, count(`project_id`) AS `amount` FROM `stat_page_views` GROUP BY `project_id`) AS `stat` ON `stat`.`project_id` = `project`.`project_id` WHERE `project`.`member_id` = :member_id AND `project`.`status` = :project_status GROUP BY `member_id` "; $result = $this->_db->query($sql, array('member_id' => $member_id, 'project_status' => self::PROJECT_ACTIVE)); if ($result->rowCount() > 0) { $row = $result->fetch(); return $row['page_views']; } else { return 0; } } /** * @return array * @throws Zend_Db_Statement_Exception */ public function getStatsForNewProjects() { $sql = " SELECT DATE_FORMAT(`time`, '%M %D') AS `projectdate`, count(1) AS `daycount` FROM `activity_log` WHERE `activity_type_id` = 0 GROUP BY DATE_FORMAT(`time`, '%Y%M%D') ORDER BY `time` DESC LIMIT 14 ;"; $database = Zend_Db_Table::getDefaultAdapter(); $resultSet = $database->query($sql)->fetchAll(); return $resultSet; } /** * @param int $idCategory * @param int|null $limit * * @return Zend_Db_Table_Rowset_Abstract * @throws Zend_Cache_Exception * @throws Zend_Db_Statement_Exception */ public function fetchProductsByCategory($idCategory, $limit = null) { $select = $this->select()->setIntegrityCheck(false)->from($this->_name)->where('project.project_category_id in (?)', $idCategory) ->where('project.status = ?', self::PROJECT_ACTIVE)->where('project.type_id = ?', self::PROJECT_TYPE_STANDARD) ->joinLeft(array( 'pling_amount' => new Zend_Db_Expr('(SELECT project_id as plinged_project_id, SUM(amount) AS sumAmount, count(1) as countPlings FROM plings where status_id >= 2 group by project_id order by sumAmount DESC)') ), 'pling_amount.plinged_project_id = project.project_id') ->joinLeft('project_category', 'project_category.project_category_id = project.project_category_id', array('cat_title' => 'title'))->order('pling_amount.sumAmount DESC') ; if (false === is_null($limit)) { $select->limit($limit); } $modelCategory = new Default_Model_DbTable_ProjectCategory(); $subCategories = $modelCategory->fetchChildElements($idCategory); if (count($subCategories) > 0) { $sqlwhere = ''; foreach ($subCategories as $element) { $sqlwhere .= "{$element['project_category_id']},"; } $sqlwhere = substr($sqlwhere, 0, -1); if (!empty($sqlwhere)) { $sqlwhere = explode(',', $sqlwhere); } $select->orWhere('project.project_category_id in (?)', $sqlwhere); } return $this->fetchAll($select); } /** * @param int|array $idCategory id of a category or an array of id's * @param bool $withSubCat if was set true it will also count products in sub categories * @param null $store_id * * @return int count of products in given category * @throws Zend_Exception * @deprecated */ public function countProductsInCategory($idCategory = null, $withSubCat = true, $store_id = null) { if (empty($idCategory)) { throw new Zend_Exception('idCategory param was not set'); } if (false == is_array($idCategory)) { $idCategory = array($idCategory); } if (isset($store_id)) { $configurations = Zend_Registry::get('application_store_config_id_list'); $store_config = isset($configurations[$store_id]) ? $configurations[$store_id] : null; } else { $store_config = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') : null; } $tagFilter = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; $cacheName = __FUNCTION__ . '_' . md5(serialize($idCategory) . $withSubCat . serialize($tagFilter)); /** @var Zend_Cache_Core $cache */ $cache = Zend_Registry::get('cache'); if (false !== ($resultSet = $cache->load($cacheName))) { return (int)$resultSet[0]['count_active_projects']; } $select = $this->select()->setIntegrityCheck(false)->from('stat_projects', array('count_active_projects' => 'COUNT(1)')) ->where('status = ? ', self::PROJECT_ACTIVE)->where('type_id = ?', self::PROJECT_TYPE_STANDARD) ; $select = $this->generateTagFilter($select, array(self::FILTER_NAME_TAG => $tagFilter)); if ($withSubCat) { $modelCategory = new Default_Model_DbTable_ProjectCategory(); $subCategories = $modelCategory->fetchChildIds($idCategory); $inCategories = implode(',', array_unique(array_merge($idCategory, $subCategories))); } else { $inCategories = implode(',', $idCategory); } $select->where('project_category_id in (' . $inCategories . ')'); $resultSet = $this->fetchAll($select)->toArray(); $cache->save($resultSet, $cacheName, array(), 60); return (int)$resultSet[0]['count_active_projects']; } /** * @param int|array $idCategory * * @return int * @throws Zend_Exception */ public function countActiveMembersForCategory($idCategory) { $cacheName = __FUNCTION__ . md5(serialize($idCategory)); $cache = Zend_Registry::get('cache'); $result = $cache->load($cacheName); if ($result) { return (int)$result['count_active_members']; } $sqlwhereCat = ""; $sqlwhereSubCat = ""; if (false === is_array($idCategory)) { $idCategory = array($idCategory); } $sqlwhereCat .= implode(',', $idCategory); $modelCategory = new Default_Model_DbTable_ProjectCategory(); $subCategories = $modelCategory->fetchChildElements($idCategory); if (count($subCategories) > 0) { foreach ($subCategories as $element) { $sqlwhereSubCat .= "{$element['project_category_id']},"; } } $selectWhere = 'AND p.project_category_id in (' . $sqlwhereSubCat . $sqlwhereCat . ')'; $sql = "SELECT count(1) AS `count_active_members` FROM ( SELECT count(1) AS `count_active_projects` FROM `project` `p` WHERE `p`.`status` = 100 AND `p`.`type_id` = 1 {$selectWhere} GROUP BY p.member_id ) AS `A`;"; $result = $this->_db->fetchRow($sql); $cache->save($result, $cacheName); return (int)$result['count_active_members']; } /** * @param int $project_id * * @return bool */ public function isProjectFeatured($project_id) { $sql_object = "SELECT `project_id` FROM `project` WHERE `project_id`= :project_id AND `status` = 100 AND `type_id` = 1 AND `featured` = 1"; $r = $this->getAdapter()->fetchRow($sql_object, array('project_id' => $project_id)); if ($r) { return true; } else { return false; } } /** * @param bool $in_current_store * * @return int * @throws Zend_Exception */ public function fetchTotalProjectsCount($in_current_store = false) { $sql = "SELECT count(1) AS `total_project_count` FROM `stat_projects`"; if ($in_current_store) { $store_tags = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; /* if ($store_tags) { $sql .= ' JOIN (SELECT DISTINCT project_id FROM stat_project_tagids WHERE tag_id in (' . implode(',', $store_tags) . ')) AS tags ON stat_projects.project_id = tags.project_id'; } * */ $info = new Default_Model_Info(); $activeCategories = $info->getActiveCategoriesForCurrentHost(); $sql .= ' WHERE project_category_id IN (' . implode(',', $activeCategories) . ')'; //Store Tag Filter if ($store_tags) { $tagList = $store_tags; //build where statement für projects $sql .= " AND ("; if(!is_array($tagList)) { $tagList = array($tagList); } foreach($tagList as $item) { #and $sql .= ' find_in_set('.$item.', tag_ids) AND '; } $sql .= ' 1=1)';; } } $result = $this->_db->fetchRow($sql); return (int)$result['total_project_count']; } /** * @param $member_id * * @throws Zend_Db_Statement_Exception * @throws Zend_Exception */ public function setAllProjectsForMemberDeleted($member_id) { $sql = "SELECT `project_id` FROM `project` WHERE `member_id` = :memberId AND `type_id` = :typeId AND `status` > :project_status"; $projectForDelete = $this->_db->fetchAll($sql, array( 'memberId' => $member_id, 'typeId' => self::PROJECT_TYPE_STANDARD, 'project_status' => self::PROJECT_DELETED )); foreach ($projectForDelete as $item) { $this->setDeleted($member_id, $item['project_id']); } // set personal page deleted $sql = "SELECT project_id FROM project WHERE member_id = :memberId AND type_id = :typeId"; $projectForDelete = $this->_db->fetchAll($sql, array( 'memberId' => $member_id, 'typeId' => self::PROJECT_TYPE_PERSONAL )); foreach ($projectForDelete as $item) { $this->setDeleted($member_id, $item['project_id']); } /* $sql = "UPDATE project SET `status` = :statusCode, deleted_at = NOW() WHERE member_id = :memberId AND type_id = :typeId"; $this->_db->query($sql, array( 'statusCode' => self::PROJECT_DELETED, 'memberId' => $member_id, 'typeId' => self::PROJECT_TYPE_PERSONAL ))->execute(); */ } /** * @param int $member_id * @param int $id * * @throws Zend_Db_Statement_Exception * @throws Zend_Exception */ public function setDeleted($member_id, $id) { $id = (int)$id; $updateValues = array( 'status' => self::PROJECT_DELETED, 'deleted_at' => new Zend_Db_Expr('Now()') ); $this->update($updateValues, 'status > 30 AND project_id=' . $id); $memberLog = new Default_Model_MemberDeactivationLog(); $memberLog->logProjectAsDeleted($member_id, $id); $this->setDeletedForUpdates($member_id, $id); $this->setDeletedForComments($member_id, $id); $this->setDeletedInMaterializedView($id); } /** * @param $member_id * @param int $id */ protected function setDeletedForUpdates($member_id, $id) { $id = (int)$id; $updateValues = array( 'status' => self::PROJECT_DELETED, 'deleted_at' => new Zend_Db_Expr('Now()') ); $this->update($updateValues, 'status > 30 AND pid=' . $id); } /** * @param $id * * @throws Zend_Db_Statement_Exception */ private function setDeletedInMaterializedView($id) { $sql = "UPDATE `stat_projects` SET `status` = :new_status WHERE `project_id` = :project_id"; $result = $this->_db->query($sql, array('new_status' => self::PROJECT_DELETED, 'project_id' => $id))->execute(); } /** * @param int $member_id * * @throws Zend_Exception */ public function setAllProjectsForMemberActivated($member_id) { $sql = "SELECT `p`.`project_id` FROM `project` `p` JOIN `member_deactivation_log` `l` ON `l`.`object_type_id` = 3 AND `l`.`object_id` = `p`.`project_id` AND `l`.`deactivation_id` = `p`.`member_id` WHERE `p`.`member_id` = :memberId"; $projectForDelete = $this->_db->fetchAll($sql, array( 'memberId' => $member_id )); foreach ($projectForDelete as $item) { $this->setActive($member_id, $item['project_id']); } } /** * @param int $member_id * @param int $id * * @throws Zend_Exception */ public function setActive($member_id, $id) { $updateValues = array( 'status' => self::PROJECT_ACTIVE, 'deleted_at' => null ); $this->update($updateValues, $this->_db->quoteInto('project_id=?', $id, 'INTEGER')); $memberLog = new Default_Model_MemberDeactivationLog(); $memberLog->removeLogProjectAsDeleted($member_id, $id); $this->setActiveForUpdates($member_id, $id); $this->setActiveForComments($member_id, $id); } /** * @param int $id */ protected function setActiveForUpdates($member_id, $id) { $updateValues = array( 'status' => self::PROJECT_ACTIVE, 'deleted_at' => null ); $this->update($updateValues, $this->_db->quoteInto('pid=?', $id, 'INTEGER')); } /** * @param int $member_id * @param int $project_id */ private function setActiveForComments($member_id, $project_id) { $modelComments = new Default_Model_ProjectComments(); $modelComments->setAllCommentsForProjectActivated($member_id, $project_id); } /** * @param array $inputFilterParams * @param int|null $limit * @param int|null $offset * * @return array * @throws Zend_Cache_Exception * @throws Zend_Db_Select_Exception * @throws Zend_Exception */ public function fetchProjectsByFilter($inputFilterParams, $limit = null, $offset = null) { $cacheName = __FUNCTION__ . '_' . md5(serialize($inputFilterParams) . (string)$limit . (string)$offset); /** @var Zend_Cache_Core $cache */ $cache = Zend_Registry::get('cache'); if (false === ($returnValue = $cache->load($cacheName))) { $statement = $this->generateStatement($inputFilterParams, $limit, $offset); if (APPLICATION_ENV == 'development') { Zend_Registry::get('logger')->debug(__METHOD__ . ' - ' . $statement->__toString()); } /** @var Zend_Db_Table_Rowset $fetchedElements */ $fetchedElements = $this->fetchAll($statement); $statement->reset('limitcount')->reset('limitoffset'); $statement->reset('columns')->columns(array('count' => new Zend_Db_Expr('count(*)'))); $countElements = $this->fetchRow($statement); $returnValue = array('elements' => $fetchedElements, 'total_count' => $countElements->count); $cache->save($returnValue, $cacheName, array(), 120); } return $returnValue; } /** * @param array $inputFilterParams * @param int|null $limit * @param int|null $offset * * @return Zend_Db_Select * @throws Zend_Cache_Exception * @throws Zend_Db_Statement_Exception */ protected function generateStatement($inputFilterParams, $limit = null, $offset = null) { $statement = $this->generateBaseStatement(); $statement = $this->generateCategoryFilter($statement, $inputFilterParams); $statement = $this->generateOrderFilter($statement, $inputFilterParams); $statement = $this->generateTagFilter($statement, $inputFilterParams); $statement = $this->generateOriginalFilter($statement, $inputFilterParams); $statement = $this->generateReportedSpamFilter($statement); $statement->limit($limit, $offset); return $statement; } /** * @return Zend_Db_Select */ protected function generateBaseStatement() { $statement = $this->select()->setIntegrityCheck(false); //$statement->from(array('project' => $this->_name), array( $statement->from(array('project' => 'stat_projects'), array( '*' )); $statement->where('project.status = ?', self::PROJECT_ACTIVE)->where('project.type_id IN (?)', array(self::PROJECT_TYPE_STANDARD, self::PROJECT_TYPE_COLLECTION)); return $statement; } /** * @param Zend_Db_Select $statement * @param array $filterArrayValue * * @return Zend_Db_Select * @throws Zend_Cache_Exception * @throws Zend_Db_Statement_Exception */ protected function generateCategoryFilter(Zend_Db_Select $statement, $filterArrayValue) { if (false == isset($filterArrayValue[self::FILTER_NAME_CATEGORY])) { return $statement; } $filter = $filterArrayValue[self::FILTER_NAME_CATEGORY]; if (false === is_array($filter)) { $filter = array($filter); } // fetch child elements for each category $modelProjectCategories = new Default_Model_DbTable_ProjectCategory(); $childElements = $modelProjectCategories->fetchChildIds($filter); $allCategories = array_unique(array_merge($filter, $childElements)); $stringCategories = implode(',', $allCategories); $statement->where("( project.project_category_id IN ({$stringCategories}) )"); return $statement; } /** * @param Zend_Db_Select $statement * @param array $filterArrayValue * * @return Zend_Db_Select */ protected function generateOrderFilter(Zend_Db_Select $statement, $filterArrayValue) { if (!isset($filterArrayValue[self::FILTER_NAME_ORDER])) { $filterValue = ''; } else { $filterValue = $filterArrayValue[self::FILTER_NAME_ORDER]; } switch ($filterValue) { case 'latest': $statement->order('project.major_updated_at DESC'); //$statement->order('project.changed_at DESC'); break; case 'rating': //$statement->order(array('amount_received DESC', 'count_plings DESC', 'latest_pling DESC', 'project.created_at DESC')); //$statement->order(array(new Zend_Db_Expr('(round(((count_likes + 6) / ((count_likes + count_dislikes) + 12)),2) * 100) DESC'),'amount_received DESC', 'count_plings DESC', 'latest_pling DESC', 'project.created_at DESC')); /*$statement->order(array( new Zend_Db_Expr('(round(((count_likes + 6) / ((count_likes + count_dislikes) + 12)),2) * 100) DESC'), 'project.created_at DESC' ));*/ $statement->order('project.laplace_score DESC'); break; case 'top': $statement->order('project.laplace_score_old DESC'); break; case 'download': $statement->order('project.count_downloads_hive DESC'); break; case 'downloadQuarter': $statement->order('project.count_downloads_quarter DESC'); break; case 'hot': //$statement->order(array('amount_received DESC', 'count_plings DESC', 'latest_pling DESC', 'project.created_at DESC')); $statement->order(array( new Zend_Db_Expr('(round(((count_likes + 6) / ((count_likes + count_dislikes) + 12)),2) * 100) DESC'), 'amount_received DESC', 'count_plings DESC', 'latest_pling DESC', 'project.created_at DESC' )); $statement->where(' project.created_at >= (NOW()- INTERVAL 14 DAY)'); break; case 'alpha': default: $statement->order('project.title'); } return $statement; } /** * @param Zend_Db_Select $statement * @param array $filterArrayValue * * @return Zend_Db_Select */ protected function generateOriginalFilter(Zend_Db_Select $statement, $filterArrayValue) { if (false == isset($filterArrayValue[self::FILTER_NAME_ORIGINAL])) { return $statement; } $filter = $filterArrayValue[self::FILTER_NAME_ORIGINAL]; if (is_array($filter)) { // todo maybe for other tags filter } else { $statement->where('find_in_set(?, tags)', $filter); } return $statement; } /** * @param Zend_Db_Select $statement * * @return Zend_Db_Select */ protected function generateReportedSpamFilter(Zend_Db_Select $statement) { return $statement->where('(amount_reports is null)'); } /** * @param int $member_id * @param array $values * @param string $username * * @return Zend_Db_Table_Row_Abstract * @throws Exception * @throws Zend_Db_Table_Exception */ public function createProject($member_id, $values, $username) { $values = (array)$values; if (empty($member_id)) { throw new Zend_Db_Table_Exception('member_id is not set'); } if (empty($username)) { throw new Zend_Db_Table_Exception('username is not set'); } // check important values for a new project $values['uuid'] = (!array_key_exists('uuid', $values)) ? Local_Tools_UUID::generateUUID() : $values['uuid']; $values['member_id'] = (!array_key_exists('member_id', $values)) ? $member_id : $values['member_id']; $values['status'] = (!array_key_exists('status', $values)) ? self::PROJECT_INACTIVE : $values['status']; $values['type_id'] = (!array_key_exists('type_id', $values)) ? self::ITEM_TYPE_PRODUCT : $values['type_id']; $values['created_at'] = (!array_key_exists('created_at', $values)) ? new Zend_Db_Expr('NOW()') : $values['created_at']; $values['start_date'] = (!array_key_exists('start_date', $values)) ? new Zend_Db_Expr('NULL') : $values['start_date']; $values['creator_id'] = (!array_key_exists('creator_id', $values)) ? $member_id : $values['creator_id']; + $values['gitlab_project_id'] = empty($values['gitlab_project_id']) ? new Zend_Db_Expr('NULL') : $values['gitlab_project_id']; if ($username == 'pling editor') { $values['claimable'] = (!array_key_exists('claimable', $values)) ? self::PROJECT_CLAIMABLE : $values['claimable']; } $savedRow = $this->save($values); return $savedRow; } /** * @param int $project_id * @param array $values * * @return Zend_Db_Table_Row_Abstract - * @throws Exception * @throws Zend_Db_Table_Exception */ public function updateProject($project_id, $values) { $values = (array)$values; $projectData = $this->find($project_id)->current(); if (empty($projectData)) { throw new Zend_Db_Table_Exception('project_id not found'); } + $values['gitlab_project_id'] = empty($values['gitlab_project_id']) ? new Zend_Db_Expr('NULL') : $values['gitlab_project_id']; + $projectData->setFromArray($values)->save(); return $projectData; } /** * @param int $member_id * * @return array|mixed */ public function fetchMainProject($member_id) { $sql = "SELECT * FROM {$this->_name} WHERE type_id = :type AND member_id = :member"; // $this->_db->getProfiler()->setEnabled(true); $result = $this->_db->fetchRow($sql, array('type' => self::PROJECT_TYPE_PERSONAL, 'member' => (int)$member_id)); // $dummy = $this->_db->getProfiler()->getLastQueryProfile()->getQuery(); // $this->_db->getProfiler()->setEnabled(true); if (count($result) > 0) { return $result; } else { return array(); } } /** * @param $project_id * * @return Zend_Db_Table_Row_Abstract * @throws Zend_Db_Statement_Exception */ public function fetchProductDataFromMV($project_id) { $sql = "SELECT * FROM `stat_projects` WHERE `project_id` = :project_id"; $resultSet = $this->_db->query($sql, array('project_id' => $project_id))->fetch(); if (false === $resultSet) { return $this->generateRowClass(array()); } return $this->generateRowClass($resultSet); } /** * @return array */ public function fetchGhnsExcludedProjects() { $sql = " SELECT `p`.`project_id`, `p`.`title`, `l`.`member_id` AS `exclude_member_id`, `l`.`time` AS `exclude_time`, `m`.`username` AS `exclude_member_name` FROM `project` `p` JOIN `activity_log` `l` ON `l`.`project_id` = `p`.`project_id` AND `l`.`activity_type_id` = 314 INNER JOIN `member` `m` ON `m`.`member_id` = `l`.`member_id` WHERE `p`.`ghns_excluded` = 1 "; $list = $this->_db->fetchAll($sql); return $list; } public function getUserCreatingCategorys($member_id) { $sql = " select c.title as category1, count(1) as cnt from project p join project_category c on p.project_category_id = c.project_category_id where p.status = 100 and p.member_id =:member_id and p.type_id = 1 group by c.title order by cnt desc, c.title asc "; $result = $this->_db->fetchAll($sql, array('member_id' => $member_id)); return $result; } /** * @return array */ public function getUserActiveProjects($member_id, $limit = null, $offset = null) { // for member me page $sql = " SELECT `p`.`project_id`, `p`.`title`, `p`.`created_at` AS `project_created_at`, `p`.`changed_at` AS `project_changed_at`, `pr`.`likes` AS count_likes, `pr`.`dislikes`AS count_dislikes, IFNULL(pr.score_with_pling, 500) AS laplace_score, `p`.`member_id`, `cat`.`title` AS `catTitle`, `p`.`project_category_id`, `p`.`image_small`, (SELECT count(1) FROM `project_plings` `l` WHERE `p`.`project_id` = `l`.`project_id` AND `l`.`is_deleted` = 0 AND `l`.`is_active` = 1 ) `countplings`, c.cnt cntCategory FROM `project` `p` join project_category cat on p.project_category_id = cat.project_category_id LEFT join stat_rating_project AS pr ON p.project_id = pr.project_id left join stat_cnt_projects_catid_memberid c on p.project_category_id = c.project_category_id and p.member_id = c.member_id WHERE `p`.`status` =100 and `p`.`type_id` = 1 AND `p`.`member_id` = :member_id ORDER BY cntCategory desc,catTitle asc, `p`.`changed_at` DESC "; if (isset($limit)) { $sql = $sql . ' limit ' . $limit; } if (isset($offset)) { $sql = $sql . ' offset ' . $offset; } $result = $this->_db->fetchAll($sql, array('member_id' => $member_id)); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @return array */ public function getUserActiveProjectsDuplicatedSourceurl($member_id, $limit = null, $offset = null) { // for member me page $sql = " select * from ( SELECT `p`.`project_id`, `p`.`title`, `p`.`created_at` AS `project_created_at`, `p`.`changed_at` AS `project_changed_at`, `pr`.`likes` AS count_likes, `pr`.`dislikes`AS count_dislikes, IFNULL(pr.score_with_pling, 500) AS laplace_score, `p`.`member_id`, `cat`.`title` AS `catTitle`, `p`.`project_category_id`, `p`.`image_small`, (SELECT count(1) FROM `project_plings` `l` WHERE `p`.`project_id` = `l`.`project_id` AND `l`.`is_deleted` = 0 AND `l`.`is_active` = 1 ) `countplings`, c.cnt cntCategory, (select count(1) from stat_projects_source_url s where TRIM(TRAILING '/' FROM p.source_url) = s.source_url) as cntDuplicates FROM `project` `p` join project_category cat on p.project_category_id = cat.project_category_id left join stat_cnt_projects_catid_memberid c on p.project_category_id = c.project_category_id and p.member_id = c.member_id LEFT join stat_rating_project AS pr ON p.project_id = pr.project_id WHERE `p`.`status` =100 and `p`.`type_id` = 1 AND `p`.`member_id` = :member_id ORDER BY cntCategory desc,catTitle asc, `p`.`changed_at` DESC ) t where t.cntDuplicates >1 "; if (isset($limit)) { $sql = $sql . ' limit ' . $limit; } if (isset($offset)) { $sql = $sql . ' offset ' . $offset; } $result = $this->_db->fetchAll($sql, array('member_id' => $member_id)); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @param int $member_id * @param int|null $limit * @param int|null $offset * * @return null|Zend_Db_Table_Row_Abstract */ public function fetchAllFeaturedProjectsForMember($member_id, $limit = null, $offset = null) { // for member me page $sql = " SELECT `p`.`project_id`, `p`.`title`, `p`.`created_at` AS `project_created_at`, `p`.`changed_at` AS `project_changed_at`, `p`.`count_likes`, `p`.`count_dislikes`, `p`.`laplace_score`, `p`.`member_id`, `p`.`cat_title` AS `catTitle`, `p`.`image_small`, (SELECT count(1) FROM `project_plings` `l` WHERE `p`.`project_id` = `l`.`project_id` AND `l`.`is_deleted` = 0 AND `l`.`is_active` = 1 ) `countplings` FROM `stat_projects` `p` WHERE `p`.`status` =100 AND `p`.`type_id` = 1 AND `featured` = 1 AND `p`.`member_id` = :member_id ORDER BY `p`.`changed_at` DESC "; if (isset($limit)) { $sql = $sql . ' limit ' . $limit; } if (isset($offset)) { $sql = $sql . ' offset ' . $offset; } $result = $this->_db->fetchAll($sql, array('member_id' => $member_id)); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @param int $member_id * @param int|null $limit * @param int|null $offset * * @return null|Zend_Db_Table_Row_Abstract */ public function fetchAllCollectionsForMember($member_id, $limit = null, $offset = null) { // for member me page $sql = " SELECT `p`.`project_id`, `p`.`title`, `p`.`created_at` AS `project_created_at`, `p`.`changed_at` AS `project_changed_at`, `p`.`count_likes`, `p`.`count_dislikes`, `p`.`laplace_score`, `p`.`member_id`, `p`.`cat_title` AS `catTitle`, `p`.`image_small`, (SELECT count(1) FROM `project_plings` `l` WHERE `p`.`project_id` = `l`.`project_id` AND `l`.`is_deleted` = 0 AND `l`.`is_active` = 1 ) `countplings` FROM `stat_projects` `p` WHERE `p`.`status` =100 AND `p`.`type_id` = 3 AND `p`.`member_id` = :member_id ORDER BY `p`.`changed_at` DESC "; if (isset($limit)) { $sql = $sql . ' limit ' . $limit; } if (isset($offset)) { $sql = $sql . ' offset ' . $offset; } $result = $this->_db->fetchAll($sql, array('member_id' => $member_id)); if ($result) { return $this->generateRowClass($result); } else { return null; } } /** * @param string $orderby * @param int|null $limit * @param int|null $offset * * @return array */ public function fetchDuplicatedSourceProjects($orderby = 'source_url asc', $limit = null, $offset = null) { $sql = " SELECT `source_url` ,count(1) AS `cnt`, GROUP_CONCAT(`p`.`project_id` ORDER BY `p`.`created_at`) `pids` FROM `stat_projects_source_url` `p` GROUP BY `source_url` HAVING count(1)>1 "; if (isset($orderby)) { $sql = $sql . ' order by ' . $orderby; } if (isset($limit)) { $sql .= ' limit ' . (int)$limit; } if (isset($offset)) { $sql .= ' offset ' . (int)$offset; } $result = $this->_db->fetchAll($sql); return $result; } /** * @return mixed */ public function getTotalCountDuplicates() { $sql = " SELECT count(1) AS `cnt` FROM ( SELECT `source_url` ,count(1) AS `cnt`, GROUP_CONCAT(`p`.`project_id` ORDER BY `p`.`created_at`) `pids` FROM `stat_projects_source_url` `p` GROUP BY `p`.`source_url` HAVING count(1)>1 ) `a` "; $result = $this->_db->fetchAll($sql); return $result[0]['cnt'];; } /** * @param string $source_url * * @return mixed */ public function getCountSourceUrl($source_url) { $last = substr($source_url, -1); if ($last == '/') { $source_url = substr($source_url, 0, -1); } $sql = " SELECT count(1) AS `cnt` FROM `stat_projects_source_url` `p` WHERE `p`.`source_url`= :source_url "; $result = $this->_db->fetchAll($sql, array('source_url' => $source_url)); return $result[0]['cnt']; } public function getSourceUrlProjects($source_url) { $last = substr($source_url, -1); if ($last == '/') { $source_url = substr($source_url, 0, -1); } $sql = " SELECT p.project_id, pj.title, pj.member_id, pj.created_at, pj.changed_at, m.username FROM stat_projects_source_url p inner join project pj on p.project_id = pj.project_id and pj.status=100 inner join member m on pj.member_id = m.member_id WHERE p.source_url= :source_url "; $result = $this->_db->fetchAll($sql, array('source_url' => $source_url)); return $result; } /** * @param int $member_id * * @return mixed */ public function getCountProjectsDuplicateSourceurl($member_id) { $sql = " SELECT count(1) AS `cnt` FROM ( SELECT `p`.`source_url` ,(SELECT count(1) FROM `stat_projects_source_url` `pp` WHERE `pp`.`source_url`=`p`.`source_url`) `cnt` FROM `stat_projects_source_url` `p` WHERE `p`.`member_id` = :member_id ) `t` WHERE `t`.`cnt`>1 "; $result = $this->_db->fetchAll($sql, array('member_id' => $member_id)); return $result[0]['cnt']; } /** * @param $ids * * @return Zend_Db_Table_Row_Abstract * @throws Zend_Db_Statement_Exception */ public function fetchProjects($ids) { $sql = "SELECT * FROM stat_projects WHERE project_id in (" . $ids . ")"; $resultSet = $this->_db->fetchAll($sql); return $this->generateRowSet($resultSet); } /** * @param $project_id * @return true/false * @throws Zend_Db_Statement_Exception */ public function validateDeleteProjectFromSpam($project_id) { //produkt ist ueber 6 monate alt oder produkt hat ueber 5 kommentare oder produkt hat minimum 1 pling // darf nicht gelöscht werden $sql ='select count_comments ,created_at , (created_at+ INTERVAL 6 MONTH < NOW()) is_old ,(select count(1) from project_plings f where f.project_id = p.project_id and f.is_deleted = 0) plings FROM project p where project_id =:project_id'; $result = $this->_db->fetchRow($sql, array( 'project_id' => $project_id, )); if($result['count_comments'] >5 || $result['is_old'] ==1 || $result['plings']>0) { return false; } return true; } } diff --git a/application/modules/default/views/helpers/Image.php b/application/modules/default/views/helpers/Image.php index 98787a95a..ce50f98eb 100644 --- a/application/modules/default/views/helpers/Image.php +++ b/application/modules/default/views/helpers/Image.php @@ -1,126 +1,121 @@ . **/ class Default_View_Helper_Image extends Zend_View_Helper_Abstract { protected $_operations = array( 'crop' => '%d', 'width' => '%d', 'height' => '%d', 'quality' => '%d', 'bgColor' => '%s', 'progressive' => '%d' ); protected $_options = array( 'temporal' => false ); protected $_separator = '-'; public function Image($filename, $options = array()) { if (false === $this->validUri($filename)) { return $this->createImageUri($filename, $options); } $httpScheme = 'https'; - if (PHP_SAPI != 'cli') { - /** @var Zend_Controller_Request_Http $request */ - $request = Zend_Controller_Front::getInstance()->getRequest(); - $httpScheme = $request->getScheme(); - } $uri = $this->replaceScheme($filename, $httpScheme); if (empty($options)) { return $uri; } return $this->updateImageUri($uri, $options); } private function validUri($filename) { return Zend_Uri::check($filename); } private function createImageUri($filename, $options) { $operations = ""; if (isset($options['width']) && isset($options['height'])) { $operations .= $options['width'] . 'x' . $options['height']; } else { //$operations .= '80x80'; $operations .= ''; } if (isset($options['crop'])) { $operations .= '-' . $options['crop']; } else { //$operations .= '-2'; $operations .= ''; } if ($filename == "") { $filename = 'default.png'; } if (isset($options['temporal'])) { $filename = '/img/default/tmp/' . $filename; $url = $filename; } else { if (strpos($filename, '.gif') > 0 || $operations == '') { $url = IMAGES_MEDIA_SERVER . '/img/' . $filename; } else { $url = IMAGES_MEDIA_SERVER . '/cache/' . $operations . '/img/' . $filename; } } return $url; } private function replaceScheme($filename, $getScheme) { $result = preg_replace("|^https?|", $getScheme, $filename); return $result; } private function updateImageUri($filename, $options) { $dimension = ''; if (isset($options['width']) && isset($options['height'])) { $dimension = $options['width'] . 'x' . $options['height']; } else if (isset($options['width']) && (false === isset($options['height']))) { $dimension = $options['width'] . 'x' . $options['width']; } else if (isset($options['height']) && (false === isset($options['width']))) { $dimension = $options['height'] . 'x' . $options['height']; } $uri = preg_replace("/\d\d\dx\d\d\d/", $dimension, $filename); return $uri; } } \ No newline at end of file diff --git a/application/modules/default/views/scripts/product/add.phtml b/application/modules/default/views/scripts/product/add.phtml index 3a0bff40a..557099a1d 100644 --- a/application/modules/default/views/scripts/product/add.phtml +++ b/application/modules/default/views/scripts/product/add.phtml @@ -1,2186 +1,2186 @@ . **/ //$this->os = Zend_Registry::get('application_os'); $this->tab = 'add'; $helperImage = new Default_View_Helper_Image(); $helpMemberUrl = new Default_View_Helper_BuildMemberUrl(); $helpProductUrl = new Default_View_Helper_BuildProductUrl(); $helpBaseUrl = new Default_View_Helper_BuildBaseUrl(); $modelCategory = new Default_Model_DbTable_ProjectCategory(); $valueCatId = $this->form->project_category_id->getValue(); //$valueCatId = 55; $storeCatIds = Zend_Registry::isRegistered('store_category_list') ? Zend_Registry::get('store_category_list') : null; $categoryAncestors = $modelCategory->fetchAncestorsAsId($valueCatId); $categories = $modelCategory->fetchCategoriesForFormNew($valueCatId); $categoriesFallback = $modelCategory->fetchCategoriesForForm($valueCatId); //$categories2 = array(); if (count($categoryAncestors) > 0) { $categoryPath = explode(',',$categoryAncestors['ancestors']); } $categoryPath[] = $valueCatId; $this->headLink()->appendStylesheet('/theme/flatui/css/chosen.css'); $this->inlineScript()->appendFile('/theme/flatui/js/lib/chosen.jquery.min.js'); $this->inlineScript()->appendScript(' $(document).ready(function(){ $("select.chosen").chosen({ width: "100%", max_selected_options: "5", disable_search: "false", disable_search_threshold: "5" }); }); '); ?>
render('user/partials/userHeader_top.phtml'); ?>
render('user/partials/userHeader.phtml'); ?> render('product/partials/header.phtml'); ?>
form->project_id ?>

Basics

(*) Mandatory fields.

form->title ?>
*
value="escape($this->form->title->getValue()) ?>" title="Please use only letters." maxlength="60" aria-required="true" aria-invalid="false" data-rule-minlength="4" data-rule-maxlength="60" data-msg-minlength="At least 4 chars" data-msg-maxlength="At most 60 chars"> form->title->getMessages()) { $errorHtml = ''; foreach ($this->form->title->getMessages() as $currentError) { $errorHtml .= ''; } ?>
form->project_category_id ?> form->project_subcategory_id ?> form->project_sub_subcategory_id ?> form->description ?> form->version ?> form->source_url ?>
form->is_original ?> Check this box, if this is your own original work and not based on something else
form->license_tag_id ?> project_id) { $tagmodel = new Default_Model_Tags(); $tagscat = $tagmodel->getTagsCategory($this->project_id, Default_Model_Tags::TAG_TYPE_PROJECT); if(strlen($tagscat)>0) { ?>
form->tagsuser ?> form->image_small ?> form->image_small_upload ?> form->image_big ?> form->image_big_upload ?> form->gallery ?> form->embed_code ?> form->link_1 ?> form->facebook_code ?> form->twitter_code ?>

Git

form->gitlab_project_id->getMultiOptions())) { ?>
form->is_gitlab_project ?> Check this box, if this a public project on opencode.net
product) || (!empty($this->product) && $this->product->is_gitlab_project == 0)) { $this->form->gitlab_project_id->setAttrib('disabled', 'disabled'); } ?> form->gitlab_project_id ?>
product) || (!empty($this->product) && $this->product->is_gitlab_project == 0)) { $this->form->show_gitlab_project_issues->setAttrib('disabled', 'disabled'); } ?> form->show_gitlab_project_issues ?> Check this box, if you want to show the issue list
product) || (!empty($this->product) && $this->product->is_gitlab_project == 0)) { $this->form->use_gitlab_project_readme->setAttrib('disabled', 'disabled'); } ?> form->use_gitlab_project_readme ?> Check this box, if you want to show the README.md as project description
You can create a project on opencode.net and link it with this project.

Files

project_id)) { ?>

Changelog

inlineScript()->appendScript( ' $(document).ready(function(){ ImagePreview.setup(); ProductForm.setup(); ProductGallery.setup(); Opendownloadfile.setup(); }); '); diff --git a/httpdocs/theme/react/assets/css/metaheader.css b/httpdocs/theme/react/assets/css/metaheader.css index 69c74fc19..ba9a702a5 100644 --- a/httpdocs/theme/react/assets/css/metaheader.css +++ b/httpdocs/theme/react/assets/css/metaheader.css @@ -1 +1 @@ -#metaheader{float:left;width:100%;height:34px;font-family:"Helvetica","Arial",sans-serif !important;font-size:14px !important;position:absolute;top:0;left:0;z-index:1001;background-color:white}#metaheader .metamenu{display:block !important}#metaheader *{outline:none !important;box-sizing:border-box}#metaheader a{cursor:pointer;text-decoration:none !important}#metaheader button{cursor:pointer}#metaheader .dropdown-menu{position:absolute;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-color:white}#metaheader .dropdown-menu.dropdown-menu-right{right:0;left:auto}#metaheader .dropdown-menu li{padding:0}#metaheader .dropdown-menu li>a:hover,#metaheader .dropdown-menu .active>a,#metaheader .dropdown-menu .active>a:hover{color:#222;text-decoration:none;background-color:#eee}#metaheader .metamenu{height:34px}#metaheader #metaheader-nav{width:100%;float:left;height:34px}#metaheader #metaheader-nav .btn-metaheader{display:block !important;padding:0 12px !important;border-radius:2px !important;color:white !important;font-size:13px !important;height:26px !important;line-height:25px !important;font-weight:bold;border:1px solid #3079ed;background:-webkit-linear-gradient(top, #4387fd, #4683ea);margin-top:-2px;margin-right:5px}#metaheader #metaheader-nav #user-menu-container{float:right;height:34px}#metaheader #metaheader-nav ul.metaheader-menu{padding:0;margin:0;list-style-type:none}#metaheader #metaheader-nav ul.metaheader-menu>li{float:left;padding:5px}#metaheader #metaheader-nav ul.metaheader-menu>li#chat-link-item .riotIcon{width:20px;height:20px;vertical-align:middle}#metaheader #metaheader-nav ul.metaheader-menu>li .switch{position:relative;display:inline-block;width:45px;height:22px}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input{opacity:0;width:0;height:0}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider:before{position:absolute;content:"";height:18px;width:18px;left:0;bottom:2px;background-color:white;-webkit-transition:.4s;transition:.4s}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input:checked+.slider{background-color:#2196F3}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input:focus+.slider{box-shadow:0 0 1px #2196F3}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider.round{border-radius:34px}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider.round:before{border-radius:50%}#metaheader #metaheader-nav ul.metaheader-menu>li>a{padding:5px;color:#6a7686;border-radius:5px;height:24px;line-height:24px;cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu>li>a:active,#metaheader #metaheader-nav ul.metaheader-menu>li>a:hover{background-color:#eee;text-decoration:none}#metaheader #metaheader-nav ul.metaheader-menu>li.active>a{background-color:#eee}#metaheader #metaheader-nav ul.metaheader-menu>li.active>a img{margin-right:5px}#metaheader #metaheader-nav ul.metaheader-menu>li .dropdown-menu::before{content:"";position:absolute;right:356px;top:-8px;width:0;height:0;border-style:solid;border-width:0 8.5px 8.5px;border-color:transparent transparent #b7bcc4 transparent;border-bottom-color:#fff;border-style:dashed dashed solid;z-index:1}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu{margin-left:10px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li{padding-left:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li>a{margin:0 10px 0 5px;cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li>a#opendesktop-logo{position:relative;padding-left:25px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li>a#opendesktop-logo img{position:absolute;top:5px;left:5px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li::after{content:"•";color:#E2E2E2}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li:last-of-type::after{content:""}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li.dropdown>ul.dropdown-menu{margin-left:0;margin-top:-9px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu{position:relative;cursor:pointer;z-index:1000}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu.open .dropdown-menu{display:block}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu{width:600px;max-width:600px;top:45px;right:-473px;min-height:296px;bottom:auto}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu::before{right:556px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container{width:33.333%;float:left;height:auto}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container a.groupname{cursor:default;height:24px;line-height:24px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container a.groupname:hover{background-color:white !important}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul{list-style-type:none;padding:0;margin:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li a{padding:3px 20px;font-size:12px;color:#6a7686;cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul{margin-bottom:10px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li{height:24px;line-height:24px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li a{padding:0 30px;display:block;width:100%;height:24px;line-height:24px;color:#6a7686}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li:hover{background-color:#eee}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu{position:relative;cursor:pointer;z-index:1000}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards.open .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu.open .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu.open .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu.open .dropdown-menu{display:block}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu{width:200px;top:45px;right:auto;min-height:104px;bottom:auto !important}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu::before{right:156px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li{padding:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li a,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li a,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li a,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li a{margin:0;font-size:13px;height:24px;line-height:24px;padding:0 20px;border-radius:0;display:block;color:#6a7686}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li a.cd-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li a.cd-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li a.cd-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li a.cd-menu-link-item{font-weight:bold}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li>ul,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li>ul,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li>ul,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li>ul{position:relative;float:left;top:0;left:0;padding:5px;padding-top:0;border:0;height:auto;min-height:auto;width:100%;box-shadow:none;margin:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li>ul::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li>ul::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li>ul::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li>ul::before{display:none}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu>a{cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu{left:-6px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu{right:auto;min-height:61px;height:auto}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu{right:auto;height:auto}#metaheader #metaheader-nav ul.metaheader-menu#user-menu{margin-right:10px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#user-login-container{padding:5px;margin-top:1px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#user-register-container{padding:5px;margin-top:1px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#user-register-container a{font-size:11pt}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu{position:relative;cursor:pointer;z-index:1000}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu a.about-menu-link-item .th-icon{height:18px;width:18px;display:block;background-image:url(../img/down-arrow.svg);background-size:15px;background-position:bottom right;cursor:pointer;background-repeat:no-repeat;float:right}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu.open .dropdown-menu{display:block}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu{width:200px;top:45px;right:-125px;min-height:104px;bottom:auto !important}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu::before{right:156px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li{padding:0}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li a{margin:0;font-size:13px;height:24px;line-height:24px;padding:0 20px;border-radius:0;display:block;color:#6a7686}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li>ul{position:relative;float:left;top:0;left:0;padding:5px;padding-top:0;border:0;height:auto;min-height:auto;width:100%;box-shadow:none;margin:0}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li>ul::before{display:none}#metaheader #metaheader-nav .user-dropdown{position:relative;height:auto;z-index:1000}#metaheader #metaheader-nav .user-dropdown.open .dropdown-menu,#metaheader #metaheader-nav .user-dropdown.show .dropdown-menu{display:block;right:-6px}#metaheader #metaheader-nav .user-dropdown.open #background-overlay,#metaheader #metaheader-nav .user-dropdown.show #background-overlay{position:fixed;top:34px;left:0;width:100%;height:100%;background-color:rgba(0,0,0,0.25)}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle{padding:0;background:none !important;background-color:white;color:#6a7686;border:0;margin:0;min-height:auto}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle:active{background-color:white;box-shadow:none;outline:none}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle .glyphicon{font-size:16px;top:1px;font-style:normal;font-weight:100;margin:0 5px;margin-top:2px}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle#userLoginDropdown{width:26px;height:25px;position:relative}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle#userLoginDropdown img{position:absolute;top:0;left:0}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle#userLoginDropdown span.badge-notification{display:inline-block;font-weight:normal;white-space:nowrap;border-radius:10px;padding:2px 4px;min-width:8px;vertical-align:middle;color:#fff;font-size:.7579em;line-height:1;text-align:center;background-color:#bdbdbd;position:absolute;z-index:1;min-width:6px;top:-3px;left:-5px;background:#090}#metaheader #metaheader-nav .user-dropdown .dropdown-menu{border-radius:0;padding:0;width:320px;top:40px;bottom:auto !important;background:#fff;border:1px solid #ccc;border-color:rgba(0,0,0,0.2);color:#000;box-shadow:0 2px 10px rgba(0,0,0,0.2);box-sizing:border-box !important}#metaheader #metaheader-nav .user-dropdown .dropdown-menu::before{content:"";position:absolute;right:6px;top:-8px;width:0;height:0;border-style:solid;border-width:0 8.5px 8.5px;border-color:transparent transparent #b7bcc4 transparent;border-bottom-color:#fff;border-style:dashed dashed solid;z-index:1}#metaheader #metaheader-nav .user-dropdown .dropdown-menu li{float:left;box-sizing:border-box !important}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel{height:100%;position:fixed;top:35px;right:0;padding:0;border:0;box-shadow:none;width:432px;border-left:1px solid #ccc;margin:0;padding-top:150px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel::before{display:none}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item{position:absolute;top:0;left:0;height:150px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-info-section .user-details{width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-info-section .user-details .buttons{padding-left:0;padding-right:0;background:white}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-details-username h2{margin:10px 0;font-size:26px;color:#353a3d;font-weight:bold}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-details-email{color:#687a86;font-size:18px;margin-bottom:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item{height:100%;background-color:white;padding:10px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item .autosuggest{flex:1;display:flex;flex-direction:row}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container{position:relative;padding-top:40px;height:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu{height:40px;width:100%;position:absolute;top:0;left:0;border-bottom:2px solid #ccc}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul{padding:0;list-style-type:none;height:40px;display:table;margin:0 auto}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li{float:left;height:20px;width:auto;line-height:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a{display:block;padding:10px 10px;height:40px;border-bottom:2px solid transparent}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a.active,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a:hover{color:#2e9fff;border-bottom-color:#2e9fff}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a input[type="text"]{height:24px;border-radius:5px;border:1px solid #ccc;padding:0 5px;margin:7px 0;color:#888;background-image:url('http://i.stack.imgur.com/MFpLm.png');background-repeat:no-repeat;background-position:0 -30px;border:1px solid #a9e2ff;padding:3px;width:200px;font-size:1em;padding-left:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a span.search-button{height:23px;width:23px;display:block;float:right;background-image:url('../img/bg_sheet.png');background-position:-670px -149px;margin:6px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container{position:relative}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container ul{position:absolute;background:white;padding:5px;border:1px solid #ccc;border-radius:0 0 5px 5px;top:32px;left:140px;width:159px;z-index:10}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container ul li{float:left;width:100%;cursor:pointer}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container ul li:hover{background-color:#ccc}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content{height:100%;padding:10px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container{max-height:600px;overflow:auto}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo{color:#687a86;padding:10px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo .header{font-size:16px;border-bottom:1px solid #F1F1F1}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo .statistic .statisticRow{display:block}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo .statistic .statisticRow span.statisticRow{font-weight:bold}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container{width:100%;float:left;padding:10px;padding-bottom:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header{float:left;width:100%;border-bottom:1px solid #f1f1f1}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle{float:left;width:100%;font-size:14px;margin:5px 0}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p{float:left;color:#687a86;margin:0}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p+p{margin-left:5px;padding-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p+p::before{content:"•";color:#e2e2e2}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p+p span{margin-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-title{float:left;width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-title h2{float:left;margin:0 0 10px 0;font-size:16px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments{float:left;width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .thread-title{float:left;width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .thread-title h2{float:left;margin:0 0 10px 0;font-size:18px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item{position:relative;height:auto;padding-left:40px;float:left;width:100%;margin-bottom:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item figure{position:absolute;top:0;left:0;width:32px;height:32px;margin:0}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item figure img{width:32px;height:32px;border-radius:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header{margin-bottom:5px;width:100%;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p{margin-bottom:0;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.user span,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.replied-user span{margin-right:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.user a,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.replied-user a{color:#2e9fff}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.user:hover a,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.replied-user:hover a{color:#2e87e7}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.date-created{margin-left:5px;padding-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.date-created::before{content:"•";color:#e2e2e2}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.date-created span{margin-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p+p{margin-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-content{width:100%;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-votes-container{width:100%;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-votes-container>div{float:left;width:auto;margin-right:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container+.user-comments-thread-container{border-bottom:3px solid #ccc}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .th-icon{height:24px;width:24px;display:block;background-image:url(../img/search.svg);background-size:20px;background-position:center 3px;cursor:pointer;background-repeat:no-repeat}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-toggle img{height:26px;width:26px;border-radius:100%;margin-top:-1px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu::before{right:9px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-menu-item{width:100%;border-bottom:1px solid #ccc}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section{height:auto;padding:20px;background:white;float:left;padding-left:116px;position:relative;width:100%;min-height:136px;box-sizing:border-box}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar{height:96px;width:96px;float:left;border-radius:100%;overflow:hidden;position:absolute;top:20px;left:20px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter{border-radius:100%;height:100%;width:100%;background-color:#c1c1c1;text-align:center;line-height:80px;font-size:50px;color:white;overflow:hidden;position:relative}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter img{height:96px;width:96px;position:absolute;top:0;left:0}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter .change-profile-pic{width:100%;position:absolute;bottom:0;font-size:9px;height:26px;left:0;background-color:rgba(0,0,0,0.4);line-height:30px;color:white;cursor:pointer;font-weight:bold}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details{width:175px;padding-left:20px;float:left;margin-top:-4px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul{padding:0;margin:0;list-style-type:none;float:left;width:100%}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li{width:100%;float:left;height:auto;line-height:15px;font-size:13px;min-height:8px;color:#6a7686}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li a{color:#36c}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li b{color:black}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li button{margin-top:16px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu#right-panel{padding-top:10px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons{padding:10px 20px;background-color:#f5f5f5;width:100%}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn{width:auto;display:block;border-radius:2px;padding:6px 16px !important;font-size:12px;height:30px;font-weight:normal;color:#666 !important;background:#f8f8f8;border:1px solid #c6c6c6;float:left;clear:none;line-height:12px !important}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn.pull-right{float:right}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-color:#c6c6c6;color:#222;background-color:#fff;background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));background-image:-webkit-linear-gradient(top, #fff, #f8f8f8);background-image:linear-gradient(top, #fff, #f8f8f8)}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn span{display:block;float:left;height:12px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .th-icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .th-icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .th-icon{height:24px;width:24px;display:block;background-image:url(../img/glyphicons-th.svg);background-size:32px;background-position:center -5px;cursor:pointer}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu{padding:23px 28px;right:-42px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu::before,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu::before,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu::before{right:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li{height:auto;width:86px;border:1px solid white;margin:5px 0 10px 0}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a{display:block;width:100%;padding:0;height:auto;float:left}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a:hover,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a:hover,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a:hover{background-color:white !important}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a .icon{width:55px;height:55px;margin:5px auto;background-size:50px;background-position:center center;background-repeat:no-repeat;width:100%}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a span,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a span,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a span{float:left;width:100%;text-align:center;display:block;color:rgba(0,0,0,0.87);font-size:13px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a:active,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a:active,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a:active{background-color:white}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li.clear-left,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li.clear-left,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li.clear-left{clear:left}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#issues-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#issues-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#issues-link-item a .icon{background-image:url(../img/issues.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#music-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#music-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#music-link-item a .icon{background-image:url(../img/logo-music.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#docs-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#docs-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#docs-link-item a .icon{background-image:url(../img/logo-docs.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#storage-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#storage-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#storage-link-item a .icon{background-image:url(../img/logo-storage.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#contacts-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#contacts-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#contacts-link-item a .icon{background-image:url(../img/logo-contacts.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#calendar-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#calendar-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#calendar-link-item a .icon{background-image:url(../img/logo-calendar.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#talk-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#talk-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#talk-link-item a .icon{background-image:url(../img/logo-talk.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#chat-link-item,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#chat-link-item,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#chat-link-item{display:block;clear:both}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#chat-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#chat-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#chat-link-item a .icon{background-image:url(../img/logo-riot.svg);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:hover,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li:hover,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li:hover{border:1px solid #e5e5e5}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:hover a,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li:hover a,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li:hover a{background-color:white}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:active a,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li:active a,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li:active a{background-color:white}#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .th-icon{height:24px;width:24px;display:block;background-image:url(../img/glyphicons-th.svg);background-size:32px;background-position:center -5px;cursor:pointer}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-toggle img{height:26px;width:26px;border-radius:100%;margin-top:-1px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu::before{right:9px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-menu-item{width:100%;border-bottom:1px solid #ccc}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu{width:100%;border-bottom:1px solid #ccc;background-color:#fff}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container{list-style:none;padding-left:20px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li{height:auto;width:86px;border:1px solid white;margin:5px 0 10px 0}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a{display:block;width:100%;padding:0;height:auto;float:left}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a:hover{background-color:white !important}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a .icon{width:55px;height:55px;margin:5px auto;background-size:50px;background-position:center center;background-repeat:no-repeat;width:100%}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a span{float:left;width:100%;text-align:center;display:block;color:rgba(0,0,0,0.87);font-size:13px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a:active{background-color:white}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li.clear-left{clear:left}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#opendesktop-link-item a .icon{background-image:url('../img/logo-opendesktop.png')}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#discourse-link-item a .icon{background-image:url('../img/logo-discourse.png');background-size:58px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#gitlab-link-item a .icon{background-image:url(../img/logo-gitlab.png)}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#opencode-link-item a .icon{background-image:url(../img/logo-opencode.png);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#addproduct-link-item a .icon{background-image:url(../img/add.svg);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#listproduct-link-item a .icon{background-image:url(../img/products.png);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#plings-link-item a .icon{background-image:url(../img/pling.png);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#messages-link-item{position:relative}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#messages-link-item a .icon{background-image:url(../img/messages.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#messages-link-item span.badge-notification{display:inline-block;font-weight:normal;white-space:nowrap;border-radius:10px;padding:2px 4px;min-width:8px;vertical-align:middle;color:#fff;font-size:.7579em;line-height:1;text-align:center;background-color:#bdbdbd;position:absolute;z-index:1;min-width:6px;width:15px;top:10px;left:15px;background:#090}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#issues-link-item a .icon{background-image:url(../img/issues.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#music-link-item a .icon{background-image:url(../img/logo-music.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#docs-link-item a .icon{background-image:url(../img/logo-docs.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#storage-link-item a .icon{background-image:url(../img/logo-storage.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#contacts-link-item a .icon{background-image:url(../img/logo-contacts.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#calendar-link-item a .icon{background-image:url(../img/logo-calendar.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#talk-link-item a .icon{background-image:url(../img/logo-talk.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#chat-link-item{display:block;clear:both}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#chat-link-item a .icon{background-image:url(../img/logo-riot.svg);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li:hover{border:1px solid #e5e5e5}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li:hover a{background-color:white}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li:active a{background-color:white}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-settings-item{width:100%;border-bottom:1px solid #ccc;padding:10px 20px;background-color:#f5f5f5}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-settings-item div.switchContainer{display:inline-block;vertical-align:middle;margin-right:5px;margin-left:5px;padding-top:5px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-settings-item span.user-settings-item-title{display:inline-block}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section{height:auto;padding:20px;background:white;float:left;padding-left:116px;position:relative;width:100%;min-height:136px;box-sizing:border-box}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar{height:96px;width:96px;float:left;border-radius:100%;overflow:hidden;position:absolute;top:20px;left:20px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter{border-radius:100%;height:100%;width:100%;background-color:#c1c1c1;text-align:center;line-height:80px;font-size:50px;color:white;overflow:hidden;position:relative}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter img{height:96px;width:96px;position:absolute;top:0;left:0}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter .change-profile-pic{width:100%;position:absolute;bottom:0;font-size:9px;height:26px;left:0;background-color:rgba(0,0,0,0.4);line-height:30px;color:white;cursor:pointer;font-weight:bold}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details{width:175px;padding-left:20px;float:left;margin-top:-4px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul{padding:0;margin:0;list-style-type:none;float:left;width:100%}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li{width:100%;float:left;height:auto;line-height:15px;font-size:13px;min-height:8px;color:#6a7686}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li a{color:#36c}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li b{color:black}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li button{margin-top:16px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons{padding:10px 20px;background-color:#f5f5f5;width:100%}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn{width:auto;display:block;border-radius:2px;padding:6px 16px !important;font-size:12px;height:30px;font-weight:normal;color:#666 !important;background:#f8f8f8;border:1px solid #c6c6c6;float:left;clear:none;line-height:12px !important}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn.pull-right{float:right}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-color:#c6c6c6;color:#222;background-color:#fff;background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));background-image:-webkit-linear-gradient(top, #fff, #f8f8f8);background-image:linear-gradient(top, #fff, #f8f8f8)}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn span{display:block;float:left;height:12px}#metaheader #metaheader-nav #development-app-menu-container .user-dropdown ul.dropdown-menu{right:-40px}#metaheader #metaheader-nav #development-app-menu-container .user-dropdown ul.dropdown-menu::before{right:42px}#metaheader #metaheader-left-mobile{float:left;height:34px;width:34px}#metaheader #metaheader-left-mobile a#menu-toggle-item{cursor:pointer;height:34px;width:40px;display:block;float:left;background-image:url(../img/hamburger-menu-icon.png);background-size:20px 16px;background-repeat:no-repeat;background-position:8px 10px;position:absolute;left:0;background-color:transparent;z-index:1000}#metaheader #metaheader-left-mobile #left-side-overlay{position:fixed;width:0;height:100%;background:rgba(0,0,0,0.5);z-index:1001;overflow:hidden}#metaheader #metaheader-left-mobile #left-side-overlay a{cursor:pointer;color:#6a7686}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel{height:100%;width:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-color:white;overflow:scroll}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #left-side-panel-thumb-block{width:100%;height:50px;position:absolute;top:0;left:0}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-header{background:#efefef;padding:20px;text-align:center;margin-bottom:10px}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-header img{margin:0 auto;clear:both;display:block}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu{width:100%}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu>ul>li>a{font-weight:bold}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul{list-style-type:none;padding:0;margin:0;width:100%;float:left}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li{width:100%;float:left}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li a{width:100%;line-height:24px;display:block;padding:0 10px;text-decoration:none;color:#6a7686;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul{display:block;position:relative;float:left;top:0;left:0;padding:5px;padding-top:0;border:0;height:auto;min-height:auto;width:100%;box-shadow:none;margin:0;padding:0 10px;margin-bottom:15px}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul::before{display:none}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul li{margin-bottom:0}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul li a{font-size:14px}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul li a:hover{background-color:#efefef}#metaheader #metaheader-left-mobile.open #left-side-overlay{width:100%}#metaheader #metaheader-left-mobile.open #left-side-overlay #left-side-panel{width:50%}#metaheader-modal{position:fixed;background:rgba(0,0,0,0.5);z-index:10000000000;height:100%;width:100%;top:0;left:0;padding:5%}#metaheader-modal #metaheader-modal-content{width:100%;height:100%;overflow:scroll;background:white;padding:10px;box-shadow:0 1px 2px rgba(0,0,0,0.25)}.react-autosuggest_status{display:block;line-height:30px;min-height:30px}.react-autosuggest__container{position:relative}.react-autosuggest__input{width:280px;height:30px;padding:10px 25px !important;font-family:Helvetica,sans-serif;font-weight:300;font-size:16px;border:1px solid #aaa;border-radius:4px}.react-autosuggest__input--focused{outline:none}.react-autosuggest__input--open{border-bottom-left-radius:0;border-bottom-right-radius:0}.react-autosuggest__suggestions-container{display:none}.react-autosuggest__suggestions-container--open{display:block;position:absolute;top:29px;width:280px;border:1px solid #aaa;background-color:#fff;font-family:Helvetica,sans-serif;font-weight:300;font-size:16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;z-index:2}.react-autosuggest__suggestions-container--open li{display:block !important}.react-autosuggest__suggestions-list{margin:0;padding:0;list-style-type:none}.react-autosuggest__suggestion{cursor:pointer;padding:10px 20px}.react-autosuggest__suggestion--highlighted{background-color:#ddd}.react-autosuggest__inputContainer{position:relative}.react-autosuggest__inputContainer .react-autosuggest__icon{position:absolute;top:4px;left:0;width:24px;height:24px}#metaheader #metaheader-nav .metamenu-theme-dark{background-color:#3D3D3E}#metaheader #metaheader-nav .metamenu-theme-dark ul.metaheader-menu>li>a{color:#E7F3F8}#metaheader #metaheader-nav .metamenu-theme-dark ul.metaheader-menu>li>a:hover{color:#24292E}#metaheader #metaheader-nav .metamenu-theme-dark ul.metaheader-menu>li.active>a{background-color:#2185D0;color:#E7F3F8}#metaheader #metaheader-nav .metamenu-theme-dark #user-context-menu-container .user-dropdown .th-icon{background-image:url(../img/glyphicons-th-light.svg)}#metaheader #metaheader-nav .metamenu-theme-dark #development-app-menu-container .user-dropdown .th-icon{background-image:url(../img/glyphicons-th-light.svg)}#metaheader #metaheader-nav .metamenu-theme-dark #user-search-menu-container .user-dropdown .th-icon{background-image:url(../img/search-light.svg)} \ No newline at end of file +#metaheader{float:left;width:100%;height:34px;font-family:"Helvetica","Arial",sans-serif !important;font-size:14px !important;position:absolute;top:0;left:0;z-index:1001;background-color:white}#metaheader .metamenu{display:block !important}#metaheader *{outline:none !important;box-sizing:border-box}#metaheader a{cursor:pointer;text-decoration:none !important}#metaheader button{cursor:pointer}#metaheader .dropdown-menu{position:absolute;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-color:white}#metaheader .dropdown-menu.dropdown-menu-right{right:0;left:auto}#metaheader .dropdown-menu li{padding:0}#metaheader .dropdown-menu li>a:hover,#metaheader .dropdown-menu .active>a,#metaheader .dropdown-menu .active>a:hover{color:#222;text-decoration:none;background-color:#eee}#metaheader .metamenu{height:34px}#metaheader #metaheader-nav{width:100%;float:left;height:34px}#metaheader #metaheader-nav .btn-metaheader{display:block !important;padding:0 12px !important;border-radius:2px !important;color:white !important;font-size:13px !important;height:26px !important;line-height:25px !important;font-weight:bold;border:1px solid #3079ed;background:-webkit-linear-gradient(top, #4387fd, #4683ea);margin-top:-2px;margin-right:5px}#metaheader #metaheader-nav #user-menu-container{float:right;height:34px}#metaheader #metaheader-nav ul.metaheader-menu{padding:0;margin:0;list-style-type:none}#metaheader #metaheader-nav ul.metaheader-menu>li{float:left;padding:5px}#metaheader #metaheader-nav ul.metaheader-menu>li#chat-link-item .riotIcon{width:20px;height:20px;vertical-align:middle}#metaheader #metaheader-nav ul.metaheader-menu>li .switch{position:relative;display:inline-block;width:45px;height:22px}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input{opacity:0;width:0;height:0}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider:before{position:absolute;content:"";height:18px;width:18px;left:0;bottom:2px;background-color:white;-webkit-transition:.4s;transition:.4s}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input:checked+.slider{background-color:#2196F3}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input:focus+.slider{box-shadow:0 0 1px #2196F3}#metaheader #metaheader-nav ul.metaheader-menu>li .switch input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider.round{border-radius:34px}#metaheader #metaheader-nav ul.metaheader-menu>li .switch .slider.round:before{border-radius:50%}#metaheader #metaheader-nav ul.metaheader-menu>li>a{padding:5px;color:#6a7686;border-radius:5px;height:24px;line-height:24px;cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu>li>a:active,#metaheader #metaheader-nav ul.metaheader-menu>li>a:hover{background-color:#eee;text-decoration:none}#metaheader #metaheader-nav ul.metaheader-menu>li.active>a{background-color:#eee}#metaheader #metaheader-nav ul.metaheader-menu>li.active>a img{margin-right:5px}#metaheader #metaheader-nav ul.metaheader-menu>li .dropdown-menu::before{content:"";position:absolute;right:356px;top:-8px;width:0;height:0;border-style:solid;border-width:0 8.5px 8.5px;border-color:transparent transparent #b7bcc4 transparent;border-bottom-color:#fff;border-style:dashed dashed solid;z-index:1}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu{margin-left:10px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li{padding-left:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li>a{margin:0 10px 0 5px;cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li>a#opendesktop-logo{position:relative;padding-left:25px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li>a#opendesktop-logo img{position:absolute;top:5px;left:5px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li::after{content:"•";color:#E2E2E2}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li:last-of-type::after{content:""}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li.dropdown>ul.dropdown-menu{margin-left:0;margin-top:-9px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu{position:relative;cursor:pointer;z-index:1000}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu.open .dropdown-menu{display:block}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu{width:600px;max-width:600px;top:45px;right:-473px;min-height:296px;bottom:auto}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu::before{right:556px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container{width:33.333%;float:left;height:auto}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container a.groupname{cursor:default;height:24px;line-height:24px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container a.groupname:hover{background-color:white !important}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul{list-style-type:none;padding:0;margin:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li a{padding:3px 20px;font-size:12px;color:#6a7686;cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul{margin-bottom:10px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li{height:24px;line-height:24px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li a{padding:0 30px;display:block;width:100%;height:24px;line-height:24px;color:#6a7686}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li:hover{background-color:#eee}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu{position:relative;cursor:pointer;z-index:1000}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards.open .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu.open .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu.open .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu.open .dropdown-menu{display:block}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu{width:200px;top:45px;right:auto;min-height:104px;bottom:auto !important}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu::before{right:156px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li{padding:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li a,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li a,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li a,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li a{margin:0;font-size:13px;height:24px;line-height:24px;padding:0 20px;border-radius:0;display:block;color:#6a7686}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li a.admins-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li a.cd-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li a.cd-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li a.cd-menu-link-item,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li a.cd-menu-link-item{font-weight:bold}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li>ul,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li>ul,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li>ul,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li>ul{position:relative;float:left;top:0;left:0;padding:5px;padding-top:0;border:0;height:auto;min-height:auto;width:100%;box-shadow:none;margin:0}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu li>ul::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu li>ul::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu li>ul::before,#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu li>ul::before{display:none}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu>a{cursor:pointer}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#more-dropdown-menu .dropdown-menu{left:-6px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#admins-dropdown-menu .dropdown-menu{right:auto;min-height:61px;height:auto}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#cd-dropdown-menu .dropdown-menu{right:auto;height:auto}#metaheader #metaheader-nav ul.metaheader-menu#user-menu{margin-right:10px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#user-login-container{padding:5px;margin-top:1px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#user-register-container{padding:5px;margin-top:1px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#user-register-container a{font-size:11pt}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu{position:relative;cursor:pointer;z-index:1000}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu a.about-menu-link-item .th-icon{height:18px;width:18px;display:block;background-image:url(../img/down-arrow.svg);background-size:15px;background-position:bottom right;cursor:pointer;background-repeat:no-repeat;float:right}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu.open .dropdown-menu{display:block}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu{width:200px;top:45px;right:-125px;min-height:104px;bottom:auto !important}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu::before{right:156px}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li{padding:0}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li a{margin:0;font-size:13px;height:24px;line-height:24px;padding:0 20px;border-radius:0;display:block;color:#6a7686}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li>ul{position:relative;float:left;top:0;left:0;padding:5px;padding-top:0;border:0;height:auto;min-height:auto;width:100%;box-shadow:none;margin:0}#metaheader #metaheader-nav ul.metaheader-menu#user-menu>li#about-dropdown-menu .dropdown-menu li>ul::before{display:none}#metaheader #metaheader-nav .user-dropdown{position:relative;height:auto;z-index:1000}#metaheader #metaheader-nav .user-dropdown.open .dropdown-menu,#metaheader #metaheader-nav .user-dropdown.show .dropdown-menu{display:block;right:-6px}#metaheader #metaheader-nav .user-dropdown.open #background-overlay,#metaheader #metaheader-nav .user-dropdown.show #background-overlay{position:fixed;top:34px;left:0;width:100%;height:100%;background-color:rgba(0,0,0,0.25)}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle{padding:0;background:none !important;background-color:white;color:#6a7686;border:0;margin:0;min-height:auto}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle:active{background-color:white;box-shadow:none;outline:none}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle .glyphicon{font-size:16px;top:1px;font-style:normal;font-weight:100;margin:0 5px;margin-top:2px}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle#userLoginDropdown{width:26px;height:25px;position:relative}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle#userLoginDropdown img{position:absolute;top:0;left:0}#metaheader #metaheader-nav .user-dropdown .dropdown-toggle#userLoginDropdown span.badge-notification{display:inline-block;font-weight:normal;white-space:nowrap;border-radius:10px;padding:2px 4px;min-width:8px;vertical-align:middle;color:#fff;font-size:.7579em;line-height:1;text-align:center;background-color:#bdbdbd;position:absolute;z-index:1;min-width:6px;top:-3px;left:-5px;background:#090}#metaheader #metaheader-nav .user-dropdown .dropdown-menu{border-radius:0;padding:0;width:320px;top:40px;bottom:auto !important;background:#fff;border:1px solid #ccc;border-color:rgba(0,0,0,0.2);color:#000;box-shadow:0 2px 10px rgba(0,0,0,0.2);box-sizing:border-box !important}#metaheader #metaheader-nav .user-dropdown .dropdown-menu::before{content:"";position:absolute;right:6px;top:-8px;width:0;height:0;border-style:solid;border-width:0 8.5px 8.5px;border-color:transparent transparent #b7bcc4 transparent;border-bottom-color:#fff;border-style:dashed dashed solid;z-index:1}#metaheader #metaheader-nav .user-dropdown .dropdown-menu li{float:left;box-sizing:border-box !important}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel{height:100%;position:fixed;top:35px;right:0;padding:0;border:0;box-shadow:none;width:432px;border-left:1px solid #ccc;margin:0;padding-top:150px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel::before{display:none}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item{position:absolute;top:0;left:0;height:150px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-info-section .user-details{width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-info-section .user-details .buttons{padding-left:0;padding-right:0;background:white}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-details-username h2{margin:10px 0;font-size:26px;color:#353a3d;font-weight:bold}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-info-menu-item #user-details-email{color:#687a86;font-size:18px;margin-bottom:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item{height:100%;background-color:white;padding:10px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item .autosuggest{flex:1;display:flex;flex-direction:row}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container{position:relative;padding-top:40px;height:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu{height:40px;width:100%;position:absolute;top:0;left:0;border-bottom:2px solid #ccc}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul{padding:0;list-style-type:none;height:40px;display:table;margin:0 auto}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li{float:left;height:20px;width:auto;line-height:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a{display:block;padding:10px 10px;height:40px;border-bottom:2px solid transparent}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a.active,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a:hover{color:#2e9fff;border-bottom-color:#2e9fff}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a input[type="text"]{height:24px;border-radius:5px;border:1px solid #ccc;padding:0 5px;margin:7px 0;color:#888;background-image:url('http://i.stack.imgur.com/MFpLm.png');background-repeat:no-repeat;background-position:0 -30px;border:1px solid #a9e2ff;padding:3px;width:200px;font-size:1em;padding-left:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li a span.search-button{height:23px;width:23px;display:block;float:right;background-image:url('../img/bg_sheet.png');background-position:-670px -149px;margin:6px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container{position:relative}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container ul{position:absolute;background:white;padding:5px;border:1px solid #ccc;border-radius:0 0 5px 5px;top:32px;left:140px;width:159px;z-index:10}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container ul li{float:left;width:100%;cursor:pointer}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-menu ul li#search-form-container ul li:hover{background-color:#ccc}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content{height:100%;padding:10px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container{max-height:600px;overflow:auto}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo{color:#687a86;padding:10px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo .header{font-size:16px;border-bottom:1px solid #F1F1F1}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo .statistic .statisticRow{display:block}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .userinfo .statistic .statisticRow span.statisticRow{font-weight:bold}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container{width:100%;float:left;padding:10px;padding-bottom:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header{float:left;width:100%;border-bottom:1px solid #f1f1f1}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle{float:left;width:100%;font-size:14px;margin:5px 0}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p{float:left;color:#687a86;margin:0}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p+p{margin-left:5px;padding-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p+p::before{content:"•";color:#e2e2e2}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-subtitle p+p span{margin-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-title{float:left;width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-header .thread-title h2{float:left;margin:0 0 10px 0;font-size:16px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments{float:left;width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .thread-title{float:left;width:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .thread-title h2{float:left;margin:0 0 10px 0;font-size:18px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item{position:relative;height:auto;padding-left:40px;float:left;width:100%;margin-bottom:20px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item figure{position:absolute;top:0;left:0;width:32px;height:32px;margin:0}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item figure img{width:32px;height:32px;border-radius:100%}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header{margin-bottom:5px;width:100%;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p{margin-bottom:0;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.user span,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.replied-user span{margin-right:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.user a,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.replied-user a{color:#2e9fff}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.user:hover a,#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.replied-user:hover a{color:#2e87e7}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.date-created{margin-left:5px;padding-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.date-created::before{content:"•";color:#e2e2e2}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p.date-created span{margin-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-header p+p{margin-left:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-content{width:100%;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-votes-container{width:100%;float:left}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container .thread-comments .comment-item .comment-item-votes-container>div{float:left;width:auto;margin-right:5px}#metaheader #metaheader-nav .user-dropdown .dropdown-menu#right-panel #user-tabs-menu-item #user-tabs-container #user-tabs-content .user-comments-tab-container .user-comments-thread-container+.user-comments-thread-container{border-bottom:3px solid #ccc}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .th-icon{height:24px;width:24px;display:block;background-image:url(../img/search.svg);background-size:20px;background-position:center 3px;cursor:pointer;background-repeat:no-repeat}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-toggle img{height:26px;width:26px;border-radius:100%;margin-top:-1px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu::before{right:9px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-menu-item{width:100%;border-bottom:1px solid #ccc}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section{height:auto;padding:20px;background:white;float:left;padding-left:116px;position:relative;width:100%;min-height:136px;box-sizing:border-box}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar{height:96px;width:96px;float:left;border-radius:100%;overflow:hidden;position:absolute;top:20px;left:20px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter{border-radius:100%;height:100%;width:100%;background-color:#c1c1c1;text-align:center;line-height:80px;font-size:50px;color:white;overflow:hidden;position:relative}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter img{height:96px;width:96px;position:absolute;top:0;left:0}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter .change-profile-pic{width:100%;position:absolute;bottom:0;font-size:9px;height:26px;left:0;background-color:rgba(0,0,0,0.4);line-height:30px;color:white;cursor:pointer;font-weight:bold}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details{width:175px;padding-left:20px;float:left;margin-top:-4px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul{padding:0;margin:0;list-style-type:none;float:left;width:100%}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li{width:100%;float:left;height:auto;line-height:15px;font-size:13px;min-height:8px;color:#6a7686}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li a{color:#36c}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li b{color:black}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li button{margin-top:16px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu#right-panel{padding-top:10px}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons{padding:10px 20px;background-color:#f5f5f5;width:100%}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn{width:auto;display:block;border-radius:2px;padding:6px 16px !important;font-size:12px;height:30px;font-weight:normal;color:#666 !important;background:#f8f8f8;border:1px solid #c6c6c6;float:left;clear:none;line-height:12px !important}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn.pull-right{float:right}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-color:#c6c6c6;color:#222;background-color:#fff;background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));background-image:-webkit-linear-gradient(top, #fff, #f8f8f8);background-image:linear-gradient(top, #fff, #f8f8f8)}#metaheader #metaheader-nav #user-search-menu-container .user-dropdown .dropdown-menu li.buttons .btn span{display:block;float:left;height:12px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .th-icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .th-icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .th-icon{height:24px;width:24px;display:block;background-image:url(../img/glyphicons-th.svg);background-size:32px;background-position:center -5px;cursor:pointer}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu{padding:23px 28px;right:-42px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu::before,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu::before,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu::before{right:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li{height:auto;width:86px;border:1px solid white;margin:5px 0 10px 0}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a{display:block;width:100%;padding:0;height:auto;float:left}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a:hover,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a:hover,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a:hover{background-color:white !important}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a .icon{width:55px;height:55px;margin:5px auto;background-size:50px;background-position:center center;background-repeat:no-repeat;width:100%}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a span,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a span,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a span{float:left;width:100%;text-align:center;display:block;color:rgba(0,0,0,0.87);font-size:13px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a:active,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li a:active,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li a:active{background-color:white}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li.clear-left,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li.clear-left,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li.clear-left{clear:left}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#opendesktop-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#opendesktop-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#opendesktop-link-item a .icon{background-image:url('../img/logo-opendesktop.png')}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#discourse-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#discourse-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#discourse-link-item a .icon{background-image:url('../img/logo-discourse.png');background-size:58px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#gitlab-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#gitlab-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#gitlab-link-item a .icon{background-image:url(../img/logo-gitlab.png)}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#opencode-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#opencode-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#opencode-link-item a .icon{background-image:url(../img/logo-opencode.png);background-size:40px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#addproduct-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#addproduct-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#addproduct-link-item a .icon{background-image:url(../img/add.svg);background-size:40px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#listproduct-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#listproduct-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#listproduct-link-item a .icon{background-image:url(../img/products.png);background-size:40px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#plings-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#plings-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#plings-link-item a .icon{background-image:url(../img/pling.png);background-size:40px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#messages-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#messages-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#messages-link-item a .icon{background-image:url(../img/messages.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#messages-link-item span.badge-notification,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#messages-link-item span.badge-notification,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#messages-link-item span.badge-notification{display:inline-block;font-weight:normal;white-space:nowrap;border-radius:10px;padding:2px 4px;min-width:8px;vertical-align:middle;color:#fff;font-size:.7579em;line-height:1;text-align:center;background-color:#bdbdbd;position:absolute;z-index:1;min-width:6px;top:-3px;left:-5px;background:#090}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#issues-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#issues-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#issues-link-item a .icon{background-image:url(../img/issues.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#music-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#music-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#music-link-item a .icon{background-image:url(../img/logo-music.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#docs-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#docs-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#docs-link-item a .icon{background-image:url(../img/logo-docs.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#storage-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#storage-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#storage-link-item a .icon{background-image:url(../img/logo-storage.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#contacts-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#contacts-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#contacts-link-item a .icon{background-image:url(../img/logo-contacts.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#calendar-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#calendar-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#calendar-link-item a .icon{background-image:url(../img/logo-calendar.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#talk-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#talk-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#talk-link-item a .icon{background-image:url(../img/logo-talk.png);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#chat-link-item,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#chat-link-item,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#chat-link-item{display:block;clear:both}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li#chat-link-item a .icon,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li#chat-link-item a .icon,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li#chat-link-item a .icon{background-image:url(../img/logo-riot.svg);background-size:45px}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:hover,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li:hover,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li:hover{border:1px solid #e5e5e5}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:hover a,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li:hover a,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li:hover a{background-color:white}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:active a,#metaheader #metaheader-nav #about-menu-container .user-dropdown .dropdown-menu li:active a,#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .dropdown-menu li:active a{background-color:white}#metaheader #metaheader-nav #development-app-menu-container .user-dropdown .th-icon{height:24px;width:24px;display:block;background-image:url(../img/glyphicons-th.svg);background-size:32px;background-position:center -5px;cursor:pointer}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-toggle img{height:26px;width:26px;border-radius:100%;margin-top:-1px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu::before{right:9px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-menu-item{width:100%;border-bottom:1px solid #ccc}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu{width:100%;border-bottom:1px solid #ccc;background-color:#fff}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container{list-style:none;padding-left:20px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li{height:auto;width:86px;border:1px solid white;margin:5px 0 10px 0}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a{display:block;width:100%;padding:0;height:auto;float:left}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a:hover{background-color:white !important}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a .icon{width:55px;height:55px;margin:5px auto;background-size:50px;background-position:center center;background-repeat:no-repeat;width:100%}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a span{float:left;width:100%;text-align:center;display:block;color:rgba(0,0,0,0.87);font-size:13px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li a:active{background-color:white}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li.clear-left{clear:left}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#opendesktop-link-item a .icon{background-image:url('../img/logo-opendesktop.png')}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#discourse-link-item a .icon{background-image:url('../img/logo-discourse.png');background-size:58px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#gitlab-link-item a .icon{background-image:url(../img/logo-gitlab.png)}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#opencode-link-item a .icon{background-image:url(../img/logo-opencode.png);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#addproduct-link-item a .icon{background-image:url(../img/add.svg);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#listproduct-link-item a .icon{background-image:url(../img/products.png);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#plings-link-item a .icon{background-image:url(../img/pling.png);background-size:40px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#messages-link-item{position:relative}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#messages-link-item a .icon{background-image:url(../img/messages.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#messages-link-item span.badge-notification{display:inline-block;font-weight:normal;white-space:nowrap;border-radius:10px;padding:2px 4px;min-width:8px;vertical-align:middle;color:#fff;font-size:.7579em;line-height:1;text-align:center;background-color:#bdbdbd;position:absolute;z-index:1;min-width:6px;width:15px;top:10px;left:15px;background:#090}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#issues-link-item a .icon{background-image:url(../img/issues.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#music-link-item a .icon{background-image:url(../img/logo-music.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#docs-link-item a .icon{background-image:url(../img/logo-docs.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#storage-link-item a .icon{background-image:url(../img/logo-storage.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#contacts-link-item a .icon{background-image:url(../img/logo-contacts.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#calendar-link-item a .icon{background-image:url(../img/logo-calendar.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#talk-link-item a .icon{background-image:url(../img/logo-talk.png);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#chat-link-item{display:block;clear:both}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li#chat-link-item a .icon{background-image:url(../img/logo-riot.svg);background-size:45px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li:hover{border:1px solid #e5e5e5}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li:hover a{background-color:white}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-context-menu ul.user-context-menu-container li:active a{background-color:white}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-settings-item{width:100%;border-bottom:1px solid #ccc;padding:10px 20px;background-color:#f5f5f5}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-settings-item div.switchContainer{display:inline-block;vertical-align:middle;margin-right:5px;margin-left:5px;padding-top:5px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu .user-settings-item span.user-settings-item-title{display:inline-block}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section{height:auto;padding:20px;background:white;float:left;padding-left:116px;position:relative;width:100%;min-height:136px;box-sizing:border-box}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar{height:96px;width:96px;float:left;border-radius:100%;overflow:hidden;position:absolute;top:20px;left:20px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter{border-radius:100%;height:100%;width:100%;background-color:#c1c1c1;text-align:center;line-height:80px;font-size:50px;color:white;overflow:hidden;position:relative}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter img{height:96px;width:96px;position:absolute;top:0;left:0}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter .change-profile-pic{width:100%;position:absolute;bottom:0;font-size:9px;height:26px;left:0;background-color:rgba(0,0,0,0.4);line-height:30px;color:white;cursor:pointer;font-weight:bold}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details{width:175px;padding-left:20px;float:left;margin-top:-4px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul{padding:0;margin:0;list-style-type:none;float:left;width:100%}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li{width:100%;float:left;height:auto;line-height:15px;font-size:13px;min-height:8px;color:#6a7686}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li a{color:#36c}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li b{color:black}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li button{margin-top:16px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons{padding:10px 20px;background-color:#f5f5f5;width:100%}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn{width:auto;display:block;border-radius:2px;padding:6px 16px !important;font-size:12px;height:30px;font-weight:normal;color:#666 !important;background:#f8f8f8;border:1px solid #c6c6c6;float:left;clear:none;line-height:12px !important}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn.pull-right{float:right}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-color:#c6c6c6;color:#222;background-color:#fff;background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));background-image:-webkit-linear-gradient(top, #fff, #f8f8f8);background-image:linear-gradient(top, #fff, #f8f8f8)}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons .btn span{display:block;float:left;height:12px}#metaheader #metaheader-nav #development-app-menu-container .user-dropdown ul.dropdown-menu{right:-40px}#metaheader #metaheader-nav #development-app-menu-container .user-dropdown ul.dropdown-menu::before{right:42px}#metaheader #metaheader-left-mobile{float:left;height:34px;width:34px}#metaheader #metaheader-left-mobile a#menu-toggle-item{cursor:pointer;height:34px;width:40px;display:block;float:left;background-image:url(../img/hamburger-menu-icon.png);background-size:20px 16px;background-repeat:no-repeat;background-position:8px 10px;position:absolute;left:0;background-color:transparent;z-index:1000}#metaheader #metaheader-left-mobile #left-side-overlay{position:fixed;width:0;height:100%;background:rgba(0,0,0,0.5);z-index:1001;overflow:hidden}#metaheader #metaheader-left-mobile #left-side-overlay a{cursor:pointer;color:#6a7686}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel{height:100%;width:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-color:white;overflow:scroll}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #left-side-panel-thumb-block{width:100%;height:50px;position:absolute;top:0;left:0}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-header{background:#efefef;padding:20px;text-align:center;margin-bottom:10px}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-header img{margin:0 auto;clear:both;display:block}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu{width:100%}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu>ul>li>a{font-weight:bold}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul{list-style-type:none;padding:0;margin:0;width:100%;float:left}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li{width:100%;float:left}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li a{width:100%;line-height:24px;display:block;padding:0 10px;text-decoration:none;color:#6a7686;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul{display:block;position:relative;float:left;top:0;left:0;padding:5px;padding-top:0;border:0;height:auto;min-height:auto;width:100%;box-shadow:none;margin:0;padding:0 10px;margin-bottom:15px}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul::before{display:none}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul li{margin-bottom:0}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul li a{font-size:14px}#metaheader #metaheader-left-mobile #left-side-overlay #left-side-panel #panel-menu ul li ul li a:hover{background-color:#efefef}#metaheader #metaheader-left-mobile.open #left-side-overlay{width:100%}#metaheader #metaheader-left-mobile.open #left-side-overlay #left-side-panel{width:50%}#metaheader-modal{position:fixed;background:rgba(0,0,0,0.5);z-index:10000000000;height:100%;width:100%;top:0;left:0;padding:5%}#metaheader-modal #metaheader-modal-content{width:100%;height:100%;overflow:scroll;background:white;padding:10px;box-shadow:0 1px 2px rgba(0,0,0,0.25)}.react-autosuggest_status{display:block;line-height:30px;min-height:30px}.react-autosuggest__container{position:relative}.react-autosuggest__input{width:280px;height:30px;padding:10px 25px !important;font-family:Helvetica,sans-serif;font-weight:300;font-size:16px;border:1px solid #aaa;border-radius:4px}.react-autosuggest__input--focused{outline:none}.react-autosuggest__input--open{border-bottom-left-radius:0;border-bottom-right-radius:0}.react-autosuggest__suggestions-container{display:none}.react-autosuggest__suggestions-container--open{display:block;position:absolute;top:29px;width:280px;border:1px solid #aaa;background-color:#fff;font-family:Helvetica,sans-serif;font-weight:300;font-size:16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;z-index:2}.react-autosuggest__suggestions-container--open li{display:block !important}.react-autosuggest__suggestions-list{margin:0;padding:0;list-style-type:none}.react-autosuggest__suggestion{cursor:pointer;padding:10px 20px}.react-autosuggest__suggestion--highlighted{background-color:#ddd}.react-autosuggest__inputContainer{position:relative}.react-autosuggest__inputContainer .react-autosuggest__icon{position:absolute;top:4px;left:0;width:24px;height:24px}#metaheader #metaheader-nav .metamenu-theme-dark{background-color:#3D3D3E}#metaheader #metaheader-nav .metamenu-theme-dark ul.metaheader-menu>li>a{color:#E7F3F8}#metaheader #metaheader-nav .metamenu-theme-dark ul.metaheader-menu>li>a:hover{color:#24292E}#metaheader #metaheader-nav .metamenu-theme-dark ul.metaheader-menu>li.active>a{background-color:#2185D0;color:#E7F3F8}#metaheader #metaheader-nav .metamenu-theme-dark #user-context-menu-container .user-dropdown .th-icon{background-image:url(../img/glyphicons-th-light.svg)}#metaheader #metaheader-nav .metamenu-theme-dark #development-app-menu-container .user-dropdown .th-icon{background-image:url(../img/glyphicons-th-light.svg)}#metaheader #metaheader-nav .metamenu-theme-dark #user-search-menu-container .user-dropdown .th-icon{background-image:url(../img/search-light.svg)} \ No newline at end of file diff --git a/httpdocs/theme/react/assets/less/metaheader.less b/httpdocs/theme/react/assets/less/metaheader.less index d26e2dff1..96a602ee9 100644 --- a/httpdocs/theme/react/assets/less/metaheader.less +++ b/httpdocs/theme/react/assets/less/metaheader.less @@ -1,2129 +1,2129 @@ // out: ../css/metaheader.css, sourcemap: true, compress: true @import "elements.less"; #metaheader { float: left; width: 100%; height: 34px; font-family: "Helvetica","Arial",sans-serif !important; font-size: 14px !important; position: absolute; top: 0; left: 0; z-index: 1001; background-color: white; .metamenu { display: block !important; } * { outline: none !important; box-sizing: border-box; } a { cursor: pointer; text-decoration: none !important; } button{ cursor: pointer; } .dropdown-menu { position: absolute; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0,0,0,.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); box-shadow: 0 6px 12px rgba(0,0,0,.175); background-color: white; &.dropdown-menu-right { right: 0; left: auto; } li { padding: 0; } li>a:hover, .active>a, .active>a:hover { color: #222; text-decoration: none; background-color: #eee; } } .metamenu { height: 34px; } #metaheader-nav { width: 100%; float: left; height: 34px; .btn-metaheader { display: block !important; padding: 0 12px !important; border-radius: 2px !important; color: white !important; font-size: 13px !important; height: 26px !important; line-height: 25px !important; font-weight: bold; border: 1px solid #3079ed; background: -webkit-linear-gradient(top, #4387fd, #4683ea); margin-top: -2px; margin-right: 5px; } #user-menu-container { float: right; height: 34px; } ul.metaheader-menu { padding: 0; margin: 0; list-style-type: none; > li { float: left; padding: 5px; /*height: 24px;*/ &#chat-link-item { .riotIcon{ width: 20px; height: 20px; vertical-align: middle; } } .switch { position: relative; display: inline-block; width: 45px; height: 22px; input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 0px; bottom: 2px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked + .slider { background-color: #2196F3; } input:focus + .slider { box-shadow: 0 0 1px #2196F3; } input:checked + .slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } /* Rounded sliders */ .slider.round { border-radius: 34px; } .slider.round:before { border-radius: 50%; } } > a { color: #6a7686; border-radius: 5px; padding: 5px; color: #6a7686; border-radius: 5px; height: 24px; line-height: 24px; cursor: pointer; &:active, &:hover { background-color: #eee; text-decoration: none; } } &.active { > a { background-color: #eee; img { margin-right: 5px; } } } .dropdown-menu { &::before { content: ""; position: absolute; right: 356px; top: -8px; width: 0; height: 0; border-style: solid; border-width: 0 8.5px 8.5px; border-color: transparent transparent #b7bcc4 transparent; border-bottom-color: #fff; border-style: dashed dashed solid; z-index: 1; } } } &#domains-menu { margin-left: 10px; > li { padding-left: 0; > a { margin: 0 10px 0 5px; cursor: pointer; &#opendesktop-logo { position: relative; padding-left: 25px; img { position: absolute; top: 5px; left: 5px; } } } &::after { content: "•"; color: #E2E2E2; } &:last-of-type { &::after { content: ""; } } &.dropdown { > ul.dropdown-menu { margin-left: 0; margin-top: -9px; } } &#domains-dropdown-menu { position: relative; cursor: pointer; z-index: 1000; &.open { .dropdown-menu { display: block; } } .dropdown-menu { width: 600px; max-width: 600px; top: 45px; right: -473px; min-height: 296px; bottom: auto; &::before { right: 556px; } .submenu-container { width:33.333%; float: left; height: auto; a.groupname { cursor: default; height: 24px; line-height: 24px; &:hover { background-color: white !important; } } ul { list-style-type: none; padding: 0; margin: 0; li { a { padding: 3px 20px; font-size: 12px; color:#6a7686; cursor: pointer; } ul { margin-bottom: 10px; li { height: 24px; line-height: 24px; a { padding: 0px 30px; display: block; width: 100%; height: 24px; line-height: 24px; color:#6a7686; } &:hover { background-color: #eee; } } } } } } } } &#discussion-boards, &#admins-dropdown-menu, &#more-dropdown-menu, &#cd-dropdown-menu { position: relative; cursor: pointer; z-index: 1000; &.open { .dropdown-menu { display: block; } } .dropdown-menu { width: 200px; top: 45px; right: auto; min-height: 104px; bottom: auto !important; &::before { right: 156px; } li { padding: 0; a { margin: 0; font-size: 13px; height: 24px; line-height: 24px; padding: 0 20px; border-radius: 0; display: block; color: #6a7686; &.admins-menu-link-item, &.cd-menu-link-item { font-weight: bold; } } > ul { position: relative; float: left; top: 0; left: 0; padding: 5px; padding-top: 0; border: 0; height: auto; min-height: auto; width: 100%; box-shadow: none; margin: 0; &::before { display: none; } } } } } &#more-dropdown-menu { > a { cursor: pointer; } .dropdown-menu { left: -6px; } } &#admins-dropdown-menu { .dropdown-menu { right: auto; min-height: 61px; height: auto; } } &#cd-dropdown-menu { .dropdown-menu { right: auto; height: auto; } } } } &#user-menu { margin-right: 10px; > li { &#user-login-container { padding: 5px; margin-top: 1px; } &#user-register-container { padding: 5px; margin-top: 1px; a{ font-size: 11pt; } } &#about-dropdown-menu{ position: relative; cursor: pointer; z-index: 1000; a.about-menu-link-item { .th-icon { height: 18px; width: 18px; display: block; background-image: url(../img/down-arrow.svg); background-size: 15px; background-position: bottom right; cursor: pointer; background-repeat: no-repeat; float: right; } } &.open { .dropdown-menu { display: block; } } .dropdown-menu { width: 200px; top: 45px; /*right: auto;*/ right: -125px; min-height: 104px; bottom: auto !important; &::before { /*right: 156px;*/ /*right: 100px;*/ right: 156px; } li { padding: 0; a { margin: 0; font-size: 13px; height: 24px; line-height: 24px; padding: 0 20px; border-radius: 0; display: block; color: #6a7686; } > ul { position: relative; float: left; top: 0; left: 0; padding: 5px; padding-top: 0; border: 0; height: auto; min-height: auto; width: 100%; box-shadow: none; margin: 0; &::before { display: none; } } } } } } } } .user-dropdown { position: relative; height: auto; z-index: 1000; &.open, &.show { .dropdown-menu { display: block; right: -6px; } #background-overlay { position: fixed; top: 34px; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.25); } } .dropdown-toggle { padding: 0; background: none !important; background-color: white; color: #6a7686; border: 0; margin: 0; min-height: auto; &:active { background-color: white; box-shadow: none; outline: none; } .glyphicon { font-size: 16px; top: 1px; font-style: normal; font-weight: 100; margin: 0 5px; margin-top: 2px; } &#userLoginDropdown { width: 26px; height: 25px; position: relative; img { position: absolute; top: 0; left: 0; } span.badge-notification{ display: inline-block; font-weight: normal; white-space: nowrap; border-radius: 10px; padding: 2px 4px; min-width: 8px; vertical-align: middle; color: #fff; font-size: .7579em; line-height: 1; text-align: center; background-color: #bdbdbd; position: absolute; z-index: 1; min-width: 6px; top: -3px; left: -5px; background: #090; } } } .dropdown-menu { border-radius: 0; padding: 0; width: 320px; top: 40px; bottom: auto !important; background: #fff; border: 1px solid #ccc; border-color: rgba(0,0,0,0.2); color: #000; box-shadow: 0 2px 10px rgba(0,0,0,0.2); box-sizing: border-box !important; &::before { content: ""; position: absolute; right: 6px; top: -8px; width: 0; height: 0; border-style: solid; border-width: 0 8.5px 8.5px; border-color: transparent transparent #b7bcc4 transparent; border-bottom-color: #fff; border-style: dashed dashed solid; z-index: 1; } li { float: left; box-sizing: border-box !important; } &#right-panel { height: 100%; position: fixed; top: 35px; right: 0; padding: 0; border: 0; box-shadow: none; width: 432px; border-left: 1px solid #ccc; margin: 0; padding-top: 150px; &::before { display: none; } #user-info-menu-item { position: absolute; top: 0; left: 0; height: 150px; #user-info-section { .user-details { width: 100%; .buttons { padding-left: 0; padding-right: 0; background: white; } } } #user-details-username { h2 { margin: 10px 0; font-size: 26px; color: #353a3d; font-weight: bold; } } #user-details-email { color: #687a86; font-size: 18px; margin-bottom: 5px; } } #user-tabs-menu-item { height: 100%; background-color: white; padding:10px; .autosuggest { flex: 1; display: flex; flex-direction:row; } #user-tabs-container { position: relative; padding-top: 40px; height: 100%; #user-tabs-menu { height: 40px; width: 100%; position: absolute; top: 0; left: 0; border-bottom: 2px solid #ccc; ul { padding: 0; list-style-type: none; height: 40px; display: table; margin: 0 auto; li { float: left; height: 20px; width: auto; line-height: 20px; a { display: block; padding: 10px 10px; height: 40px; border-bottom: 2px solid transparent; &.active, &:hover { color: #2e9fff; border-bottom-color: #2e9fff; } input[type="text"] { height: 24px; border-radius: 5px; border: 1px solid #ccc; padding: 0 5px; margin: 7px 0; color: #888; background-image: url('http://i.stack.imgur.com/MFpLm.png'); background-repeat: no-repeat; background-position: 0 -30px; border: 1px solid #a9e2ff; padding: 3px; width: 200px; font-size: 1em; padding-left: 20px; } span.search-button { height: 23px; width: 23px; display: block; float: right; background-image: url('../img/bg_sheet.png'); background-position: -670px -149px; margin: 6px; } } &#search-form-container { position: relative; ul { position: absolute; background: white; padding: 5px; border: 1px solid #ccc; border-radius: 0 0 5px 5px; top: 32px; left: 140px; width: 159px; z-index: 10; li { float: left; width: 100%; cursor: pointer; &:hover { background-color: #ccc; } } } } } } } #user-tabs-content { height: 100%; padding: 10px; /* overflow: scroll;*/ .user-comments-tab-container { max-height: 600px; overflow: auto; .userinfo { color:#687a86; padding: 10px; .header{ font-size: 16px; border-bottom: 1px solid #F1F1F1; } .statistic{ .statisticRow { display: block; span.statisticRow{ font-weight: bold; } } } } .user-comments-thread-container { width: 100%; float: left; padding: 10px; padding-bottom: 20px; .thread-header { float: left; width: 100%; border-bottom: 1px solid #f1f1f1; .thread-subtitle { float: left; width: 100%; font-size: 14px; margin: 5px 0; p { float: left; color: #687a86; margin: 0; } p + p { margin-left: 5px; padding-left: 5px; &::before { content: "•"; color: rgb(226, 226, 226); } span { margin-left: 5px; } } } .thread-title { float: left; width: 100%; h2 { float: left; margin: 0 0 10px 0; font-size: 16px; } } } .thread-comments { float: left; width: 100%; .thread-title { float: left; width: 100%; h2 { float: left; margin: 0 0 10px 0; font-size: 18px; } } .comment-item { position: relative; height: auto; padding-left: 40px; float: left; width: 100%; margin-bottom: 20px; figure { position: absolute; top: 0; left: 0; width: 32px; height: 32px; margin: 0; img { width: 32px; height: 32px; border-radius: 100%; } } .comment-item-header { margin-bottom: 5px; width: 100%; float: left; p { margin-bottom: 0; float: left; &.user, &.replied-user { span { margin-right: 5px; } a { color: #2e9fff; } &:hover { a { color: #2e87e7; } } } &.date-created { margin-left: 5px; padding-left: 5px; &::before { content: "•"; color: rgb(226, 226, 226); } span { margin-left: 5px; } } } p + p { margin-left: 5px; } } .comment-item-content { width: 100%; float: left; } .comment-item-votes-container { width: 100%; float: left; > div { float: left; width: auto; margin-right: 5px; } .comment-item-votes { } } } } } .user-comments-thread-container + .user-comments-thread-container { border-bottom: 3px solid #ccc; } } } } } } } } #user-search-menu-container { .user-dropdown { .th-icon { height: 24px; width: 24px; display: block; background-image: url(../img/search.svg); background-size: 20px; background-position: center 3px; cursor: pointer; background-repeat: no-repeat; } .dropdown-toggle { img { height: 26px; width: 26px; border-radius: 100%; margin-top: -1px; } } .dropdown-menu { &::before { right: 9px; } #user-info-menu-item { width: 100%; border-bottom: 1px solid #ccc; } #user-info-section { height: auto; padding: 20px; background: white; float: left; padding-left: 116px; position: relative; width: 100%; min-height: 136px; box-sizing: border-box; .user-avatar { height: 96px; width: 96px; float: left; border-radius: 100%; overflow: hidden; position: absolute; top: 20px; left: 20px; .no-avatar-user-letter { border-radius: 100%; height: 100%; width: 100%; background-color: #c1c1c1; text-align: center; line-height: 80px; font-size: 50px; color: white; overflow: hidden; position: relative; img { height: 96px; width: 96px; position: absolute; top: 0; left: 0; } .change-profile-pic { width: 100%; position: absolute; bottom: 0; font-size: 9px; height: 26px; left: 0; background-color: rgba(0,0,0,0.4); line-height: 30px; color: white; cursor: pointer; font-weight: bold; } } } .user-details { width: 175px; padding-left: 20px; float: left; margin-top: -4px; ul { padding: 0; margin: 0; list-style-type: none; float: left; width: 100%; li { width: 100%; float: left; height: auto; line-height: 15px; font-size: 13px; min-height: 8px; color: #6a7686; a { color: #36c; } b { color: black; } button { margin-top: 16px; } } } } } &#right-panel { padding-top:10px; } li.buttons { padding: 10px 20px; background-color: #f5f5f5; width: 100%; .btn { width: auto; display: block; border-radius: 2px; padding: 6px 16px !important; font-size: 12px; height: 30px; font-weight: normal; color: #666 !important; background: #f8f8f8; border: 1px solid #c6c6c6; float: left; clear: none; line-height: 12px !important; &.pull-right { float: right; } &:hover { -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.1); box-shadow: 0 1px 1px rgba(0,0,0,0.1); border-color: #c6c6c6; color: #222; background-color: #fff; background-image: -webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8)); background-image: -webkit-linear-gradient(top,#fff,#f8f8f8); background-image: -webkit-linear-gradient(top,#fff,#f8f8f8); background-image: linear-gradient(top,#fff,#f8f8f8); } span { display: block; float: left; height: 12px; } } } } } } #user-context-menu-container, #about-menu-container, #development-app-menu-container { .user-dropdown { .th-icon { height: 24px; width: 24px; display: block; background-image: url(../img/glyphicons-th.svg); background-size: 32px; background-position: center -5px; cursor: pointer; } .dropdown-menu { padding: 23px 28px; right: -42px; &::before { right: 45px; } li { height: auto; width: 86px; border: 1px solid white; margin: 5px 0 10px 0; a { display: block; width: 100%; padding: 0; height: auto; float: left; &:hover { background-color: white !important; } .icon { width: 55px; height: 55px; margin: 5px auto; background-size: 50px; background-position: center center; background-repeat: no-repeat; width: 100%; } span { float: left; width: 100%; text-align: center; display: block; color:rgba(0,0,0,0.87); font-size: 13px; } &:active { background-color: white; } } &.clear-left{ clear: left; } - /* + &#opendesktop-link-item { a { .icon { background-image: url('../img/logo-opendesktop.png'); } } } &#discourse-link-item { a { .icon { background-image: url('../img/logo-discourse.png'); background-size: 58px; } } } &#gitlab-link-item { a { .icon { background-image: url(../img/logo-gitlab.png); } } } &#opencode-link-item { a { .icon { background-image: url(../img/logo-opencode.png); background-size: 40px; } } } &#addproduct-link-item { a { .icon { background-image: url(../img/add.svg); background-size: 40px; } } } &#listproduct-link-item { a { .icon { background-image: url(../img/products.png); background-size: 40px; } } } &#plings-link-item { a { .icon { background-image: url(../img/pling.png); background-size: 40px; } } } &#messages-link-item { a { .icon { background-image: url(../img/messages.png); background-size: 45px; } } span.badge-notification{ display: inline-block; font-weight: normal; white-space: nowrap; border-radius: 10px; padding: 2px 4px; min-width: 8px; vertical-align: middle; color: #fff; font-size: .7579em; line-height: 1; text-align: center; background-color: #bdbdbd; position: absolute; z-index: 1; min-width: 6px; top: -3px; left: -5px; background: #090; } } - */ + &#issues-link-item { a { .icon { background-image: url(../img/issues.png); background-size: 45px; } } } &#music-link-item { a { .icon { background-image: url(../img/logo-music.png); background-size: 45px; } } } &#docs-link-item { a { .icon { background-image: url(../img/logo-docs.png); background-size: 45px; } } } &#storage-link-item { a { .icon { background-image: url(../img/logo-storage.png); background-size: 45px; } } } &#contacts-link-item { a { .icon { background-image: url(../img/logo-contacts.png); background-size: 45px; } } } &#calendar-link-item { a { .icon { background-image: url(../img/logo-calendar.png); background-size: 45px; } } } &#talk-link-item { a { .icon { background-image: url(../img/logo-talk.png); background-size: 45px; } } } &#chat-link-item { display: block; clear: both; a { .icon { background-image: url(../img/logo-riot.svg); background-size: 45px; } } } &:hover { border:1px solid #e5e5e5; a { background-color: white; } } &:active { a { background-color: white; } } } } } } #development-app-menu-container { .user-dropdown { .th-icon { height: 24px; width: 24px; display: block; /*background-image: url(../img/development-app-menu-item.png);*/ background-image: url(../img/glyphicons-th.svg); background-size: 32px; background-position: center -5px; cursor: pointer; } } } #user-login-menu-container { .user-dropdown { .dropdown-toggle { img { height: 26px; width: 26px; border-radius: 100%; margin-top: -1px; } } .dropdown-menu { &::before { right: 9px; } #user-info-menu-item { width: 100%; border-bottom: 1px solid #ccc; } .user-context-menu{ width: 100%; border-bottom: 1px solid #ccc; background-color: #fff; ul.user-context-menu-container{ list-style: none; padding-left: 20px; li { height: auto; width: 86px; border: 1px solid white; margin: 5px 0 10px 0; a { display: block; width: 100%; padding: 0; height: auto; float: left; &:hover { background-color: white !important; } .icon { width: 55px; height: 55px; margin: 5px auto; background-size: 50px; background-position: center center; background-repeat: no-repeat; width: 100%; } span { float: left; width: 100%; text-align: center; display: block; color:rgba(0,0,0,0.87); font-size: 13px; } &:active { background-color: white; } } &.clear-left{ clear: left; } &#opendesktop-link-item { a { .icon { background-image: url('../img/logo-opendesktop.png'); } } } &#discourse-link-item { a { .icon { background-image: url('../img/logo-discourse.png'); background-size: 58px; } } } &#gitlab-link-item { a { .icon { background-image: url(../img/logo-gitlab.png); } } } &#opencode-link-item { a { .icon { background-image: url(../img/logo-opencode.png); background-size: 40px; } } } &#addproduct-link-item { a { .icon { background-image: url(../img/add.svg); background-size: 40px; } } } &#listproduct-link-item { a { .icon { background-image: url(../img/products.png); background-size: 40px; } } } &#plings-link-item { a { .icon { background-image: url(../img/pling.png); background-size: 40px; } } } &#messages-link-item { position: relative; a { .icon { background-image: url(../img/messages.png); background-size: 45px; } } span.badge-notification{ display: inline-block; font-weight: normal; white-space: nowrap; border-radius: 10px; padding: 2px 4px; min-width: 8px; vertical-align: middle; - color: #fff; + color: #fff; font-size: .7579em; line-height: 1; text-align: center; background-color: #bdbdbd; position: absolute; z-index: 1; min-width: 6px; width:15px; top: 10px; left: 15px; background: #090; } } &#issues-link-item { a { .icon { background-image: url(../img/issues.png); background-size: 45px; } } } &#music-link-item { a { .icon { background-image: url(../img/logo-music.png); background-size: 45px; } } } &#docs-link-item { a { .icon { background-image: url(../img/logo-docs.png); background-size: 45px; } } } &#storage-link-item { a { .icon { background-image: url(../img/logo-storage.png); background-size: 45px; } } } &#contacts-link-item { a { .icon { background-image: url(../img/logo-contacts.png); background-size: 45px; } } } &#calendar-link-item { a { .icon { background-image: url(../img/logo-calendar.png); background-size: 45px; } } } &#talk-link-item { a { .icon { background-image: url(../img/logo-talk.png); background-size: 45px; } } } &#chat-link-item { display: block; clear: both; a { .icon { background-image: url(../img/logo-riot.svg); background-size: 45px; } } } &:hover { border:1px solid #e5e5e5; a { background-color: white; } } &:active { a { background-color: white; } } } } } .user-settings-item { width: 100%; border-bottom: 1px solid #ccc; padding: 10px 20px; background-color: #f5f5f5; div.switchContainer{ display: inline-block; vertical-align: middle; margin-right: 5px; margin-left: 5px; padding-top:5px; } span.user-settings-item-title{ display: inline-block; } } #user-info-section { height: auto; padding: 20px; background: white; float: left; padding-left: 116px; position: relative; width: 100%; min-height: 136px; box-sizing: border-box; .user-avatar { height: 96px; width: 96px; float: left; border-radius: 100%; overflow: hidden; position: absolute; top: 20px; left: 20px; .no-avatar-user-letter { border-radius: 100%; height: 100%; width: 100%; background-color: #c1c1c1; text-align: center; line-height: 80px; font-size: 50px; color: white; overflow: hidden; position: relative; img { height: 96px; width: 96px; position: absolute; top: 0; left: 0; } .change-profile-pic { width: 100%; position: absolute; bottom: 0; font-size: 9px; height: 26px; left: 0; background-color: rgba(0,0,0,0.4); line-height: 30px; color: white; cursor: pointer; font-weight: bold; } } } .user-details { width: 175px; padding-left: 20px; float: left; margin-top: -4px; ul { padding: 0; margin: 0; list-style-type: none; float: left; width: 100%; li { width: 100%; float: left; height: auto; line-height: 15px; font-size: 13px; min-height: 8px; color: #6a7686; a { color: #36c; } b { color: black; } button { margin-top: 16px; } } } } } li.buttons { padding: 10px 20px; background-color: #f5f5f5; width: 100%; .btn { width: auto; display: block; border-radius: 2px; padding: 6px 16px !important; font-size: 12px; height: 30px; font-weight: normal; color: #666 !important; background: #f8f8f8; border: 1px solid #c6c6c6; float: left; clear: none; line-height: 12px !important; &.pull-right { float: right; } &:hover { -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.1); box-shadow: 0 1px 1px rgba(0,0,0,0.1); border-color: #c6c6c6; color: #222; background-color: #fff; background-image: -webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8)); background-image: -webkit-linear-gradient(top,#fff,#f8f8f8); background-image: -webkit-linear-gradient(top,#fff,#f8f8f8); background-image: linear-gradient(top,#fff,#f8f8f8); } span { display: block; float: left; height: 12px; } } } } } } #development-app-menu-container { .user-dropdown { ul.dropdown-menu { /*right: -76px;*/ right: -40px; &::before { /*right: 78px;*/ right: 42px; } } } } } #metaheader-left-mobile { float: left; height: 34px; width: 34px; a#menu-toggle-item { cursor: pointer; height: 34px; width: 40px; display: block; float: left; background-image: url(../img/hamburger-menu-icon.png); background-size: 20px 16px; background-repeat: no-repeat; background-position: 8px 10px; position: absolute; left: 0; background-color: transparent; z-index: 1000; } #left-side-overlay { position: fixed; width: 0; height: 100%; background: rgba(0,0,0,0.5); z-index: 1001; overflow: hidden; a { cursor: pointer; color: #6a7686; } #left-side-panel { height: 100%; width: 0; background-color: white; -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); box-shadow: 0 6px 12px rgba(0,0,0,.175); background-color: white; overflow: scroll; #left-side-panel-thumb-block { width: 100%; height: 50px; position: absolute; top: 0; left: 0; } #panel-header { background: #efefef; padding: 20px; text-align: center; margin-bottom: 10px; img { margin: 0 auto; clear: both; display: block; } } #panel-menu { width: 100%; > ul > li > a { font-weight: bold; } ul { list-style-type: none; padding: 0; margin: 0; width: 100%; float: left; li { width: 100%; float: left; a { width: 100%; line-height: 24px; display: block; padding: 0 10px; text-decoration: none; color: #6a7686; .transition(); } ul { display: block; position: relative; float: left; top: 0; left: 0; padding: 5px; padding-top: 0; border: 0; height: auto; min-height: auto; width: 100%; box-shadow: none; margin: 0; padding: 0 10px; margin-bottom: 15px; &::before { display: none; } li { margin-bottom: 0; a { font-size: 14px; &:hover { background-color: #efefef; } } } } } } } } } &.open { #left-side-overlay { width: 100%; #left-side-panel { width: 50%; } } } } } #metaheader-modal { position: fixed; background: rgba(0,0,0,0.5); z-index: 10000000000; height: 100%; width: 100%; top: 0; left: 0; padding: 5%; #metaheader-modal-content { width: 100%; height: 100%; overflow: scroll; background: white; padding: 10px; box-shadow: 0px 1px 2px rgba(0,0,0,0.25); } } /*********autosuggestion**********/ .react-autosuggest_status { display: block; line-height: 30px; min-height: 30px; } .react-autosuggest__container { position: relative; } .react-autosuggest__input { width: 280px; height: 30px; padding: 10px 25px !important; font-family: Helvetica, sans-serif; font-weight: 300; font-size: 16px; border: 1px solid #aaa; border-radius: 4px; } .react-autosuggest__input--focused { outline: none; } .react-autosuggest__input--open { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .react-autosuggest__suggestions-container { display: none; } .react-autosuggest__suggestions-container--open { display: block; position: absolute; top: 29px; width: 280px; border: 1px solid #aaa; background-color: #fff; font-family: Helvetica, sans-serif; font-weight: 300; font-size: 16px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; z-index: 2; li{ display: block !important; } } .react-autosuggest__suggestions-list { margin: 0; padding: 0; list-style-type: none; } .react-autosuggest__suggestion { cursor: pointer; padding: 10px 20px; } .react-autosuggest__suggestion--highlighted { background-color: #ddd; } .react-autosuggest__inputContainer{ position: relative; .react-autosuggest__icon { position: absolute; top: 4px; left: 0px; width: 24px; height: 24px; } } /******************end of autosuggestion ******************/ /* metamenu dark theme*/ #metaheader #metaheader-nav .metamenu-theme-dark { background-color: #3D3D3E; ul.metaheader-menu > li >a { color:#E7F3F8 ; &:hover{ color:#24292E ; } } ul.metaheader-menu > li.active >a { background-color: #2185D0; color:#E7F3F8 ; } #user-context-menu-container .user-dropdown .th-icon { background-image: url(../img/glyphicons-th-light.svg); } #development-app-menu-container .user-dropdown .th-icon { /*background-image: url(../img/development-app-menu-item-white.png);*/ background-image: url(../img/glyphicons-th-light.svg); } #user-search-menu-container .user-dropdown .th-icon { background-image: url(../img/search-light.svg); } } diff --git a/library/Zend/Http/Client.php b/library/Zend/Http/Client.php index a5e6be7b5..c382482c3 100644 --- a/library/Zend/Http/Client.php +++ b/library/Zend/Http/Client.php @@ -1,1607 +1,1610 @@ 5, 'strictredirects' => false, 'useragent' => 'Zend_Http_Client', 'timeout' => 10, 'adapter' => 'Zend_Http_Client_Adapter_Socket', 'httpversion' => self::HTTP_1, 'keepalive' => false, 'storeresponse' => true, 'strict' => true, 'output_stream' => false, 'encodecookies' => true, 'rfc3986_strict' => false ); /** * The adapter used to perform the actual connection to the server * * @var Zend_Http_Client_Adapter_Interface */ protected $adapter = null; /** * Request URI * * @var Zend_Uri_Http */ protected $uri = null; /** * Associative array of request headers * * @var array */ protected $headers = array(); /** * HTTP request method * * @var string */ protected $method = self::GET; /** * Associative array of GET parameters * * @var array */ protected $paramsGet = array(); /** * Associative array of POST parameters * * @var array */ protected $paramsPost = array(); /** * Request body content type (for POST requests) * * @var string */ protected $enctype = null; /** * The raw post data to send. Could be set by setRawData($data, $enctype). * * @var string */ protected $raw_post_data = null; /** * HTTP Authentication settings * * Expected to be an associative array with this structure: * $this->auth = array('user' => 'username', 'password' => 'password', 'type' => 'basic') * Where 'type' should be one of the supported authentication types (see the AUTH_* * constants), for example 'basic' or 'digest'. * * If null, no authentication will be used. * * @var array|null */ protected $auth; /** * File upload arrays (used in POST requests) * * An associative array, where each element is of the format: * 'name' => array('filename.txt', 'text/plain', 'This is the actual file contents') * * @var array */ protected $files = array(); /** * Ordered list of keys from key/value pair data to include in body * * An associative array, where each element is of the format: * '' => VTYPE_SCALAR | VTYPE_FILE * * @var array */ protected $body_field_order = array(); /** * The client's cookie jar * * @var Zend_Http_CookieJar */ protected $cookiejar = null; /** * The last HTTP request sent by the client, as string * * @var string */ protected $last_request = null; /** * The last HTTP response received by the client * * @var Zend_Http_Response */ protected $last_response = null; /** * Redirection counter * * @var int */ protected $redirectCounter = 0; /** * Status for unmasking GET array params * * @var boolean */ protected $_unmaskStatus = false; /** * Status if the http_build_query function escapes brackets * * @var boolean */ protected $_queryBracketsEscaped = true; /** * Fileinfo magic database resource * * This variable is populated the first time _detectFileMimeType is called * and is then reused on every call to this method * * @var resource */ protected static $_fileInfoDb = null; /** * Constructor method. Will create a new HTTP client. Accepts the target * URL and optionally configuration array. * * @param Zend_Uri_Http|string $uri - * @param array $config Configuration key-value pairs. + * @param array $config Configuration key-value pairs. + * @throws Zend_Http_Client_Exception + * @throws Zend_Uri_Exception */ public function __construct($uri = null, $config = null) { if ($uri !== null) { $this->setUri($uri); } if ($config !== null) { $this->setConfig($config); } $this->_queryBracketsEscaped = version_compare(phpversion(), '5.1.3', '>='); } /** * Set the URI for the next request * - * @param Zend_Uri_Http|string $uri + * @param Zend_Uri_Http|string $uri * @return Zend_Http_Client * @throws Zend_Http_Client_Exception + * @throws Zend_Uri_Exception */ public function setUri($uri) { if ($uri instanceof Zend_Uri_Http) { // clone the URI in order to keep the passed parameter constant $uri = clone $uri; } elseif (is_string($uri)) { $uri = Zend_Uri::factory($uri); } if (!$uri instanceof Zend_Uri_Http) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Passed parameter is not a valid HTTP URI.'); } // Set auth if username and password has been specified in the uri if ($uri->getUsername() && $uri->getPassword()) { $this->setAuth($uri->getUsername(), $uri->getPassword()); } // We have no ports, set the defaults if (! $uri->getPort()) { $uri->setPort(($uri->getScheme() == 'https' ? 443 : 80)); } $this->uri = $uri; return $this; } /** * Get the URI for the next request * * @param boolean $as_string If true, will return the URI as a string * @return Zend_Uri_Http|string */ public function getUri($as_string = false) { if ($as_string && $this->uri instanceof Zend_Uri_Http) { return $this->uri->__toString(); } else { return $this->uri; } } /** * Set configuration parameters for this HTTP client * * @param Zend_Config | array $config * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setConfig($config = array()) { if ($config instanceof Zend_Config) { $config = $config->toArray(); } elseif (! is_array($config)) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Array or Zend_Config object expected, got ' . gettype($config)); } foreach ($config as $k => $v) { $this->config[strtolower($k)] = $v; } // Pass configuration options to the adapter if it exists if ($this->adapter instanceof Zend_Http_Client_Adapter_Interface) { $this->adapter->setConfig($config); } return $this; } /** * Set the next request's method * * Validated the passed method and sets it. If we have files set for * POST requests, and the new method is not POST, the files are silently * dropped. * * @param string $method * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setMethod($method = self::GET) { if (! preg_match('/^[^\x00-\x1f\x7f-\xff\(\)<>@,;:\\\\"\/\[\]\?={}\s]+$/', $method)) { // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("'{$method}' is not a valid HTTP request method."); } if (($method == self::POST || $method == self::PUT || $method == self::DELETE || $method == self::PATCH || $method == self::OPTIONS) && $this->enctype === null ) { $this->setEncType(self::ENC_URLENCODED); } $this->method = $method; return $this; } /** * Set one or more request headers * * This function can be used in several ways to set the client's request * headers: * 1. By providing two parameters: $name as the header to set (e.g. 'Host') * and $value as it's value (e.g. 'www.example.com'). * 2. By providing a single header string as the only parameter * e.g. 'Host: www.example.com' * 3. By providing an array of headers as the first parameter * e.g. array('host' => 'www.example.com', 'x-foo: bar'). In This case * the function will call itself recursively for each array item. * * @param string|array $name Header name, full header string ('Header: value') * or an array of headers * @param mixed $value Header value or null * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setHeaders($name, $value = null) { // If we got an array, go recursive! if (is_array($name)) { foreach ($name as $k => $v) { if (is_string($k)) { $this->setHeaders($k, $v); continue; } $this->setHeaders($v, null); } return $this; } // Check if $name needs to be split if ($value === null && (strpos($name, ':') > 0)) { list($name, $value) = explode(':', $name, 2); } // Make sure the name is valid if we are in strict mode if ($this->config['strict'] && (! preg_match('/^[a-zA-Z0-9-]+$/', $name))) { // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("{$name} is not a valid HTTP header name"); } $normalized_name = strtolower($name); // If $value is null or false, unset the header if ($value === null || $value === false) { unset($this->headers[$normalized_name]); return $this; } // Validate value $this->_validateHeaderValue($value); // Header names are stored lowercase internally. if (is_string($value)) { $value = trim($value); } $this->headers[$normalized_name] = array($name, $value); return $this; } /** * Get the value of a specific header * * Note that if the header has more than one value, an array * will be returned. * * @param string $key * @return string|array|null The header value or null if it is not set */ public function getHeader($key) { $key = strtolower($key); if (isset($this->headers[$key])) { return $this->headers[$key][1]; } else { return null; } } /** * Set a GET parameter for the request. Wrapper around _setParameter * * @param string|array $name * @param string $value * @return Zend_Http_Client */ public function setParameterGet($name, $value = null) { if (is_array($name)) { foreach ($name as $k => $v) $this->_setParameter('GET', $k, $v); } else { $this->_setParameter('GET', $name, $value); } return $this; } /** * Set a POST parameter for the request. Wrapper around _setParameter * * @param string|array $name * @param string $value * @return Zend_Http_Client */ public function setParameterPost($name, $value = null) { if (is_array($name)) { foreach ($name as $k => $v) $this->_setParameter('POST', $k, $v); } else { $this->_setParameter('POST', $name, $value); } return $this; } /** * Set a GET or POST parameter - used by SetParameterGet and SetParameterPost * * @param string $type GET or POST * @param string $name * @param string $value * @return null */ protected function _setParameter($type, $name, $value) { $parray = array(); $type = strtolower($type); switch ($type) { case 'get': $parray = &$this->paramsGet; break; case 'post': $parray = &$this->paramsPost; if ( $value === null ) { if (isset($this->body_field_order[$name])) unset($this->body_field_order[$name]); } else { $this->body_field_order[$name] = self::VTYPE_SCALAR; } break; } if ($value === null) { if (isset($parray[$name])) unset($parray[$name]); } else { $parray[$name] = $value; } } /** * Get the number of redirections done on the last request * * @return int */ public function getRedirectionsCount() { return $this->redirectCounter; } /** * Set HTTP authentication parameters * * $type should be one of the supported types - see the self::AUTH_* * constants. * * To enable authentication: * * $this->setAuth('shahar', 'secret', Zend_Http_Client::AUTH_BASIC); * * * To disable authentication: * * $this->setAuth(false); * * * @see http://www.faqs.org/rfcs/rfc2617.html * @param string|false $user User name or false disable authentication * @param string $password Password * @param string $type Authentication type * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setAuth($user, $password = '', $type = self::AUTH_BASIC) { // If we got false or null, disable authentication if ($user === false || $user === null) { $this->auth = null; // Clear the auth information in the uri instance as well if ($this->uri instanceof Zend_Uri_Http) { $this->getUri()->setUsername(''); $this->getUri()->setPassword(''); } // Else, set up authentication } else { // Check we got a proper authentication type if (! defined('self::AUTH_' . strtoupper($type))) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Invalid or not supported authentication type: '$type'"); } $this->auth = array( 'user' => (string) $user, 'password' => (string) $password, 'type' => $type ); } return $this; } /** * Set the HTTP client's cookie jar. * * A cookie jar is an object that holds and maintains cookies across HTTP requests * and responses. * * @param Zend_Http_CookieJar|boolean $cookiejar Existing cookiejar object, true to create a new one, false to disable * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setCookieJar($cookiejar = true) { Zend_Loader::loadClass('Zend_Http_CookieJar'); if ($cookiejar instanceof Zend_Http_CookieJar) { $this->cookiejar = $cookiejar; } elseif ($cookiejar === true) { $this->cookiejar = new Zend_Http_CookieJar(); } elseif (! $cookiejar) { $this->cookiejar = null; } else { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Invalid parameter type passed as CookieJar'); } return $this; } /** * Return the current cookie jar or null if none. * * @return Zend_Http_CookieJar|null */ public function getCookieJar() { return $this->cookiejar; } /** * Add a cookie to the request. If the client has no Cookie Jar, the cookies * will be added directly to the headers array as "Cookie" headers. * * @param Zend_Http_Cookie|string $cookie * @param string|null $value If "cookie" is a string, this is the cookie value. * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setCookie($cookie, $value = null) { Zend_Loader::loadClass('Zend_Http_Cookie'); if (is_array($cookie)) { foreach ($cookie as $c => $v) { if (is_string($c)) { $this->setCookie($c, $v); } else { $this->setCookie($v); } } return $this; } if ($value !== null && $this->config['encodecookies']) { $value = urlencode($value); } if (isset($this->cookiejar)) { if ($cookie instanceof Zend_Http_Cookie) { $this->cookiejar->addCookie($cookie); } elseif (is_string($cookie) && $value !== null) { $cookie = Zend_Http_Cookie::fromString("{$cookie}={$value}", $this->uri, $this->config['encodecookies']); $this->cookiejar->addCookie($cookie); } } else { if ($cookie instanceof Zend_Http_Cookie) { $name = $cookie->getName(); $value = $cookie->getValue(); $cookie = $name; } if (preg_match("/[=,; \t\r\n\013\014]/", $cookie)) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Cookie name cannot contain these characters: =,; \t\r\n\013\014 ({$cookie})"); } $value = addslashes($value); if (! isset($this->headers['cookie'])) { $this->headers['cookie'] = array('Cookie', ''); } $this->headers['cookie'][1] .= $cookie . '=' . $value . '; '; } return $this; } /** * Set a file to upload (using a POST request) * * Can be used in two ways: * * 1. $data is null (default): $filename is treated as the name if a local file which * will be read and sent. Will try to guess the content type using mime_content_type(). * 2. $data is set - $filename is sent as the file name, but $data is sent as the file * contents and no file is read from the file system. In this case, you need to * manually set the Content-Type ($ctype) or it will default to * application/octet-stream. * * @param string $filename Name of file to upload, or name to save as * @param string $formname Name of form element to send as * @param string $data Data to send (if null, $filename is read and sent) * @param string $ctype Content type to use (if $data is set and $ctype is * null, will be application/octet-stream) * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setFileUpload($filename, $formname, $data = null, $ctype = null) { if ($data === null) { if (($data = @file_get_contents($filename)) === false) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Unable to read file '{$filename}' for upload"); } if (! $ctype) { $ctype = $this->_detectFileMimeType($filename); } } // Force enctype to multipart/form-data $this->setEncType(self::ENC_FORMDATA); $this->files[] = array( 'formname' => $formname, 'filename' => basename($filename), 'ctype' => $ctype, 'data' => $data ); $this->body_field_order[$formname] = self::VTYPE_FILE; return $this; } /** * Set the encoding type for POST data * * @param string $enctype * @return Zend_Http_Client */ public function setEncType($enctype = self::ENC_URLENCODED) { $this->enctype = $enctype; return $this; } /** * Set the raw (already encoded) POST data. * * This function is here for two reasons: * 1. For advanced user who would like to set their own data, already encoded * 2. For backwards compatibilty: If someone uses the old post($data) method. * this method will be used to set the encoded data. * * $data can also be stream (such as file) from which the data will be read. * * @param string|resource $data * @param string $enctype * @return Zend_Http_Client */ public function setRawData($data, $enctype = null) { $this->raw_post_data = $data; $this->setEncType($enctype); if (is_resource($data)) { // We've got stream data $stat = @fstat($data); if($stat) { $this->setHeaders(self::CONTENT_LENGTH, $stat['size']); } } return $this; } /** * Set the unmask feature for GET parameters as array * * Example: * foo%5B0%5D=a&foo%5B1%5D=b * becomes * foo=a&foo=b * * This is usefull for some services * * @param boolean $status * @return Zend_Http_Client */ public function setUnmaskStatus($status = true) { $this->_unmaskStatus = (BOOL)$status; return $this; } /** * Returns the currently configured unmask status * * @return boolean */ public function getUnmaskStatus() { return $this->_unmaskStatus; } /** * Clear all GET and POST parameters * * Should be used to reset the request parameters if the client is * used for several concurrent requests. * * clearAll parameter controls if we clean just parameters or also * headers and last_* * * @param bool $clearAll Should all data be cleared? * @return Zend_Http_Client */ public function resetParameters($clearAll = false) { // Reset parameter data $this->paramsGet = array(); $this->paramsPost = array(); $this->files = array(); $this->raw_post_data = null; $this->enctype = null; if($clearAll) { $this->headers = array(); $this->last_request = null; $this->last_response = null; } else { // Clear outdated headers if (isset($this->headers[strtolower(self::CONTENT_TYPE)])) { unset($this->headers[strtolower(self::CONTENT_TYPE)]); } if (isset($this->headers[strtolower(self::CONTENT_LENGTH)])) { unset($this->headers[strtolower(self::CONTENT_LENGTH)]); } } return $this; } /** * Get the last HTTP request as string * * @return string */ public function getLastRequest() { return $this->last_request; } /** * Get the last HTTP response received by this client * * If $config['storeresponse'] is set to false, or no response was * stored yet, will return null * * @return Zend_Http_Response or null if none */ public function getLastResponse() { return $this->last_response; } /** * Load the connection adapter * * While this method is not called more than one for a client, it is * seperated from ->request() to preserve logic and readability * * @param Zend_Http_Client_Adapter_Interface|string $adapter * @return null * @throws Zend_Http_Client_Exception */ public function setAdapter($adapter) { if (is_string($adapter)) { try { Zend_Loader::loadClass($adapter); } catch (Zend_Exception $e) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Unable to load adapter '$adapter': {$e->getMessage()}", 0, $e); } $adapter = new $adapter; } if (! $adapter instanceof Zend_Http_Client_Adapter_Interface) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Passed adapter is not a HTTP connection adapter'); } $this->adapter = $adapter; $config = $this->config; unset($config['adapter']); $this->adapter->setConfig($config); } /** * Load the connection adapter * * @return Zend_Http_Client_Adapter_Interface $adapter */ public function getAdapter() { if (null === $this->adapter) { $this->setAdapter($this->config['adapter']); } return $this->adapter; } /** * Set streaming for received data * * @param string|boolean $streamfile Stream file, true for temp file, false/null for no streaming * @return Zend_Http_Client */ public function setStream($streamfile = true) { $this->setConfig(array("output_stream" => $streamfile)); return $this; } /** * Get status of streaming for received data * @return boolean|string */ public function getStream() { return $this->config["output_stream"]; } /** * Create temporary stream * * @return resource */ protected function _openTempStream() { $this->_stream_name = $this->config['output_stream']; if(!is_string($this->_stream_name)) { // If name is not given, create temp name $this->_stream_name = tempnam(isset($this->config['stream_tmp_dir'])?$this->config['stream_tmp_dir']:sys_get_temp_dir(), 'Zend_Http_Client'); } if (false === ($fp = @fopen($this->_stream_name, "w+b"))) { if ($this->adapter instanceof Zend_Http_Client_Adapter_Interface) { $this->adapter->close(); } // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Could not open temp file {$this->_stream_name}"); } return $fp; } /** * Send the HTTP request and return an HTTP response object * * @param string $method * @return Zend_Http_Response * @throws Zend_Http_Client_Exception */ public function request($method = null) { if (! $this->uri instanceof Zend_Uri_Http) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('No valid URI has been passed to the client'); } if ($method) { $this->setMethod($method); } $this->redirectCounter = 0; $response = null; // Make sure the adapter is loaded if ($this->adapter == null) { $this->setAdapter($this->config['adapter']); } // Send the first request. If redirected, continue. do { // Clone the URI and add the additional GET parameters to it $uri = clone $this->uri; if (! empty($this->paramsGet)) { $query = $uri->getQuery(); if (! empty($query)) { $query .= '&'; } $query .= http_build_query($this->paramsGet, null, '&'); if ($this->config['rfc3986_strict']) { $query = str_replace('+', '%20', $query); } // @see ZF-11671 to unmask for some services to foo=val1&foo=val2 if ($this->getUnmaskStatus()) { if ($this->_queryBracketsEscaped) { $query = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query); } else { $query = preg_replace('/\\[(?:[0-9]|[1-9][0-9]+)\\]=/', '=', $query); } } $uri->setQuery($query); } $body = $this->_prepareBody(); $headers = $this->_prepareHeaders(); // check that adapter supports streaming before using it if(is_resource($body) && !($this->adapter instanceof Zend_Http_Client_Adapter_Stream)) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Adapter does not support streaming'); } // Open the connection, send the request and read the response $this->adapter->connect($uri->getHost(), $uri->getPort(), ($uri->getScheme() == 'https' ? true : false)); if($this->config['output_stream']) { if($this->adapter instanceof Zend_Http_Client_Adapter_Stream) { $stream = $this->_openTempStream(); $this->adapter->setOutputStream($stream); } else { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Adapter does not support streaming'); } } $this->last_request = $this->adapter->write($this->method, $uri, $this->config['httpversion'], $headers, $body); $response = $this->adapter->read(); if (! $response) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Unable to read response, or response is empty'); } if($this->config['output_stream']) { $streamMetaData = stream_get_meta_data($stream); if ($streamMetaData['seekable']) { rewind($stream); } // cleanup the adapter $this->adapter->setOutputStream(null); $response = Zend_Http_Response_Stream::fromStream($response, $stream); $response->setStreamName($this->_stream_name); if(!is_string($this->config['output_stream'])) { // we used temp name, will need to clean up $response->setCleanup(true); } } else { $response = Zend_Http_Response::fromString($response); } if ($this->config['storeresponse']) { $this->last_response = $response; } // Load cookies into cookie jar if (isset($this->cookiejar)) { $this->cookiejar->addCookiesFromResponse($response, $uri, $this->config['encodecookies']); } // If we got redirected, look for the Location header if ($response->isRedirect() && ($location = $response->getHeader('location'))) { // Avoid problems with buggy servers that add whitespace at the // end of some headers (See ZF-11283) $location = trim($location); // Check whether we send the exact same request again, or drop the parameters // and send a GET request if ($response->getStatus() == 303 || ((! $this->config['strictredirects']) && ($response->getStatus() == 302 || $response->getStatus() == 301))) { $this->resetParameters(); $this->setMethod(self::GET); } // If we got a well formed absolute URI if (($scheme = substr($location, 0, 6)) && ($scheme == 'http:/' || $scheme == 'https:')) { $this->setHeaders('host', null); $this->setUri($location); } else { // Split into path and query and set the query if (strpos($location, '?') !== false) { list($location, $query) = explode('?', $location, 2); } else { $query = ''; } $this->uri->setQuery($query); // Else, if we got just an absolute path, set it if(strpos($location, '/') === 0) { $this->uri->setPath($location); // Else, assume we have a relative path } else { // Get the current path directory, removing any trailing slashes $path = $this->uri->getPath(); $path = rtrim(substr($path, 0, strrpos($path, '/')), "/"); $this->uri->setPath($path . '/' . $location); } } ++$this->redirectCounter; } else { // If we didn't get any location, stop redirecting break; } } while ($this->redirectCounter < $this->config['maxredirects']); return $response; } /** * Prepare the request headers * * @return array */ protected function _prepareHeaders() { $headers = array(); // Set the host header if (! isset($this->headers['host'])) { $host = $this->uri->getHost(); // If the port is not default, add it if (! (($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80) || ($this->uri->getScheme() == 'https' && $this->uri->getPort() == 443))) { $host .= ':' . $this->uri->getPort(); } $headers[] = "Host: {$host}"; } // Set the connection header if (! isset($this->headers['connection'])) { if (! $this->config['keepalive']) { $headers[] = "Connection: close"; } } // Set the Accept-encoding header if not set - depending on whether // zlib is available or not. if (! isset($this->headers['accept-encoding'])) { if (function_exists('gzinflate')) { $headers[] = 'Accept-encoding: gzip, deflate'; } else { $headers[] = 'Accept-encoding: identity'; } } // Set the Content-Type header if (($this->method == self::POST || $this->method == self::PUT) && (! isset($this->headers[strtolower(self::CONTENT_TYPE)]) && isset($this->enctype))) { $headers[] = self::CONTENT_TYPE . ': ' . $this->enctype; } // Set the user agent header if (! isset($this->headers['user-agent']) && isset($this->config['useragent'])) { $headers[] = "User-Agent: {$this->config['useragent']}"; } // Set HTTP authentication if needed if (is_array($this->auth)) { $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']); $headers[] = "Authorization: {$auth}"; } // Load cookies from cookie jar if (isset($this->cookiejar)) { $cookstr = $this->cookiejar->getMatchingCookies($this->uri, true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT); if ($cookstr) { $headers[] = "Cookie: {$cookstr}"; } } // Add all other user defined headers foreach ($this->headers as $header) { list($name, $value) = $header; if (is_array($value)) { $value = implode(', ', $value); } $headers[] = "$name: $value"; } return $headers; } /** * Prepare the request body (for POST and PUT requests) * * @return string * @throws Zend_Http_Client_Exception */ protected function _prepareBody() { // According to RFC2616, a TRACE request should not have a body. if ($this->method == self::TRACE) { return ''; } if (isset($this->raw_post_data) && is_resource($this->raw_post_data)) { return $this->raw_post_data; } // If mbstring overloads substr and strlen functions, we have to // override it's internal encoding if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { $mbIntEnc = mb_internal_encoding(); mb_internal_encoding('ASCII'); } // If we have raw_post_data set, just use it as the body. if (isset($this->raw_post_data)) { $this->setHeaders(self::CONTENT_LENGTH, strlen($this->raw_post_data)); if (isset($mbIntEnc)) { mb_internal_encoding($mbIntEnc); } return $this->raw_post_data; } $body = ''; // If we have files to upload, force enctype to multipart/form-data if (count ($this->files) > 0) { $this->setEncType(self::ENC_FORMDATA); } // If we have POST parameters or files, encode and add them to the body if (count($this->paramsPost) > 0 || count($this->files) > 0) { switch($this->enctype) { case self::ENC_FORMDATA: // Encode body as multipart/form-data $boundary = '---ZENDHTTPCLIENT-' . md5(microtime()); $this->setHeaders(self::CONTENT_TYPE, self::ENC_FORMDATA . "; boundary={$boundary}"); // Encode all files and POST vars in the order they were given foreach ($this->body_field_order as $fieldName=>$fieldType) { switch ($fieldType) { case self::VTYPE_FILE: foreach ($this->files as $file) { if ($file['formname']===$fieldName) { $fhead = array(self::CONTENT_TYPE => $file['ctype']); $body .= self::encodeFormData($boundary, $file['formname'], $file['data'], $file['filename'], $fhead); } } break; case self::VTYPE_SCALAR: if (isset($this->paramsPost[$fieldName])) { if (is_array($this->paramsPost[$fieldName])) { $flattened = self::_flattenParametersArray($this->paramsPost[$fieldName], $fieldName); foreach ($flattened as $pp) { $body .= self::encodeFormData($boundary, $pp[0], $pp[1]); } } else { $body .= self::encodeFormData($boundary, $fieldName, $this->paramsPost[$fieldName]); } } break; } } $body .= "--{$boundary}--\r\n"; break; case self::ENC_URLENCODED: // Encode body as application/x-www-form-urlencoded $this->setHeaders(self::CONTENT_TYPE, self::ENC_URLENCODED); $body = http_build_query($this->paramsPost, '', '&'); break; default: if (isset($mbIntEnc)) { mb_internal_encoding($mbIntEnc); } /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Cannot handle content type '{$this->enctype}' automatically." . " Please use Zend_Http_Client::setRawData to send this kind of content."); break; } } // Set the Content-Length if we have a body or if request is POST/PUT if ($body || $this->method == self::POST || $this->method == self::PUT) { $this->setHeaders(self::CONTENT_LENGTH, strlen($body)); } if (isset($mbIntEnc)) { mb_internal_encoding($mbIntEnc); } return $body; } /** * Helper method that gets a possibly multi-level parameters array (get or * post) and flattens it. * * The method returns an array of (key, value) pairs (because keys are not * necessarily unique. If one of the parameters in as array, it will also * add a [] suffix to the key. * * This method is deprecated since Zend Framework 1.9 in favour of * self::_flattenParametersArray() and will be dropped in 2.0 * * @deprecated since 1.9 * * @param array $parray The parameters array * @param bool $urlencode Whether to urlencode the name and value * @return array */ protected function _getParametersRecursive($parray, $urlencode = false) { // Issue a deprecated notice trigger_error("The " . __METHOD__ . " method is deprecated and will be dropped in 2.0.", E_USER_NOTICE); if (! is_array($parray)) { return $parray; } $parameters = array(); foreach ($parray as $name => $value) { if ($urlencode) { $name = urlencode($name); } // If $value is an array, iterate over it if (is_array($value)) { $name .= ($urlencode ? '%5B%5D' : '[]'); foreach ($value as $subval) { if ($urlencode) { $subval = urlencode($subval); } $parameters[] = array($name, $subval); } } else { if ($urlencode) { $value = urlencode($value); } $parameters[] = array($name, $value); } } return $parameters; } /** * Attempt to detect the MIME type of a file using available extensions * * This method will try to detect the MIME type of a file. If the fileinfo * extension is available, it will be used. If not, the mime_magic * extension which is deprected but is still available in many PHP setups * will be tried. * * If neither extension is available, the default application/octet-stream * MIME type will be returned * * @param string $file File path * @return string MIME type */ protected function _detectFileMimeType($file) { $type = null; // First try with fileinfo functions if (function_exists('finfo_open')) { if (self::$_fileInfoDb === null) { self::$_fileInfoDb = @finfo_open(FILEINFO_MIME); } if (self::$_fileInfoDb) { $type = finfo_file(self::$_fileInfoDb, $file); } } elseif (function_exists('mime_content_type')) { $type = mime_content_type($file); } // Fallback to the default application/octet-stream if (! $type) { $type = 'application/octet-stream'; } return $type; } /** * Encode data to a multipart/form-data part suitable for a POST request. * * @param string $boundary * @param string $name * @param mixed $value * @param string $filename * @param array $headers Associative array of optional headers @example ("Content-Transfer-Encoding" => "binary") * @return string */ public static function encodeFormData($boundary, $name, $value, $filename = null, $headers = array()) { $ret = "--{$boundary}\r\n" . 'Content-Disposition: form-data; name="' . $name .'"'; if ($filename) { $ret .= '; filename="' . $filename . '"'; } $ret .= "\r\n"; foreach ($headers as $hname => $hvalue) { $ret .= "{$hname}: {$hvalue}\r\n"; } $ret .= "\r\n"; $ret .= "{$value}\r\n"; return $ret; } /** * Create a HTTP authentication "Authorization:" header according to the * specified user, password and authentication method. * * @see http://www.faqs.org/rfcs/rfc2617.html * @param string $user * @param string $password * @param string $type * @return string * @throws Zend_Http_Client_Exception */ public static function encodeAuthHeader($user, $password, $type = self::AUTH_BASIC) { $authHeader = null; switch ($type) { case self::AUTH_BASIC: // In basic authentication, the user name cannot contain ":" if (strpos($user, ':') !== false) { /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("The user name cannot contain ':' in 'Basic' HTTP authentication"); } $authHeader = 'Basic ' . base64_encode($user . ':' . $password); break; //case self::AUTH_DIGEST: /** * @todo Implement digest authentication */ // break; default: /** @see Zend_Http_Client_Exception */ // require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Not a supported HTTP authentication type: '$type'"); } return $authHeader; } /** * Convert an array of parameters into a flat array of (key, value) pairs * * Will flatten a potentially multi-dimentional array of parameters (such * as POST parameters) into a flat array of (key, value) paris. In case * of multi-dimentional arrays, square brackets ([]) will be added to the * key to indicate an array. * * @since 1.9 * * @param array $parray * @param string $prefix * @return array */ protected static function _flattenParametersArray($parray, $prefix = null) { if (! is_array($parray)) { return $parray; } $parameters = array(); foreach($parray as $name => $value) { // Calculate array key if ($prefix) { if (is_int($name)) { $key = $prefix . '[]'; } else { $key = $prefix . "[$name]"; } } else { $key = $name; } if (is_array($value)) { $parameters = array_merge($parameters, self::_flattenParametersArray($value, $key)); } else { $parameters[] = array($key, $value); } } return $parameters; } /** * Ensure a header value is valid per RFC 7230. * * @see http://tools.ietf.org/html/rfc7230#section-3.2 * @param string|object|array $value * @param bool $recurse */ protected function _validateHeaderValue($value, $recurse = true) { if (is_array($value) && $recurse) { foreach ($value as $v) { $this->_validateHeaderValue($v, false); } return; } // Cast integers and floats to strings for purposes of header representation. if (is_int($value) || is_float($value)) { $value = (string) $value; } if (! is_string($value) && (! is_object($value) || ! method_exists($value, '__toString'))) { // require_once 'Zend/Http/Exception.php'; throw new Zend_Http_Exception('Invalid header value detected'); } Zend_Http_Header_HeaderValue::assertValid($value); } } diff --git a/sql_code/20160914_add_file_type.sql b/sql_code/20160914_add_file_type.sql index 15e623b35..6204515cf 100644 --- a/sql_code/20160914_add_file_type.sql +++ b/sql_code/20160914_add_file_type.sql @@ -1,29 +1,35 @@ -CREATE TABLE `file_types` ( - `filetype_id` INT NOT NULL AUTO_INCREMENT, - `text` VARCHAR(255) NOT NULL, - `order` INT NULL, - `is_active` INT(1) NULL DEFAULT '1', - PRIMARY KEY (`filetype_id`) +CREATE TABLE `file_types` +( + `filetype_id` INT NOT NULL AUTO_INCREMENT, + `text` VARCHAR(255) NOT NULL, + `order` INT NULL, + `is_active` INT(1) NULL DEFAULT '1', + PRIMARY KEY (`filetype_id`) ) -ENGINE=InnoDB + ENGINE = InnoDB ; -CREATE TABLE `project_file_type` ( - `project_id` INT NOT NULL, - `file_id` INT NOT NULL, - `file_type_id` INT NOT NULL, - PRIMARY KEY (`project_id`, `file_id`) +CREATE TABLE `project_file_type` +( + `project_id` INT NOT NULL, + `file_id` INT NOT NULL, + `file_type_id` INT NOT NULL, + PRIMARY KEY (`project_id`, `file_id`) ) -ENGINE=InnoDB + ENGINE = InnoDB ; -INSERT INTO `file_types` (`filetype_id`, `text`, `order`) VALUES ('1', 'AppImage', '1'); -INSERT INTO `file_types` (`filetype_id`, `text`, `order`) VALUES ('2', 'Android (APK)', '2'); -INSERT INTO `file_types` (`filetype_id`, `text`, `order`) VALUES ('3', 'OS X compatible', '3'); -INSERT INTO `file_types` (`filetype_id`, `text`, `order`) VALUES ('4', 'Windows executable', '4'); +INSERT INTO `file_types` (`filetype_id`, `text`, `order`) +VALUES ('1', 'AppImage', '1'); +INSERT INTO `file_types` (`filetype_id`, `text`, `order`) +VALUES ('2', 'Android (APK)', '2'); +INSERT INTO `file_types` (`filetype_id`, `text`, `order`) +VALUES ('3', 'OS X compatible', '3'); +INSERT INTO `file_types` (`filetype_id`, `text`, `order`) +VALUES ('4', 'Windows executable', '4'); ALTER TABLE `file_types` -CHANGE COLUMN `text` `name` VARCHAR(255) NOT NULL ; + CHANGE COLUMN `text` `name` VARCHAR(255) NOT NULL; ALTER TABLE `project_file_type` -CHANGE COLUMN `file_type_id` `filetype_id` INT(11) NOT NULL , -ADD INDEX `idx_type_id` (`filetype_id` ASC); \ No newline at end of file + CHANGE COLUMN `file_type_id` `filetype_id` INT(11) NOT NULL , + ADD INDEX `idx_type_id` (`filetype_id` ASC); \ No newline at end of file diff --git a/sql_code/20160916_file_type_rename.sql b/sql_code/20160916_file_type_rename.sql index 4f3ffe44a..5e94c13bb 100644 --- a/sql_code/20160916_file_type_rename.sql +++ b/sql_code/20160916_file_type_rename.sql @@ -1,7 +1,6 @@ - ALTER TABLE `file_types` -CHANGE COLUMN `text` `name` VARCHAR(255) NOT NULL ; + CHANGE COLUMN `text` `name` VARCHAR(255) NOT NULL; ALTER TABLE `project_file_type` -CHANGE COLUMN `file_type_id` `filetype_id` INT(11) NOT NULL , -ADD INDEX `idx_type_id` (`filetype_id` ASC); \ No newline at end of file + CHANGE COLUMN `file_type_id` `filetype_id` INT(11) NOT NULL , + ADD INDEX `idx_type_id` (`filetype_id` ASC); \ No newline at end of file diff --git a/sql_code/20160919_file_type_rename.sql b/sql_code/20160919_file_type_rename.sql index aa4ae9005..19fb85e29 100644 --- a/sql_code/20160919_file_type_rename.sql +++ b/sql_code/20160919_file_type_rename.sql @@ -1,12 +1,12 @@ RENAME TABLE `file_types` TO `package_types`; ALTER TABLE `package_types` - CHANGE COLUMN `filetype_id` `package_type_id` INT(11) NOT NULL AUTO_INCREMENT FIRST; + CHANGE COLUMN `filetype_id` `package_type_id` INT(11) NOT NULL AUTO_INCREMENT FIRST; ALTER TABLE `project_file_type` - ALTER `filetype_id` DROP DEFAULT; + ALTER `filetype_id` DROP DEFAULT; ALTER TABLE `project_file_type` - CHANGE COLUMN `filetype_id` `package_type_id` INT(11) NOT NULL AFTER `file_id`; + CHANGE COLUMN `filetype_id` `package_type_id` INT(11) NOT NULL AFTER `file_id`; RENAME TABLE `project_file_type` TO `project_package_type`; diff --git a/sql_code/20160921_add_mail_template_comment_reply.sql b/sql_code/20160921_add_mail_template_comment_reply.sql index e9d471a41..412c44f6b 100644 --- a/sql_code/20160921_add_mail_template_comment_reply.sql +++ b/sql_code/20160921_add_mail_template_comment_reply.sql @@ -1 +1,4 @@ -INSERT INTO `mail_template` (`name`, `subject`, `text`, `created_at`, `changed_at`) VALUES ('tpl_user_comment_reply_note', 'opendesktop.org - You received a new reply to your comment', '

Hey %username%,

\r\n


you received a new reply to your comment on %product_title%

\r\n


Here is what the user wrote:

\r\n

%comment_text%
\r\n



\r\n



Kind regards,
Your openDesktop Team
contact@opendesktop.org

', '2016-09-15 12:32:48', '2016-09-15 12:32:48'); +INSERT INTO `mail_template` (`name`, `subject`, `text`, `created_at`, `changed_at`) +VALUES ('tpl_user_comment_reply_note', 'opendesktop.org - You received a new reply to your comment', + '

Hey %username%,

\r\n


you received a new reply to your comment on %product_title%

\r\n


Here is what the user wrote:

\r\n

%comment_text%
\r\n



\r\n



Kind regards,
Your openDesktop Team
contact@opendesktop.org

', + '2016-09-15 12:32:48', '2016-09-15 12:32:48'); diff --git a/sql_code/20160922_add_member_email_table.sql b/sql_code/20160922_add_member_email_table.sql index 02c3cc83c..7fba002e2 100644 --- a/sql_code/20160922_add_member_email_table.sql +++ b/sql_code/20160922_add_member_email_table.sql @@ -1,46 +1,60 @@ DROP TABLE IF EXISTS `member_email`; -CREATE TABLE `member_email` ( - `email_id` int(11) NOT NULL AUTO_INCREMENT, - `email_member_id` int(11) NOT NULL, - `email_address` varchar(255) NOT NULL, - `email_primary` int(1) DEFAULT '0', - `email_deleted` int(1) DEFAULT '0', - `email_created` datetime DEFAULT NULL, - `email_checked` datetime DEFAULT NULL, - `email_verification_value` varchar(255) DEFAULT NULL, - PRIMARY KEY (`email_id`), - KEY `idx_address` (`email_address`), - KEY `idx_member` (`email_member_id`), - KEY `idx_verification` (`email_verification_value`) -) ENGINE=InnoDB; +CREATE TABLE `member_email` +( + `email_id` int(11) NOT NULL AUTO_INCREMENT, + `email_member_id` int(11) NOT NULL, + `email_address` varchar(255) NOT NULL, + `email_primary` int(1) DEFAULT '0', + `email_deleted` int(1) DEFAULT '0', + `email_created` datetime DEFAULT NULL, + `email_checked` datetime DEFAULT NULL, + `email_verification_value` varchar(255) DEFAULT NULL, + PRIMARY KEY (`email_id`), + KEY `idx_address` (`email_address`), + KEY `idx_member` (`email_member_id`), + KEY `idx_verification` (`email_verification_value`) +) ENGINE = InnoDB; DELIMITER $$ -DROP TRIGGER IF EXISTS member_email_BEFORE_INSERT$$ -CREATE DEFINER = CURRENT_USER TRIGGER `member_email_BEFORE_INSERT` BEFORE INSERT ON `member_email` FOR EACH ROW - BEGIN - IF NEW.email_created IS NULL THEN - SET NEW.email_created = NOW(); +DROP TRIGGER IF EXISTS `member_email_BEFORE_INSERT`$$ +CREATE DEFINER = CURRENT_USER TRIGGER `member_email_BEFORE_INSERT` + BEFORE INSERT + ON `member_email` + FOR EACH ROW +BEGIN + IF `NEW`.`email_created` IS NULL THEN + SET `NEW`.`email_created` = NOW(); END IF; - END$$ +END$$ DELIMITER ; START TRANSACTION; -- migrate all user email -TRUNCATE member_email; -INSERT INTO member_email (email_member_id, email_address, email_primary, email_created, email_checked, email_verification_value) - SELECT member.member_id as email_member_id, member.mail as email_address, 1 as email_primary, member.created_at as email_created, member.created_at as email_checked, member.verificationVal as email_verification_value - FROM member - WHERE member.mail_checked AND member.is_active and member.mail IS NOT NULL +TRUNCATE `member_email`; +INSERT INTO `member_email` (`email_member_id`, `email_address`, `email_primary`, `email_created`, `email_checked`, + `email_verification_value`) +SELECT `member`.`member_id` AS `email_member_id`, + `member`.`mail` AS `email_address`, + 1 AS `email_primary`, + `member`.`created_at` AS `email_created`, + `member`.`created_at` AS `email_checked`, + `member`.`verificationVal` AS `email_verification_value` +FROM `member` +WHERE `member`.`mail_checked` + AND `member`.`is_active` + AND `member`.`mail` IS NOT NULL ; -- backup member table -CREATE TABLE member_bak_20160928 LIKE member; -INSERT member_bak_20160928 SELECT * FROM member; +CREATE TABLE `member_bak_20160928` LIKE `member`; +INSERT `member_bak_20160928` +SELECT * +FROM `member`; -- after migrating to member_email we can drop the column `validationVal` ALTER TABLE `member` - DROP COLUMN `verificationVal`; + DROP COLUMN `verificationVal`; COMMIT; diff --git a/sql_code/20161011_add_index_stat_table_views.sql b/sql_code/20161011_add_index_stat_table_views.sql index 9798e3659..374174086 100644 --- a/sql_code/20161011_add_index_stat_table_views.sql +++ b/sql_code/20161011_add_index_stat_table_views.sql @@ -1,5 +1,5 @@ ALTER TABLE `activity_log` - ADD INDEX `idx_time` (`member_id` ASC,`time` DESC); + ADD INDEX `idx_time` (`member_id` ASC, `time` DESC); ALTER TABLE `stat_page_views` - ADD INDEX `idx_member` (`member_id` ASC, `created_at` ASC); \ No newline at end of file + ADD INDEX `idx_member` (`member_id` ASC, `created_at` ASC); \ No newline at end of file diff --git a/sql_code/20161025_update_session_table.sql b/sql_code/20161025_update_session_table.sql index 5a0c1e733..4cba40372 100644 --- a/sql_code/20161025_update_session_table.sql +++ b/sql_code/20161025_update_session_table.sql @@ -1,11 +1,11 @@ ALTER TABLE `session` - CHANGE COLUMN `idsession` `session_id` INT(11) NOT NULL AUTO_INCREMENT, - CHANGE COLUMN `member_id` `member_id` INT(11) NOT NULL , - CHANGE COLUMN `uuid` `remember_me_id` VARCHAR(255) NOT NULL , - ADD COLUMN `expiry` DATETIME NOT NULL AFTER `remember_me_id`, - DROP INDEX `member_uuid` , - ADD INDEX `idx_remember` (`member_id` ASC, `remember_me_id` ASC, `expiry` ASC); + CHANGE COLUMN `idsession` `session_id` INT(11) NOT NULL AUTO_INCREMENT, + CHANGE COLUMN `member_id` `member_id` INT(11) NOT NULL , + CHANGE COLUMN `uuid` `remember_me_id` VARCHAR(255) NOT NULL , + ADD COLUMN `expiry` DATETIME NOT NULL AFTER `remember_me_id`, + DROP INDEX `member_uuid` , + ADD INDEX `idx_remember` (`member_id` ASC, `remember_me_id` ASC, `expiry` ASC); UPDATE `session` -SET expiry = DATE_ADD( `session`.created, INTERVAL + 31536000 SECOND) +SET `expiry` = DATE_ADD(`session`.`created`, INTERVAL + 31536000 SECOND) ; diff --git a/sql_code/20161130_add_stat_downloads_quarter_year.sql b/sql_code/20161130_add_stat_downloads_quarter_year.sql index 0666774a0..e65414ada 100644 --- a/sql_code/20161130_add_stat_downloads_quarter_year.sql +++ b/sql_code/20161130_add_stat_downloads_quarter_year.sql @@ -1,12 +1,12 @@ - -CREATE TABLE `stat_downloads_quarter_year` ( - `project_id` INT(11) NOT NULL DEFAULT '0', - `project_category_id` INT(11) NOT NULL DEFAULT '0', - `ppload_collection_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `amount` BIGINT(21) NOT NULL DEFAULT '0', - `category_title` VARCHAR(100) NOT NULL COLLATE 'utf8_general_ci', - INDEX `idx_project_id` (`project_id`), - INDEX `idx_collection_id` (`ppload_collection_id`) +CREATE TABLE `stat_downloads_quarter_year` +( + `project_id` INT(11) NOT NULL DEFAULT '0', + `project_category_id` INT(11) NOT NULL DEFAULT '0', + `ppload_collection_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `amount` BIGINT(21) NOT NULL DEFAULT '0', + `category_title` VARCHAR(100) NOT NULL COLLATE 'utf8_general_ci', + INDEX `idx_project_id` (`project_id`), + INDEX `idx_collection_id` (`ppload_collection_id`) ) -ENGINE=InnoDB + ENGINE = InnoDB ; \ No newline at end of file diff --git a/sql_code/20170103_add_trigger_comment_update.sql b/sql_code/20170103_add_trigger_comment_update.sql index 997976d9f..d3e7f4c28 100644 --- a/sql_code/20170103_add_trigger_comment_update.sql +++ b/sql_code/20170103_add_trigger_comment_update.sql @@ -1,14 +1,18 @@ /** * If a comment will be deleted (hidden) then update num of * active comments in project (viewd in explore list). */ -CREATE TRIGGER `comment_update` BEFORE UPDATE ON `comments` FOR EACH ROW BEGIN +CREATE TRIGGER `comment_update` + BEFORE UPDATE + ON `comments` + FOR EACH ROW +BEGIN - IF NEW.comment_active = 0 AND OLD.comment_active = 1 THEN - - UPDATE project p - SET p.count_comments = (p.count_comments-1) - WHERE p.project_id = NEW.comment_target_id; - - END IF; + IF `NEW`.`comment_active` = 0 AND `OLD`.`comment_active` = 1 THEN + + UPDATE `project` `p` + SET `p`.`count_comments` = (`p`.`count_comments` - 1) + WHERE `p`.`project_id` = `NEW`.`comment_target_id`; + + END IF; END diff --git a/sql_code/20170112_create_table_member_token.sql b/sql_code/20170112_create_table_member_token.sql index a91f1d526..0b007d6d8 100644 --- a/sql_code/20170112_create_table_member_token.sql +++ b/sql_code/20170112_create_table_member_token.sql @@ -1,25 +1,30 @@ -CREATE TABLE `member_token` ( - `token_id` int(11) NOT NULL AUTO_INCREMENT, - `token_member_id` int(11) NOT NULL, - `token_provider_name` varchar(45) NOT NULL, - `token_value` varchar(45) NOT NULL, - `token_provider_username` varchar(45) DEFAULT NULL, - `token_fingerprint` varchar(45) DEFAULT NULL, - `token_created` datetime DEFAULT NULL, - `token_changed` datetime DEFAULT NULL, - `token_deleted` datetime DEFAULT NULL, - PRIMARY KEY (`token_id`), - KEY `idx_token` (`token_member_id`,`token_provider_name`,`token_value`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +CREATE TABLE `member_token` +( + `token_id` int(11) NOT NULL AUTO_INCREMENT, + `token_member_id` int(11) NOT NULL, + `token_provider_name` varchar(45) NOT NULL, + `token_value` varchar(45) NOT NULL, + `token_provider_username` varchar(45) DEFAULT NULL, + `token_fingerprint` varchar(45) DEFAULT NULL, + `token_created` datetime DEFAULT NULL, + `token_changed` datetime DEFAULT NULL, + `token_deleted` datetime DEFAULT NULL, + PRIMARY KEY (`token_id`), + KEY `idx_token` (`token_member_id`, `token_provider_name`, `token_value`) +) ENGINE = InnoDB + DEFAULT CHARSET = `latin1`; DELIMITER $$ -DROP TRIGGER IF EXISTS member_token_BEFORE_INSERT$$ +DROP TRIGGER IF EXISTS `member_token_BEFORE_INSERT`$$ -CREATE DEFINER = CURRENT_USER TRIGGER `member_token_BEFORE_INSERT` BEFORE INSERT ON `member_token` FOR EACH ROW - BEGIN - IF NEW.token_created IS NULL THEN - SET NEW.token_created = NOW(); +CREATE DEFINER = CURRENT_USER TRIGGER `member_token_BEFORE_INSERT` + BEFORE INSERT + ON `member_token` + FOR EACH ROW +BEGIN + IF `NEW`.`token_created` IS NULL THEN + SET `NEW`.`token_created` = NOW(); END IF; - END$$ +END$$ DELIMITER ; diff --git a/sql_code/20170123_add_masspay.sql b/sql_code/20170123_add_masspay.sql index b21e80964..ce2e67cab 100644 --- a/sql_code/20170123_add_masspay.sql +++ b/sql_code/20170123_add_masspay.sql @@ -1,35 +1,41 @@ -DROP VIEW stat_dl_payment_last_month; +DROP VIEW `stat_dl_payment_last_month`; -CREATE VIEW stat_dl_payment_last_month AS +CREATE VIEW `stat_dl_payment_last_month` AS #Letzter Monat -SELECT (DATE_FORMAT(NOW() - INTERVAL 1 MONTH,'%Y%m')) as yearmonth, count(d.id) AS num_downloads, d.owner_id as member_id, m.username, count(d.id)/100 as amount,m.mail,m.paypal_mail -FROM ppload.ppload_files_downloaded d -JOIN member m ON m.member_id = d.owner_id -WHERE - (d.downloaded_timestamp BETWEEN CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01 00:00:00') AND CONCAT(LEFT(NOW(),7),'-01 00:00:00')) +SELECT (DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y%m')) AS `yearmonth`, + count(`d`.`id`) AS `num_downloads`, + `d`.`owner_id` AS `member_id`, + `m`.`username`, + count(`d`.`id`) / 100 AS `amount`, + `m`.`mail`, + `m`.`paypal_mail` +FROM `ppload`.`ppload_files_downloaded` `d` + JOIN `member` `m` ON `m`.`member_id` = `d`.`owner_id` +WHERE (`d`.`downloaded_timestamp` BETWEEN CONCAT(LEFT(NOW() - INTERVAL 1 MONTH, 7), '-01 00:00:00') AND CONCAT(LEFT(NOW(), 7), '-01 00:00:00')) # AND count(d.id) > 100 -GROUP BY d.owner_id -ORDER BY count(d.id) DESC; +GROUP BY `d`.`owner_id` +ORDER BY count(`d`.`id`) DESC; -CREATE TABLE `payout` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `yearmonth` INT(11) NOT NULL, - `member_id` INT(11) NOT NULL, - `mail` VARCHAR(50) NOT NULL, - `paypal_mail` VARCHAR(50) NULL DEFAULT NULL, - `amount` DOUBLE NOT NULL, - `num_downloads` INT(11) NOT NULL, - `status` INT(11) NOT NULL DEFAULT '0' COMMENT '0=new,1=start request,2=money recieved,99=error', - `timestamp_create` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - `timestamp_masspay_start` TIMESTAMP NULL DEFAULT NULL, - `timestamp_masspay_last_ipn` TIMESTAMP NULL DEFAULT NULL, - `paypal_ipn` TEXT NULL, - PRIMARY KEY (`id`), - UNIQUE INDEX `UK_PAYOUT` (`yearmonth`, `member_id`) +CREATE TABLE `payout` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `yearmonth` INT(11) NOT NULL, + `member_id` INT(11) NOT NULL, + `mail` VARCHAR(50) NOT NULL, + `paypal_mail` VARCHAR(50) NULL DEFAULT NULL, + `amount` DOUBLE NOT NULL, + `num_downloads` INT(11) NOT NULL, + `status` INT(11) NOT NULL DEFAULT '0' COMMENT '0=new,1=start request,2=money recieved,99=error', + `timestamp_create` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `timestamp_masspay_start` TIMESTAMP NULL DEFAULT NULL, + `timestamp_masspay_last_ipn` TIMESTAMP NULL DEFAULT NULL, + `paypal_ipn` TEXT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `UK_PAYOUT` (`yearmonth`, `member_id`) ) -COMMENT='Table for our monthly payouts' -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB + COMMENT ='Table for our monthly payouts' + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB ; diff --git a/sql_code/20170125_add_package_type_in_store_config.sql b/sql_code/20170125_add_package_type_in_store_config.sql index 97f97a1ed..0359b19e0 100644 --- a/sql_code/20170125_add_package_type_in_store_config.sql +++ b/sql_code/20170125_add_package_type_in_store_config.sql @@ -1,2 +1,2 @@ ALTER TABLE `config_store` - ADD COLUMN `package_type` VARCHAR(45) NULL DEFAULT NULL COMMENT '1-n package_type_ids' AFTER `google_id`; + ADD COLUMN `package_type` VARCHAR(45) NULL DEFAULT NULL COMMENT '1-n package_type_ids' AFTER `google_id`; diff --git a/sql_code/20170223_add_table_sso_token b/sql_code/20170223_add_table_sso_token deleted file mode 100644 index b6f094536..000000000 --- a/sql_code/20170223_add_table_sso_token +++ /dev/null @@ -1,28 +0,0 @@ -USE `pling`; - -CREATE TABLE `sso_auth_token` ( - `sso_auth_token_id` int(11) NOT NULL AUTO_INCREMENT, - `token_member_id` int(11) NOT NULL, - `token_value` varchar(45) NOT NULL, - `token_action` varchar(45) NOT NULL, - `remember_me` int(1) DEFAULT '0', - `token_created` datetime DEFAULT NULL, - `token_changed` datetime DEFAULT NULL, - `token_expired` datetime DEFAULT NULL, - PRIMARY KEY (`sso_auth_token_id`), - KEY `idx_token` (`token_member_id`,`token_value`,`token_action`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; - -DELIMITER $$ - -DROP TRIGGER IF EXISTS sso_auth_token_BEFORE_INSERT$$ -CREATE DEFINER = CURRENT_USER TRIGGER `sso_auth_token_BEFORE_INSERT` BEFORE INSERT ON `sso_auth_token` FOR EACH ROW - BEGIN - IF NEW.token_created IS NULL THEN - SET NEW.token_created = NOW(); - END IF; - IF NEW.token_expired IS NULL THEN - SET NEW.token_expired = NOW() + INTERVAL 1 HOUR; - END IF; - END$$ -DELIMITER ; diff --git a/sql_code/20170223_add_table_sso_token.sql b/sql_code/20170223_add_table_sso_token.sql new file mode 100644 index 000000000..2d70a5205 --- /dev/null +++ b/sql_code/20170223_add_table_sso_token.sql @@ -0,0 +1,34 @@ + + +CREATE TABLE `sso_auth_token` +( + `sso_auth_token_id` int(11) NOT NULL AUTO_INCREMENT, + `token_member_id` int(11) NOT NULL, + `token_value` varchar(45) NOT NULL, + `token_action` varchar(45) NOT NULL, + `remember_me` int(1) DEFAULT '0', + `token_created` datetime DEFAULT NULL, + `token_changed` datetime DEFAULT NULL, + `token_expired` datetime DEFAULT NULL, + PRIMARY KEY (`sso_auth_token_id`), + KEY `idx_token` (`token_member_id`, `token_value`, `token_action`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = `latin1`; + +DELIMITER $$ + +DROP TRIGGER IF EXISTS `sso_auth_token_BEFORE_INSERT`$$ +CREATE DEFINER = CURRENT_USER TRIGGER `sso_auth_token_BEFORE_INSERT` + BEFORE INSERT + ON `sso_auth_token` + FOR EACH ROW +BEGIN + IF `NEW`.`token_created` IS NULL THEN + SET `NEW`.`token_created` = NOW(); + END IF; + IF `NEW`.`token_expired` IS NULL THEN + SET `NEW`.`token_expired` = NOW() + INTERVAL 1 HOUR; + END IF; +END$$ +DELIMITER ; diff --git a/sql_code/20170505_projects_mv.sql b/sql_code/20170505_projects_mv.sql index f5e9bd3a7..05d41cda8 100644 --- a/sql_code/20170505_projects_mv.sql +++ b/sql_code/20170505_projects_mv.sql @@ -1,160 +1,160 @@ ALTER TABLE `pling`.`project` - ADD COLUMN `hive_category_id` INT(11) NOT NULL DEFAULT 0 AFTER `source_type`; + ADD COLUMN `hive_category_id` INT(11) NOT NULL DEFAULT 0 AFTER `source_type`; #create view and tables -DROP VIEW IF EXISTS stat_projects_v; -CREATE VIEW stat_projects_v AS -SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`is_active` AS `is_active`, - `project`.`is_deleted` AS `is_deleted`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`approved` AS `approved`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `project`.`changed_at` AS `project_changed_at`, - (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)),2) * 100) AS `laplace_score`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling` +DROP VIEW IF EXISTS `stat_projects_v`; +CREATE VIEW `stat_projects_v` AS +SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`is_active` AS `is_active`, + `project`.`is_deleted` AS `is_deleted`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`approved` AS `approved`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `project`.`changed_at` AS `project_changed_at`, + (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * + 100) AS `laplace_score`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling` FROM (((`project` -JOIN `member` ON(((`project`.`member_id` = `member`.`member_id`) AND (`member`.`is_active` = 1) AND (`member`.`is_deleted` = 0)))) -JOIN `project_category` ON((`project`.`project_category_id` = `project_category`.`project_category_id`))) -LEFT JOIN `stat_plings` ON((`project`.`project_id` = `stat_plings`.`project_id`))) + JOIN `member` ON (((`project`.`member_id` = `member`.`member_id`) AND (`member`.`is_active` = 1) AND + (`member`.`is_deleted` = 0)))) + JOIN `project_category` ON ((`project`.`project_category_id` = `project_category`.`project_category_id`))) + LEFT JOIN `stat_plings` ON ((`project`.`project_id` = `stat_plings`.`project_id`))) WHERE ((`project`.`status` = 100) AND (`project`.`type_id` = 1)) ; -CREATE TABLE `stat_projects` ( - `project_id` INT(11) NOT NULL DEFAULT '0', - `member_id` INT(11) NOT NULL DEFAULT '0', - `content_type` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci', - `project_category_id` INT(11) NOT NULL DEFAULT '0', - `hive_category_id` INT(11) NOT NULL DEFAULT '0', - `is_active` INT(1) NOT NULL DEFAULT '0', - `is_deleted` INT(1) NOT NULL DEFAULT '0', - `status` INT(11) NOT NULL DEFAULT '0', - `uuid` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `pid` INT(11) NULL DEFAULT NULL COMMENT 'ParentId', - `type_id` INT(11) NULL DEFAULT NULL COMMENT '0 = DummyProject, 1 = Project, 2 = Update', - `title` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `description` TEXT NULL COLLATE 'utf8_general_ci', - `version` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `image_big` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `image_small` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `start_date` DATETIME NULL DEFAULT NULL, - `content_url` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `created_at` DATETIME NULL DEFAULT NULL, - `changed_at` DATETIME NULL DEFAULT NULL, - `deleted_at` DATETIME NULL DEFAULT NULL, - `creator_id` INT(11) NULL DEFAULT NULL COMMENT 'Member_id of the creator. Importent for groups.', - `facebook_code` TEXT NULL COLLATE 'utf8_general_ci', - `github_code` TEXT NULL COLLATE 'utf8_general_ci', - `twitter_code` TEXT NULL COLLATE 'utf8_general_ci', - `google_code` TEXT NULL COLLATE 'utf8_general_ci', - `link_1` TEXT NULL COLLATE 'utf8_general_ci', - `embed_code` TEXT NULL COLLATE 'utf8_general_ci', - `ppload_collection_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `validated` INT(1) NULL DEFAULT NULL, - `validated_at` DATETIME NULL DEFAULT NULL, - `featured` INT(1) NULL DEFAULT NULL, - `approved` INT(1) NULL DEFAULT NULL, - `amount` INT(11) NULL DEFAULT NULL, - `amount_period` VARCHAR(45) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `claimable` INT(1) NULL DEFAULT NULL, - `claimed_by_member` INT(11) NULL DEFAULT NULL, - `count_likes` INT(11) NULL DEFAULT NULL, - `count_dislikes` INT(11) NULL DEFAULT NULL, - `count_comments` INT(11) NULL DEFAULT NULL, - `count_downloads_hive` INT(11) NULL DEFAULT NULL, - `source_id` INT(11) NULL DEFAULT NULL, - `source_pk` INT(11) NULL DEFAULT NULL, - `source_type` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `project_validated` INT(1) NULL DEFAULT NULL, - `project_uuid` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `project_status` INT(11) NOT NULL DEFAULT '0', - `project_created_at` DATETIME NULL DEFAULT NULL, - `member_type` INT(1) NOT NULL DEFAULT '0' COMMENT 'Type: 0 = Member, 1 = group', - `project_member_id` INT(10) NOT NULL DEFAULT '0', - `project_changed_at` DATETIME NULL DEFAULT NULL, - `laplace_score` DECIMAL(17,2) NULL DEFAULT NULL, - `username` VARCHAR(255) NOT NULL COLLATE 'utf8_bin', - `profile_image_url` VARCHAR(355) NULL DEFAULT NULL COMMENT 'URL to the profile-image' COLLATE 'utf8_general_ci', - `city` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `country` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `member_created_at` DATETIME NULL DEFAULT NULL, - `paypal_mail` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', - `cat_title` VARCHAR(100) NOT NULL COLLATE 'utf8_general_ci', - `amount_received` DOUBLE(19,2) NULL DEFAULT NULL, - `count_plings` BIGINT(21) NULL DEFAULT NULL, - `count_plingers` BIGINT(21) NULL DEFAULT NULL, - `latest_pling` TIMESTAMP NULL DEFAULT NULL COMMENT 'When did paypal say, that this pling was payed successfull', - INDEX `idx_project_cat_id` (`project_category_id`) +CREATE TABLE `stat_projects` +( + `project_id` INT(11) NOT NULL DEFAULT '0', + `member_id` INT(11) NOT NULL DEFAULT '0', + `content_type` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci', + `project_category_id` INT(11) NOT NULL DEFAULT '0', + `hive_category_id` INT(11) NOT NULL DEFAULT '0', + `is_active` INT(1) NOT NULL DEFAULT '0', + `is_deleted` INT(1) NOT NULL DEFAULT '0', + `status` INT(11) NOT NULL DEFAULT '0', + `uuid` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `pid` INT(11) NULL DEFAULT NULL COMMENT 'ParentId', + `type_id` INT(11) NULL DEFAULT NULL COMMENT '0 = DummyProject, 1 = Project, 2 = Update', + `title` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `description` TEXT NULL COLLATE 'utf8_general_ci', + `version` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `image_big` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `image_small` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `start_date` DATETIME NULL DEFAULT NULL, + `content_url` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `created_at` DATETIME NULL DEFAULT NULL, + `changed_at` DATETIME NULL DEFAULT NULL, + `deleted_at` DATETIME NULL DEFAULT NULL, + `creator_id` INT(11) NULL DEFAULT NULL COMMENT 'Member_id of the creator. Importent for groups.', + `facebook_code` TEXT NULL COLLATE 'utf8_general_ci', + `github_code` TEXT NULL COLLATE 'utf8_general_ci', + `twitter_code` TEXT NULL COLLATE 'utf8_general_ci', + `google_code` TEXT NULL COLLATE 'utf8_general_ci', + `link_1` TEXT NULL COLLATE 'utf8_general_ci', + `embed_code` TEXT NULL COLLATE 'utf8_general_ci', + `ppload_collection_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `validated` INT(1) NULL DEFAULT NULL, + `validated_at` DATETIME NULL DEFAULT NULL, + `featured` INT(1) NULL DEFAULT NULL, + `approved` INT(1) NULL DEFAULT NULL, + `amount` INT(11) NULL DEFAULT NULL, + `amount_period` VARCHAR(45) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `claimable` INT(1) NULL DEFAULT NULL, + `claimed_by_member` INT(11) NULL DEFAULT NULL, + `count_likes` INT(11) NULL DEFAULT NULL, + `count_dislikes` INT(11) NULL DEFAULT NULL, + `count_comments` INT(11) NULL DEFAULT NULL, + `count_downloads_hive` INT(11) NULL DEFAULT NULL, + `source_id` INT(11) NULL DEFAULT NULL, + `source_pk` INT(11) NULL DEFAULT NULL, + `source_type` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `project_validated` INT(1) NULL DEFAULT NULL, + `project_uuid` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `project_status` INT(11) NOT NULL DEFAULT '0', + `project_created_at` DATETIME NULL DEFAULT NULL, + `member_type` INT(1) NOT NULL DEFAULT '0' COMMENT 'Type: 0 = Member, 1 = group', + `project_member_id` INT(10) NOT NULL DEFAULT '0', + `project_changed_at` DATETIME NULL DEFAULT NULL, + `laplace_score` DECIMAL(17, 2) NULL DEFAULT NULL, + `username` VARCHAR(255) NOT NULL COLLATE 'utf8_bin', + `profile_image_url` VARCHAR(355) NULL DEFAULT NULL COMMENT 'URL to the profile-image' COLLATE 'utf8_general_ci', + `city` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `country` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `member_created_at` DATETIME NULL DEFAULT NULL, + `paypal_mail` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci', + `cat_title` VARCHAR(100) NOT NULL COLLATE 'utf8_general_ci', + `amount_received` DOUBLE(19, 2) NULL DEFAULT NULL, + `count_plings` BIGINT(21) NULL DEFAULT NULL, + `count_plingers` BIGINT(21) NULL DEFAULT NULL, + `latest_pling` TIMESTAMP NULL DEFAULT NULL COMMENT 'When did paypal say, that this pling was payed successfull', + INDEX `idx_project_cat_id` (`project_category_id`) ) -ENGINE=InnoDB + ENGINE = InnoDB ; - - #Update machanism START TRANSACTION; -CREATE TABLE stat_projects_new LIKE stat_projects; -INSERT INTO stat_projects_new (select * from stat_projects_v); +CREATE TABLE `stat_projects_new` LIKE `stat_projects`; +INSERT INTO `stat_projects_new` (SELECT * FROM `stat_projects_v`); RENAME TABLE `stat_projects` TO `stat_projects_old`; RENAME TABLE `stat_projects_new` TO `stat_projects`; DROP TABLE `stat_projects_old`; COMMIT; diff --git a/sql_code/20170510_add_fields_stat_projects.sql b/sql_code/20170510_add_fields_stat_projects.sql index 8a8b32a4d..abda2e921 100644 --- a/sql_code/20170510_add_fields_stat_projects.sql +++ b/sql_code/20170510_add_fields_stat_projects.sql @@ -1,3 +1,3 @@ ALTER TABLE `stat_projects` - ADD COLUMN `cat_xdg_type` VARCHAR(100) NOT NULL AFTER `cat_title`, - ADD COLUMN `cat_name_legacy` VARCHAR(100) NOT NULL AFTER `cat_xdg_type`; + ADD COLUMN `cat_xdg_type` VARCHAR(100) NOT NULL AFTER `cat_title`, + ADD COLUMN `cat_name_legacy` VARCHAR(100) NOT NULL AFTER `cat_xdg_type`; diff --git a/sql_code/20170526_alter_table_report_project.sql b/sql_code/20170526_alter_table_report_project.sql index 200b7a849..7060fd7b9 100644 --- a/sql_code/20170526_alter_table_report_project.sql +++ b/sql_code/20170526_alter_table_report_project.sql @@ -1,6 +1,6 @@ -USE `pling`; + ALTER TABLE `reports_project` - CHANGE COLUMN `is_deleted` `is_deleted` INT(1) NOT NULL DEFAULT '0' , - ADD INDEX `idxReport` (`project_id` ASC, `reported_by` ASC, `is_deleted` ASC, `created_at` ASC), - DROP INDEX `idxMemberId` , - DROP INDEX `idxProjectId` ; \ No newline at end of file + CHANGE COLUMN `is_deleted` `is_deleted` INT(1) NOT NULL DEFAULT '0' , + ADD INDEX `idxReport` (`project_id` ASC, `reported_by` ASC, `is_deleted` ASC, `created_at` ASC), + DROP INDEX `idxMemberId` , + DROP INDEX `idxProjectId`; \ No newline at end of file diff --git a/sql_code/20170529_add_view reported_projects.sql b/sql_code/20170529_add_view reported_projects.sql index c0ed1b284..3df6ff036 100644 --- a/sql_code/20170529_add_view reported_projects.sql +++ b/sql_code/20170529_add_view reported_projects.sql @@ -1,103 +1,98 @@ -USE `pling`; + CREATE OR REPLACE - ALGORITHM = UNDEFINED - DEFINER = CURRENT_USER - SQL SECURITY DEFINER -VIEW `view_reported_projects` AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; + ALGORITHM = UNDEFINED + DEFINER = CURRENT_USER + SQL SECURITY DEFINER + VIEW `view_reported_projects` AS +SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` +FROM `reports_project` +WHERE (`reports_project`.`is_deleted` = 0) +GROUP BY `reports_project`.`project_id` +; CREATE OR REPLACE - ALGORITHM = TEMPTABLE - DEFINER = CURRENT_USER - SQL SECURITY DEFINER -VIEW `stat_projects_v` AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`approved` AS `approved`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `project`.`changed_at` AS `project_changed_at`, - (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * 100) AS `laplace_score`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `view_reported_projects`.`amount_reports` AS `amount_reports` - FROM - `project` - JOIN - `member` ON ((`member`.`member_id` = `project`.`member_id`)) - JOIN - `project_category` ON ((`project`.`project_category_id` = `project_category`.`project_category_id`)) - LEFT JOIN - `stat_plings` ON ((`stat_plings`.`project_id` = `project`.`project_id`)) - LEFT JOIN - `view_reported_projects` ON ((`view_reported_projects`.`project_id` = `project`.`project_id`)) - WHERE - ((`member`.`is_deleted` = 0) - AND (`member`.`is_active` = 1) - AND (`project`.`type_id` = 1) - AND (`project`.`status` = 100)) + ALGORITHM = TEMPTABLE + DEFINER = CURRENT_USER + SQL SECURITY DEFINER + VIEW `stat_projects_v` AS +SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`approved` AS `approved`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `project`.`changed_at` AS `project_changed_at`, + (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * + 100) AS `laplace_score`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `view_reported_projects`.`amount_reports` AS `amount_reports` +FROM `project` + JOIN + `member` ON ((`member`.`member_id` = `project`.`member_id`)) + JOIN + `project_category` ON ((`project`.`project_category_id` = `project_category`.`project_category_id`)) + LEFT JOIN + `stat_plings` ON ((`stat_plings`.`project_id` = `project`.`project_id`)) + LEFT JOIN + `view_reported_projects` ON ((`view_reported_projects`.`project_id` = `project`.`project_id`)) +WHERE ((`member`.`is_deleted` = 0) + AND (`member`.`is_active` = 1) + AND (`project`.`type_id` = 1) + AND (`project`.`status` = 100)) ; diff --git a/sql_code/20170607_add_field_to_config_store.sql b/sql_code/20170607_add_field_to_config_store.sql index 8aac6d310..410700e56 100644 --- a/sql_code/20170607_add_field_to_config_store.sql +++ b/sql_code/20170607_add_field_to_config_store.sql @@ -1,2 +1,2 @@ ALTER TABLE `config_store` - ADD COLUMN `cross_domain_login` INT(1) NOT NULL DEFAULT '0' AFTER `package_type`; + ADD COLUMN `cross_domain_login` INT(1) NOT NULL DEFAULT '0' AFTER `package_type`; diff --git a/sql_code/20170607_add_field_to_project.sql b/sql_code/20170607_add_field_to_project.sql index 8870ebfe0..a927ef29e 100644 --- a/sql_code/20170607_add_field_to_project.sql +++ b/sql_code/20170607_add_field_to_project.sql @@ -1,2 +1,2 @@ ALTER TABLE `project` - ADD COLUMN `spam_checked` INT(1) NOT NULL DEFAULT '0' AFTER `approved`; + ADD COLUMN `spam_checked` INT(1) NOT NULL DEFAULT '0' AFTER `approved`; diff --git a/sql_code/20170608_add_paypal_valid_status.sql b/sql_code/20170608_add_paypal_valid_status.sql index 0cf31d699..eba6fe687 100644 --- a/sql_code/20170608_add_paypal_valid_status.sql +++ b/sql_code/20170608_add_paypal_valid_status.sql @@ -1,23 +1,36 @@ ALTER TABLE `member` - ADD COLUMN `paypal_valid_status` MEDIUMINT NULL DEFAULT NULL AFTER `paypal_mail`; + ADD COLUMN `paypal_valid_status` MEDIUMINT NULL DEFAULT NULL AFTER `paypal_mail`; -CREATE TABLE `paypal_valid_status` ( - `id` INT(11) NOT NULL, - `title` VARCHAR(50) NULL DEFAULT NULL, - `description` TEXT NULL, - `color` VARCHAR(50) NULL DEFAULT NULL, - `is_active` INT(1) NULL DEFAULT '1', - PRIMARY KEY (`id`) +CREATE TABLE `paypal_valid_status` +( + `id` INT(11) NOT NULL, + `title` VARCHAR(50) NULL DEFAULT NULL, + `description` TEXT NULL, + `color` VARCHAR(50) NULL DEFAULT NULL, + `is_active` INT(1) NULL DEFAULT '1', + PRIMARY KEY (`id`) ) -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB ; -insert into paypal_valid_status (id,title,desciption,color) values (0,'New','New - valid status unknown','yellow'); -insert into paypal_valid_status (id,title,desciption,color) values (100,'Valid','Valid - we can send you money per PayPal','green'); -insert into paypal_valid_status (id,title,desciption,color) values (404,'Unknown Address','Invalid - Your PayPal-Address could not be found.','red'); -insert into paypal_valid_status (id,title,desciption,color) values (500,'Invalid','Invalid - at the moment we can not send you money per PayPal','red'); -insert into paypal_valid_status (id,title,desciption,color) values (501,'Can receive only from homepage.','Invalid - You can only receive money from homepage. Please change your Settings on the PayPal Website.','red'); -insert into paypal_valid_status (id,title,desciption,color) values (502,'Can receive only personal payments.','Invalid - You can not receive personal payments. Please change your Settings on the PayPal Website.','red'); -insert into paypal_valid_status (id,title,desciption,color) values (503,'Currently unable to receive money.','Invalid - You are currently unable to receive money. Please change your Settings on the PayPal Website.','red'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (0, 'New', 'New - valid status unknown', 'yellow'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (100, 'Valid', 'Valid - we can send you money per PayPal', 'green'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (404, 'Unknown Address', 'Invalid - Your PayPal-Address could not be found.', 'red'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (500, 'Invalid', 'Invalid - at the moment we can not send you money per PayPal', 'red'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (501, 'Can receive only from homepage.', + 'Invalid - You can only receive money from homepage. Please change your Settings on the PayPal Website.', + 'red'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (502, 'Can receive only personal payments.', + 'Invalid - You can not receive personal payments. Please change your Settings on the PayPal Website.', 'red'); +INSERT INTO `paypal_valid_status` (`id`, `title`, `desciption`, `color`) +VALUES (503, 'Currently unable to receive money.', + 'Invalid - You are currently unable to receive money. Please change your Settings on the PayPal Website.', + 'red'); diff --git a/sql_code/20170608_alter_table_member_addcolumn.sql b/sql_code/20170608_alter_table_member_addcolumn.sql index 066cf8416..37d38f632 100644 --- a/sql_code/20170608_alter_table_member_addcolumn.sql +++ b/sql_code/20170608_alter_table_member_addcolumn.sql @@ -1 +1,2 @@ -alter table member add column profile_image_url_bg varchar(355) after profile_image_url; \ No newline at end of file +ALTER TABLE `member` + ADD COLUMN `profile_image_url_bg` varchar(355) AFTER `profile_image_url`; \ No newline at end of file diff --git a/sql_code/20170613_alter_member_table.sql b/sql_code/20170613_alter_member_table.sql index 49943d9ee..924596477 100644 --- a/sql_code/20170613_alter_member_table.sql +++ b/sql_code/20170613_alter_member_table.sql @@ -1,2 +1,2 @@ ALTER TABLE `member` - ADD COLUMN `profile_image_url_bg` VARCHAR(355) NULL DEFAULT NULL AFTER `profile_image_url`; + ADD COLUMN `profile_image_url_bg` VARCHAR(355) NULL DEFAULT NULL AFTER `profile_image_url`; diff --git a/sql_code/20170622_add_reviews.sql b/sql_code/20170622_add_reviews.sql index 916cdc369..ef2cb37a1 100644 --- a/sql_code/20170622_add_reviews.sql +++ b/sql_code/20170622_add_reviews.sql @@ -1,5 +1,6 @@ ALTER TABLE `project_rating` - ADD COLUMN `comment_id` INT(11) NULL DEFAULT '0' COMMENT 'review for rating' AFTER `user_dislike`, - ADD COLUMN `rating_active` INT(1) NULL DEFAULT '1' COMMENT 'active = 1, deleted = 0' AFTER `comment_id`; + ADD COLUMN `comment_id` INT(11) NULL DEFAULT '0' COMMENT 'review for rating' AFTER `user_dislike`, + ADD COLUMN `rating_active` INT(1) NULL DEFAULT '1' COMMENT 'active = 1, deleted = 0' AFTER `comment_id`; -UPDATE project_rating r SET r.rating_active = 1; +UPDATE `project_rating` `r` +SET `r`.`rating_active` = 1; diff --git a/sql_code/20170629_add_event_daily_views.sql b/sql_code/20170629_add_event_daily_views.sql index 808b8e8dc..fedefbf7a 100644 --- a/sql_code/20170629_add_event_daily_views.sql +++ b/sql_code/20170629_add_event_daily_views.sql @@ -1,22 +1,29 @@ -CREATE TABLE stat_page_views_48h LIKE stat_page_views; +CREATE TABLE `stat_page_views_48h` LIKE `stat_page_views`; DELIMITER $$ -DROP TRIGGER IF EXISTS stat_page_views_AFTER_INSERT$$ -CREATE TRIGGER stat_page_views_AFTER_INSERT AFTER INSERT ON stat_page_views FOR EACH ROW BEGIN - #insert also into table stat_page_views_48h - INSERT INTO stat_page_views_48h (stat_page_views_id,project_id,ip,member_id,created_at) values (new.stat_page_views_id,new.project_id,new.ip,new.member_id,new.created_at); +DROP TRIGGER IF EXISTS `stat_page_views_AFTER_INSERT`$$ +CREATE TRIGGER `stat_page_views_AFTER_INSERT` + AFTER INSERT + ON `stat_page_views` + FOR EACH ROW +BEGIN + #insert also into table stat_page_views_48h + INSERT INTO `stat_page_views_48h` (`stat_page_views_id`, `project_id`, `ip`, `member_id`, `created_at`) + VALUES (`new`.`stat_page_views_id`, `new`.`project_id`, `new`.`ip`, `new`.`member_id`, `new`.`created_at`); END$$ DROP EVENT IF EXISTS `e_generate_page_views_48h`; CREATE EVENT `e_generate_page_views_48h` - ON SCHEDULE - EVERY 1 DAY STARTS '2018-11-20 05:00:00' - ON COMPLETION PRESERVE - ENABLE - COMMENT 'Delete old page_view data from table stat_page_views_48h' - DO - DELETE FROM stat_page_views_48h WHERE created_at <= subdate(now(), 2); - + ON SCHEDULE + EVERY 1 DAY STARTS '2018-11-20 05:00:00' + ON COMPLETION PRESERVE + ENABLE + COMMENT 'Delete old page_view data from table stat_page_views_48h' + DO + DELETE + FROM `stat_page_views_48h` + WHERE `created_at` <= subdate(now(), 2); + DELIMITER ; \ No newline at end of file diff --git a/sql_code/20170629_prod_daily_views.sql b/sql_code/20170629_prod_daily_views.sql index ac6e5b379..e00b96681 100644 --- a/sql_code/20170629_prod_daily_views.sql +++ b/sql_code/20170629_prod_daily_views.sql @@ -1,52 +1,51 @@ -USE `pling`; + DROP PROCEDURE IF EXISTS `generate_stat_views_today`; DELIMITER $$ USE `pling`$$ -CREATE DEFINER = CURRENT_USER PROCEDURE `generate_stat_views_today`() - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_views_today`() +BEGIN DROP TABLE IF EXISTS `temp_stat_views_today`; - CREATE TABLE `temp_stat_views_today` ( - `id` INT NOT NULL AUTO_INCREMENT, - `project_id` INT(11) NOT NULL, - `count_views` INT(11) NULL DEFAULT 0, - `count_visitor` INT(11) NULL DEFAULT 0, - `last_view` DATETIME NULL DEFAULT NULL, - PRIMARY KEY (`id`), - INDEX `idx_project` (`project_id` ASC) + CREATE TABLE `temp_stat_views_today` + ( + `id` INT NOT NULL AUTO_INCREMENT, + `project_id` INT(11) NOT NULL, + `count_views` INT(11) NULL DEFAULT 0, + `count_visitor` INT(11) NULL DEFAULT 0, + `last_view` DATETIME NULL DEFAULT NULL, + PRIMARY KEY (`id`), + INDEX `idx_project` (`project_id` ASC) ) - ENGINE = MyISAM + ENGINE = MyISAM AS - SELECT - project_id, - COUNT(*) AS count_views, - COUNT(DISTINCT `stat_page_views`.`ip`) AS `count_visitor`, - MAX(`stat_page_views`.`created_at`) AS `last_view` - FROM stat_page_views - WHERE (stat_page_views.`created_at` - BETWEEN DATE_FORMAT(NOW(), '%Y-%m-%d 00:00') AND DATE_FORMAT(NOW(), '%Y-%m-%d 23:59') - ) - GROUP BY project_id; - - IF EXISTS(SELECT table_name - FROM INFORMATION_SCHEMA.TABLES - WHERE table_schema = DATABASE() - AND table_name = 'stat_page_views_today_mv') - + SELECT `project_id`, + COUNT(*) AS `count_views`, + COUNT(DISTINCT `stat_page_views`.`ip`) AS `count_visitor`, + MAX(`stat_page_views`.`created_at`) AS `last_view` + FROM `stat_page_views` + WHERE (`stat_page_views`.`created_at` + BETWEEN DATE_FORMAT(NOW(), '%Y-%m-%d 00:00') AND DATE_FORMAT(NOW(), '%Y-%m-%d 23:59') + ) + GROUP BY `project_id`; + + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_page_views_today_mv') THEN - - ALTER TABLE `stat_page_views_today_mv` - RENAME TO `old_stat_views_today_mv`; + ALTER TABLE `stat_page_views_today_mv` + RENAME TO `old_stat_views_today_mv`; END IF; ALTER TABLE `temp_stat_views_today` - RENAME TO `stat_page_views_today_mv`; + RENAME TO `stat_page_views_today_mv`; DROP TABLE IF EXISTS `old_stat_views_today_mv`; - END $$ +END $$ DELIMITER ; diff --git a/sql_code/20170704_add_member_paypal_table.sql b/sql_code/20170704_add_member_paypal_table.sql index d6491afd1..a2ed76a25 100644 --- a/sql_code/20170704_add_member_paypal_table.sql +++ b/sql_code/20170704_add_member_paypal_table.sql @@ -1,107 +1,397 @@ DROP TABLE `member_paypal`; -CREATE TABLE `member_paypal` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `member_id` INT(11) NULL DEFAULT NULL, - `paypal_address` VARCHAR(150) NULL DEFAULT NULL, - `is_active` INT(1) NOT NULL DEFAULT '1', - `name` VARCHAR(150) NULL DEFAULT NULL, - `address` VARCHAR(150) NULL DEFAULT NULL, - `currency` VARCHAR(150) NULL DEFAULT NULL, - `country_code` VARCHAR(150) NULL DEFAULT NULL, - `last_payment_status` VARCHAR(150) NULL DEFAULT NULL, - `last_payment_amount` DOUBLE NULL DEFAULT NULL, - `last_transaction_id` VARCHAR(50) NULL DEFAULT NULL, - `last_transaction_event_code` VARCHAR(50) NULL DEFAULT NULL, - `created_at` TIMESTAMP NULL DEFAULT NULL, - `changed_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) +CREATE TABLE `member_paypal` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `member_id` INT(11) NULL DEFAULT NULL, + `paypal_address` VARCHAR(150) NULL DEFAULT NULL, + `is_active` INT(1) NOT NULL DEFAULT '1', + `name` VARCHAR(150) NULL DEFAULT NULL, + `address` VARCHAR(150) NULL DEFAULT NULL, + `currency` VARCHAR(150) NULL DEFAULT NULL, + `country_code` VARCHAR(150) NULL DEFAULT NULL, + `last_payment_status` VARCHAR(150) NULL DEFAULT NULL, + `last_payment_amount` DOUBLE NULL DEFAULT NULL, + `last_transaction_id` VARCHAR(50) NULL DEFAULT NULL, + `last_transaction_event_code` VARCHAR(50) NULL DEFAULT NULL, + `created_at` TIMESTAMP NULL DEFAULT NULL, + `changed_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) ) -COLLATE='utf8_general_ci' -ENGINE=InnoDB -AUTO_INCREMENT=74 + COLLATE = 'utf8_general_ci' + ENGINE = InnoDB + AUTO_INCREMENT = 74 ; ALTER TABLE `member_paypal` - ADD UNIQUE INDEX `uk_paypal_address` (`paypal_address`); + ADD UNIQUE INDEX `uk_paypal_address` (`paypal_address`); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Алексей Варфоломеев','Completed','RUB','-21870.12','varlesh@gmail.com','7KK96863AX5754344','Алексей, Варфоломеев','T0000','RU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Paul Beyens','Completed','EUR','-245.42','paulbeyens@gmail.com','96661567PS4341036','Paul, Beyens','T0000','BE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('LE MAOUT GUILLAUME','Completed','EUR','-94.48','exebetche@hotmail.fr','7F337922WT999935X','LE MAOUT, GUILLAUME','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('','Pending','USD','-92.25','talamelli@libero.it','3M436460MU296622V','','T0000','',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Brook Hill','Completed','USD','-90.20','music_is4thesoul@yahoo.com','8GG56561YA353312S','Brook, Hill','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Keefer Rourke','Completed','CAD','-113.03','keefer.rourke@gmail.com','1DC62380HC6218649','Keefer, Rourke','T0000','CA',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Ahmed Alharbi','Completed','USD','-80.26','rsamalmot@gmail.com','9EY96472EY000824V','Ahmed, Alharbi','T0000','SA',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Matthieu James','Completed','EUR','-63.42','matthieu.james@gmail.com','2SY20996GF419200K','Matthieu, James','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('CHRISTOPHER HOLLAND','Completed','CAD','-90.56','zrenfire@gmail.com','1UL56145SN3373905','CHRISTOPHER, HOLLAND','T0000','CA',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('eRescue','Completed','USD','-66.47','jmtodaro@gmail.com','99J12880X84142501','jeremy, todaro','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Michail Vourlakos','Completed','EUR','-44.59','mvourlakos@gmail.com','6FA17975VJ3169237','Michail, Vourlakos','T0000','GR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('源斯 刘','Completed','USD','-50.70','1151548973@qq.com','8HC22880PR727672Y','源斯, 刘','T0000','C2',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('yanev','Completed','EUR','-42.06','gericom.hummer@gmail.com','1P966741WA233501Y','Nikola, Yanev','T0000','BG',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('RAVEfinity Open Source Design Project.','Completed','USD','-45.71','ravefinity@ravefinity.com','67A45065856497501','Jared, Soto','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Doyle Harpole','Completed','USD','-37.72','kubuntu4172@yahoo.com','2UK688847E0212107','Doyle, Harpole','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Dindin Hernawan','Completed','USD','-36.56','dindin_hernawan@yahoo.com','9TB91656EM146414W','Dindin, Hernawan','T0000','ID',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Michele Guerra','Completed','EUR','-30.66','mike.ieee1@gmail.com','85J96429SE204210U','Michele, Guerra','T0000','IT',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Charlie Henson','Completed','USD','-35.18','microfreaks@gmail.com','8LK70351BP7068617','Charlie, Henson','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('DRA','Completed','EUR','-28.65','daniruizdealegria@gmail.com','26N24064E8419024F','Daniel, Ruiz De Alegría','T0000','ES',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Holger Jaintsch','Pending','USD','-25.04','hjaintsch@gmail.com','2HL03710N2255450C','Holger, Jaintsch','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Oliver Scholtz','Completed','EUR','-20.22','scholli_tz@yahoo.de','5NX21697YB5246447','Oliver, Scholtz','T0000','ES',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Rudra Banerjee','Completed','SEK','-182.78','bnrj.rudra@live.com','7SJ50339R9869084T','Rudra, Banerjee','T0000','SE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Sam Hewitt','Completed','CAD','-25.90','hewittsamuel@gmail.com','7UR19536RV483230G','Sam, Hewitt','T0000','CA',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Daniel Faust','Pending','USD','-15.78','hessijames@ymail.com','5S9857397H8836636','Daniel, Faust','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Stolmet Żywiec Michał Dybczak','Completed','PLN','-52.91','biuro@stolmet-zywiec.pl','40V40234RC0517103','Michał, Dybczak','T0000','PL',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Milen Simic','Completed','EUR','-12.02','milen.simic@gmail.com','10809685DG1768543','Milen, Simic','T0000','RS',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Pierre ORANGE','Completed','EUR','-11.65','fruit94@msn.com','5BD115921T533740F','Pierre, ORANGE','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Alessandro Roncone','Completed','EUR','-11.24','alecive87@gmail.com','2SN30584LL049141H','Alessandro, Roncone','T0000','IT',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Nattapong Pullkhow','Completed','USD','-13.03','exenatt@gmail.com','0CV65795G9635992N','Nattapong, Pullkhow','T0000','TH',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Максим Орлов','Completed','USD','-12.56','uubboo@gmail.com','36D61468MR0997132','Максим, Орлов','T0000','RU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('John Goodland','Completed','JPY','-1107.00','zan642@gmail.com','1EG313746H690200S','John, Goodland','T0000','AU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('alexis duca','Completed','EUR','-8.88','finonino26@gmail.com','2HD847814J4891837','alexis, duca','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('stephane sansonetti','Completed','EUR','-8.61','steftrikia@gmail.com','9TK45357NR821725B','stephane, sansonetti','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Kristofer Rickheden Gustavsson','Completed','SEK','-83.99','hackan@mbox301.tele2.se','8C058888879369153','Kristofer, Rickheden Gustavsson','T0000','SE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('chris stanko','Completed','USD','-10.00','3gs32g@gmail.com','9R125975B8300333G','chris, stanko','T0000','CA',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Jelena Narezkina','Completed','EUR','-7.50','jelena.narezkina@gmail.com','5M148944SD7341924','Jelena, Narezkina','T0000','LT',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Karoly Barcza','Completed','GBP','-6.20','donate@blackpanther.hu','2MM70282L7713503K','Karoly, Barcza','T0000','GB',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('felipe aristizabal','Completed','USD','-8.31','wfpaisa@gmail.com','3S572330VV0356111','felipe, aristizabal','T0000','CO',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Anton Gonzalez','Completed','USD','-123.56','anzigo@gmail.com','3L864047FA6931700','Anton, Gonzalez','T0000','TT',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Jani Lindholm','Completed','EUR','-6.85','paypal@em.tunk.org','3SG398139W115384W','Jani, Lindholm','T0000','FI',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Holger Jaintsch','Completed','USD','-25.04','hjaintsch@gmail.com','2HL03710N2255450C','Holger, Jaintsch','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Daniel Faust','Completed','USD','-15.78','hessijames@ymail.com','5S9857397H8836636','Daniel, Faust','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('József Makay','Completed','HUF','-2028.00','makay.jozsef@gmail.com','9WE09084XB549024S','József, Makay','T0000','HU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Darin Liebegott','Completed','USD','-7.65','newhoa@gmail.com','6WK65505WT041512U','Darin, Liebegott','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Antonio Orefice','Completed','EUR','-6.45','kokoko3k@gmail.com','2DG114378U707135L','Antonio, Orefice','T0000','IT',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Konrad Stahlhofer','Completed','USD','-7.43','bluedxca93@googlemail.com','1H6504536W0007106','Konrad, Stahlhofer','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Everaldo Coelho','Completed','USD','-6.99','everaldo@everaldo.com','5LR93545UP308074U','Everaldo, Coelho','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('pling.it','Completed','USD','-10.10','payment@pling.it','2XS937018E529852G','Clemens, Toennies','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('pling.it','Completed','USD','-1.00','payment@pling.it','3WC96957X72670451','Clemens, Toennies','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('alessandro rei','Completed','EUR','-5.81','mentalrey@gmail.com','7L627466BJ432823Y','alessandro, rei','T0000','IT',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Tobias Kaiser','Pending','USD','-6.76','tobi012@gmx.de','7YT33817RJ175681T','Tobias, Kaiser','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Christophe Bricheux-Duchossois','Completed','EUR','-5.78','lefteye92@free.fr','2HF89418AM1281924','Christophe, Bricheux-Duchossois','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Scott Ferguson','Completed','AUD','-8.51','s.cottscottf@gmail.com','9VE84679U1239605B','Scott, Ferguson','T0000','AU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Ernesto Acosta','Completed','USD','-6.61','elavdeveloper@gmail.com','31D92286AS017950E','Ernesto, Acosta','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Christopher Wood','Completed','CAD','-8.31','frosspc@gmail.com','9EC909814Y156190K','Christopher, Wood','T0000','CA',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Tory Gaurnier','Completed','USD','-6.18','KoRnKloWn@linuxmail.org','10012372KS0103230','Tory, Gaurnier','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Georg Eckert','Pending','USD','-5.94','lion.d.gem.heart@gmail.com','83C754513D680272U','Georg, Eckert','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Александр Якубов','Completed','RUB','-330.58','World-fly@yandex.ru','7NB86158FR736702N','Александр, Якубов','T0000','RU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Miha Čančula','Completed','EUR','-4.95','miha.cancula@gmail.com','3JM45056RV7515218','Miha, Čančula','T0000','SI',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('','Pending','USD','-41.22','celli.mode@web.de','23U45596HP4305453','','T0000','',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Daboribo Linux','Completed','USD','-31.25','etles.team@gmail.com','81232928MU912032S','Erwin, Edy Cahyono','T0000','ID',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Антон Тихомиров','Completed','RUB','-872.08','Diamond.kde@yahoo.com','35776372FX094794U','Антон, Тихомиров','T0000','RU',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Lars Acou','Completed','EUR','-4.88','lars.acou@telenet.be','8FP47977YF2401717','Lars, Acou','T0000','BE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Jean-Alexandre Anglès d\'Auriac','Completed','EUR','-4.79','jagw40k@free.fr','9J663139LD2104335','Jean-Alexandre, Anglès d\'Auriac','T0000','FR',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('James Hardy','Completed','GBP','-4.05','jameshardy88@gmail.com','0TJ05858BP1667740','James, Hardy','T0000','GB',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Stefano Rosselli','Completed','USD','-5.29','bloomind.studio@gmail.com','43P939541K426654C','Stefano, Rosselli','T0000','CH',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Daniel Fore','Completed','USD','-5.29','Daniel.P.Fore@gmail.com','8XX1253526902043D','Daniel, Fore','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Leszek Lesner','Pending','USD','-5.04','leszek.lesner@web.de','23V003349H478045E','Leszek, Lesner','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Robert Bosak','Completed','USD','-4.97','BBOSAK2143@gmail.com','5G716149E3425380F','Robert, Bosak','T0000','US',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Piotr Arłukowicz','Completed','EUR','-4.03','piotao@gmail.com','5P191039R5161262M','Piotr, Arłukowicz','T0000','PL',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Stefan Siegl','Pending','USD','-4.58','sis@soulinsadness.de','1KM71136EH2876453','Stefan, Siegl','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Leszek Lesner','Completed','USD','-5.04','leszek.lesner@web.de','23V003349H478045E','Leszek, Lesner','T0000','DE',NOW()); -INSERT INTO `member_paypal` (`name`,`last_payment_status`, `currency`,`last_payment_amount`, `paypal_address`,`last_transaction_id`,`address`,`last_transaction_event_code`, `country_code`, `created_at`) VALUES ('Tobias Kaiser','Completed','USD','-6.76','tobi012@gmx.de','7YT33817RJ175681T','Tobias, Kaiser','T0000','DE',NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Алексей Варфоломеев', 'Completed', 'RUB', '-21870.12', 'varlesh@gmail.com', '7KK96863AX5754344', + 'Алексей, Варфоломеев', 'T0000', 'RU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Paul Beyens', 'Completed', 'EUR', '-245.42', 'paulbeyens@gmail.com', '96661567PS4341036', 'Paul, Beyens', + 'T0000', 'BE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('LE MAOUT GUILLAUME', 'Completed', 'EUR', '-94.48', 'exebetche@hotmail.fr', '7F337922WT999935X', + 'LE MAOUT, GUILLAUME', 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('', 'Pending', 'USD', '-92.25', 'talamelli@libero.it', '3M436460MU296622V', '', 'T0000', '', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Brook Hill', 'Completed', 'USD', '-90.20', 'music_is4thesoul@yahoo.com', '8GG56561YA353312S', 'Brook, Hill', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Keefer Rourke', 'Completed', 'CAD', '-113.03', 'keefer.rourke@gmail.com', '1DC62380HC6218649', + 'Keefer, Rourke', 'T0000', 'CA', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Ahmed Alharbi', 'Completed', 'USD', '-80.26', 'rsamalmot@gmail.com', '9EY96472EY000824V', 'Ahmed, Alharbi', + 'T0000', 'SA', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Matthieu James', 'Completed', 'EUR', '-63.42', 'matthieu.james@gmail.com', '2SY20996GF419200K', + 'Matthieu, James', 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('CHRISTOPHER HOLLAND', 'Completed', 'CAD', '-90.56', 'zrenfire@gmail.com', '1UL56145SN3373905', + 'CHRISTOPHER, HOLLAND', 'T0000', 'CA', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('eRescue', 'Completed', 'USD', '-66.47', 'jmtodaro@gmail.com', '99J12880X84142501', 'jeremy, todaro', 'T0000', + 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Michail Vourlakos', 'Completed', 'EUR', '-44.59', 'mvourlakos@gmail.com', '6FA17975VJ3169237', + 'Michail, Vourlakos', 'T0000', 'GR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('源斯 刘', 'Completed', 'USD', '-50.70', '1151548973@qq.com', '8HC22880PR727672Y', '源斯, 刘', 'T0000', 'C2', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('yanev', 'Completed', 'EUR', '-42.06', 'gericom.hummer@gmail.com', '1P966741WA233501Y', 'Nikola, Yanev', + 'T0000', 'BG', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('RAVEfinity Open Source Design Project.', 'Completed', 'USD', '-45.71', 'ravefinity@ravefinity.com', + '67A45065856497501', 'Jared, Soto', 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Doyle Harpole', 'Completed', 'USD', '-37.72', 'kubuntu4172@yahoo.com', '2UK688847E0212107', 'Doyle, Harpole', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Dindin Hernawan', 'Completed', 'USD', '-36.56', 'dindin_hernawan@yahoo.com', '9TB91656EM146414W', + 'Dindin, Hernawan', 'T0000', 'ID', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Michele Guerra', 'Completed', 'EUR', '-30.66', 'mike.ieee1@gmail.com', '85J96429SE204210U', 'Michele, Guerra', + 'T0000', 'IT', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Charlie Henson', 'Completed', 'USD', '-35.18', 'microfreaks@gmail.com', '8LK70351BP7068617', 'Charlie, Henson', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('DRA', 'Completed', 'EUR', '-28.65', 'daniruizdealegria@gmail.com', '26N24064E8419024F', + 'Daniel, Ruiz De Alegría', 'T0000', 'ES', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Holger Jaintsch', 'Pending', 'USD', '-25.04', 'hjaintsch@gmail.com', '2HL03710N2255450C', 'Holger, Jaintsch', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Oliver Scholtz', 'Completed', 'EUR', '-20.22', 'scholli_tz@yahoo.de', '5NX21697YB5246447', 'Oliver, Scholtz', + 'T0000', 'ES', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Rudra Banerjee', 'Completed', 'SEK', '-182.78', 'bnrj.rudra@live.com', '7SJ50339R9869084T', 'Rudra, Banerjee', + 'T0000', 'SE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Sam Hewitt', 'Completed', 'CAD', '-25.90', 'hewittsamuel@gmail.com', '7UR19536RV483230G', 'Sam, Hewitt', + 'T0000', 'CA', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Daniel Faust', 'Pending', 'USD', '-15.78', 'hessijames@ymail.com', '5S9857397H8836636', 'Daniel, Faust', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Stolmet Żywiec Michał Dybczak', 'Completed', 'PLN', '-52.91', 'biuro@stolmet-zywiec.pl', '40V40234RC0517103', + 'Michał, Dybczak', 'T0000', 'PL', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Milen Simic', 'Completed', 'EUR', '-12.02', 'milen.simic@gmail.com', '10809685DG1768543', 'Milen, Simic', + 'T0000', 'RS', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Pierre ORANGE', 'Completed', 'EUR', '-11.65', 'fruit94@msn.com', '5BD115921T533740F', 'Pierre, ORANGE', + 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Alessandro Roncone', 'Completed', 'EUR', '-11.24', 'alecive87@gmail.com', '2SN30584LL049141H', + 'Alessandro, Roncone', 'T0000', 'IT', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Nattapong Pullkhow', 'Completed', 'USD', '-13.03', 'exenatt@gmail.com', '0CV65795G9635992N', + 'Nattapong, Pullkhow', 'T0000', 'TH', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Максим Орлов', 'Completed', 'USD', '-12.56', 'uubboo@gmail.com', '36D61468MR0997132', 'Максим, Орлов', 'T0000', + 'RU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('John Goodland', 'Completed', 'JPY', '-1107.00', 'zan642@gmail.com', '1EG313746H690200S', 'John, Goodland', + 'T0000', 'AU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('alexis duca', 'Completed', 'EUR', '-8.88', 'finonino26@gmail.com', '2HD847814J4891837', 'alexis, duca', + 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('stephane sansonetti', 'Completed', 'EUR', '-8.61', 'steftrikia@gmail.com', '9TK45357NR821725B', + 'stephane, sansonetti', 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Kristofer Rickheden Gustavsson', 'Completed', 'SEK', '-83.99', 'hackan@mbox301.tele2.se', '8C058888879369153', + 'Kristofer, Rickheden Gustavsson', 'T0000', 'SE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('chris stanko', 'Completed', 'USD', '-10.00', '3gs32g@gmail.com', '9R125975B8300333G', 'chris, stanko', 'T0000', + 'CA', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Jelena Narezkina', 'Completed', 'EUR', '-7.50', 'jelena.narezkina@gmail.com', '5M148944SD7341924', + 'Jelena, Narezkina', 'T0000', 'LT', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Karoly Barcza', 'Completed', 'GBP', '-6.20', 'donate@blackpanther.hu', '2MM70282L7713503K', 'Karoly, Barcza', + 'T0000', 'GB', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('felipe aristizabal', 'Completed', 'USD', '-8.31', 'wfpaisa@gmail.com', '3S572330VV0356111', + 'felipe, aristizabal', 'T0000', 'CO', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Anton Gonzalez', 'Completed', 'USD', '-123.56', 'anzigo@gmail.com', '3L864047FA6931700', 'Anton, Gonzalez', + 'T0000', 'TT', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Jani Lindholm', 'Completed', 'EUR', '-6.85', 'paypal@em.tunk.org', '3SG398139W115384W', 'Jani, Lindholm', + 'T0000', 'FI', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Holger Jaintsch', 'Completed', 'USD', '-25.04', 'hjaintsch@gmail.com', '2HL03710N2255450C', 'Holger, Jaintsch', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Daniel Faust', 'Completed', 'USD', '-15.78', 'hessijames@ymail.com', '5S9857397H8836636', 'Daniel, Faust', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('József Makay', 'Completed', 'HUF', '-2028.00', 'makay.jozsef@gmail.com', '9WE09084XB549024S', 'József, Makay', + 'T0000', 'HU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Darin Liebegott', 'Completed', 'USD', '-7.65', 'newhoa@gmail.com', '6WK65505WT041512U', 'Darin, Liebegott', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Antonio Orefice', 'Completed', 'EUR', '-6.45', 'kokoko3k@gmail.com', '2DG114378U707135L', 'Antonio, Orefice', + 'T0000', 'IT', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Konrad Stahlhofer', 'Completed', 'USD', '-7.43', 'bluedxca93@googlemail.com', '1H6504536W0007106', + 'Konrad, Stahlhofer', 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Everaldo Coelho', 'Completed', 'USD', '-6.99', 'everaldo@everaldo.com', '5LR93545UP308074U', + 'Everaldo, Coelho', 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('pling.it', 'Completed', 'USD', '-10.10', 'payment@pling.it', '2XS937018E529852G', 'Clemens, Toennies', 'T0000', + 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('pling.it', 'Completed', 'USD', '-1.00', 'payment@pling.it', '3WC96957X72670451', 'Clemens, Toennies', 'T0000', + 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('alessandro rei', 'Completed', 'EUR', '-5.81', 'mentalrey@gmail.com', '7L627466BJ432823Y', 'alessandro, rei', + 'T0000', 'IT', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Tobias Kaiser', 'Pending', 'USD', '-6.76', 'tobi012@gmx.de', '7YT33817RJ175681T', 'Tobias, Kaiser', 'T0000', + 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Christophe Bricheux-Duchossois', 'Completed', 'EUR', '-5.78', 'lefteye92@free.fr', '2HF89418AM1281924', + 'Christophe, Bricheux-Duchossois', 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Scott Ferguson', 'Completed', 'AUD', '-8.51', 's.cottscottf@gmail.com', '9VE84679U1239605B', 'Scott, Ferguson', + 'T0000', 'AU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Ernesto Acosta', 'Completed', 'USD', '-6.61', 'elavdeveloper@gmail.com', '31D92286AS017950E', + 'Ernesto, Acosta', 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Christopher Wood', 'Completed', 'CAD', '-8.31', 'frosspc@gmail.com', '9EC909814Y156190K', 'Christopher, Wood', + 'T0000', 'CA', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Tory Gaurnier', 'Completed', 'USD', '-6.18', 'KoRnKloWn@linuxmail.org', '10012372KS0103230', 'Tory, Gaurnier', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Georg Eckert', 'Pending', 'USD', '-5.94', 'lion.d.gem.heart@gmail.com', '83C754513D680272U', 'Georg, Eckert', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Александр Якубов', 'Completed', 'RUB', '-330.58', 'World-fly@yandex.ru', '7NB86158FR736702N', + 'Александр, Якубов', 'T0000', 'RU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Miha Čančula', 'Completed', 'EUR', '-4.95', 'miha.cancula@gmail.com', '3JM45056RV7515218', 'Miha, Čančula', + 'T0000', 'SI', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('', 'Pending', 'USD', '-41.22', 'celli.mode@web.de', '23U45596HP4305453', '', 'T0000', '', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Daboribo Linux', 'Completed', 'USD', '-31.25', 'etles.team@gmail.com', '81232928MU912032S', + 'Erwin, Edy Cahyono', 'T0000', 'ID', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Антон Тихомиров', 'Completed', 'RUB', '-872.08', 'Diamond.kde@yahoo.com', '35776372FX094794U', + 'Антон, Тихомиров', 'T0000', 'RU', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Lars Acou', 'Completed', 'EUR', '-4.88', 'lars.acou@telenet.be', '8FP47977YF2401717', 'Lars, Acou', 'T0000', + 'BE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Jean-Alexandre Anglès d\'Auriac', 'Completed', 'EUR', '-4.79', 'jagw40k@free.fr', '9J663139LD2104335', + 'Jean-Alexandre, Anglès d\'Auriac', 'T0000', 'FR', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('James Hardy', 'Completed', 'GBP', '-4.05', 'jameshardy88@gmail.com', '0TJ05858BP1667740', 'James, Hardy', + 'T0000', 'GB', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Stefano Rosselli', 'Completed', 'USD', '-5.29', 'bloomind.studio@gmail.com', '43P939541K426654C', + 'Stefano, Rosselli', 'T0000', 'CH', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Daniel Fore', 'Completed', 'USD', '-5.29', 'Daniel.P.Fore@gmail.com', '8XX1253526902043D', 'Daniel, Fore', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Leszek Lesner', 'Pending', 'USD', '-5.04', 'leszek.lesner@web.de', '23V003349H478045E', 'Leszek, Lesner', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Robert Bosak', 'Completed', 'USD', '-4.97', 'BBOSAK2143@gmail.com', '5G716149E3425380F', 'Robert, Bosak', + 'T0000', 'US', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Piotr Arłukowicz', 'Completed', 'EUR', '-4.03', 'piotao@gmail.com', '5P191039R5161262M', 'Piotr, Arłukowicz', + 'T0000', 'PL', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Stefan Siegl', 'Pending', 'USD', '-4.58', 'sis@soulinsadness.de', '1KM71136EH2876453', 'Stefan, Siegl', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Leszek Lesner', 'Completed', 'USD', '-5.04', 'leszek.lesner@web.de', '23V003349H478045E', 'Leszek, Lesner', + 'T0000', 'DE', NOW()); +INSERT INTO `member_paypal` (`name`, `last_payment_status`, `currency`, `last_payment_amount`, `paypal_address`, + `last_transaction_id`, `address`, `last_transaction_event_code`, `country_code`, + `created_at`) +VALUES ('Tobias Kaiser', 'Completed', 'USD', '-6.76', 'tobi012@gmx.de', '7YT33817RJ175681T', 'Tobias, Kaiser', 'T0000', + 'DE', NOW()); #select * from member_paypal p -update member_paypal p -join member m on m.paypal_mail = p.paypal_address -set p.member_id = m.member_id -where p.member_id is null; +UPDATE `member_paypal` `p` + JOIN `member` `m` ON `m`.`paypal_mail` = `p`.`paypal_address` +SET `p`.`member_id` = `m`.`member_id` +WHERE `p`.`member_id` IS NULL; diff --git a/sql_code/20170706_add_stored_procedure_for_solr.sql b/sql_code/20170706_add_stored_procedure_for_solr.sql index 7f5edd67b..1f31e889d 100644 --- a/sql_code/20170706_add_stored_procedure_for_solr.sql +++ b/sql_code/20170706_add_stored_procedure_for_solr.sql @@ -1,192 +1,209 @@ USE `pling-import`; -DROP procedure IF EXISTS `solr_query_import`; +DROP PROCEDURE IF EXISTS `solr_query_import`; DELIMITER $$ USE `pling-import`$$ -CREATE PROCEDURE `solr_query_import` () - BEGIN - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; +CREATE PROCEDURE `solr_query_import`() +BEGIN + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; - DROP TABLE IF EXISTS tmp_cat_store; - CREATE TEMPORARY TABLE tmp_cat_store AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; + DROP TABLE IF EXISTS `tmp_cat_store`; + CREATE TEMPORARY TABLE `tmp_cat_store` AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * - 100) AS `laplace_score`, - project.created_at, - project.changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path` - FROM project - JOIN member ON member.member_id = project.member_id - JOIN tmp_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - WHERE project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND tcs.`is_active` = 1; - END$$ + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * + 100) AS `laplace_score`, + `project`.`created_at`, + `project`.`changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `tmp_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + WHERE `project`.`status` = 100 + AND `project`.`type_id` = 1 + AND `member`.`is_active` = 1 + AND `tcs`.`is_active` = 1; +END$$ DELIMITER ; USE `pling-import`; -DROP procedure IF EXISTS `solr_query_delta_import`; +DROP PROCEDURE IF EXISTS `solr_query_delta_import`; DELIMITER $$ USE `pling-import`$$ -CREATE PROCEDURE `solr_query_delta_import` (IN projectID INT(11)) - BEGIN - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; +CREATE PROCEDURE `solr_query_delta_import`(IN `projectID` INT(11)) +BEGIN + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; - DROP TABLE IF EXISTS tmp_cat_store; - CREATE TEMPORARY TABLE tmp_cat_store AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; + DROP TABLE IF EXISTS `tmp_cat_store`; + CREATE TEMPORARY TABLE `tmp_cat_store` AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * - 100) AS `laplace_score`, - project.created_at, - project.changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path` - FROM project - JOIN member ON member.member_id = project.member_id - JOIN tmp_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - WHERE project_id = projectID; - END$$ + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + (ROUND(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * + 100) AS `laplace_score`, + `project`.`created_at`, + `project`.`changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `tmp_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + WHERE `project_id` = `projectID`; +END$$ DELIMITER ; USE `pling-import`; -DROP procedure IF EXISTS `solr_query_delta`; +DROP PROCEDURE IF EXISTS `solr_query_delta`; DELIMITER $$ USE `pling-import`$$ -CREATE PROCEDURE `solr_query_delta` (IN lastIndexed varchar(255)) - BEGIN - SELECT project_id - FROM project - JOIN member ON member.member_id = project.member_id - JOIN project_category AS pc ON pc.project_category_id = project.project_category_id - WHERE project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND pc.`is_active` = 1 AND - project.changed_at > lastIndexed; - END$$ +CREATE PROCEDURE `solr_query_delta`(IN `lastIndexed` varchar(255)) +BEGIN + SELECT `project_id` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `project`.`project_category_id` + WHERE `project`.`status` = 100 + AND `project`.`type_id` = 1 + AND `member`.`is_active` = 1 + AND `pc`.`is_active` = 1 + AND `project`.`changed_at` > `lastIndexed`; +END$$ DELIMITER ; USE `pling-import`; -DROP procedure IF EXISTS `solr_query_deleted_pk`; +DROP PROCEDURE IF EXISTS `solr_query_deleted_pk`; DELIMITER $$ USE `pling-import`$$ -CREATE PROCEDURE `solr_query_deleted_pk` (IN lastIndexed VARCHAR(255)) - BEGIN - SELECT project_id - FROM project - JOIN member ON member.member_id = project.member_id - JOIN project_category AS pc ON pc.project_category_id = project.project_category_id - WHERE project.deleted_at > lastIndexed OR member.deleted_at > lastIndexed OR - (project.changed_at > lastIndexed AND project.status < 100); - END$$ +CREATE PROCEDURE `solr_query_deleted_pk`(IN `lastIndexed` VARCHAR(255)) +BEGIN + SELECT `project_id` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `project`.`project_category_id` + WHERE `project`.`deleted_at` > `lastIndexed` + OR `member`.`deleted_at` > `lastIndexed` + OR (`project`.`changed_at` > `lastIndexed` AND `project`.`status` < 100); +END$$ DELIMITER ; USE `pling-import`; DELIMITER $$ -DROP TRIGGER IF EXISTS project_BEFORE_UPDATE$$ +DROP TRIGGER IF EXISTS `project_BEFORE_UPDATE`$$ USE `pling-import`$$ -CREATE DEFINER=CURRENT_USER TRIGGER `project_BEFORE_UPDATE` BEFORE UPDATE ON `project` FOR EACH ROW - BEGIN - SET NEW.changed_at = NOW(); - END$$ +CREATE DEFINER = CURRENT_USER TRIGGER `project_BEFORE_UPDATE` + BEFORE UPDATE + ON `project` + FOR EACH ROW +BEGIN + SET `NEW`.`changed_at` = NOW(); +END$$ DELIMITER ; USE `pling-import`; DELIMITER $$ -DROP TRIGGER IF EXISTS member_BEFORE_UPDATE$$ +DROP TRIGGER IF EXISTS `member_BEFORE_UPDATE`$$ USE `pling-import`$$ -CREATE DEFINER = CURRENT_USER TRIGGER `member_BEFORE_UPDATE` BEFORE UPDATE ON `member` FOR EACH ROW - BEGIN - SET NEW.changed_at = NOW(); - END$$ +CREATE DEFINER = CURRENT_USER TRIGGER `member_BEFORE_UPDATE` + BEFORE UPDATE + ON `member` + FOR EACH ROW +BEGIN + SET `NEW`.`changed_at` = NOW(); +END$$ DELIMITER ; USE `pling-import`; DELIMITER $$ -DROP TRIGGER IF EXISTS project_category_BEFORE_INSERT$$ +DROP TRIGGER IF EXISTS `project_category_BEFORE_INSERT`$$ USE `pling-import`$$ -CREATE DEFINER = CURRENT_USER TRIGGER `project_category_BEFORE_INSERT` BEFORE INSERT ON `project_category` FOR EACH ROW - BEGIN - IF NEW.created_at IS NULL THEN - SET NEW.created_at = NOW(); +CREATE DEFINER = CURRENT_USER TRIGGER `project_category_BEFORE_INSERT` + BEFORE INSERT + ON `project_category` + FOR EACH ROW +BEGIN + IF `NEW`.`created_at` IS NULL THEN + SET `NEW`.`created_at` = NOW(); END IF; - END$$ +END$$ DELIMITER ; USE `pling-import`; DELIMITER $$ -DROP TRIGGER IF EXISTS project_category_BEFORE_UPDATE$$ +DROP TRIGGER IF EXISTS `project_category_BEFORE_UPDATE`$$ USE `pling-import`$$ -CREATE DEFINER = CURRENT_USER TRIGGER `project_category_BEFORE_UPDATE` BEFORE UPDATE ON `project_category` FOR EACH ROW - BEGIN - SET NEW.changed_at = NOW(); - END$$ +CREATE DEFINER = CURRENT_USER TRIGGER `project_category_BEFORE_UPDATE` + BEFORE UPDATE + ON `project_category` + FOR EACH ROW +BEGIN + SET `NEW`.`changed_at` = NOW(); +END$$ DELIMITER ; diff --git a/sql_code/20170713_add_table_payout_status.sql b/sql_code/20170713_add_table_payout_status.sql index fe4656695..05000cd47 100644 --- a/sql_code/20170713_add_table_payout_status.sql +++ b/sql_code/20170713_add_table_payout_status.sql @@ -1,33 +1,48 @@ -CREATE TABLE `payout_status` ( - `id` INT(11) NOT NULL, - `type` VARCHAR(50) NOT NULL DEFAULT 'info', - `title` VARCHAR(50) NULL DEFAULT NULL, - `description` TEXT NULL, - `color` VARCHAR(50) NULL DEFAULT NULL, - `icon` VARCHAR(50) NULL DEFAULT 'glyphicon-info-sign', - `is_active` INT(1) NULL DEFAULT '1', - PRIMARY KEY (`id`) +CREATE TABLE `payout_status` +( + `id` INT(11) NOT NULL, + `type` VARCHAR(50) NOT NULL DEFAULT 'info', + `title` VARCHAR(50) NULL DEFAULT NULL, + `description` TEXT NULL, + `color` VARCHAR(50) NULL DEFAULT NULL, + `icon` VARCHAR(50) NULL DEFAULT 'glyphicon-info-sign', + `is_active` INT(1) NULL DEFAULT '1', + PRIMARY KEY (`id`) ) -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB ; /** public static $PAYOUT_STATUS_NEW = 0; public static $PAYOUT_STATUS_REQUESTED = 1; public static $PAYOUT_STATUS_PROCESSED = 10; public static $PAYOUT_STATUS_PENDING = 50; public static $PAYOUT_STATUS_COMPLETED = 100; public static $PAYOUT_STATUS_DENIED = 999; public static $PAYOUT_STATUS_REFUND = 900; public static $PAYOUT_STATUS_ERROR = 99; **/ -insert into payout_status (id,title,description,color,icon) values (0,'New','New - valid status unknown','#31708f;','glyphicon-info-sign'); -insert into payout_status (id,title,description,color) values (1,'Status: Requested','We send your payout. The actual status is: Requested.','#31708f;','glyphicon-info-sign'); -insert into payout_status (id,title,description,color) values (10,'Status: Processed','We send your payout. The actual status is: Processed.','#31708f;','glyphicon-info-sign'); -insert into payout_status (id,title,description,color) values (50,'Status: Pending','We send your payout. The actual status is: Pending.','#31708f;','glyphicon-info-sign'); -insert into payout_status (id,title,description,color) values (100,'Status: Completed','For this month we has successfully paid you.','#3c763d;','glyphicon-ok-sign'); -insert into payout_status (id,title,description,color) values (999,'Status: Denied','We tried to payout your plings, but your payment was denied.','#a94442;','glyphicon-exclamation-sign'); -insert into payout_status (id,title,description,color) values (900,'Status: Refund','We tried to payout your plings, but your payment was refund.','#a94442;','glyphicon-exclamation-sign'); -insert into payout_status (id,title,description,color) values (99,'Status: Error','We tried to payout your plings, but there was an error.','#a94442;','glyphicon-exclamation-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`, `icon`) +VALUES (0, 'New', 'New - valid status unknown', '#31708f;', 'glyphicon-info-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (1, 'Status: Requested', 'We send your payout. The actual status is: Requested.', '#31708f;', + 'glyphicon-info-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (10, 'Status: Processed', 'We send your payout. The actual status is: Processed.', '#31708f;', + 'glyphicon-info-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (50, 'Status: Pending', 'We send your payout. The actual status is: Pending.', '#31708f;', + 'glyphicon-info-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (100, 'Status: Completed', 'For this month we has successfully paid you.', '#3c763d;', 'glyphicon-ok-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (999, 'Status: Denied', 'We tried to payout your plings, but your payment was denied.', '#a94442;', + 'glyphicon-exclamation-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (900, 'Status: Refund', 'We tried to payout your plings, but your payment was refund.', '#a94442;', + 'glyphicon-exclamation-sign'); +INSERT INTO `payout_status` (`id`, `title`, `description`, `color`) +VALUES (99, 'Status: Error', 'We tried to payout your plings, but there was an error.', '#a94442;', + 'glyphicon-exclamation-sign'); diff --git a/sql_code/20170801_add_laplace_scrore_sql_function.sql b/sql_code/20170801_add_laplace_scrore_sql_function.sql index 6da504d24..8c357681e 100644 --- a/sql_code/20170801_add_laplace_scrore_sql_function.sql +++ b/sql_code/20170801_add_laplace_scrore_sql_function.sql @@ -1,13 +1,14 @@ -USE `pling`; -DROP function IF EXISTS `laplace_score`; + +DROP FUNCTION IF EXISTS `laplace_score`; DELIMITER $$ USE `pling`$$ -CREATE DEFINER=CURRENT_USER FUNCTION `laplace_score`(upvotes INT, downvotes INT) RETURNS int(11) DETERMINISTIC - BEGIN - DECLARE score INT(10); - SET score = (round(((upvotes + 6) / ((upvotes + downvotes) + 12)),2) * 100); - RETURN score; - END$$ +CREATE + DEFINER = CURRENT_USER FUNCTION `laplace_score`(`upvotes` INT, `downvotes` INT) RETURNS int(11) DETERMINISTIC +BEGIN + DECLARE `score` INT(10); + SET `score` = (round(((`upvotes` + 6) / ((`upvotes` + `downvotes`) + 12)), 2) * 100); + RETURN `score`; +END$$ DELIMITER ; \ No newline at end of file diff --git a/sql_code/20170808_add_stored_procedure_projects.sql b/sql_code/20170808_add_stored_procedure_projects.sql index 332015fa1..33c797f06 100644 --- a/sql_code/20170808_add_stored_procedure_projects.sql +++ b/sql_code/20170808_add_stored_procedure_projects.sql @@ -1,147 +1,142 @@ -USE `pling`; -DROP procedure IF EXISTS `generate_stat_project`; + +DROP PROCEDURE IF EXISTS `generate_stat_project`; DELIMITER $$ USE `pling`$$ -CREATE PROCEDURE `generate_stat_project` () - BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; +CREATE PROCEDURE `generate_stat_project`() +BEGIN + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`approved` AS `approved`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.package_type_id_list as package_types, - `tppt`.package_name_list as package_names - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`approved` AS `approved`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; DROP EVENT IF EXISTS `e_generate_stat_projects`; CREATE - DEFINER = CURRENT_USER -EVENT IF NOT EXISTS `e_generate_stat_projects` - ON SCHEDULE - EVERY 5 MINUTE STARTS DATE_FORMAT(NOW(),'%Y-%m-%d 05:00:00') - ON COMPLETION PRESERVE - -- DISABLE ON SLAVE - COMMENT 'Regenerates stat_projects table' -DO - CALL pling.generate_stat_project(); \ No newline at end of file + DEFINER = CURRENT_USER + EVENT IF NOT EXISTS `e_generate_stat_projects` + ON SCHEDULE + EVERY 5 MINUTE STARTS DATE_FORMAT(NOW(), '%Y-%m-%d 05:00:00') + ON COMPLETION PRESERVE + -- DISABLE ON SLAVE + COMMENT 'Regenerates stat_projects table' + DO + CALL `pling`.generate_stat_project(); \ No newline at end of file diff --git a/sql_code/20170811_add_stored_procedure_cat_tree.sql b/sql_code/20170811_add_stored_procedure_cat_tree.sql index ab358731d..cabbb9cb1 100644 --- a/sql_code/20170811_add_stored_procedure_cat_tree.sql +++ b/sql_code/20170811_add_stored_procedure_cat_tree.sql @@ -1,107 +1,104 @@ -USE `pling`; -DROP procedure IF EXISTS `generate_stat_cat_tree`; + +DROP PROCEDURE IF EXISTS `generate_stat_cat_tree`; DELIMITER $$ -CREATE DEFINER=CURRENT_USER PROCEDURE `generate_stat_cat_tree`() - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_cat_tree`() +BEGIN - DROP TABLE IF EXISTS tmp_stat_cat_tree; - CREATE TABLE tmp_stat_cat_tree + DROP TABLE IF EXISTS `tmp_stat_cat_tree`; + CREATE TABLE `tmp_stat_cat_tree` ( - `project_category_id` int(11) NOT NULL, - `lft` int(11) NOT NULL, - `rgt` int(11) NOT NULL, - `title` varchar(100) NOT NULL, - `name_legacy` varchar(50) NULL, - `is_active` int(1), - `orderPos` int(11) NULL, - `depth` int(11) NOT NULL, - `ancestor_id_path` varchar(100), - `ancestor_path` varchar(256), - `ancestor_path_legacy` varchar(256), - PRIMARY KEY `primary` (project_category_id, lft, rgt) + `project_category_id` int(11) NOT NULL, + `lft` int(11) NOT NULL, + `rgt` int(11) NOT NULL, + `title` varchar(100) NOT NULL, + `name_legacy` varchar(50) NULL, + `is_active` int(1), + `orderPos` int(11) NULL, + `depth` int(11) NOT NULL, + `ancestor_id_path` varchar(100), + `ancestor_path` varchar(256), + `ancestor_path_legacy` varchar(256), + PRIMARY KEY `primary` (`project_category_id`, `lft`, `rgt`) ) - ENGINE Memory - AS - SELECT - pc.project_category_id, - pc.lft, - pc.rgt, - pc.title, - pc.name_legacy, - pc.is_active, - pc.orderPos, - count(pc.lft) - 1 AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path, - GROUP_CONCAT(IF(LENGTH(TRIM(pc2.name_legacy))>0,pc2.name_legacy,pc2.title) ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path_legacy - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) AND pc.is_active = 1 and pc2.is_active = 1 - GROUP BY pc.lft -- HAVING depth >= 1 - ORDER BY pc.lft, pc.orderPos - ; + ENGINE MEMORY + AS + SELECT `pc`.`project_category_id`, + `pc`.`lft`, + `pc`.`rgt`, + `pc`.`title`, + `pc`.`name_legacy`, + `pc`.`is_active`, + `pc`.`orderPos`, + count(`pc`.`lft`) - 1 AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path`, + GROUP_CONCAT(IF(LENGTH(TRIM(`pc2`.`name_legacy`)) > 0, `pc2`.`name_legacy`, `pc2`.`title`) ORDER BY + `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path_legacy` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + AND `pc`.`is_active` = 1 + AND `pc2`.`is_active` = 1 + GROUP BY `pc`.`lft` -- HAVING depth >= 1 + ORDER BY `pc`.`lft`, `pc`.`orderPos`; - DROP TABLE IF EXISTS tmp_stat_cat; - CREATE TABLE tmp_stat_cat + DROP TABLE IF EXISTS `tmp_stat_cat`; + CREATE TABLE `tmp_stat_cat` ( - `project_category_id` int(11) NOT NULL, - `lft` int(11) NOT NULL, - `rgt` int(11) NOT NULL, - `title` varchar(100) NOT NULL, - `name_legacy` varchar(50) NULL, - `is_active` int(1), - `orderPos` int(11) NULL, - `depth` int(11) NOT NULL, - `ancestor_id_path` varchar(100), - `ancestor_path` varchar(256), - `ancestor_path_legacy` varchar(256), - `stores` varchar(256), - PRIMARY KEY `primary` (project_category_id, lft, rgt) + `project_category_id` int(11) NOT NULL, + `lft` int(11) NOT NULL, + `rgt` int(11) NOT NULL, + `title` varchar(100) NOT NULL, + `name_legacy` varchar(50) NULL, + `is_active` int(1), + `orderPos` int(11) NULL, + `depth` int(11) NOT NULL, + `ancestor_id_path` varchar(100), + `ancestor_path` varchar(256), + `ancestor_path_legacy` varchar(256), + `stores` varchar(256), + PRIMARY KEY `primary` (`project_category_id`, `lft`, `rgt`) ) - ENGINE Memory - AS - SELECT - sct.*, - GROUP_CONCAT(csc.store_id ORDER BY csc.store_id) AS stores - FROM - tmp_stat_cat_tree AS sct - LEFT JOIN - config_store_category AS csc ON FIND_IN_SET(csc.project_category_id,sct.ancestor_id_path) - GROUP BY sct.project_category_id - ORDER BY sct.lft - ; - - IF EXISTS(SELECT table_name - FROM INFORMATION_SCHEMA.TABLES - WHERE table_schema = DATABASE() - AND table_name = 'stat_cat_tree') + ENGINE MEMORY + AS + SELECT `sct`.*, + GROUP_CONCAT(`csc`.`store_id` ORDER BY `csc`.`store_id`) AS `stores` + FROM `tmp_stat_cat_tree` AS `sct` + LEFT JOIN + `config_store_category` AS `csc` ON FIND_IN_SET(`csc`.`project_category_id`, `sct`.`ancestor_id_path`) + GROUP BY `sct`.`project_category_id` + ORDER BY `sct`.`lft`; + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_cat_tree') THEN - - RENAME TABLE stat_cat_tree TO old_stat_cat_tree, tmp_stat_cat TO stat_cat_tree; + RENAME TABLE `stat_cat_tree` TO `old_stat_cat_tree`, `tmp_stat_cat` TO `stat_cat_tree`; ELSE - - RENAME TABLE tmp_stat_cat TO stat_cat_tree; + RENAME TABLE `tmp_stat_cat` TO `stat_cat_tree`; END IF; - DROP TABLE IF EXISTS old_stat_cat_tree; - DROP TABLE IF EXISTS tmp_stat_cat_tree; + DROP TABLE IF EXISTS `old_stat_cat_tree`; + DROP TABLE IF EXISTS `tmp_stat_cat_tree`; - END$$ +END$$ DELIMITER ; DROP EVENT IF EXISTS `e_generate_stat_cat_tree`; CREATE - DEFINER = CURRENT_USER -EVENT IF NOT EXISTS `e_generate_stat_cat_tree` - ON SCHEDULE - EVERY 60 MINUTE STARTS DATE_FORMAT(NOW(),'%Y-%m-%d 05:00:00') - ON COMPLETION PRESERVE - -- DISABLE ON SLAVE - COMMENT 'Regenerates generate_stat_cat_tree table' -DO - CALL pling.generate_stat_cat_tree(); \ No newline at end of file + DEFINER = CURRENT_USER + EVENT IF NOT EXISTS `e_generate_stat_cat_tree` + ON SCHEDULE + EVERY 60 MINUTE STARTS DATE_FORMAT(NOW(), '%Y-%m-%d 05:00:00') + ON COMPLETION PRESERVE + -- DISABLE ON SLAVE + COMMENT 'Regenerates generate_stat_cat_tree table' + DO + CALL `pling`.generate_stat_cat_tree(); \ No newline at end of file diff --git a/sql_code/20170811_add_stored_procedure_prod_count.sql b/sql_code/20170811_add_stored_procedure_prod_count.sql index dece7b83b..ed5a511db 100644 --- a/sql_code/20170811_add_stored_procedure_prod_count.sql +++ b/sql_code/20170811_add_stored_procedure_prod_count.sql @@ -1,73 +1,68 @@ -USE `pling`; -DROP procedure IF EXISTS `generate_stat_cat_prod_count`; + +DROP PROCEDURE IF EXISTS `generate_stat_cat_prod_count`; DELIMITER $$ USE `pling`$$ -CREATE DEFINER=CURRENT_USER PROCEDURE `generate_stat_cat_prod_count`() - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_cat_prod_count`() +BEGIN - DROP TABLE IF EXISTS tmp_stat_cat_prod_count; - CREATE TABLE tmp_stat_cat_prod_count + DROP TABLE IF EXISTS `tmp_stat_cat_prod_count`; + CREATE TABLE `tmp_stat_cat_prod_count` ( - `project_category_id` int(11) NOT NULL, - `package_type_id` int(11) NULL, - `count_product` int(11) NULL, - INDEX `idx_package` (`project_category_id`,`package_type_id`) + `project_category_id` int(11) NOT NULL, + `package_type_id` int(11) NULL, + `count_product` int(11) NULL, + INDEX `idx_package` (`project_category_id`, `package_type_id`) ) - ENGINE Memory - AS - SELECT - sct2.project_category_id, - NULL as package_type_id, - count(p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - LEFT JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - GROUP BY sct2.project_category_id - - UNION + ENGINE MEMORY + AS + SELECT `sct2`.`project_category_id`, + NULL AS `package_type_id`, + count(`p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + LEFT JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + GROUP BY `sct2`.`project_category_id` - SELECT - sct2.project_category_id, - ppt.package_type_id, - count(p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - JOIN project_package_type AS ppt ON ppt.project_id = p.project_id - GROUP BY sct2.lft, ppt.package_type_id - ; + UNION - IF EXISTS(SELECT table_name - FROM INFORMATION_SCHEMA.TABLES - WHERE table_schema = DATABASE() - AND table_name = 'stat_cat_prod_count') + SELECT `sct2`.`project_category_id`, + `ppt`.`package_type_id`, + count(`p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + JOIN `project_package_type` AS `ppt` ON `ppt`.`project_id` = `p`.`project_id` + GROUP BY `sct2`.`lft`, `ppt`.`package_type_id`; + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_cat_prod_count') THEN - - RENAME TABLE stat_cat_prod_count TO old_stat_cat_prod_count, tmp_stat_cat_prod_count TO stat_cat_prod_count; + RENAME TABLE `stat_cat_prod_count` TO `old_stat_cat_prod_count`, `tmp_stat_cat_prod_count` TO `stat_cat_prod_count`; ELSE - - RENAME TABLE tmp_stat_cat_prod_count TO stat_cat_prod_count; + RENAME TABLE `tmp_stat_cat_prod_count` TO `stat_cat_prod_count`; END IF; - DROP TABLE IF EXISTS old_stat_cat_prod_count; + DROP TABLE IF EXISTS `old_stat_cat_prod_count`; - END$$ +END$$ DELIMITER ; DROP EVENT IF EXISTS `e_generate_stat_cat_prod_count`; CREATE - DEFINER = CURRENT_USER -EVENT IF NOT EXISTS `e_generate_stat_cat_prod_count` - ON SCHEDULE - EVERY 2 MINUTE STARTS DATE_FORMAT(NOW(),'%Y-%m-%d 05:00:00') - ON COMPLETION PRESERVE - -- DISABLE ON SLAVE - COMMENT 'Regenerates generate_stat_cat_prod_count table' -DO - CALL pling.generate_stat_cat_prod_count(); \ No newline at end of file + DEFINER = CURRENT_USER + EVENT IF NOT EXISTS `e_generate_stat_cat_prod_count` + ON SCHEDULE + EVERY 2 MINUTE STARTS DATE_FORMAT(NOW(), '%Y-%m-%d 05:00:00') + ON COMPLETION PRESERVE + -- DISABLE ON SLAVE + COMMENT 'Regenerates generate_stat_cat_prod_count table' + DO + CALL `pling`.generate_stat_cat_prod_count(); \ No newline at end of file diff --git a/sql_code/20170825_add_support_btn.sql b/sql_code/20170825_add_support_btn.sql index bb26507c5..733c99b7a 100644 --- a/sql_code/20170825_add_support_btn.sql +++ b/sql_code/20170825_add_support_btn.sql @@ -1,26 +1,27 @@ -CREATE TABLE `support` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `member_id` INT(11) NOT NULL COMMENT 'Supporter', - `status_id` INT(11) NULL DEFAULT '0' COMMENT 'Stati der donation: 0 = inactive, 1 = active (donated), 2 = payed successfull, 99 = deleted', - `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation-time', - `donation_time` TIMESTAMP NULL DEFAULT NULL COMMENT 'When was a project plinged?', - `active_time` TIMESTAMP NULL DEFAULT NULL COMMENT 'When did paypal say, that this donation was payed successfull', - `delete_time` TIMESTAMP NULL DEFAULT NULL, - `amount` DOUBLE(10,2) NULL DEFAULT '0.00' COMMENT 'Amount of money', - `comment` VARCHAR(140) NULL DEFAULT NULL COMMENT 'Comment from the supporter', - `payment_provider` VARCHAR(45) NULL DEFAULT NULL, - `payment_reference_key` VARCHAR(255) NULL DEFAULT NULL COMMENT 'uniquely identifies the request', - `payment_transaction_id` VARCHAR(255) NULL DEFAULT NULL COMMENT 'uniquely identify caller (developer, facilliator, marketplace) transaction', - `payment_raw_message` VARCHAR(2000) NULL DEFAULT NULL COMMENT 'the raw text message ', - `payment_raw_error` VARCHAR(2000) NULL DEFAULT NULL, - `payment_status` VARCHAR(45) NULL DEFAULT NULL, - PRIMARY KEY (`id`), - INDEX `status_id` (`status_id`), - INDEX `member_id` (`member_id`), - INDEX `DONATION_IX_01` (`status_id`, `member_id`, `active_time`, `amount`) +CREATE TABLE `support` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `member_id` INT(11) NOT NULL COMMENT 'Supporter', + `status_id` INT(11) NULL DEFAULT '0' COMMENT 'Stati der donation: 0 = inactive, 1 = active (donated), 2 = payed successfull, 99 = deleted', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation-time', + `donation_time` TIMESTAMP NULL DEFAULT NULL COMMENT 'When was a project plinged?', + `active_time` TIMESTAMP NULL DEFAULT NULL COMMENT 'When did paypal say, that this donation was payed successfull', + `delete_time` TIMESTAMP NULL DEFAULT NULL, + `amount` DOUBLE(10, 2) NULL DEFAULT '0.00' COMMENT 'Amount of money', + `comment` VARCHAR(140) NULL DEFAULT NULL COMMENT 'Comment from the supporter', + `payment_provider` VARCHAR(45) NULL DEFAULT NULL, + `payment_reference_key` VARCHAR(255) NULL DEFAULT NULL COMMENT 'uniquely identifies the request', + `payment_transaction_id` VARCHAR(255) NULL DEFAULT NULL COMMENT 'uniquely identify caller (developer, facilliator, marketplace) transaction', + `payment_raw_message` VARCHAR(2000) NULL DEFAULT NULL COMMENT 'the raw text message ', + `payment_raw_error` VARCHAR(2000) NULL DEFAULT NULL, + `payment_status` VARCHAR(45) NULL DEFAULT NULL, + PRIMARY KEY (`id`), + INDEX `status_id` (`status_id`), + INDEX `member_id` (`member_id`), + INDEX `DONATION_IX_01` (`status_id`, `member_id`, `active_time`, `amount`) ) -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB -AUTO_INCREMENT=8 + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB + AUTO_INCREMENT = 8 ; diff --git a/sql_code/20170904_cat_show_description.sql b/sql_code/20170904_cat_show_description.sql index f247d8ecb..00bd54b4e 100644 --- a/sql_code/20170904_cat_show_description.sql +++ b/sql_code/20170904_cat_show_description.sql @@ -1,159 +1,225 @@ ALTER TABLE `project_category` - ADD COLUMN `show_description` INT(1) NOT NULL DEFAULT '0' AFTER `dl_pling_factor`; - + ADD COLUMN `show_description` INT(1) NOT NULL DEFAULT '0' AFTER `dl_pling_factor`; + ALTER TABLE `stat_projects` - ADD COLUMN `cat_show_description` INT(1) NULL DEFAULT NULL AFTER `cat_name_legacy`; - -DROP VIEW stat_projects_v; -CREATE VIEW stat_projects_v AS -select `project`.`project_id` AS `project_id`,`project`.`member_id` AS `member_id`,`project`.`content_type` AS `content_type`,`project`.`project_category_id` AS `project_category_id`,`project`.`hive_category_id` AS `hive_category_id`,`project`.`status` AS `status`,`project`.`uuid` AS `uuid`,`project`.`pid` AS `pid`,`project`.`type_id` AS `type_id`,`project`.`title` AS `title`,`project`.`description` AS `description`,`project`.`version` AS `version`,`project`.`image_big` AS `image_big`,`project`.`image_small` AS `image_small`,`project`.`start_date` AS `start_date`,`project`.`content_url` AS `content_url`,`project`.`created_at` AS `created_at`,`project`.`changed_at` AS `changed_at`,`project`.`deleted_at` AS `deleted_at`,`project`.`creator_id` AS `creator_id`,`project`.`facebook_code` AS `facebook_code`,`project`.`github_code` AS `github_code`,`project`.`twitter_code` AS `twitter_code`,`project`.`google_code` AS `google_code`,`project`.`link_1` AS `link_1`,`project`.`embed_code` AS `embed_code`,`project`.`ppload_collection_id` AS `ppload_collection_id`,`project`.`validated` AS `validated`,`project`.`validated_at` AS `validated_at`,`project`.`featured` AS `featured`,`project`.`approved` AS `approved`,`project`.`amount` AS `amount`,`project`.`amount_period` AS `amount_period`,`project`.`claimable` AS `claimable`,`project`.`claimed_by_member` AS `claimed_by_member`,`project`.`count_likes` AS `count_likes`,`project`.`count_dislikes` AS `count_dislikes`,`project`.`count_comments` AS `count_comments`,`project`.`count_downloads_hive` AS `count_downloads_hive`,`project`.`source_id` AS `source_id`,`project`.`source_pk` AS `source_pk`,`project`.`source_type` AS `source_type`,`project`.`validated` AS `project_validated`,`project`.`uuid` AS `project_uuid`,`project`.`status` AS `project_status`,`project`.`created_at` AS `project_created_at`,`member`.`type` AS `member_type`,`member`.`member_id` AS `project_member_id`,`project`.`changed_at` AS `project_changed_at`,(round(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)),2) * 100) AS `laplace_score`,`member`.`username` AS `username`,`member`.`profile_image_url` AS `profile_image_url`,`member`.`city` AS `city`,`member`.`country` AS `country`,`member`.`created_at` AS `member_created_at`,`member`.`paypal_mail` AS `paypal_mail`,`project_category`.`title` AS `cat_title`,`project_category`.`xdg_type` AS `cat_xdg_type`,`project_category`.`name_legacy` AS `cat_name_legacy`,`project_category`.`show_description` AS `cat_show_description`,`stat_plings`.`amount_received` AS `amount_received`,`stat_plings`.`count_plings` AS `count_plings`,`stat_plings`.`count_plingers` AS `count_plingers`,`stat_plings`.`latest_pling` AS `latest_pling`,`view_reported_projects`.`amount_reports` AS `amount_reports` from ((((`project` join `member` on((`member`.`member_id` = `project`.`member_id`))) join `project_category` on((`project`.`project_category_id` = `project_category`.`project_category_id`))) left join `stat_plings` on((`stat_plings`.`project_id` = `project`.`project_id`))) left join `view_reported_projects` on((`view_reported_projects`.`project_id` = `project`.`project_id`))) where ((`member`.`is_deleted` = 0) and (`member`.`is_active` = 1) and (`project`.`type_id` = 1) and (`project`.`status` = 100)); + ADD COLUMN `cat_show_description` INT(1) NULL DEFAULT NULL AFTER `cat_name_legacy`; + +DROP VIEW `stat_projects_v`; +CREATE VIEW `stat_projects_v` AS +SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`approved` AS `approved`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `project`.`changed_at` AS `project_changed_at`, + (round(((`project`.`count_likes` + 6) / ((`project`.`count_likes` + `project`.`count_dislikes`) + 12)), 2) * + 100) AS `laplace_score`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `view_reported_projects`.`amount_reports` AS `amount_reports` +FROM ((((`project` JOIN `member` ON ((`member`.`member_id` = `project`.`member_id`))) JOIN `project_category` ON (( + `project`.`project_category_id` = + `project_category`.`project_category_id`))) LEFT JOIN `stat_plings` ON ((`stat_plings`.`project_id` = `project`.`project_id`))) + LEFT JOIN `view_reported_projects` ON ((`view_reported_projects`.`project_id` = `project`.`project_id`))) +WHERE ((`member`.`is_deleted` = 0) AND (`member`.`is_active` = 1) AND (`project`.`type_id` = 1) AND + (`project`.`status` = 100)); + -USE `pling`; -DROP procedure IF EXISTS `generate_stat_project`; +DROP PROCEDURE IF EXISTS `generate_stat_project`; DELIMITER $$ USE `pling`$$ -CREATE PROCEDURE `generate_stat_project` () - BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; +CREATE PROCEDURE `generate_stat_project`() +BEGIN + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`approved` AS `approved`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.package_type_id_list as package_types, - `tppt`.package_name_list as package_names - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`approved` AS `approved`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; DROP EVENT IF EXISTS `e_generate_stat_projects`; CREATE - DEFINER = CURRENT_USER -EVENT IF NOT EXISTS `e_generate_stat_projects` - ON SCHEDULE - EVERY 5 MINUTE STARTS DATE_FORMAT(NOW(),'%Y-%m-%d 05:00:00') - ON COMPLETION PRESERVE - -- DISABLE ON SLAVE - COMMENT 'Regenerates stat_projects table' -DO - CALL pling.generate_stat_project(); \ No newline at end of file + DEFINER = CURRENT_USER + EVENT IF NOT EXISTS `e_generate_stat_projects` + ON SCHEDULE + EVERY 5 MINUTE STARTS DATE_FORMAT(NOW(), '%Y-%m-%d 05:00:00') + ON COMPLETION PRESERVE + -- DISABLE ON SLAVE + COMMENT 'Regenerates stat_projects table' + DO + CALL `pling`.generate_stat_project(); \ No newline at end of file diff --git a/sql_code/20170908_paypal_ipn.sql b/sql_code/20170908_paypal_ipn.sql index c74695b23..9d0db802c 100644 --- a/sql_code/20170908_paypal_ipn.sql +++ b/sql_code/20170908_paypal_ipn.sql @@ -1,28 +1,29 @@ -CREATE TABLE `paypal_ipn` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - `txn_type` VARCHAR(50) NULL DEFAULT NULL, - `ipn_track_id` VARCHAR(50) NULL DEFAULT NULL, - `txn_id` VARCHAR(50) NULL DEFAULT NULL, - `payer_email` VARCHAR(50) NULL DEFAULT NULL, - `payer_id` VARCHAR(50) NULL DEFAULT NULL, - `auth_amount` VARCHAR(50) NULL DEFAULT NULL, - `mc_currency` VARCHAR(50) NULL DEFAULT NULL, - `mc_fee` VARCHAR(50) NULL DEFAULT NULL, - `mc_gross` VARCHAR(50) NULL DEFAULT NULL, - `memo` VARCHAR(50) NULL DEFAULT NULL, - `payer_status` VARCHAR(50) NULL DEFAULT NULL, - `payment_date` VARCHAR(50) NULL DEFAULT NULL, - `payment_fee` VARCHAR(50) NULL DEFAULT NULL, - `payment_status` VARCHAR(50) NULL DEFAULT NULL, - `payment_type` VARCHAR(50) NULL DEFAULT NULL, - `pending_reason` VARCHAR(50) NULL DEFAULT NULL, - `reason_code` VARCHAR(50) NULL DEFAULT NULL, - `custom` VARCHAR(50) NULL DEFAULT NULL, - `raw` TEXT NULL, - PRIMARY KEY (`id`) +CREATE TABLE `paypal_ipn` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `txn_type` VARCHAR(50) NULL DEFAULT NULL, + `ipn_track_id` VARCHAR(50) NULL DEFAULT NULL, + `txn_id` VARCHAR(50) NULL DEFAULT NULL, + `payer_email` VARCHAR(50) NULL DEFAULT NULL, + `payer_id` VARCHAR(50) NULL DEFAULT NULL, + `auth_amount` VARCHAR(50) NULL DEFAULT NULL, + `mc_currency` VARCHAR(50) NULL DEFAULT NULL, + `mc_fee` VARCHAR(50) NULL DEFAULT NULL, + `mc_gross` VARCHAR(50) NULL DEFAULT NULL, + `memo` VARCHAR(50) NULL DEFAULT NULL, + `payer_status` VARCHAR(50) NULL DEFAULT NULL, + `payment_date` VARCHAR(50) NULL DEFAULT NULL, + `payment_fee` VARCHAR(50) NULL DEFAULT NULL, + `payment_status` VARCHAR(50) NULL DEFAULT NULL, + `payment_type` VARCHAR(50) NULL DEFAULT NULL, + `pending_reason` VARCHAR(50) NULL DEFAULT NULL, + `reason_code` VARCHAR(50) NULL DEFAULT NULL, + `custom` VARCHAR(50) NULL DEFAULT NULL, + `raw` TEXT NULL, + PRIMARY KEY (`id`) ) -COMMENT='Save all PayPal IPNs here' -ENGINE=InnoDB + COMMENT ='Save all PayPal IPNs here' + ENGINE = InnoDB ; diff --git a/sql_code/20170922_complete_sql_for_tags.sql b/sql_code/20170922_complete_sql_for_tags.sql index 5562ec739..465c72a9c 100644 --- a/sql_code/20170922_complete_sql_for_tags.sql +++ b/sql_code/20170922_complete_sql_for_tags.sql @@ -1,408 +1,420 @@ -USE `pling`; DROP TABLE IF EXISTS `tag`; -CREATE TABLE `tag` ( - `tag_id` int(11) NOT NULL AUTO_INCREMENT, - `tag_name` varchar(45) NOT NULL, - PRIMARY KEY (`tag_id`), - UNIQUE KEY `idx_name` (`tag_name`) -) ENGINE=InnoDB; +CREATE TABLE `tag` +( + `tag_id` int(11) NOT NULL AUTO_INCREMENT, + `tag_name` varchar(45) NOT NULL, + PRIMARY KEY (`tag_id`), + UNIQUE KEY `idx_name` (`tag_name`) +) ENGINE = InnoDB; DROP TABLE IF EXISTS `tag_group`; -CREATE TABLE `tag_group` ( - `group_id` int(11) NOT NULL AUTO_INCREMENT, - `group_name` varchar(45) NOT NULL, - PRIMARY KEY (`group_id`) -) ENGINE=InnoDB; +CREATE TABLE `tag_group` +( + `group_id` int(11) NOT NULL AUTO_INCREMENT, + `group_name` varchar(45) NOT NULL, + PRIMARY KEY (`group_id`) +) ENGINE = InnoDB; DROP TABLE IF EXISTS `tag_group_item`; -CREATE TABLE `tag_group_item` ( - `tag_group_item_id` int(11) NOT NULL AUTO_INCREMENT, - `tag_group_id` int(11) NOT NULL, - `tag_id` int(11) NOT NULL, - PRIMARY KEY (`tag_group_item_id`), - KEY `tag_group_idx` (`tag_group_id`), - KEY `tag_idx` (`tag_id`), - CONSTRAINT `tag` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`tag_id`) ON DELETE CASCADE ON UPDATE NO ACTION, - CONSTRAINT `tag_group` FOREIGN KEY (`tag_group_id`) REFERENCES `tag_group` (`group_id`) ON DELETE CASCADE ON UPDATE NO ACTION -) ENGINE=InnoDB; +CREATE TABLE `tag_group_item` +( + `tag_group_item_id` int(11) NOT NULL AUTO_INCREMENT, + `tag_group_id` int(11) NOT NULL, + `tag_id` int(11) NOT NULL, + PRIMARY KEY (`tag_group_item_id`), + KEY `tag_group_idx` (`tag_group_id`), + KEY `tag_idx` (`tag_id`), + CONSTRAINT `tag` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`tag_id`) ON DELETE CASCADE ON UPDATE NO ACTION, + CONSTRAINT `tag_group` FOREIGN KEY (`tag_group_id`) REFERENCES `tag_group` (`group_id`) ON DELETE CASCADE ON UPDATE NO ACTION +) ENGINE = InnoDB; DROP TABLE IF EXISTS `tag_object`; -CREATE TABLE `tag_object` ( - `tag_item_id` int(11) NOT NULL AUTO_INCREMENT, - `tag_id` int(11) NOT NULL, - `tag_type_id` int(11) NOT NULL, - `tag_object_id` int(11) NOT NULL, - `tag_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `tag_changed` datetime DEFAULT NULL, - PRIMARY KEY (`tag_item_id`), - UNIQUE KEY `tags_unique` (`tag_id`,`tag_type_id`,`tag_object_id`), - KEY `tags_idx` (`tag_id`), - KEY `types_idx` (`tag_type_id`) -) ENGINE=InnoDB; +CREATE TABLE `tag_object` +( + `tag_item_id` int(11) NOT NULL AUTO_INCREMENT, + `tag_id` int(11) NOT NULL, + `tag_type_id` int(11) NOT NULL, + `tag_object_id` int(11) NOT NULL, + `tag_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `tag_changed` datetime DEFAULT NULL, + PRIMARY KEY (`tag_item_id`), + UNIQUE KEY `tags_unique` (`tag_id`, `tag_type_id`, `tag_object_id`), + KEY `tags_idx` (`tag_id`), + KEY `types_idx` (`tag_type_id`) +) ENGINE = InnoDB; DELIMITER $$ -DROP TRIGGER IF EXISTS tag_object_BEFORE_INSERT$$ -CREATE DEFINER = CURRENT_USER TRIGGER `tag_object_BEFORE_INSERT` BEFORE INSERT ON `tag_object` FOR EACH ROW - BEGIN - IF NEW.tag_changed IS NULL THEN - SET NEW.tag_changed = NOW(); +DROP TRIGGER IF EXISTS `tag_object_BEFORE_INSERT`$$ +CREATE DEFINER = CURRENT_USER TRIGGER `tag_object_BEFORE_INSERT` + BEFORE INSERT + ON `tag_object` + FOR EACH ROW +BEGIN + IF `NEW`.`tag_changed` IS NULL THEN + SET `NEW`.`tag_changed` = NOW(); END IF; - END$$ +END$$ DELIMITER ; DROP TABLE IF EXISTS `tag_type`; -CREATE TABLE `tag_type` ( - `tag_type_id` int(11) NOT NULL AUTO_INCREMENT, - `tag_type_name` varchar(45) NOT NULL, - PRIMARY KEY (`tag_type_id`) -) ENGINE=InnoDB; +CREATE TABLE `tag_type` +( + `tag_type_id` int(11) NOT NULL AUTO_INCREMENT, + `tag_type_name` varchar(45) NOT NULL, + PRIMARY KEY (`tag_type_id`) +) ENGINE = InnoDB; -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('1', 'project'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('2', 'member'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('3', 'file'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('4', 'download'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('5', 'image'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('6', 'video'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('7', 'comment'); -INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) VALUES ('8', 'activity'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('1', 'project'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('2', 'member'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('3', 'file'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('4', 'download'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('5', 'image'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('6', 'video'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('7', 'comment'); +INSERT INTO `tag_type` (`tag_type_id`, `tag_type_name`) +VALUES ('8', 'activity'); -DROP procedure IF EXISTS `solr_query_import`; +DROP PROCEDURE IF EXISTS `solr_query_import`; DELIMITER $$ -CREATE PROCEDURE `solr_query_import` () - BEGIN - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 - GROUP BY tgo.tag_object_id - ORDER BY tgo.tag_object_id; +CREATE PROCEDURE `solr_query_import`() +BEGIN + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 + GROUP BY `tgo`.`tag_object_id` + ORDER BY `tgo`.`tag_object_id`; - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; - DROP TABLE IF EXISTS tmp_cat_store; - CREATE TEMPORARY TABLE tmp_cat_store AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; + DROP TABLE IF EXISTS `tmp_cat_store`; + CREATE TEMPORARY TABLE `tmp_cat_store` AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; - DROP TABLE IF EXISTS solr_project_package_types; - CREATE TEMPORARY TABLE solr_project_package_types - (PRIMARY KEY `primary` (package_project_id)) - ENGINE MyISAM - AS - SELECT - project_id as package_project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `solr_project_package_types`; + CREATE TEMPORARY TABLE `solr_project_package_types` + ( + PRIMARY KEY `primary` (`package_project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id` AS `package_project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - laplace_score(project.count_likes, project.count_dislikes) AS `laplace_score`, - project.created_at, - project.changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - sppt.package_type_id_list AS `package_ids`, - sppt.package_name_list AS `package_names`, - t.tag_names AS `tags` - FROM project - JOIN member ON member.member_id = project.member_id - JOIN tmp_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - LEFT JOIN solr_project_package_types AS sppt ON sppt.package_project_id = project.project_id - LEFT JOIN tmp_project_tags AS t ON t.tag_project_id = project.project_id - WHERE project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND tcs.`is_active` = 1; - END$$ + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `project`.`created_at`, + `project`.`changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + `sppt`.`package_type_id_list` AS `package_ids`, + `sppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `tmp_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + LEFT JOIN `solr_project_package_types` AS `sppt` ON `sppt`.`package_project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + WHERE `project`.`status` = 100 + AND `project`.`type_id` = 1 + AND `member`.`is_active` = 1 + AND `tcs`.`is_active` = 1; +END$$ DELIMITER ; -DROP procedure IF EXISTS `solr_query_delta_import`; +DROP PROCEDURE IF EXISTS `solr_query_delta_import`; DELIMITER $$ -CREATE PROCEDURE `solr_query_delta_import` (IN projectID INT(11)) - BEGIN - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 - GROUP BY tgo.tag_object_id - ORDER BY tgo.tag_object_id; +CREATE PROCEDURE `solr_query_delta_import`(IN `projectID` INT(11)) +BEGIN + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 + GROUP BY `tgo`.`tag_object_id` + ORDER BY `tgo`.`tag_object_id`; - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; - DROP TABLE IF EXISTS tmp_cat_store; - CREATE TEMPORARY TABLE tmp_cat_store AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; + DROP TABLE IF EXISTS `tmp_cat_store`; + CREATE TEMPORARY TABLE `tmp_cat_store` AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; - DROP TABLE IF EXISTS solr_project_package_types; - CREATE TEMPORARY TABLE solr_project_package_types - (PRIMARY KEY `primary` (package_project_id)) - ENGINE MyISAM - AS - SELECT - project_id as package_project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `solr_project_package_types`; + CREATE TEMPORARY TABLE `solr_project_package_types` + ( + PRIMARY KEY `primary` (`package_project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id` AS `package_project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - laplace_score(project.count_likes, project.count_dislikes) AS `laplace_score`, - project.created_at, - project.changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - sppt.package_type_id_list AS `package_ids`, - sppt.package_name_list AS `package_names`, - t.tag_names AS `tags` - FROM project - JOIN member ON member.member_id = project.member_id - JOIN tmp_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - LEFT JOIN solr_project_package_types AS sppt ON sppt.package_project_id = project.project_id - LEFT JOIN tmp_project_tags AS t ON t.tag_project_id = project.project_id - WHERE project_id = projectID; - END$$ + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `project`.`created_at`, + `project`.`changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + `sppt`.`package_type_id_list` AS `package_ids`, + `sppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `tmp_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + LEFT JOIN `solr_project_package_types` AS `sppt` ON `sppt`.`package_project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + WHERE `project_id` = `projectID`; +END$$ DELIMITER ; -DROP procedure IF EXISTS `solr_query_delta`; +DROP PROCEDURE IF EXISTS `solr_query_delta`; DELIMITER $$ -CREATE PROCEDURE `solr_query_delta` (IN lastIndexed varchar(255)) - BEGIN - SELECT DISTINCT project_id - FROM project - JOIN member ON member.member_id = project.member_id - JOIN project_category AS pc ON pc.project_category_id = project.project_category_id - LEFT JOIN tag_object AS tgo ON tgo.tag_object_id = project.project_id AND tgo.tag_type_id = 1 - WHERE (project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND pc.`is_active` = 1 AND project.changed_at > lastIndexed) - OR (project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND pc.`is_active` = 1 AND (tgo.tag_created > lastIndexed OR tgo.tag_changed > lastIndexed)) - ; - END$$ +CREATE PROCEDURE `solr_query_delta`(IN `lastIndexed` varchar(255)) +BEGIN + SELECT DISTINCT `project_id` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `project`.`project_category_id` + LEFT JOIN `tag_object` AS `tgo` + ON `tgo`.`tag_object_id` = `project`.`project_id` AND `tgo`.`tag_type_id` = 1 + WHERE (`project`.`status` = 100 AND `project`.`type_id` = 1 AND `member`.`is_active` = 1 AND + `pc`.`is_active` = 1 AND `project`.`changed_at` > `lastIndexed`) + OR (`project`.`status` = 100 AND `project`.`type_id` = 1 AND `member`.`is_active` = 1 AND + `pc`.`is_active` = 1 AND (`tgo`.`tag_created` > `lastIndexed` OR `tgo`.`tag_changed` > `lastIndexed`)); +END$$ DELIMITER ; -DROP procedure IF EXISTS `generate_stat_project`; +DROP PROCEDURE IF EXISTS `generate_stat_project`; DELIMITER $$ -CREATE DEFINER=CURRENT_USER PROCEDURE `generate_stat_project`() - BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_project`() +BEGIN + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 - GROUP BY tgo.tag_object_id - ORDER BY tgo.tag_object_id; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 + GROUP BY `tgo`.`tag_object_id` + ORDER BY `tgo`.`tag_object_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`approved` AS `approved`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags` - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`approved` AS `approved`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; diff --git a/sql_code/20171109_activity_log_types_updated.sql b/sql_code/20171109_activity_log_types_updated.sql index 401401472..efe50c8a8 100644 --- a/sql_code/20171109_activity_log_types_updated.sql +++ b/sql_code/20171109_activity_log_types_updated.sql @@ -1,22 +1,44 @@ -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('50', 'ProjectFollowed'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('51', 'ProjectUnfollowed'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('52', 'ProjectShared'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('60', 'ProjectRatedHigher'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('61', 'ProjectRatedLower'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('200', 'ProjectFilesCreated'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('210', 'ProjectFilesUpdated'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('220', 'ProjectFilesDeleted'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('100', 'MemberJoined'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('101', 'MemberUpdated'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('102', 'MemberDeleted'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('107', 'MemberEdited'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('150', 'MemberFollowed'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('151', 'MemberUnfollowed'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('152', 'MemberShared'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('302', 'BackendLogin'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('304', 'BackendLogout'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('310', 'BackendProjectDelete'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('312', 'BackendProjectFeature'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('314', 'BackendProjectApproved'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('316', 'BackendProjectCatChanged'); -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('320', 'BackendUserDeleted'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('50', 'ProjectFollowed'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('51', 'ProjectUnfollowed'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('52', 'ProjectShared'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('60', 'ProjectRatedHigher'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('61', 'ProjectRatedLower'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('200', 'ProjectFilesCreated'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('210', 'ProjectFilesUpdated'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('220', 'ProjectFilesDeleted'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('100', 'MemberJoined'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('101', 'MemberUpdated'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('102', 'MemberDeleted'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('107', 'MemberEdited'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('150', 'MemberFollowed'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('151', 'MemberUnfollowed'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('152', 'MemberShared'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('302', 'BackendLogin'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('304', 'BackendLogout'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('310', 'BackendProjectDelete'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('312', 'BackendProjectFeature'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('314', 'BackendProjectApproved'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('316', 'BackendProjectCatChanged'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('320', 'BackendUserDeleted'); diff --git a/sql_code/20171115_add_field_pling_excluded.sql b/sql_code/20171115_add_field_pling_excluded.sql index 07ef98202..b7d3f3ec0 100644 --- a/sql_code/20171115_add_field_pling_excluded.sql +++ b/sql_code/20171115_add_field_pling_excluded.sql @@ -1,17 +1,30 @@ ALTER TABLE `project` - ADD COLUMN `pling_excluded` INT(1) NOT NULL DEFAULT '0' COMMENT 'Project was excluded from pling payout' AFTER `spam_checked`; + ADD COLUMN `pling_excluded` INT(1) NOT NULL DEFAULT '0' COMMENT 'Project was excluded from pling payout' AFTER `spam_checked`; -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('318', 'BackendProjectPlingExcluded'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('318', 'BackendProjectPlingExcluded'); -DROP VIEW stat_member_dl_curent_month; -CREATE VIEW stat_member_dl_curent_month AS -SELECT DATE_FORMAT(NOW(),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`, COUNT(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((COUNT(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`, NULL AS `created_at`, NULL AS `updated_at` +DROP VIEW `stat_member_dl_curent_month`; +CREATE VIEW `stat_member_dl_curent_month` AS +SELECT DATE_FORMAT(NOW(), '%Y%m') AS `yearmonth`, + `p`.`project_id` AS `project_id`, + `p`.`project_category_id` AS `project_category_id`, + `d`.`owner_id` AS `member_id`, + `m`.`mail` AS `mail`, + `m`.`paypal_mail` AS `paypal_mail`, + COUNT(`d`.`id`) AS `num_downloads`, + `c`.`dl_pling_factor` AS `dl_pling_factor`, + ((COUNT(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`, + NULL AS `created_at`, + NULL AS `updated_at` FROM (((`ppload`.`ppload_files_downloaded` `d` -JOIN `pling`.`member` `m` ON(((`m`.`member_id` = `d`.`owner_id`) AND (`m`.`is_active` = 1)))) -JOIN `pling`.`project` `p` ON(((CAST(`p`.`ppload_collection_id` AS UNSIGNED) = `d`.`collection_id`) AND (`p`.`pling_excluded` = 0) AND (`p`.`status` = 100)))) -JOIN `pling`.`project_category` `c` ON((`c`.`project_category_id` = `p`.`project_category_id`))) + JOIN `pling`.`member` `m` ON (((`m`.`member_id` = `d`.`owner_id`) AND (`m`.`is_active` = 1)))) + JOIN `pling`.`project` `p` ON (((CAST(`p`.`ppload_collection_id` AS UNSIGNED) = `d`.`collection_id`) AND + (`p`.`pling_excluded` = 0) AND (`p`.`status` = 100)))) + JOIN `pling`.`project_category` `c` ON ((`c`.`project_category_id` = `p`.`project_category_id`))) WHERE ((`d`.`downloaded_timestamp` >= CONCAT( -LEFT(NOW(),7),'-01 00:00:00')) AND (`p`.`ppload_collection_id` IS NOT NULL) AND (LENGTH(`p`.`ppload_collection_id`) > 0) AND (NOT((`p`.`ppload_collection_id` LIKE '!%')))) -GROUP BY `d`.`owner_id`,`p`.`project_id` + LEFT(NOW(), 7), '-01 00:00:00')) AND (`p`.`ppload_collection_id` IS NOT NULL) AND + (LENGTH(`p`.`ppload_collection_id`) > 0) AND (NOT ((`p`.`ppload_collection_id` LIKE '!%')))) +GROUP BY `d`.`owner_id`, `p`.`project_id` ORDER BY COUNT(`d`.`id`) DESC; diff --git a/sql_code/20171214_add_piwik.sql b/sql_code/20171214_add_piwik.sql index 0ce93ce96..1b3db5992 100644 --- a/sql_code/20171214_add_piwik.sql +++ b/sql_code/20171214_add_piwik.sql @@ -1,4 +1,4 @@ ALTER TABLE `config_store` - ADD COLUMN `piwik_id` INT NULL DEFAULT '1' AFTER `google_id`; + ADD COLUMN `piwik_id` INT NULL DEFAULT '1' AFTER `google_id`; diff --git a/sql_code/20180122_member_dl_history.sql b/sql_code/20180122_member_dl_history.sql index ac13df5e2..72aac6096 100644 --- a/sql_code/20180122_member_dl_history.sql +++ b/sql_code/20180122_member_dl_history.sql @@ -1,17 +1,18 @@ -CREATE TABLE `member_download_history` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `member_id` VARCHAR(255) NOT NULL, - `project_id` INT(11) NOT NULL, - `file_id` INT(11) NOT NULL, - `file_name` VARCHAR(255) NOT NULL, - `file_type` VARCHAR(255) NOT NULL, - `file_size` BIGINT(20) UNSIGNED NOT NULL, - `downloaded_timestamp` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - INDEX `idx_time` (`downloaded_timestamp`), - INDEX `idx_projectid` (`project_id`), - INDEX `idx_memberid` (`member_id`) +CREATE TABLE `member_download_history` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `member_id` VARCHAR(255) NOT NULL, + `project_id` INT(11) NOT NULL, + `file_id` INT(11) NOT NULL, + `file_name` VARCHAR(255) NOT NULL, + `file_type` VARCHAR(255) NOT NULL, + `file_size` BIGINT(20) UNSIGNED NOT NULL, + `downloaded_timestamp` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `idx_time` (`downloaded_timestamp`), + INDEX `idx_projectid` (`project_id`), + INDEX `idx_memberid` (`member_id`) ) -COLLATE='latin1_swedish_ci' -ENGINE=MyISAM + COLLATE = 'latin1_swedish_ci' + ENGINE = MyISAM ; diff --git a/sql_code/20180131_add_activity_log_type_paypal.sql b/sql_code/20180131_add_activity_log_type_paypal.sql index 605cb5afe..a5ef4b2a5 100644 --- a/sql_code/20180131_add_activity_log_type_paypal.sql +++ b/sql_code/20180131_add_activity_log_type_paypal.sql @@ -1,4 +1,11 @@ -INSERT INTO `pling`.`activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('110', 'MEMBER_PAYPAL_CHANGED'); -UPDATE `pling`.`activity_log_types` SET `activity_log_type_id`='401' WHERE `activity_log_type_id`=103; -UPDATE `pling`.`activity_log_types` SET `activity_log_type_id`='410', `type_text`='MemberPaypalChanged' WHERE `activity_log_type_id`=110; -INSERT INTO `pling`.`activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('402', 'MemberEmailChanged'); \ No newline at end of file +INSERT INTO `pling`.`activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('110', 'MEMBER_PAYPAL_CHANGED'); +UPDATE `pling`.`activity_log_types` +SET `activity_log_type_id`='401' +WHERE `activity_log_type_id` = 103; +UPDATE `pling`.`activity_log_types` +SET `activity_log_type_id`='410', + `type_text`='MemberPaypalChanged' +WHERE `activity_log_type_id` = 110; +INSERT INTO `pling`.`activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('402', 'MemberEmailChanged'); \ No newline at end of file diff --git a/sql_code/20180207_alter_comment_update_trigger.sql b/sql_code/20180207_alter_comment_update_trigger.sql index c85752a90..4699e30a0 100644 --- a/sql_code/20180207_alter_comment_update_trigger.sql +++ b/sql_code/20180207_alter_comment_update_trigger.sql @@ -1,29 +1,32 @@ DROP TRIGGER IF EXISTS `comment_update`; DELIMITER $$ -CREATE DEFINER = CURRENT_USER TRIGGER `comment_update` BEFORE UPDATE ON `comments` FOR EACH ROW - BEGIN - - IF NEW.comment_active = 0 AND OLD.comment_active = 1 THEN - - UPDATE project p - SET p.count_comments = (p.count_comments-1) - WHERE p.project_id = NEW.comment_target_id; - - SET NEW.comment_deleted_at = NOW(); - - END IF; - - IF NEW.comment_active = 1 AND OLD.comment_active = 0 THEN - - UPDATE project p - SET p.count_comments = (p.count_comments+1) - WHERE p.project_id = NEW.comment_target_id; - - SET NEW.comment_deleted_at = null; - - END IF; - - END$$ +CREATE DEFINER = CURRENT_USER TRIGGER `comment_update` + BEFORE UPDATE + ON `comments` + FOR EACH ROW +BEGIN + + IF `NEW`.`comment_active` = 0 AND `OLD`.`comment_active` = 1 THEN + + UPDATE `project` `p` + SET `p`.`count_comments` = (`p`.`count_comments` - 1) + WHERE `p`.`project_id` = `NEW`.`comment_target_id`; + + SET `NEW`.`comment_deleted_at` = NOW(); + + END IF; + + IF `NEW`.`comment_active` = 1 AND `OLD`.`comment_active` = 0 THEN + + UPDATE `project` `p` + SET `p`.`count_comments` = (`p`.`count_comments` + 1) + WHERE `p`.`project_id` = `NEW`.`comment_target_id`; + + SET `NEW`.`comment_deleted_at` = NULL; + + END IF; + +END$$ DELIMITER ; \ No newline at end of file diff --git a/sql_code/20180208_alter_table_project_follower.sql b/sql_code/20180208_alter_table_project_follower.sql index 055f6bb54..bf7f6ebea 100644 --- a/sql_code/20180208_alter_table_project_follower.sql +++ b/sql_code/20180208_alter_table_project_follower.sql @@ -1,2 +1,2 @@ ALTER TABLE `project_follower` - ADD COLUMN `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP AFTER `member_id`; + ADD COLUMN `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP AFTER `member_id`; diff --git a/sql_code/20180208_reports_comment_add_ip.sql b/sql_code/20180208_reports_comment_add_ip.sql index b18605b83..3272a7ad0 100644 --- a/sql_code/20180208_reports_comment_add_ip.sql +++ b/sql_code/20180208_reports_comment_add_ip.sql @@ -1,3 +1,3 @@ ALTER TABLE `reports_comment` - ADD COLUMN `user_ip` VARCHAR(255) NULL AFTER `created_at`, - ADD COLUMN `user_ip2` VARCHAR(255) NULL AFTER `user_ip`; + ADD COLUMN `user_ip` VARCHAR(255) NULL AFTER `created_at`, + ADD COLUMN `user_ip2` VARCHAR(255) NULL AFTER `user_ip`; diff --git a/sql_code/20180213_ghns_excluded.sql b/sql_code/20180213_ghns_excluded.sql index 95de74eb8..77a173dae 100644 --- a/sql_code/20180213_ghns_excluded.sql +++ b/sql_code/20180213_ghns_excluded.sql @@ -1,152 +1,152 @@ -INSERT INTO `member_role` (`member_role_id`, `title`, `shortname`, `is_active`) VALUES ('400', 'Moderator', 'moderator', '1'); +INSERT INTO `member_role` (`member_role_id`, `title`, `shortname`, `is_active`) +VALUES ('400', 'Moderator', 'moderator', '1'); -ALTER TABLE `project` CHANGE COLUMN `approved` `ghns_excluded` INT(1) NULL DEFAULT '0' AFTER `featured`; +ALTER TABLE `project` + CHANGE COLUMN `approved` `ghns_excluded` INT(1) NULL DEFAULT '0' AFTER `featured`; -DROP procedure IF EXISTS `generate_stat_project`; +DROP PROCEDURE IF EXISTS `generate_stat_project`; DELIMITER $$ -CREATE DEFINER=current_user PROCEDURE `generate_stat_project`() - BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_project`() +BEGIN + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 - GROUP BY tgo.tag_object_id - ORDER BY tgo.tag_object_id; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 + GROUP BY `tgo`.`tag_object_id` + ORDER BY `tgo`.`tag_object_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `sdqy`.amount AS count_downloads_quarter - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `sdqy`.`amount` AS `count_downloads_quarter` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; \ No newline at end of file diff --git a/sql_code/20180227_add_package_type_sourcecode.sql b/sql_code/20180227_add_package_type_sourcecode.sql index 451a8ee3d..f20f92b9d 100644 --- a/sql_code/20180227_add_package_type_sourcecode.sql +++ b/sql_code/20180227_add_package_type_sourcecode.sql @@ -1 +1,2 @@ -INSERT INTO `pling-import`.`package_types` (`package_type_id`, `name`, `order`) VALUES ('12', 'Source Code', '100'); +INSERT INTO `pling-import`.`package_types` (`package_type_id`, `name`, `order`) +VALUES ('12', 'Source Code', '100'); diff --git a/sql_code/20180228_hive_import_fan.sql b/sql_code/20180228_hive_import_fan.sql index 6f1d848ce..258d09982 100644 --- a/sql_code/20180228_hive_import_fan.sql +++ b/sql_code/20180228_hive_import_fan.sql @@ -1,33 +1,35 @@ - ALTER TABLE `project_follower` - ADD COLUMN `source_id` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `created_at`, - ADD COLUMN `source_pk` INT(11) UNSIGNED NULL AFTER `source_id`; - - - -select - count(1) -from H01.fan f -join H01.users u on u.userdb = 0 and u.login = f.user -join `pling`.project p on p.source_id = 1 and p.source_pk = f.contentid and p.source_type = 'project' -join `pling`.member m on m.is_active = 1 and m.is_deleted = 0 and m.source_id = 1 and m.source_pk = u.id -where f.userdb = 0; - - -INSERT INTO project_follower -( - select - null as project_follower_id, - p.project_id, - m.member_id, - from_unixtime(f.timestamp) AS `created_at`, - 1 as source_id, - f.id as source_pk - from hive.fan f - join hive.users u on u.userdb = 0 and u.login = f.user - join `pling-import`.project p on p.source_id = 1 and p.source_pk = f.contentid and p.source_type = 'project' - join `pling-import`.member m on m.is_active = 1 and m.is_deleted = 0 and m.source_id = 1 and m.source_pk = u.id - where f.userdb = 0 -); + ADD COLUMN `source_id` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `created_at`, + ADD COLUMN `source_pk` INT(11) UNSIGNED NULL AFTER `source_id`; + + + +SELECT count(1) +FROM `H01`.`fan` `f` + JOIN `H01`.`users` `u` ON `u`.`userdb` = 0 AND `u`.`login` = `f`.`user` + JOIN `pling`.`project` `p` + ON `p`.`source_id` = 1 AND `p`.`source_pk` = `f`.`contentid` AND `p`.`source_type` = 'project' + JOIN `pling`.`member` `m` + ON `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 AND `m`.`source_id` = 1 AND `m`.`source_pk` = `u`.`id` +WHERE `f`.`userdb` = 0; + + +INSERT INTO `project_follower` + ( + SELECT NULL AS `project_follower_id`, + `p`.`project_id`, + `m`.`member_id`, + from_unixtime(`f`.`timestamp`) AS `created_at`, + 1 AS `source_id`, + `f`.`id` AS `source_pk` + FROM `hive`.`fan` `f` + JOIN `hive`.`users` `u` ON `u`.`userdb` = 0 AND `u`.`login` = `f`.`user` + JOIN `pling-import`.`project` `p` + ON `p`.`source_id` = 1 AND `p`.`source_pk` = `f`.`contentid` AND `p`.`source_type` = 'project' + JOIN `pling-import`.`member` `m` + ON `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 AND `m`.`source_id` = 1 AND + `m`.`source_pk` = `u`.`id` + WHERE `f`.`userdb` = 0 + ); diff --git a/sql_code/20180306_proejct_rating_memberid_idx.sql b/sql_code/20180306_proejct_rating_memberid_idx.sql index ad2ce0f6a..0f655b96e 100644 --- a/sql_code/20180306_proejct_rating_memberid_idx.sql +++ b/sql_code/20180306_proejct_rating_memberid_idx.sql @@ -1 +1 @@ -CREATE INDEX idx_member_id ON project_rating (member_id) USING BTREE; \ No newline at end of file +CREATE INDEX `idx_member_id` ON `project_rating` (`member_id`) USING BTREE; \ No newline at end of file diff --git a/sql_code/20180326_source_required.sql b/sql_code/20180326_source_required.sql index b9ace47d6..834e89fee 100644 --- a/sql_code/20180326_source_required.sql +++ b/sql_code/20180326_source_required.sql @@ -1,4 +1,4 @@ ALTER TABLE `project_category` - ADD COLUMN `source_required` INT(1) NOT NULL DEFAULT '1' AFTER `show_description`; + ADD COLUMN `source_required` INT(1) NOT NULL DEFAULT '1' AFTER `show_description`; diff --git a/sql_code/20180327_project_license.sql b/sql_code/20180327_project_license.sql index b18c9d532..8fa7fe90c 100644 --- a/sql_code/20180327_project_license.sql +++ b/sql_code/20180327_project_license.sql @@ -1,190 +1,208 @@ ALTER TABLE `project` - ADD COLUMN `project_license_id` INT(11) NULL DEFAULT NULL AFTER `version`; + ADD COLUMN `project_license_id` INT(11) NULL DEFAULT NULL AFTER `version`; -CREATE TABLE `project_license` ( - `project_license_id` INT(11) NOT NULL AUTO_INCREMENT, - `title` VARCHAR(50) NULL DEFAULT NULL, - `description` VARCHAR(255) NULL DEFAULT NULL, - PRIMARY KEY (`project_license_id`) +CREATE TABLE `project_license` +( + `project_license_id` INT(11) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(50) NULL DEFAULT NULL, + `description` VARCHAR(255) NULL DEFAULT NULL, + PRIMARY KEY (`project_license_id`) ) -ENGINE=InnoDB + ENGINE = InnoDB ; -INSERT INTO `project_license` VALUES (0, 'Other', NULL); -INSERT INTO `project_license` VALUES (1, 'GPLv2 or later', NULL); -INSERT INTO `project_license` VALUES (2, 'LGPL', NULL); -INSERT INTO `project_license` VALUES (3, 'Artistic 2.0', NULL); -INSERT INTO `project_license` VALUES (4, 'X11', NULL); -INSERT INTO `project_license` VALUES (5, 'QPL', NULL); -INSERT INTO `project_license` VALUES (6, 'BSD', NULL); -INSERT INTO `project_license` VALUES (7, 'Proprietary License', NULL); -INSERT INTO `project_license` VALUES (8, 'GFDL', NULL); -INSERT INTO `project_license` VALUES (9, 'CPL 1.0', NULL); -INSERT INTO `project_license` VALUES (10, 'Creative Commons by', NULL); -INSERT INTO `project_license` VALUES (11, 'Creative Commons by-sa', NULL); -INSERT INTO `project_license` VALUES (12, 'Creative Commons by-nd', NULL); -INSERT INTO `project_license` VALUES (13, 'Creative Commons by-nc', NULL); -INSERT INTO `project_license` VALUES (14, 'Creative Commons by-nc-sa', NULL); -INSERT INTO `project_license` VALUES (15, 'Creative Commons by-nc-nd', NULL); -INSERT INTO `project_license` VALUES (16, 'AGPL', NULL); -INSERT INTO `project_license` VALUES (17, 'CC0 1.0 Universal (Public Domain)', NULL); -INSERT INTO `project_license` VALUES (18, 'GPLv2 only', NULL); -INSERT INTO `project_license` VALUES (19, 'GPLv3', NULL); +INSERT INTO `project_license` +VALUES (0, 'Other', NULL); +INSERT INTO `project_license` +VALUES (1, 'GPLv2 or later', NULL); +INSERT INTO `project_license` +VALUES (2, 'LGPL', NULL); +INSERT INTO `project_license` +VALUES (3, 'Artistic 2.0', NULL); +INSERT INTO `project_license` +VALUES (4, 'X11', NULL); +INSERT INTO `project_license` +VALUES (5, 'QPL', NULL); +INSERT INTO `project_license` +VALUES (6, 'BSD', NULL); +INSERT INTO `project_license` +VALUES (7, 'Proprietary License', NULL); +INSERT INTO `project_license` +VALUES (8, 'GFDL', NULL); +INSERT INTO `project_license` +VALUES (9, 'CPL 1.0', NULL); +INSERT INTO `project_license` +VALUES (10, 'Creative Commons by', NULL); +INSERT INTO `project_license` +VALUES (11, 'Creative Commons by-sa', NULL); +INSERT INTO `project_license` +VALUES (12, 'Creative Commons by-nd', NULL); +INSERT INTO `project_license` +VALUES (13, 'Creative Commons by-nc', NULL); +INSERT INTO `project_license` +VALUES (14, 'Creative Commons by-nc-sa', NULL); +INSERT INTO `project_license` +VALUES (15, 'Creative Commons by-nc-nd', NULL); +INSERT INTO `project_license` +VALUES (16, 'AGPL', NULL); +INSERT INTO `project_license` +VALUES (17, 'CC0 1.0 Universal (Public Domain)', NULL); +INSERT INTO `project_license` +VALUES (18, 'GPLv2 only', NULL); +INSERT INTO `project_license` +VALUES (19, 'GPLv3', NULL); DROP PROCEDURE IF EXISTS `generate_stat_project`; CREATE PROCEDURE `generate_stat_project`() -LANGUAGE SQL -NOT DETERMINISTIC -CONTAINS SQL -SQL SECURITY DEFINER -COMMENT '' + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + SQL SECURITY DEFINER + COMMENT '' BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 - GROUP BY tgo.tag_object_id - ORDER BY tgo.tag_object_id; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 + GROUP BY `tgo`.`tag_object_id` + ORDER BY `tgo`.`tag_object_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`github_code` AS `github_code`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`github_code` AS `github_code`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END \ No newline at end of file + DROP TABLE IF EXISTS `old_stat_projects`; +END \ No newline at end of file diff --git a/sql_code/20180328_source_url.sql b/sql_code/20180328_source_url.sql index a263ff6cd..d6af6ffce 100644 --- a/sql_code/20180328_source_url.sql +++ b/sql_code/20180328_source_url.sql @@ -1,158 +1,154 @@ - ALTER TABLE `project` - CHANGE COLUMN `github_code` `source_url` TEXT NULL AFTER `google_code`; + CHANGE COLUMN `github_code` `source_url` TEXT NULL AFTER `google_code`; DROP PROCEDURE IF EXISTS `generate_stat_project`; CREATE PROCEDURE `generate_stat_project`() -LANGUAGE SQL -NOT DETERMINISTIC -CONTAINS SQL -SQL SECURITY DEFINER -COMMENT '' + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + SQL SECURITY DEFINER + COMMENT '' BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0) + GROUP BY `reports_project`.`project_id`; + + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `project_id`, + GROUP_CONCAT(DISTINCT `project_package_type`.`package_type_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `package_types`.`name`) AS `package_name_list` + FROM `project_package_type` + JOIN + `package_types` ON `project_package_type`.`package_type_id` = `package_types`.`package_type_id` + WHERE `package_types`.`is_active` = 1 + GROUP BY `project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - project_id, - GROUP_CONCAT(DISTINCT project_package_type.package_type_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT package_types.`name`) AS `package_name_list` - FROM - project_package_type - JOIN - package_types ON project_package_type.package_type_id = package_types.package_type_id - WHERE - package_types.is_active = 1 - GROUP BY project_id - ; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 + GROUP BY `tgo`.`tag_object_id` + ORDER BY `tgo`.`tag_object_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 - GROUP BY tgo.tag_object_id - ORDER BY tgo.tag_object_id; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END \ No newline at end of file + DROP TABLE IF EXISTS `old_stat_projects`; +END \ No newline at end of file diff --git a/sql_code/20180403_cat_tag.sql b/sql_code/20180403_cat_tag.sql index cb93d982b..8eea463f4 100644 --- a/sql_code/20180403_cat_tag.sql +++ b/sql_code/20180403_cat_tag.sql @@ -1,3 +1,5 @@ -CREATE TABLE `category_tag` ( - `category_id` INT NOT NULL, - `tag_id` INT NOT NULL); +CREATE TABLE `category_tag` +( + `category_id` INT NOT NULL, + `tag_id` INT NOT NULL +); diff --git a/sql_code/20180405_cat_tag_proj.sql b/sql_code/20180405_cat_tag_proj.sql index 8f524bfa0..071e0e743 100644 --- a/sql_code/20180405_cat_tag_proj.sql +++ b/sql_code/20180405_cat_tag_proj.sql @@ -1,141 +1,149 @@ - -DROP TABLE tmp_cat_tag_proj; - -CREATE TABLE `tmp_cat_tag_proj` ( - `project_id` INT(11) NOT NULL, - `project_category_id` INT(11) NOT NULL, - `tag_id` INT(11) NOT NULL, - `ancestor_id_path` VARCHAR(50) NULL DEFAULT NULL, - PRIMARY KEY (`project_id`, `project_category_id`, `tag_id`) +DROP TABLE `tmp_cat_tag_proj`; + +CREATE TABLE `tmp_cat_tag_proj` +( + `project_id` INT(11) NOT NULL, + `project_category_id` INT(11) NOT NULL, + `tag_id` INT(11) NOT NULL, + `ancestor_id_path` VARCHAR(50) NULL DEFAULT NULL, + PRIMARY KEY (`project_id`, `project_category_id`, `tag_id`) ) -COLLATE='latin1_swedish_ci' -ENGINE=MyISAM + COLLATE = 'latin1_swedish_ci' + ENGINE = MyISAM ; DELIMITER $ -DROP PROCEDURE IF EXISTS generate_tmp_cat_tag_proj$ +DROP PROCEDURE IF EXISTS `generate_tmp_cat_tag_proj`$ -CREATE PROCEDURE generate_tmp_cat_tag_proj() +CREATE PROCEDURE `generate_tmp_cat_tag_proj`() BEGIN - TRUNCATE table tmp_cat_tag_proj; - - INSERT INTO tmp_cat_tag_proj - - select p.project_id, p.project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = t.project_category_id - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100 - ; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 1 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 1)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 2 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 2)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 3 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 3)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 4 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 4)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 5 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 5)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 6 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 6)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 7 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 7)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 8 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 8)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 9 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 9)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - - INSERT IGNORE INTO tmp_cat_tag_proj - #ebene 10 - select p.project_id, c.category_id as project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = (SPLIT_STRING(t.ancestor_id_path, ',', 10)) - join tag ta on ta.tag_id = c.tag_id - WHERE p.`status` = 100; - + TRUNCATE TABLE `tmp_cat_tag_proj`; + + INSERT INTO `tmp_cat_tag_proj` + + SELECT `p`.`project_id`, `p`.`project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = `t`.`project_category_id` + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 1 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 1)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 2 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 2)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 3 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 3)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 4 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 4)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 5 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 5)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 6 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 6)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 7 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 7)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 8 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 8)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 9 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 9)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + + INSERT IGNORE INTO `tmp_cat_tag_proj` + #ebene 10 + SELECT `p`.`project_id`, `c`.`category_id` AS `project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = (SPLIT_STRING(`t`.`ancestor_id_path`, ',', 10)) + JOIN `tag` `ta` ON `ta`.`tag_id` = `c`.`tag_id` + WHERE `p`.`status` = 100; + END$ -DELIMITER ; +DELIMITER ; DELIMITER $ -DROP PROCEDURE IF EXISTS SPLIT_STRING$ +DROP PROCEDURE IF EXISTS `SPLIT_STRING`$ -CREATE FUNCTION `SPLIT_STRING`( - `s` VARCHAR(1024) , - `del` CHAR(1) , - `i` INT -) -RETURNS varchar(1024) CHARSET latin1 +CREATE FUNCTION `SPLIT_STRING`(`s` VARCHAR(1024), + `del` CHAR(1), + `i` INT) + RETURNS varchar(1024) CHARSET `latin1` BEGIN - DECLARE n INT ; + DECLARE `n` INT; - -- get max number of items - SET n = LENGTH(s) - LENGTH(REPLACE(s, del, '')) + 1; + -- get max number of items + SET `n` = LENGTH(`s`) - LENGTH(REPLACE(`s`, `del`, '')) + 1; - IF i > n THEN - RETURN NULL ; - ELSE - RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(s, del, i) , del , -1 ) ; - END IF; + IF `i` > `n` THEN + RETURN NULL ; + ELSE + RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(`s`, `del`, `i`), `del`, -1); + END IF; END$ DELIMITER ; \ No newline at end of file diff --git a/sql_code/20180406_alter_tag.sql b/sql_code/20180406_alter_tag.sql index ea3640437..4db8b3c73 100644 --- a/sql_code/20180406_alter_tag.sql +++ b/sql_code/20180406_alter_tag.sql @@ -1,6 +1,7 @@ -alter table tag_object add column tag_group_id int(11) after tag_type_id; -ALTER TABLE tag_object - DROP INDEX tags_unique; - - ALTER TABLE tag_object - ADD UNIQUE KEY `tags_unique` (`tag_id`,`tag_type_id`,`tag_object_id`,`tag_group_id`); +ALTER TABLE `tag_object` + ADD COLUMN `tag_group_id` int(11) AFTER `tag_type_id`; +ALTER TABLE `tag_object` + DROP INDEX `tags_unique`; + +ALTER TABLE `tag_object` + ADD UNIQUE KEY `tags_unique` (`tag_id`, `tag_type_id`, `tag_object_id`, `tag_group_id`); diff --git a/sql_code/20180409_alter_tag.sql b/sql_code/20180409_alter_tag.sql index 925e7502f..6ba55d46c 100644 --- a/sql_code/20180409_alter_tag.sql +++ b/sql_code/20180409_alter_tag.sql @@ -1,2 +1,4 @@ -alter table tag add column tag_fullname varchar(50); -alter table tag add column tag_description text; \ No newline at end of file +ALTER TABLE `tag` + ADD COLUMN `tag_fullname` varchar(50); +ALTER TABLE `tag` + ADD COLUMN `tag_description` text; \ No newline at end of file diff --git a/sql_code/20180412_payout_requierments.sql b/sql_code/20180412_payout_requierments.sql index 81ec7c9aa..7e943891a 100644 --- a/sql_code/20180412_payout_requierments.sql +++ b/sql_code/20180412_payout_requierments.sql @@ -1,49 +1,77 @@ ALTER TABLE `member_dl_plings` - ADD COLUMN `is_license_missing` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `probably_payout_amount`, - ADD COLUMN `is_source_missing` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `is_license_missing`, - ADD COLUMN `is_pling_excluded` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `is_source_missing`; + ADD COLUMN `is_license_missing` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `probably_payout_amount`, + ADD COLUMN `is_source_missing` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `is_license_missing`, + ADD COLUMN `is_pling_excluded` INT(1) UNSIGNED NULL DEFAULT '0' AFTER `is_source_missing`; -DROP VIEW stat_member_dl_curent_month; -CREATE VIEW stat_member_dl_curent_month +DROP VIEW `stat_member_dl_curent_month`; +CREATE VIEW `stat_member_dl_curent_month` AS -SELECT DATE_FORMAT(NOW(),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`, COUNT(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((COUNT(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`, -(CASE WHEN ISNULL(`tag`.`tag_item_id`) THEN 1 ELSE 0 END) AS `is_license_missing`, -(CASE WHEN (((`c`.`source_required` = 1) AND (`p`.`source_url` IS NOT NULL) AND (LENGTH(`p`.`source_url`) > 0)) OR (`c`.`source_required` = 0)) THEN 0 ELSE 1 END) AS `is_source_missing`, -`p`.`pling_excluded` AS `is_pling_excluded`, -NULL AS `created_at`, -NULL AS `updated_at` +SELECT DATE_FORMAT(NOW(), '%Y%m') AS `yearmonth`, + `p`.`project_id` AS `project_id`, + `p`.`project_category_id` AS `project_category_id`, + `d`.`owner_id` AS `member_id`, + `m`.`mail` AS `mail`, + `m`.`paypal_mail` AS `paypal_mail`, + COUNT(`d`.`id`) AS `num_downloads`, + `c`.`dl_pling_factor` AS `dl_pling_factor`, + ((COUNT(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`, + (CASE WHEN ISNULL(`tag`.`tag_item_id`) THEN 1 ELSE 0 END) AS `is_license_missing`, + (CASE + WHEN (((`c`.`source_required` = 1) AND (`p`.`source_url` IS NOT NULL) AND (LENGTH(`p`.`source_url`) > 0)) OR + (`c`.`source_required` = 0)) THEN 0 + ELSE 1 END) AS `is_source_missing`, + `p`.`pling_excluded` AS `is_pling_excluded`, + NULL AS `created_at`, + NULL AS `updated_at` FROM ((((`ppload`.`ppload_files_downloaded` `d` -JOIN `member` `m` ON(((`m`.`member_id` = `d`.`owner_id`) AND (`m`.`is_active` = 1)))) -JOIN `project` `p` ON(((CAST(`p`.`ppload_collection_id` AS UNSIGNED) = `d`.`collection_id`) AND (`p`.`status` = 100)))) -JOIN `project_category` `c` ON((`c`.`project_category_id` = `p`.`project_category_id`))) -LEFT JOIN .`tag_object` `tag` ON(((`tag`.`tag_type_id` = 1) AND (`tag`.`tag_group_id` = 7) AND (`tag`.`tag_object_id` = `p`.`project_id`)))) + JOIN `member` `m` ON (((`m`.`member_id` = `d`.`owner_id`) AND (`m`.`is_active` = 1)))) + JOIN `project` `p` ON (((CAST(`p`.`ppload_collection_id` AS UNSIGNED) = `d`.`collection_id`) AND + (`p`.`status` = 100)))) + JOIN `project_category` `c` ON ((`c`.`project_category_id` = `p`.`project_category_id`))) + LEFT JOIN.`tag_object` `tag` ON (((`tag` . `tag_type_id` = 1) AND (`tag` . `tag_group_id` = 7) AND (`tag` . `tag_object_id` = `p` . `project_id`)))) WHERE ((`d`.`downloaded_timestamp` >= CONCAT( -LEFT(NOW(),7),'-01 00:00:00')) AND (`p`.`ppload_collection_id` IS NOT NULL) AND (LENGTH(`p`.`ppload_collection_id`) > 0) AND (NOT((`p`.`ppload_collection_id` LIKE '!%')))) -GROUP BY `d`.`owner_id`,`p`.`project_id` + LEFT(NOW(), 7), '-01 00:00:00')) AND (`p`.`ppload_collection_id` IS NOT NULL) AND + (LENGTH(`p`.`ppload_collection_id`) > 0) AND (NOT ((`p`.`ppload_collection_id` LIKE '!%')))) +GROUP BY `d`.`owner_id`, `p`.`project_id` ; -DROP VIEW stat_member_dl_last_month; -CREATE VIEW stat_member_dl_last_month +DROP VIEW `stat_member_dl_last_month`; +CREATE VIEW `stat_member_dl_last_month` AS -SELECT DATE_FORMAT((NOW() - INTERVAL 1 MONTH),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`, COUNT(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((COUNT(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`, -(CASE WHEN ISNULL(`tag`.`tag_item_id`) THEN 1 ELSE 0 END) AS `is_license_missing`, -(CASE WHEN (((`c`.`source_required` = 1) AND (`p`.`source_url` IS NOT NULL) AND (LENGTH(`p`.`source_url`) > 0)) OR (`c`.`source_required` = 0)) THEN 0 ELSE 1 END) AS `is_source_missing`, -`p`.`pling_excluded` AS `is_pling_excluded`, -NULL AS `created_at`, NULL AS `updated_at` +SELECT DATE_FORMAT((NOW() - INTERVAL 1 MONTH), '%Y%m') AS `yearmonth`, + `p`.`project_id` AS `project_id`, + `p`.`project_category_id` AS `project_category_id`, + `d`.`owner_id` AS `member_id`, + `m`.`mail` AS `mail`, + `m`.`paypal_mail` AS `paypal_mail`, + COUNT(`d`.`id`) AS `num_downloads`, + `c`.`dl_pling_factor` AS `dl_pling_factor`, + ((COUNT(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`, + (CASE WHEN ISNULL(`tag`.`tag_item_id`) THEN 1 ELSE 0 END) AS `is_license_missing`, + (CASE + WHEN (((`c`.`source_required` = 1) AND (`p`.`source_url` IS NOT NULL) AND (LENGTH(`p`.`source_url`) > 0)) OR + (`c`.`source_required` = 0)) THEN 0 + ELSE 1 END) AS `is_source_missing`, + `p`.`pling_excluded` AS `is_pling_excluded`, + NULL AS `created_at`, + NULL AS `updated_at` FROM (((`ppload`.`ppload_files` `d` -JOIN `member` `m` ON(((`m`.`member_id` = `d`.`owner_id`) AND (`m`.`is_active` = 1)))) -JOIN `project` `p` ON(((CAST(`p`.`ppload_collection_id` AS UNSIGNED) = `d`.`collection_id`) AND (`p`.`status` = 100)))) -JOIN `project_category` `c` ON((`c`.`project_category_id` = `p`.`project_category_id`)) -LEFT JOIN .`tag_object` `tag` ON(((`tag`.`tag_type_id` = 1) AND (`tag`.`tag_group_id` = 7) AND (`tag`.`tag_object_id` = `p`.`project_id`)))) + JOIN `member` `m` ON (((`m`.`member_id` = `d`.`owner_id`) AND (`m`.`is_active` = 1)))) + JOIN `project` `p` ON (((CAST(`p`.`ppload_collection_id` AS UNSIGNED) = `d`.`collection_id`) AND + (`p`.`status` = 100)))) + JOIN `project_category` `c` ON ((`c`.`project_category_id` = `p`.`project_category_id`)) + LEFT JOIN.`tag_object` `tag` ON (((`tag` . `tag_type_id` = 1) AND (`tag` . `tag_group_id` = 7) AND (`tag` . `tag_object_id` = `p` . `project_id`)))) WHERE ((`d`.`downloaded_timestamp` >= CONCAT( -LEFT((NOW() - INTERVAL 1 MONTH),7),'-01 00:00:00')) AND (`p`.`ppload_collection_id` IS NOT NULL) AND (LENGTH(`p`.`ppload_collection_id`) > 0) AND (NOT((`p`.`ppload_collection_id` LIKE '!%')))) -GROUP BY `d`.`owner_id`,`p`.`project_id` + LEFT((NOW() - INTERVAL 1 MONTH), 7), '-01 00:00:00')) AND (`p`.`ppload_collection_id` IS NOT NULL) AND + (LENGTH(`p`.`ppload_collection_id`) > 0) AND (NOT ((`p`.`ppload_collection_id` LIKE '!%')))) +GROUP BY `d`.`owner_id`, `p`.`project_id` ; -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('70', 'ProjectLicenseChanged'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('70', 'ProjectLicenseChanged'); diff --git a/sql_code/20180417_alter_tag_fullname.sql b/sql_code/20180417_alter_tag_fullname.sql index 76e622bc0..b49dd5bc2 100644 --- a/sql_code/20180417_alter_tag_fullname.sql +++ b/sql_code/20180417_alter_tag_fullname.sql @@ -1 +1,2 @@ -ALTER TABLE tag MODIFY tag_fullname VARCHAR(100); \ No newline at end of file +ALTER TABLE `tag` + MODIFY `tag_fullname` VARCHAR(100); \ No newline at end of file diff --git a/sql_code/20180422_project_plings.sql b/sql_code/20180422_project_plings.sql index a856f20f6..960e3d1db 100644 --- a/sql_code/20180422_project_plings.sql +++ b/sql_code/20180422_project_plings.sql @@ -1,9 +1,12 @@ -CREATE TABLE `project_plings` ( - `project_plings_id` int(11) NOT NULL AUTO_INCREMENT, - `project_id` int(11) NOT NULL, - `member_id` int(11) NOT NULL, - `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `is_deleted` int(1) DEFAULT 0, - `deleted_at` timestamp, - PRIMARY KEY (`project_plings_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; \ No newline at end of file +CREATE TABLE `project_plings` +( + `project_plings_id` int(11) NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `member_id` int(11) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `is_deleted` int(1) DEFAULT 0, + `deleted_at` timestamp, + PRIMARY KEY (`project_plings_id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = `utf8`; \ No newline at end of file diff --git a/sql_code/20180424_add_file_tags.sql b/sql_code/20180424_add_file_tags.sql index f4535d755..d6fb399da 100644 --- a/sql_code/20180424_add_file_tags.sql +++ b/sql_code/20180424_add_file_tags.sql @@ -1,2 +1,2 @@ ALTER TABLE `tag_object` - ADD COLUMN `tag_parent_object_id` INT NULL AFTER `tag_group_id`; + ADD COLUMN `tag_parent_object_id` INT NULL AFTER `tag_group_id`; diff --git a/sql_code/20180504_alter_project_pling.sql b/sql_code/20180504_alter_project_pling.sql index b841a8c6c..a2c840202 100644 --- a/sql_code/20180504_alter_project_pling.sql +++ b/sql_code/20180504_alter_project_pling.sql @@ -1,2 +1,4 @@ -alter table project_plings add column is_active int(1) default 1 after created_at; -alter table project_plings add column deactive_at date default null after is_active; \ No newline at end of file +ALTER TABLE `project_plings` + ADD COLUMN `is_active` int(1) DEFAULT 1 AFTER `created_at`; +ALTER TABLE `project_plings` + ADD COLUMN `deactive_at` date DEFAULT NULL AFTER `is_active`; \ No newline at end of file diff --git a/sql_code/20180506_add_plings_member_dl_plings.sql b/sql_code/20180506_add_plings_member_dl_plings.sql index 15594556e..1e3b3b3eb 100644 --- a/sql_code/20180506_add_plings_member_dl_plings.sql +++ b/sql_code/20180506_add_plings_member_dl_plings.sql @@ -1,3 +1,3 @@ ALTER TABLE `member_dl_plings` - ADD COLUMN `num_plings` BIGINT NULL DEFAULT NULL - AFTER `probably_payout_amount`; + ADD COLUMN `num_plings` BIGINT NULL DEFAULT NULL + AFTER `probably_payout_amount`; diff --git a/sql_code/20180515_report_project_advance.sql b/sql_code/20180515_report_project_advance.sql index 7b31245ea..231cfaf98 100644 --- a/sql_code/20180515_report_project_advance.sql +++ b/sql_code/20180515_report_project_advance.sql @@ -1,10 +1,10 @@ ALTER TABLE `reports_project` - ADD COLUMN `report_type` INT(1) NOT NULL DEFAULT '0' -COMMENT '0 = spam, 1 = fraud' - AFTER `report_id`, - ADD COLUMN `text` TEXT NOT NULL - AFTER `reported_by`, - ADD COLUMN `is_valid` INT(1) NOT NULL DEFAULT '0' -COMMENT 'Admin can mark a report as valid' - AFTER `is_deleted`; + ADD COLUMN `report_type` INT(1) NOT NULL DEFAULT '0' + COMMENT '0 = spam, 1 = fraud' + AFTER `report_id`, + ADD COLUMN `text` TEXT NOT NULL + AFTER `reported_by`, + ADD COLUMN `is_valid` INT(1) NOT NULL DEFAULT '0' + COMMENT 'Admin can mark a report as valid' + AFTER `is_deleted`; diff --git a/sql_code/20180515_report_project_clone.sql b/sql_code/20180515_report_project_clone.sql index 417a0f5cc..9b77e8da0 100644 --- a/sql_code/20180515_report_project_clone.sql +++ b/sql_code/20180515_report_project_clone.sql @@ -1,17 +1,18 @@ -CREATE TABLE `project_clone` ( - `project_clone_id` INT(11) NOT NULL AUTO_INCREMENT, - `project_id` INT(11) NOT NULL, - `project_id_parent` INT(11) NULL DEFAULT NULL COMMENT 'Project Id of the clone on opendesktop', - `external_link` VARCHAR(255) NULL DEFAULT NULL COMMENT 'External Link to the original project', - `member_id` INT(11) NULL DEFAULT NULL COMMENT 'Who send the report', - `text` TEXT NULL, - `is_deleted` INT(1) NOT NULL DEFAULT '0', - `is_valid` INT(1) NOT NULL DEFAULT '0' COMMENT 'Admin can mark a report as valid', - `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, - `changed_at` TIMESTAMP NULL DEFAULT NULL, - `deleted_at` TIMESTAMP NULL DEFAULT NULL, - PRIMARY KEY (`project_clone_id`), - INDEX `idxReport` (`project_id`, `member_id`, `is_deleted`, `created_at`) +CREATE TABLE `project_clone` +( + `project_clone_id` INT(11) NOT NULL AUTO_INCREMENT, + `project_id` INT(11) NOT NULL, + `project_id_parent` INT(11) NULL DEFAULT NULL COMMENT 'Project Id of the clone on opendesktop', + `external_link` VARCHAR(255) NULL DEFAULT NULL COMMENT 'External Link to the original project', + `member_id` INT(11) NULL DEFAULT NULL COMMENT 'Who send the report', + `text` TEXT NULL, + `is_deleted` INT(1) NOT NULL DEFAULT '0', + `is_valid` INT(1) NOT NULL DEFAULT '0' COMMENT 'Admin can mark a report as valid', + `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `changed_at` TIMESTAMP NULL DEFAULT NULL, + `deleted_at` TIMESTAMP NULL DEFAULT NULL, + PRIMARY KEY (`project_clone_id`), + INDEX `idxReport` (`project_id`, `member_id`, `is_deleted`, `created_at`) ) - ENGINE = InnoDB + ENGINE = InnoDB ; \ No newline at end of file diff --git a/sql_code/20180516_member_score.sql b/sql_code/20180516_member_score.sql index 734cfedff..af3b50c05 100644 --- a/sql_code/20180516_member_score.sql +++ b/sql_code/20180516_member_score.sql @@ -1,38 +1,47 @@ DROP TABLE `member_score`; -CREATE TABLE `member_score` ( - `member_score_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `member_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', - `score` INT(10) NOT NULL DEFAULT '0', - `count_product` INT(11) NULL DEFAULT '0', - `count_pling` INT(11) NULL DEFAULT '0', - `count_like` INT(11) NULL DEFAULT '0', - `count_comment` INT(11) NULL DEFAULT '0', - `count_years_membership` INT(11) NULL DEFAULT '0', - `count_report_product_spam` INT(11) NULL DEFAULT '0', - `count_report_product_fraud` INT(11) NULL DEFAULT '0', - `count_report_comment` INT(11) NULL DEFAULT '0', - `count_report_member` INT(11) NULL DEFAULT '0', - `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`member_score_id`), - INDEX `idx_member` (`member_id`) +CREATE TABLE `member_score` +( + `member_score_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `member_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `score` INT(10) NOT NULL DEFAULT '0', + `count_product` INT(11) NULL DEFAULT '0', + `count_pling` INT(11) NULL DEFAULT '0', + `count_like` INT(11) NULL DEFAULT '0', + `count_comment` INT(11) NULL DEFAULT '0', + `count_years_membership` INT(11) NULL DEFAULT '0', + `count_report_product_spam` INT(11) NULL DEFAULT '0', + `count_report_product_fraud` INT(11) NULL DEFAULT '0', + `count_report_comment` INT(11) NULL DEFAULT '0', + `count_report_member` INT(11) NULL DEFAULT '0', + `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`member_score_id`), + INDEX `idx_member` (`member_id`) ) - ENGINE = InnoDB; + ENGINE = InnoDB; DROP TABLE `member_score_factors`; -CREATE TABLE `member_score_factors` ( - `factor_id` INT NOT NULL, - `name` VARCHAR(50) NULL, - `descrption` VARCHAR(255) NULL, - `value` INT NULL, - PRIMARY KEY (`factor_id`) +CREATE TABLE `member_score_factors` +( + `factor_id` INT NOT NULL, + `name` VARCHAR(50) NULL, + `descrption` VARCHAR(255) NULL, + `value` INT NULL, + PRIMARY KEY (`factor_id`) ); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('1', 'project', '1'); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('2', 'pling', '100'); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('3', 'like', '100'); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('4', 'comment', '10'); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('5', 'year', '10'); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('6', 'report_product_spam', '-100'); -INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) VALUES ('7', 'report_product_fraud', '-100'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('1', 'project', '1'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('2', 'pling', '100'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('3', 'like', '100'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('4', 'comment', '10'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('5', 'year', '10'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('6', 'report_product_spam', '-100'); +INSERT INTO `member_score_factors` (`factor_id`, `name`, `value`) +VALUES ('7', 'report_product_fraud', '-100'); diff --git a/sql_code/20180518_member_pling_excluded.sql b/sql_code/20180518_member_pling_excluded.sql index cde57e028..22abb9265 100644 --- a/sql_code/20180518_member_pling_excluded.sql +++ b/sql_code/20180518_member_pling_excluded.sql @@ -1,10 +1,11 @@ ALTER TABLE `member` - ADD COLUMN `pling_excluded` INT(1) NOT NULL DEFAULT '0' - AFTER `primary_mail`; + ADD COLUMN `pling_excluded` INT(1) NOT NULL DEFAULT '0' + AFTER `primary_mail`; -INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('319', 'BackendUserPlingExcluded'); +INSERT INTO `activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('319', 'BackendUserPlingExcluded'); ALTER TABLE `member_dl_plings` - ADD COLUMN `is_member_pling_excluded` INT(1) UNSIGNED NULL DEFAULT '0' - AFTER `is_pling_excluded`; + ADD COLUMN `is_member_pling_excluded` INT(1) UNSIGNED NULL DEFAULT '0' + AFTER `is_pling_excluded`; diff --git a/sql_code/20180605_tag_object.sql b/sql_code/20180605_tag_object.sql index 0d5c14f6d..766b53005 100644 --- a/sql_code/20180605_tag_object.sql +++ b/sql_code/20180605_tag_object.sql @@ -1,2 +1,2 @@ ALTER TABLE `tag_object` - ADD COLUMN `is_deleted` INT(1) DEFAULT 0; \ No newline at end of file + ADD COLUMN `is_deleted` INT(1) DEFAULT 0; \ No newline at end of file diff --git a/sql_code/20180621_add_table_member_external_id.sql b/sql_code/20180621_add_table_member_external_id.sql index 68a3bd578..33153bcbc 100644 --- a/sql_code/20180621_add_table_member_external_id.sql +++ b/sql_code/20180621_add_table_member_external_id.sql @@ -1,32 +1,33 @@ -CREATE TABLE `member_external_id` ( - `external_id` VARCHAR(255) NOT NULL, - `member_id` INT(11) NOT NULL, - `created_at` DATETIME NULL, - `is_deleted` INT(1) NULL, - PRIMARY KEY (`external_id`), - INDEX `idx_member` (`member_id` ASC) +CREATE TABLE `member_external_id` +( + `external_id` VARCHAR(255) NOT NULL, + `member_id` INT(11) NOT NULL, + `created_at` DATETIME NULL, + `is_deleted` INT(1) NULL, + PRIMARY KEY (`external_id`), + INDEX `idx_member` (`member_id` ASC) ) - ENGINE = InnoDB; + ENGINE = InnoDB; DROP TRIGGER IF EXISTS `member_external_id_BEFORE_INSERT`; DELIMITER $$ CREATE DEFINER = CURRENT_USER TRIGGER `member_external_id_BEFORE_INSERT` - BEFORE INSERT - ON `member_external_id` - FOR EACH ROW - BEGIN + BEFORE INSERT + ON `member_external_id` + FOR EACH ROW +BEGIN IF `NEW`.`created_at` IS NULL THEN - SET `NEW`.`created_at` = NOW(); + SET `NEW`.`created_at` = NOW(); END IF; - END$$ +END$$ DELIMITER ; INSERT INTO `member_external_id` (`external_id`, `member_id`) - SELECT - SUBSTR(SHA(`member_id`), 1, 20) AS `external_id`, - `member_id` - FROM `member` - WHERE `is_active` = 1 AND `is_deleted` = 0 - ORDER BY `member_id`; \ No newline at end of file +SELECT SUBSTR(SHA(`member_id`), 1, 20) AS `external_id`, + `member_id` +FROM `member` +WHERE `is_active` = 1 + AND `is_deleted` = 0 +ORDER BY `member_id`; \ No newline at end of file diff --git a/sql_code/20180622_configstore_addcolumn.sql b/sql_code/20180622_configstore_addcolumn.sql index 8f9e53003..9c0ccb044 100644 --- a/sql_code/20180622_configstore_addcolumn.sql +++ b/sql_code/20180622_configstore_addcolumn.sql @@ -1,3 +1,3 @@ ALTER TABLE `config_store` - ADD COLUMN `is_show_title` INT(1) DEFAULT 1 - AFTER `cross_domain_login`; \ No newline at end of file + ADD COLUMN `is_show_title` INT(1) DEFAULT 1 + AFTER `cross_domain_login`; \ No newline at end of file diff --git a/sql_code/20180712_generate_stat_project.sql b/sql_code/20180712_generate_stat_project.sql index c5b1794e4..841e690f8 100644 --- a/sql_code/20180712_generate_stat_project.sql +++ b/sql_code/20180712_generate_stat_project.sql @@ -1,161 +1,159 @@ CREATE PROCEDURE `generate_stat_project`() BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag_name) AS tag_names, tag_project_id - FROM ( - select distinct tag.tag_name, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - UNION ALL - select distinct tag.tag_name, tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`)) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - DROP TABLE IF EXISTS old_stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; + + DROP TABLE IF EXISTS `old_stat_projects`; END diff --git a/sql_code/20180718_configstore_addcolumn.sql b/sql_code/20180718_configstore_addcolumn.sql index eadf6f8f2..992a7b733 100755 --- a/sql_code/20180718_configstore_addcolumn.sql +++ b/sql_code/20180718_configstore_addcolumn.sql @@ -1,17 +1,17 @@ ALTER TABLE `config_store` - ADD COLUMN `is_show_home` INT(1) DEFAULT 0 - AFTER `is_show_title`; + ADD COLUMN `is_show_home` INT(1) DEFAULT 0 + AFTER `is_show_title`; ALTER TABLE `config_store` - ADD COLUMN `layout_home` VARCHAR(45) - AFTER `is_show_home`; + ADD COLUMN `layout_home` VARCHAR(45) + AFTER `is_show_home`; ALTER TABLE `config_store` - ADD COLUMN `layout` VARCHAR(45) - AFTER `layout_home`; + ADD COLUMN `layout` VARCHAR(45) + AFTER `layout_home`; ALTER TABLE `config_store` - ADD COLUMN `render_view_postfix` VARCHAR(45) - AFTER `layout`; + ADD COLUMN `render_view_postfix` VARCHAR(45) + AFTER `layout`; \ No newline at end of file diff --git a/sql_code/20180724_project_moderation.sql b/sql_code/20180724_project_moderation.sql index f839e307b..0325127a0 100644 --- a/sql_code/20180724_project_moderation.sql +++ b/sql_code/20180724_project_moderation.sql @@ -1,28 +1,30 @@ -CREATE TABLE `project_moderation_type` ( - `project_moderation_type_id` INT(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(100) NOT NULL, - `tag_id` INT(11) DEFAULT NULL - COMMENT 'if exist insert/remove project tag_id relation', - PRIMARY KEY (`project_moderation_type_id`) +CREATE TABLE `project_moderation_type` +( + `project_moderation_type_id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `tag_id` INT(11) DEFAULT NULL + COMMENT 'if exist insert/remove project tag_id relation', + PRIMARY KEY (`project_moderation_type_id`) ) - ENGINE = INNODB; + ENGINE = INNODB; -CREATE TABLE `project_moderation` ( - `project_moderation_id` INT(11) NOT NULL AUTO_INCREMENT, - `project_moderation_type_id` INT(11) NOT NULL, - `project_id` INT(11) NOT NULL, - `created_by` INT(11) NOT NULL, - `updated_by` INT(11) DEFAULT NULL, - `note` TEXT NOT NULL, - `is_deleted` INT(1) NOT NULL DEFAULT '0', - `is_valid` INT(1) NOT NULL DEFAULT '0' - COMMENT 'Admin can mark a report as valid', - `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` DATETIME DEFAULT NULL, - PRIMARY KEY (`project_moderation_id`), - FOREIGN KEY (`project_moderation_type_id`) - REFERENCES `project_moderation_type` (`project_moderation_type_id`) +CREATE TABLE `project_moderation` +( + `project_moderation_id` INT(11) NOT NULL AUTO_INCREMENT, + `project_moderation_type_id` INT(11) NOT NULL, + `project_id` INT(11) NOT NULL, + `created_by` INT(11) NOT NULL, + `updated_by` INT(11) DEFAULT NULL, + `note` TEXT NOT NULL, + `is_deleted` INT(1) NOT NULL DEFAULT '0', + `is_valid` INT(1) NOT NULL DEFAULT '0' + COMMENT 'Admin can mark a report as valid', + `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` DATETIME DEFAULT NULL, + PRIMARY KEY (`project_moderation_id`), + FOREIGN KEY (`project_moderation_type_id`) + REFERENCES `project_moderation_type` (`project_moderation_type_id`) ) - ENGINE = INNODB; + ENGINE = INNODB; diff --git a/sql_code/20180724_project_moderation2.sql b/sql_code/20180724_project_moderation2.sql index 697fa1a8c..3ec983aab 100755 --- a/sql_code/20180724_project_moderation2.sql +++ b/sql_code/20180724_project_moderation2.sql @@ -1,3 +1,6 @@ -alter table project_moderation drop column updated_by; -alter table project_moderation drop column updated_at; -alter table project_moderation add column `value` int(1) not null after `project_id`; \ No newline at end of file +ALTER TABLE `project_moderation` + DROP COLUMN `updated_by`; +ALTER TABLE `project_moderation` + DROP COLUMN `updated_at`; +ALTER TABLE `project_moderation` + ADD COLUMN `value` int(1) NOT NULL AFTER `project_id`; \ No newline at end of file diff --git a/sql_code/20180730_configstore_addcolumn.sql b/sql_code/20180730_configstore_addcolumn.sql index 6628eccb5..ad3069d4b 100755 --- a/sql_code/20180730_configstore_addcolumn.sql +++ b/sql_code/20180730_configstore_addcolumn.sql @@ -1,8 +1,8 @@ ALTER TABLE `config_store` - ADD COLUMN `layout_explore` VARCHAR(45) - AFTER `layout_home`; + ADD COLUMN `layout_explore` VARCHAR(45) + AFTER `layout_home`; ALTER TABLE `config_store` - ADD COLUMN `layout_pagedetail` VARCHAR(45) - AFTER `layout_explore`; + ADD COLUMN `layout_pagedetail` VARCHAR(45) + AFTER `layout_explore`; diff --git a/sql_code/20180801_add_password_type.sql b/sql_code/20180801_add_password_type.sql index b79a75b1c..2324a36b2 100644 --- a/sql_code/20180801_add_password_type.sql +++ b/sql_code/20180801_add_password_type.sql @@ -1,24 +1,27 @@ #Create Table member_password_types -CREATE TABLE `member_password_types` ( - `password_type_id` INT(10) UNSIGNED NOT NULL, - `name` VARCHAR(50) NOT NULL, - `description` VARCHAR(255) NOT NULL, - PRIMARY KEY (`password_type_id`) +CREATE TABLE `member_password_types` +( + `password_type_id` INT(10) UNSIGNED NOT NULL, + `name` VARCHAR(50) NOT NULL, + `description` VARCHAR(255) NOT NULL, + PRIMARY KEY (`password_type_id`) ) - ENGINE = InnoDB; + ENGINE = InnoDB; -INSERT INTO `member_password_types` (`password_type_id`, `name`, `description`) VALUES (0, 'MD5', 'Default OCS Password Hash'); -INSERT INTO `member_password_types` (`password_type_id`, `name`, `description`) VALUES (1, 'SHA', 'Hive Password Hash'); +INSERT INTO `member_password_types` (`password_type_id`, `name`, `description`) +VALUES (0, 'MD5', 'Default OCS Password Hash'); +INSERT INTO `member_password_types` (`password_type_id`, `name`, `description`) +VALUES (1, 'SHA', 'Hive Password Hash'); #Add field in table member ALTER TABLE `member` - ADD COLUMN `password_type` INT(1) NOT NULL DEFAULT '0' -COMMENT 'Type: 0 = MD5 (OCS), 1 = SHA (Hive)' - AFTER `password`; + ADD COLUMN `password_type` INT(1) NOT NULL DEFAULT '0' + COMMENT 'Type: 0 = MD5 (OCS), 1 = SHA (Hive)' + AFTER `password`; #Update Hive-Members UPDATE `member` `m` SET `m`.`password_type` = 1 WHERE `m`.`source_id` = 1; diff --git a/sql_code/20180802_add_email_hash.sql b/sql_code/20180802_add_email_hash.sql index 24a8183fe..0d21f49b3 100644 --- a/sql_code/20180802_add_email_hash.sql +++ b/sql_code/20180802_add_email_hash.sql @@ -1,9 +1,9 @@ ALTER TABLE `member_email` - ADD COLUMN `email_hash` VARCHAR(255) NOT NULL AFTER `email_verification_value`; + ADD COLUMN `email_hash` VARCHAR(255) NOT NULL AFTER `email_verification_value`; ALTER TABLE `member_email` - ADD INDEX `idx_hash` (`email_hash`); + ADD INDEX `idx_hash` (`email_hash`); -UPDATE member_email me -SET me.email_hash = MD5(me.email_address) +UPDATE `member_email` `me` +SET `me`.`email_hash` = MD5(`me`.`email_address`) ; diff --git a/sql_code/20180809_member_pass.sql b/sql_code/20180809_member_pass.sql index 7a54fc80c..203b0f055 100644 --- a/sql_code/20180809_member_pass.sql +++ b/sql_code/20180809_member_pass.sql @@ -1,4 +1,4 @@ ALTER TABLE `member` - ADD COLUMN `password_old` VARCHAR(255) NULL AFTER `pling_excluded`, - ADD COLUMN `password_type_old` INT(1) NULL AFTER `password_old`; + ADD COLUMN `password_old` VARCHAR(255) NULL AFTER `pling_excluded`, + ADD COLUMN `password_type_old` INT(1) NULL AFTER `password_old`; diff --git a/sql_code/20180815_add_stored_procedure.sql b/sql_code/20180815_add_stored_procedure.sql index cf79dc60c..5a0d8fde6 100644 --- a/sql_code/20180815_add_stored_procedure.sql +++ b/sql_code/20180815_add_stored_procedure.sql @@ -1,90 +1,138 @@ DELIMITER $$ -CREATE DEFINER=CURRENT_USER PROCEDURE `fetchCatTreeForStore`(IN STORE_ID int(11)) - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `fetchCatTreeForStore`(IN `STORE_ID` int(11)) +BEGIN DROP TABLE IF EXISTS `tmp_store_cat`; CREATE TEMPORARY TABLE `tmp_store_cat` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; - SET @NEW_ORDER := 0; + SET @`NEW_ORDER` := 0; - UPDATE `tmp_store_cat` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); + UPDATE `tmp_store_cat` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`package_type_id` is null - WHERE cfc.store_id = STORE_ID - ORDER BY cfc.`order`, sct.lft; - END$$ + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + JOIN `stat_cat_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`package_type_id` IS NULL + WHERE `cfc`.`store_id` = `STORE_ID` + ORDER BY `cfc`.`order`, `sct`.`lft`; +END$$ DELIMITER ; DELIMITER $$ -CREATE DEFINER=CURRENT_USER PROCEDURE `fetchCatTreeWithPackage`(IN STORE_ID int(11), IN PACKAGE_TYPE int(11)) - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `fetchCatTreeWithPackage`(IN `STORE_ID` int(11), IN `PACKAGE_TYPE` int(11)) +BEGIN DROP TABLE IF EXISTS `tmp_store_cat`; CREATE TEMPORARY TABLE `tmp_store_cat` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; - SET @NEW_ORDER := 0; + SET @`NEW_ORDER` := 0; - UPDATE `tmp_store_cat` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); + UPDATE `tmp_store_cat` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`package_type_id` = PACKAGE_TYPE - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND + `scpc`.`package_type_id` = `PACKAGE_TYPE` + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; - END$$ +END$$ DELIMITER ; DROP PROCEDURE IF EXISTS `fetchCatTreeForStore`; DELIMITER $$ -CREATE DEFINER=CURRENT_USER PROCEDURE `fetchCatTreeForStore`(IN STORE_ID int(11)) - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `fetchCatTreeForStore`(IN `STORE_ID` int(11)) +BEGIN DROP TABLE IF EXISTS `tmp_store_cat`; CREATE TEMPORARY TABLE `tmp_store_cat` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; - SET @NEW_ORDER := 0; + SET @`NEW_ORDER` := 0; - UPDATE `tmp_store_cat` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); + UPDATE `tmp_store_cat` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null - WHERE cfc.store_id = STORE_ID - ORDER BY cfc.`order`, sct.lft; - END$$ + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + JOIN `stat_cat_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` IS NULL + WHERE `cfc`.`store_id` = `STORE_ID` + ORDER BY `cfc`.`order`, `sct`.`lft`; +END$$ DELIMITER ; diff --git a/sql_code/20180821_solr_procedure.sql b/sql_code/20180821_solr_procedure.sql index b8b69e9c5..bb7d89a38 100644 --- a/sql_code/20180821_solr_procedure.sql +++ b/sql_code/20180821_solr_procedure.sql @@ -1,299 +1,339 @@ -drop PROCEDURE solr_query_fullimport_prepare; +DROP PROCEDURE `solr_query_fullimport_prepare`; DELIMITER $$ -CREATE PROCEDURE `solr_query_fullimport_prepare`() +CREATE PROCEDURE `solr_query_fullimport_prepare`() BEGIN - - - DROP TABLE IF EXISTS tmp_solr_cat_tree; - CREATE TEMPORARY TABLE tmp_solr_cat_tree - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; - - DROP TABLE IF EXISTS tmp_solr_cat_store; - CREATE TEMPORARY TABLE tmp_solr_cat_store - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_solr_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; - - DROP TABLE IF EXISTS tmp_solr_project_tags; - CREATE TEMPORARY TABLE tmp_solr_project_tags - (PRIMARY KEY `primary` (tag_project_id) ) - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - , tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tgo.tag_type_id = 1 and tgo.tag_group_id in (5,6) and tgo.is_deleted = 0 - GROUP BY tgo.tag_object_id; - - DROP TABLE IF EXISTS tmp_solr_project_license; - CREATE TEMPORARY TABLE tmp_solr_project_license - (PRIMARY KEY `primary` (license_project_id)) + + + DROP TABLE IF EXISTS `tmp_solr_cat_tree`; + CREATE TEMPORARY TABLE `tmp_solr_cat_tree` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; + + DROP TABLE IF EXISTS `tmp_solr_cat_store`; + CREATE TEMPORARY TABLE `tmp_solr_cat_store` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_solr_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_tags`; + CREATE TEMPORARY TABLE `tmp_solr_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + , `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tgo`.`tag_type_id` = 1 + AND `tgo`.`tag_group_id` IN (5, 6) + AND `tgo`.`is_deleted` = 0 + GROUP BY `tgo`.`tag_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_license`; + CREATE TEMPORARY TABLE `tmp_solr_project_license` + ( + PRIMARY KEY `primary` (`license_project_id`) + ) + ENGINE MyISAM + AS + SELECT `t`.`tag_object_id` AS `license_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `license_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + WHERE `t`.`tag_type_id` = 1 + AND `t`.`tag_group_id` = 7 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_package_types`; + CREATE TEMPORARY TABLE `tmp_solr_project_package_types` + ( + PRIMARY KEY `primary` (`package_project_id`) + ) + ENGINE MyISAM + AS + SELECT `t`.`tag_parent_object_id` AS `package_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `package_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + WHERE `t`.`tag_type_id` = 3 + AND `t`.`tag_group_id` = 8 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_arch_types`; + CREATE TEMPORARY TABLE `tmp_solr_project_arch_types` + ( + PRIMARY KEY `primary` (`arch_project_id`) + ) ENGINE MyISAM - AS - SELECT - t.tag_object_id as license_project_id, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `license_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - WHERE t.tag_type_id = 1 and t.tag_group_id = 7 AND t.is_deleted = 0 - group by tag_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_project_package_types; - CREATE TEMPORARY TABLE tmp_solr_project_package_types - (PRIMARY KEY `primary` (package_project_id)) - ENGINE MyISAM - AS - SELECT - t.tag_parent_object_id as package_project_id, - GROUP_CONCAT(DISTINCT ta.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `package_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - WHERE t.tag_type_id = 3 and t.tag_group_id = 8 AND t.is_deleted = 0 - group by tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_project_arch_types; - CREATE TEMPORARY TABLE tmp_solr_project_arch_types - (PRIMARY KEY `primary` (arch_project_id)) - ENGINE MyISAM - AS - SELECT - t.tag_parent_object_id as arch_project_id, - GROUP_CONCAT(DISTINCT ta.tag_id) AS arch_type_id_list, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `arch_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - WHERE t.tag_type_id = 3 and t.tag_group_id = 9 AND t.is_deleted = 0 - group by tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_query_fullimport; - create table tmp_solr_query_fullimport as - - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - laplace_score(project.count_likes, project.count_dislikes) AS `laplace_score`, - DATE_FORMAT(project.created_at, '%Y-%m-%dT%TZ') AS created_at, - DATE_FORMAT(project.changed_at, '%Y-%m-%dT%TZ') AS changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - sppt.package_name_list AS `package_names`, - appt.arch_name_list AS `arch_names`, - c.license_name_list AS `license_names`, - t.tag_names AS `tags` - FROM project - JOIN member ON member.member_id = project.member_id - LEFT JOIN tmp_solr_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - LEFT JOIN tmp_solr_project_package_types AS sppt ON sppt.package_project_id = project.project_id - LEFT JOIN tmp_solr_project_arch_types AS appt ON appt.arch_project_id = project.project_id - LEFT JOIN tmp_solr_project_license AS c ON c.license_project_id = project.project_id - LEFT JOIN tmp_solr_project_tags AS t ON t.tag_project_id = project.project_id - - WHERE project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND tcs.`is_active` = 1; - + AS + SELECT `t`.`tag_parent_object_id` AS `arch_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_id`) AS `arch_type_id_list`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `arch_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + WHERE `t`.`tag_type_id` = 3 + AND `t`.`tag_group_id` = 9 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_query_fullimport`; + CREATE TABLE `tmp_solr_query_fullimport` AS + + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + DATE_FORMAT(`project`.`created_at`, '%Y-%m-%dT%TZ') AS `created_at`, + DATE_FORMAT(`project`.`changed_at`, '%Y-%m-%dT%TZ') AS `changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + `sppt`.`package_name_list` AS `package_names`, + `appt`.`arch_name_list` AS `arch_names`, + `c`.`license_name_list` AS `license_names`, + `t`.`tag_names` AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + LEFT JOIN `tmp_solr_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + LEFT JOIN `tmp_solr_project_package_types` AS `sppt` + ON `sppt`.`package_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_arch_types` AS `appt` ON `appt`.`arch_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_license` AS `c` ON `c`.`license_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + + WHERE `project`.`status` = 100 + AND `project`.`type_id` = 1 + AND `member`.`is_active` = 1 + AND `tcs`.`is_active` = 1; + END$$ DELIMITER ; -call solr_query_fullimport_prepare(); +CALL solr_query_fullimport_prepare(); -drop PROCEDURE solr_query_delta_import_new; +DROP PROCEDURE `solr_query_delta_import_new`; DELIMITER $$ -CREATE PROCEDURE `solr_query_delta_import_new`(IN projectID INT(11)) +CREATE PROCEDURE `solr_query_delta_import_new`(IN `projectID` INT(11)) BEGIN - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; - - DROP TABLE IF EXISTS tmp_solr_cat_store; - CREATE TEMPORARY TABLE tmp_solr_cat_store - (PRIMARY KEY `primary` (project_category_id) ) + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; + + DROP TABLE IF EXISTS `tmp_solr_cat_store`; + CREATE TEMPORARY TABLE `tmp_solr_cat_store` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; - - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - laplace_score(project.count_likes, project.count_dislikes) AS `laplace_score`, - DATE_FORMAT(project.created_at, '%Y-%m-%dT%TZ') AS created_at, - DATE_FORMAT(project.changed_at, '%Y-%m-%dT%TZ') AS changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - ( - - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 8 and tag_object.tag_type_id = 3 and tag_object.is_deleted = 0 and tag_object.tag_parent_object_id = project.project_id - ) as package_names , - ( - - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 9 and tag_object.tag_type_id = 3 and tag_object.is_deleted = 0 and tag_object.tag_parent_object_id = project.project_id - ) as arch_names, - ( - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 7 and tag_object.tag_type_id = 1 and tag_object.is_deleted = 0 and tag_object.tag_object_id = project.project_id - ) as license_names, - ( - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id in (5,6) and tag_object.tag_type_id = 1 and tag_object.is_deleted = 0 and tag_object.tag_object_id = project.project_id - ) as tags - FROM project - JOIN member ON member.member_id = project.member_id - LEFT JOIN tmp_solr_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - WHERE project_id = projectID; - + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; + + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + DATE_FORMAT(`project`.`created_at`, '%Y-%m-%dT%TZ') AS `created_at`, + DATE_FORMAT(`project`.`changed_at`, '%Y-%m-%dT%TZ') AS `changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`tag_type_id` = 3 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_parent_object_id` = `project`.`project_id` + ) AS `package_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 9 + AND `tag_object`.`tag_type_id` = 3 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_parent_object_id` = `project`.`project_id` + ) AS `arch_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 7 + AND `tag_object`.`tag_type_id` = 1 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_object_id` = `project`.`project_id` + ) AS `license_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` IN (5, 6) + AND `tag_object`.`tag_type_id` = 1 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_object_id` = `project`.`project_id` + ) AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + LEFT JOIN `tmp_solr_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + WHERE `project_id` = `projectID`; + END$$ DELIMITER ; - -drop PROCEDURE solr_query_import_new; + +DROP PROCEDURE `solr_query_import_new`; DELIMITER $$ CREATE PROCEDURE `solr_query_import_new`() BEGIN - select - project_id, - project_member_id, - project_category_id, - project_title, - description, - image_small, - username, - firstname, - lastname, - cat_title, - count_likes, - count_dislikes, - laplace_score, - created_at, - changed_at, - stores, - cat_id_ancestor_path, - package_names, - arch_names, - license_names, - tags - from tmp_solr_query_fullimport; + SELECT `project_id`, + `project_member_id`, + `project_category_id`, + `project_title`, + `description`, + `image_small`, + `username`, + `firstname`, + `lastname`, + `cat_title`, + `count_likes`, + `count_dislikes`, + `laplace_score`, + `created_at`, + `changed_at`, + `stores`, + `cat_id_ancestor_path`, + `package_names`, + `arch_names`, + `license_names`, + `tags` + FROM `tmp_solr_query_fullimport`; END$$ DELIMITER ; -drop PROCEDURE solr_query_delta_new; +DROP PROCEDURE `solr_query_delta_new`; DELIMITER $$ -CREATE PROCEDURE `solr_query_delta_new`(IN lastIndexed varchar(255)) +CREATE PROCEDURE `solr_query_delta_new`(IN `lastIndexed` varchar(255)) BEGIN - select distinct project_id - from - ( - SELECT project_id - FROM project - JOIN member ON member.member_id = project.member_id - WHERE (project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND project.changed_at > lastIndexed) - union - select distinct tag_object_id as project_id - from tag_object - where tag_type_id = 1 and (tag_created > lastIndexed or tag_changed > lastIndexed) - union select distinct tag_parent_object_id as project_id - from tag_object - where tag_type_id in (8,9) and (tag_created > lastIndexed or tag_changed > lastIndexed) - ) t ; + SELECT DISTINCT `project_id` + FROM ( + SELECT `project_id` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + WHERE (`project`.`status` = 100 AND `project`.`type_id` = 1 AND `member`.`is_active` = 1 AND + `project`.`changed_at` > `lastIndexed`) + UNION + SELECT DISTINCT `tag_object_id` AS `project_id` + FROM `tag_object` + WHERE `tag_type_id` = 1 + AND (`tag_created` > `lastIndexed` OR `tag_changed` > `lastIndexed`) + UNION + SELECT DISTINCT `tag_parent_object_id` AS `project_id` + FROM `tag_object` + WHERE `tag_type_id` IN (8, 9) + AND (`tag_created` > `lastIndexed` OR `tag_changed` > `lastIndexed`) + ) `t`; END$$ DELIMITER ; -drop procedure solr_query_deleted_pk_new; +DROP PROCEDURE `solr_query_deleted_pk_new`; DELIMITER $$ -CREATE PROCEDURE `solr_query_deleted_pk_new`(IN lastIndexed VARCHAR(255)) +CREATE PROCEDURE `solr_query_deleted_pk_new`(IN `lastIndexed` VARCHAR(255)) BEGIN - SELECT project_id - FROM project - WHERE - project.`type_id` = 1 - and( - project.deleted_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) - OR (project.changed_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) AND project.status < 100) - ); + SELECT `project_id` + FROM `project` + WHERE `project`.`type_id` = 1 + AND ( + `project`.`deleted_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) + OR (`project`.`changed_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) AND + `project`.`status` < 100) + ); END$$ DELIMITER ; diff --git a/sql_code/20180918_alter_table_tag.sql b/sql_code/20180918_alter_table_tag.sql index 2b848d333..7ccf7f418 100644 --- a/sql_code/20180918_alter_table_tag.sql +++ b/sql_code/20180918_alter_table_tag.sql @@ -1,2 +1,2 @@ ALTER TABLE `tag` - ADD COLUMN `is_active` INT(1) NOT NULL DEFAULT 1; + ADD COLUMN `is_active` INT(1) NOT NULL DEFAULT 1; diff --git a/sql_code/20180920_add_member_username_old.sql b/sql_code/20180920_add_member_username_old.sql index 0bd39666f..1850b30d0 100644 --- a/sql_code/20180920_add_member_username_old.sql +++ b/sql_code/20180920_add_member_username_old.sql @@ -1,3 +1,3 @@ ALTER TABLE `member` - ADD COLUMN `username_old` VARCHAR(255) NULL DEFAULT NULL AFTER `password_type_old`, - ADD COLUMN `mail_old` VARCHAR(255) NULL DEFAULT NULL AFTER `username_old`; + ADD COLUMN `username_old` VARCHAR(255) NULL DEFAULT NULL AFTER `password_type_old`, + ADD COLUMN `mail_old` VARCHAR(255) NULL DEFAULT NULL AFTER `username_old`; diff --git a/sql_code/20180926_add_procedure_merge_members.sql b/sql_code/20180926_add_procedure_merge_members.sql index 33bc65692..9ba1cdcd6 100644 --- a/sql_code/20180926_add_procedure_merge_members.sql +++ b/sql_code/20180926_add_procedure_merge_members.sql @@ -1,176 +1,182 @@ -INSERT INTO `pling-import`.`activity_log_types` (`activity_log_type_id`, `type_text`) VALUES ('321', 'BackendUserMerged'); - - -CREATE TABLE `merge_member_log` ( - `id` INT NOT NULL AUTO_INCREMENT, - `object_type` VARCHAR(50) NOT NULL COMMENT 'project, comment, rating,...', - `object_id` INT NOT NULL, - `member_id_org` INT NOT NULL COMMENT 'MemberId vor dem Merge', - `member_id_new` INT NOT NULL COMMENT 'MemberId nach dem Merge', - PRIMARY KEY (`id`) +INSERT INTO `pling-import`.`activity_log_types` (`activity_log_type_id`, `type_text`) +VALUES ('321', 'BackendUserMerged'); + + +CREATE TABLE `merge_member_log` +( + `id` INT NOT NULL AUTO_INCREMENT, + `object_type` VARCHAR(50) NOT NULL COMMENT 'project, comment, rating,...', + `object_id` INT NOT NULL, + `member_id_org` INT NOT NULL COMMENT 'MemberId vor dem Merge', + `member_id_new` INT NOT NULL COMMENT 'MemberId nach dem Merge', + PRIMARY KEY (`id`) ) -COLLATE='latin1_swedish_ci' + COLLATE = 'latin1_swedish_ci' ; -USE `pling`; + DROP PROCEDURE `merge_members`; DELIMITER // -CREATE PROCEDURE `merge_members`( - IN `from_member_id` INT, - IN `to_member_id` INT -) -COMMENT 'Merge of 2 members into 1' +CREATE PROCEDURE `merge_members`(IN `from_member_id` INT, + IN `to_member_id` INT) + COMMENT 'Merge of 2 members into 1' BEGIN - DECLARE exit handler for sqlexception - BEGIN - -- ERROR - ROLLBACK; - END; - - START TRANSACTION; - - #Update table member - UPDATE member m - SET m.is_active = 0 - ,m.is_deleted = 1 - ,m.deleted_at = NOW() - WHERE m.member_id = from_member_id; - - #Update table member_email - UPDATE member_email me - SET me.email_deleted = 1 - WHERE me.email_member_id = from_member_id; - - #Update table project - INSERT INTO merge_member_log - ( - SELECT null,'project', project_id, member_id, to_member_id - FROM project p WHERE p.member_id = from_member_id AND p.type_id = 1 - ); - - UPDATE project p - SET p.member_id = to_member_id - WHERE p.member_id = from_member_id - AND p.type_id = 1; - - #Update table comments - INSERT INTO merge_member_log - ( - SELECT null, 'comments', comment_id, comment_member_id, to_member_id - FROM comments c WHERE c.comment_member_id = from_member_id - ); - - UPDATE comments c - SET c.comment_member_id = to_member_id - WHERE c.comment_member_id = from_member_id; - - #Update table project_follower - INSERT INTO merge_member_log - ( - SELECT null, 'project_follower', project_follower_id, member_id, to_member_id - FROM project_follower f WHERE f.member_id = from_member_id - ); - - UPDATE project_follower f - SET f.member_id = to_member_id - WHERE f.member_id = from_member_id; - - #Update table project_rating - INSERT INTO merge_member_log - ( - SELECT null, 'project_rating', rating_id, member_id, to_member_id - FROM project_rating r WHERE r.member_id = from_member_id - ); - - UPDATE project_rating r - SET r.member_id = to_member_id - WHERE r.member_id = from_member_id; - - #Update table project_plings - INSERT INTO merge_member_log - ( - SELECT null, 'project_plings', project_plings_id, member_id, to_member_id - FROM project_plings r WHERE r.member_id = from_member_id - ); - - UPDATE project_plings r - SET r.member_id = to_member_id - WHERE r.member_id = from_member_id; - - - #Update ppload - - IF (SELECT count(1) FROM ppload.ppload_collections pc WHERE pc.owner_id = from_member_id) > 0 - + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + -- ERROR + ROLLBACK; + END; + + START TRANSACTION; + + #Update table member + UPDATE `member` `m` + SET `m`.`is_active` = 0 + , `m`.`is_deleted` = 1 + , `m`.`deleted_at` = NOW() + WHERE `m`.`member_id` = `from_member_id`; + + #Update table member_email + UPDATE `member_email` `me` + SET `me`.`email_deleted` = 1 + WHERE `me`.`email_member_id` = `from_member_id`; + + #Update table project + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'project', `project_id`, `member_id`, `to_member_id` + FROM `project` `p` + WHERE `p`.`member_id` = `from_member_id` + AND `p`.`type_id` = 1 + ); + + UPDATE `project` `p` + SET `p`.`member_id` = `to_member_id` + WHERE `p`.`member_id` = `from_member_id` + AND `p`.`type_id` = 1; + + #Update table comments + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'comments', `comment_id`, `comment_member_id`, `to_member_id` + FROM `comments` `c` + WHERE `c`.`comment_member_id` = `from_member_id` + ); + + UPDATE `comments` `c` + SET `c`.`comment_member_id` = `to_member_id` + WHERE `c`.`comment_member_id` = `from_member_id`; + + #Update table project_follower + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'project_follower', `project_follower_id`, `member_id`, `to_member_id` + FROM `project_follower` `f` + WHERE `f`.`member_id` = `from_member_id` + ); + + UPDATE `project_follower` `f` + SET `f`.`member_id` = `to_member_id` + WHERE `f`.`member_id` = `from_member_id`; + + #Update table project_rating + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'project_rating', `rating_id`, `member_id`, `to_member_id` + FROM `project_rating` `r` + WHERE `r`.`member_id` = `from_member_id` + ); + + UPDATE `project_rating` `r` + SET `r`.`member_id` = `to_member_id` + WHERE `r`.`member_id` = `from_member_id`; + + #Update table project_plings + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'project_plings', `project_plings_id`, `member_id`, `to_member_id` + FROM `project_plings` `r` + WHERE `r`.`member_id` = `from_member_id` + ); + + UPDATE `project_plings` `r` + SET `r`.`member_id` = `to_member_id` + WHERE `r`.`member_id` = `from_member_id`; + + + #Update ppload + + IF (SELECT count(1) FROM `ppload`.`ppload_collections` `pc` WHERE `pc`.`owner_id` = `from_member_id`) > 0 THEN - #Update ppload_collections - INSERT INTO merge_member_log - ( - SELECT null, 'ppload_collections', pc.id, pc.owner_id, to_member_id - FROM ppload.ppload_collections pc WHERE pc.owner_id = from_member_id - ); - - UPDATE ppload.ppload_collections pc - SET pc.owner_id = to_member_id - WHERE pc.owner_id = from_member_id; - - #Update ppload_files - INSERT INTO merge_member_log - ( - SELECT null, 'ppload_files', pc.id, pc.owner_id, to_member_id - FROM ppload.ppload_files pc WHERE pc.owner_id = from_member_id - ); - - UPDATE ppload.ppload_files pf - SET pf.owner_id = to_member_id - WHERE pf.owner_id = from_member_id; - - #Update ppload_files_downloaded? - /*INSERT INTO merge_member_log - ( - SELECT null, 'ppload_files_downloaded', pc.id, pc.owner_id, to_member_id - FROM ppload.ppload_files_downloaded pc WHERE pc.owner_id = from_member_id - );*/ - - UPDATE ppload.ppload_files_downloaded pfd - SET pfd.owner_id = to_member_id - WHERE pfd.owner_id = from_member_id; - - /** - #Update ppload_profiles - INSERT INTO merge_member_log - ( - SELECT null, 'ppload_profiles', pc.id, pc.owner_id, to_member_id - FROM ppload_profiles pc WHERE pc.owner_id = from_member_id - ); - - UPDATE ppload.ppload_profiles pp - SET pp.owner_id = to_member_id - WHERE pp.owner_id = from_member_id; - **/ + #Update ppload_collections + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'ppload_collections', `pc`.`id`, `pc`.`owner_id`, `to_member_id` + FROM `ppload`.`ppload_collections` `pc` + WHERE `pc`.`owner_id` = `from_member_id` + ); + + UPDATE `ppload`.`ppload_collections` `pc` + SET `pc`.`owner_id` = `to_member_id` + WHERE `pc`.`owner_id` = `from_member_id`; + + #Update ppload_files + INSERT INTO `merge_member_log` + ( + SELECT NULL, 'ppload_files', `pc`.`id`, `pc`.`owner_id`, `to_member_id` + FROM `ppload`.`ppload_files` `pc` + WHERE `pc`.`owner_id` = `from_member_id` + ); + + UPDATE `ppload`.`ppload_files` `pf` + SET `pf`.`owner_id` = `to_member_id` + WHERE `pf`.`owner_id` = `from_member_id`; + + #Update ppload_files_downloaded? + /*INSERT INTO merge_member_log + ( + SELECT null, 'ppload_files_downloaded', pc.id, pc.owner_id, to_member_id + FROM ppload.ppload_files_downloaded pc WHERE pc.owner_id = from_member_id + );*/ + + UPDATE `ppload`.`ppload_files_downloaded` `pfd` + SET `pfd`.`owner_id` = `to_member_id` + WHERE `pfd`.`owner_id` = `from_member_id`; + + /** + #Update ppload_profiles + INSERT INTO merge_member_log + ( + SELECT null, 'ppload_profiles', pc.id, pc.owner_id, to_member_id + FROM ppload_profiles pc WHERE pc.owner_id = from_member_id + ); + + UPDATE ppload.ppload_profiles pp + SET pp.owner_id = to_member_id + WHERE pp.owner_id = from_member_id; + **/ END IF; - - - - - #Write a log entry - INSERT INTO `activity_log` (`member_id`, `object_id`, `object_ref`, `object_title`, `object_text`, `activity_type_id`, `time`) VALUES ('22', from_member_id, 'member', 'call merge_members', CONCAT('merge member ', from_member_id,' into member ',to_member_id), '321', NOW()); - - - COMMIT; + + + #Write a log entry + INSERT INTO `activity_log` (`member_id`, `object_id`, `object_ref`, `object_title`, `object_text`, + `activity_type_id`, `time`) + VALUES ('22', `from_member_id`, 'member', 'call merge_members', + CONCAT('merge member ', `from_member_id`, ' into member ', `to_member_id`), '321', NOW()); + COMMIT; END // DELIMITER ; diff --git a/sql_code/20180926_member_update.sql b/sql_code/20180926_member_update.sql index 0cd211a34..7c72ebfc1 100644 --- a/sql_code/20180926_member_update.sql +++ b/sql_code/20180926_member_update.sql @@ -1,16 +1,22 @@ -CREATE TABLE `member_avatar_type` ( - `member_avatar_type_id` INT NOT NULL , - `title` VARCHAR(45) , - PRIMARY KEY (`member_avatar_type_id`)); +CREATE TABLE `member_avatar_type` +( + `member_avatar_type_id` INT NOT NULL, + `title` VARCHAR(45), + PRIMARY KEY (`member_avatar_type_id`) +); -INSERT INTO `member_avatar_type` (`member_avatar_type_id`, `title`) VALUES (0, 'unknow'); -INSERT INTO `member_avatar_type` (`member_avatar_type_id`, `title`) VALUES (1, 'auto generated letter avatar'); -INSERT INTO `member_avatar_type` (`member_avatar_type_id`, `title`) VALUES (2, 'user uploaded'); +INSERT INTO `member_avatar_type` (`member_avatar_type_id`, `title`) +VALUES (0, 'unknow'); +INSERT INTO `member_avatar_type` (`member_avatar_type_id`, `title`) +VALUES (1, 'auto generated letter avatar'); +INSERT INTO `member_avatar_type` (`member_avatar_type_id`, `title`) +VALUES (2, 'user uploaded'); -ALTER TABLE `member` -ADD COLUMN `avatar_type_id` INT(11) NOT NULL DEFAULT 1 after avatar; +ALTER TABLE `member` + ADD COLUMN `avatar_type_id` INT(11) NOT NULL DEFAULT 1 AFTER `avatar`; -update member set avatar_type_id = 0; \ No newline at end of file +UPDATE `member` +SET `avatar_type_id` = 0; \ No newline at end of file diff --git a/sql_code/20181012_add_git_group.sql b/sql_code/20181012_add_git_group.sql index abadcbcbc..6a11b3dea 100644 --- a/sql_code/20181012_add_git_group.sql +++ b/sql_code/20181012_add_git_group.sql @@ -1,20 +1,20 @@ -CREATE TABLE git_group +CREATE TABLE `git_group` ( - git_group_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, - group_name VARCHAR(255), - group_id INT, - group_full_path VARCHAR(255) + `git_group_id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + `group_name` VARCHAR(255), + `group_id` INT, + `group_full_path` VARCHAR(255) ); -CREATE INDEX git_group__group_id ON git_group (group_id); +CREATE INDEX `git_group__group_id` ON `git_group` (`group_id`); -CREATE TABLE git_group_user +CREATE TABLE `git_group_user` ( - git_group_user_id INT PRIMARY KEY AUTO_INCREMENT, - group_id INT, - user_id INT, - user_name VARCHAR(255), - user_email VARCHAR(255), - group_access VARCHAR(40) + `git_group_user_id` INT PRIMARY KEY AUTO_INCREMENT, + `group_id` INT, + `user_id` INT, + `user_name` VARCHAR(255), + `user_email` VARCHAR(255), + `group_access` VARCHAR(40) ); -CREATE INDEX git_group_user__email ON git_group_user (user_email); -CREATE INDEX git_group_user__group_id ON git_group_user (group_id); \ No newline at end of file +CREATE INDEX `git_group_user__email` ON `git_group_user` (`user_email`); +CREATE INDEX `git_group_user__group_id` ON `git_group_user` (`group_id`); \ No newline at end of file diff --git a/sql_code/20181019_alter_project_gitlab.sql b/sql_code/20181019_alter_project_gitlab.sql index 7f6a6f44d..c28724688 100644 --- a/sql_code/20181019_alter_project_gitlab.sql +++ b/sql_code/20181019_alter_project_gitlab.sql @@ -1,5 +1,5 @@ ALTER TABLE `project` - ADD COLUMN `is_gitlab_project` INT(1) NOT NULL DEFAULT '0' AFTER `count_downloads_hive`, - ADD COLUMN `gitlab_project_id` INT(11) NULL DEFAULT NULL AFTER `is_gitlab_project`, - ADD COLUMN `show_gitlab_project_issues` INT(1) NOT NULL DEFAULT '0' AFTER `gitlab_project_id`, - ADD COLUMN `use_gitlab_project_readme` INT(1) NOT NULL DEFAULT '0' AFTER `show_gitlab_project_issues`; + ADD COLUMN `is_gitlab_project` INT(1) NOT NULL DEFAULT '0' AFTER `count_downloads_hive`, + ADD COLUMN `gitlab_project_id` INT(11) NULL DEFAULT NULL AFTER `is_gitlab_project`, + ADD COLUMN `show_gitlab_project_issues` INT(1) NOT NULL DEFAULT '0' AFTER `gitlab_project_id`, + ADD COLUMN `use_gitlab_project_readme` INT(1) NOT NULL DEFAULT '0' AFTER `show_gitlab_project_issues`; diff --git a/sql_code/20181112_member_gitlab_user_id.sql b/sql_code/20181112_member_gitlab_user_id.sql index 6c54d37e1..8450c0ffb 100644 --- a/sql_code/20181112_member_gitlab_user_id.sql +++ b/sql_code/20181112_member_gitlab_user_id.sql @@ -1,2 +1,2 @@ ALTER TABLE `member_external_id` - ADD COLUMN `gitlab_user_id` INT(1) NULL DEFAULT NULL AFTER `is_deleted`; + ADD COLUMN `gitlab_user_id` INT(1) NULL DEFAULT NULL AFTER `is_deleted`; diff --git a/sql_code/20181119_add_table_stat_projects_source_url.sql b/sql_code/20181119_add_table_stat_projects_source_url.sql index 04373bf81..ac308fa3d 100644 --- a/sql_code/20181119_add_table_stat_projects_source_url.sql +++ b/sql_code/20181119_add_table_stat_projects_source_url.sql @@ -1,26 +1,32 @@ -CREATE DEFINER=`root`@`%` EVENT `e_generate_stat_projects_source_url` - ON SCHEDULE - EVERY 5 MINUTE STARTS '2018-11-19 11:57:15' - ON COMPLETION NOT PRESERVE - ENABLE - COMMENT '' - DO BEGIN +CREATE DEFINER =`root`@`%` EVENT `e_generate_stat_projects_source_url` + ON SCHEDULE + EVERY 5 MINUTE STARTS '2018-11-19 11:57:15' + ON COMPLETION NOT PRESERVE + ENABLE + COMMENT '' + DO + BEGIN - create table stat_projects_source_url_tmp - (PRIMARY KEY `primary` (`project_id`) - ,INDEX `idx_proj` (`project_id`) - ,INDEX `idx_member` (`member_id`) - ,INDEX `idx_source_url` (`source_url`(50)) - ) - ENGINE MyISAM - as - select p.project_id, p.member_id,TRIM(TRAILING '/' FROM p.source_url) as source_url, p.created_at, p.changed_at from stat_projects p - where p.source_url is not null - and p.source_url<>'' - and p.status=100 - ; - rename table stat_projects_source_url to stat_projects_source_url_old; - rename table stat_projects_source_url_tmp to stat_projects_source_url; - drop table stat_projects_source_url_old; + CREATE TABLE `stat_projects_source_url_tmp` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_proj` (`project_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `p`.`project_id`, + `p`.`member_id`, + TRIM(TRAILING '/' FROM `p`.`source_url`) AS `source_url`, + `p`.`created_at`, + `p`.`changed_at` + FROM `stat_projects` `p` + WHERE `p`.`source_url` IS NOT NULL + AND `p`.`source_url` <> '' + AND `p`.`status` = 100; + RENAME TABLE `stat_projects_source_url` TO `stat_projects_source_url_old`; + RENAME TABLE `stat_projects_source_url_tmp` TO `stat_projects_source_url`; + DROP TABLE `stat_projects_source_url_old`; -END \ No newline at end of file + END \ No newline at end of file diff --git a/sql_code/20181119_page_views_48h.sql b/sql_code/20181119_page_views_48h.sql index 808b8e8dc..fedefbf7a 100644 --- a/sql_code/20181119_page_views_48h.sql +++ b/sql_code/20181119_page_views_48h.sql @@ -1,22 +1,29 @@ -CREATE TABLE stat_page_views_48h LIKE stat_page_views; +CREATE TABLE `stat_page_views_48h` LIKE `stat_page_views`; DELIMITER $$ -DROP TRIGGER IF EXISTS stat_page_views_AFTER_INSERT$$ -CREATE TRIGGER stat_page_views_AFTER_INSERT AFTER INSERT ON stat_page_views FOR EACH ROW BEGIN - #insert also into table stat_page_views_48h - INSERT INTO stat_page_views_48h (stat_page_views_id,project_id,ip,member_id,created_at) values (new.stat_page_views_id,new.project_id,new.ip,new.member_id,new.created_at); +DROP TRIGGER IF EXISTS `stat_page_views_AFTER_INSERT`$$ +CREATE TRIGGER `stat_page_views_AFTER_INSERT` + AFTER INSERT + ON `stat_page_views` + FOR EACH ROW +BEGIN + #insert also into table stat_page_views_48h + INSERT INTO `stat_page_views_48h` (`stat_page_views_id`, `project_id`, `ip`, `member_id`, `created_at`) + VALUES (`new`.`stat_page_views_id`, `new`.`project_id`, `new`.`ip`, `new`.`member_id`, `new`.`created_at`); END$$ DROP EVENT IF EXISTS `e_generate_page_views_48h`; CREATE EVENT `e_generate_page_views_48h` - ON SCHEDULE - EVERY 1 DAY STARTS '2018-11-20 05:00:00' - ON COMPLETION PRESERVE - ENABLE - COMMENT 'Delete old page_view data from table stat_page_views_48h' - DO - DELETE FROM stat_page_views_48h WHERE created_at <= subdate(now(), 2); - + ON SCHEDULE + EVERY 1 DAY STARTS '2018-11-20 05:00:00' + ON COMPLETION PRESERVE + ENABLE + COMMENT 'Delete old page_view data from table stat_page_views_48h' + DO + DELETE + FROM `stat_page_views_48h` + WHERE `created_at` <= subdate(now(), 2); + DELIMITER ; \ No newline at end of file diff --git a/sql_code/20181129_add_stat_downloads_24h.sql b/sql_code/20181129_add_stat_downloads_24h.sql index d34c2499c..859a76fba 100644 --- a/sql_code/20181129_add_stat_downloads_24h.sql +++ b/sql_code/20181129_add_stat_downloads_24h.sql @@ -1,45 +1,46 @@ -DROP TABLE pling-import.stat_downloads_24h; +DROP TABLE `pling`-IMPORT.stat_downloads_24h; -CREATE TABLE pling-import.stat_downloads_24h LIKE ppload.ppload_files_downloaded; -ALTER TABLE pling-import.`stat_downloads_24h` - ADD INDEX `idx_collection_id` (`collection_id`); +CREATE TABLE `pling`- IMPORT.stat_downloads_24h LIKE ppload.ppload_files_downloaded; +ALTER TABLE `pling`- IMPORT.`stat_downloads_24h` + ADD INDEX `idx_collection_id` (`collection_id`); DELIMITER $$ -DROP TRIGGER IF EXISTS ppload.ppload_files_downloaded_AFTER_INSERT$$ -CREATE TRIGGER ppload.ppload_files_downloaded_AFTER_INSERT AFTER INSERT ON ppload.ppload_files_downloaded FOR EACH ROW BEGIN - #insert also into table stat_downloads_24h - INSERT INTO `pling-import`.`stat_downloads_24h` ( - id, - client_id, - owner_id, - collection_id, - file_id, - user_id, - referer, - downloaded_timestamp, - downloaded_ip - ) values ( - new.id, - new.client_id, - new.owner_id, - new.collection_id, - new.file_id, - new.user_id, - new.referer, - new.downloaded_timestamp, - new.downloaded_ip - ); +DROP TRIGGER IF EXISTS `ppload`.`ppload_files_downloaded_AFTER_INSERT`$$ +CREATE TRIGGER `ppload`.`ppload_files_downloaded_AFTER_INSERT` + AFTER INSERT + ON `ppload`.`ppload_files_downloaded` + FOR EACH ROW +BEGIN + #insert also into table stat_downloads_24h + INSERT INTO `pling-import`.`stat_downloads_24h` (`id`, + `client_id`, + `owner_id`, + `collection_id`, + `file_id`, + `user_id`, + `referer`, + `downloaded_timestamp`, + `downloaded_ip`) + VALUES (`new`.`id`, + `new`.`client_id`, + `new`.`owner_id`, + `new`.`collection_id`, + `new`.`file_id`, + `new`.`user_id`, + `new`.`referer`, + `new`.`downloaded_timestamp`, + `new`.`downloaded_ip`); END$$ - + DELIMITER ; DROP EVENT IF EXISTS `e_generate_stat_downloads_24h`; CREATE EVENT `e_generate_stat_downloads_24h` - ON SCHEDULE - EVERY 1 DAY STARTS '2018-11-30 01:00:00' - ON COMPLETION PRESERVE - ENABLE - COMMENT 'Save download data for the last 24h into table stat_downloads_24h' - DO - TRUNCATE TABLE stat_downloads_24h; \ No newline at end of file + ON SCHEDULE + EVERY 1 DAY STARTS '2018-11-30 01:00:00' + ON COMPLETION PRESERVE + ENABLE + COMMENT 'Save download data for the last 24h into table stat_downloads_24h' + DO + TRUNCATE TABLE `stat_downloads_24h`; \ No newline at end of file diff --git a/sql_code/20181205_member_deactivate_log.sql b/sql_code/20181205_member_deactivate_log.sql index 9563b65ff..33ae80f8a 100644 --- a/sql_code/20181205_member_deactivate_log.sql +++ b/sql_code/20181205_member_deactivate_log.sql @@ -1,38 +1,48 @@ DROP TABLE IF EXISTS `member_deactivation_log`; -CREATE TABLE `member_deactivation_log` ( - `log_id` INT NOT NULL AUTO_INCREMENT, - `deactivation_id` INT NOT NULL DEFAULT '0' COMMENT 'Id of the deactivation', - `object_type_id` INT NOT NULL DEFAULT '0', - `object_id` INT NOT NULL DEFAULT '0', - `member_id` INT NOT NULL DEFAULT '0' COMMENT 'Member was deactivated from this user', - `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`log_id`) +CREATE TABLE `member_deactivation_log` +( + `log_id` INT NOT NULL AUTO_INCREMENT, + `deactivation_id` INT NOT NULL DEFAULT '0' COMMENT 'Id of the deactivation', + `object_type_id` INT NOT NULL DEFAULT '0', + `object_id` INT NOT NULL DEFAULT '0', + `member_id` INT NOT NULL DEFAULT '0' COMMENT 'Member was deactivated from this user', + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`log_id`) ) -COLLATE='utf8_general_ci' + COLLATE = 'utf8_general_ci' ; DROP TABLE IF EXISTS `member_deactivation_object_types`; -CREATE TABLE `member_deactivation_object_types` ( - `object_type_id` INT NULL, - `object_system` VARCHAR(50) NULL, - `object_name` VARCHAR(50) NULL, - PRIMARY KEY (`object_type_id`) +CREATE TABLE `member_deactivation_object_types` +( + `object_type_id` INT NULL, + `object_system` VARCHAR(50) NULL, + `object_name` VARCHAR(50) NULL, + PRIMARY KEY (`object_type_id`) ) -COLLATE='utf8_general_ci' + COLLATE = 'utf8_general_ci' ; -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (1,'opendesktop','member'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (2,'opendesktop','member_email'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (3,'opendesktop','project'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (4,'opendesktop','comments'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (1, 'opendesktop', 'member'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (2, 'opendesktop', 'member_email'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (3, 'opendesktop', 'project'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (4, 'opendesktop', 'comments'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (20,'gitlab','user'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (21,'gitlab','project'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (20, 'gitlab', 'user'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (21, 'gitlab', 'project'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (30,'discourse','user'); -INSERT INTO member_deactivation_object_types (`object_type_id`,`object_system`,`object_name`) VALUES (31,'discourse','topic'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (30, 'discourse', 'user'); +INSERT INTO `member_deactivation_object_types` (`object_type_id`, `object_system`, `object_name`) +VALUES (31, 'discourse', 'topic'); ALTER TABLE `member_deactivation_log` - ADD COLUMN `is_deleted` INT NULL DEFAULT '0' COMMENT 'Is the user undeleted -> is_deleted = 1' AFTER `created_at`, - ADD COLUMN `deleted_at` TIMESTAMP NULL AFTER `is_deleted`; + ADD COLUMN `is_deleted` INT NULL DEFAULT '0' COMMENT 'Is the user undeleted -> is_deleted = 1' AFTER `created_at`, + ADD COLUMN `deleted_at` TIMESTAMP NULL AFTER `is_deleted`; diff --git a/sql_code/20181214_dactivation_log.sql b/sql_code/20181214_dactivation_log.sql index db854fa6d..054a643fc 100644 --- a/sql_code/20181214_dactivation_log.sql +++ b/sql_code/20181214_dactivation_log.sql @@ -1,2 +1,2 @@ ALTER TABLE `member_deactivation_log` - ADD COLUMN `object_data` MEDIUMTEXT NULL DEFAULT NULL AFTER `deleted_at`; + ADD COLUMN `object_data` MEDIUMTEXT NULL DEFAULT NULL AFTER `deleted_at`; diff --git a/sql_code/20181218_category_taggroup.sql b/sql_code/20181218_category_taggroup.sql index f5184c1ec..e41435bc4 100644 --- a/sql_code/20181218_category_taggroup.sql +++ b/sql_code/20181218_category_taggroup.sql @@ -1,8 +1,8 @@ - -CREATE TABLE `category_tag_group` ( - `category_id` INT(11) NOT NULL, - `tag_group_id` INT(11) NOT NULL +CREATE TABLE `category_tag_group` +( + `category_id` INT(11) NOT NULL, + `tag_group_id` INT(11) NOT NULL ) -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB ; \ No newline at end of file diff --git a/sql_code/20190104_add_suspicious_table.sql b/sql_code/20190104_add_suspicious_table.sql index 8586080b5..9f72ff6e3 100644 --- a/sql_code/20190104_add_suspicious_table.sql +++ b/sql_code/20190104_add_suspicious_table.sql @@ -1,13 +1,15 @@ -CREATE TABLE IF NOT EXISTS `suspicion_log` ( - `suspicion_id` INT NOT NULL AUTO_INCREMENT, - `project_id` INT(11) NOT NULL, - `member_id` INT(11) NOT NULL, - `http_referer` VARCHAR(255) NULL, - `http_origin` VARCHAR(255) NULL, - `client_ip` VARCHAR(45) NULL, - `user_agent` VARCHAR(255) NULL, - `suspicious` INT(1) NULL DEFAULT 0, - PRIMARY KEY (`suspicion_id`), - INDEX `idxProject` (`project_id` ASC), - INDEX `idxMember` (`member_id` ASC)) - ENGINE = MyISAM; \ No newline at end of file +CREATE TABLE IF NOT EXISTS `suspicion_log` +( + `suspicion_id` INT NOT NULL AUTO_INCREMENT, + `project_id` INT(11) NOT NULL, + `member_id` INT(11) NOT NULL, + `http_referer` VARCHAR(255) NULL, + `http_origin` VARCHAR(255) NULL, + `client_ip` VARCHAR(45) NULL, + `user_agent` VARCHAR(255) NULL, + `suspicious` INT(1) NULL DEFAULT 0, + PRIMARY KEY (`suspicion_id`), + INDEX `idxProject` (`project_id` ASC), + INDEX `idxMember` (`member_id` ASC) +) + ENGINE = MyISAM; \ No newline at end of file diff --git a/sql_code/20190110_add_table_spam_keywords.sql b/sql_code/20190110_add_table_spam_keywords.sql index ce7634bbb..825cc2ac1 100644 --- a/sql_code/20190110_add_table_spam_keywords.sql +++ b/sql_code/20190110_add_table_spam_keywords.sql @@ -1,46 +1,72 @@ -USE `pling`; + DROP TABLE IF EXISTS `spam_keywords`; -CREATE TABLE `spam_keywords` ( - `spam_key_id` INT NOT NULL AUTO_INCREMENT, - `spam_key_word` VARCHAR(45) NOT NULL, - `spam_key_created_at` DATETIME NULL, - `spam_key_is_deleted` INT(1) NULL DEFAULT 0, - `spam_key_is_active` INT(1) NULL DEFAULT 1, - PRIMARY KEY (`spam_key_id`)) - ENGINE = InnoDB; +CREATE TABLE `spam_keywords` +( + `spam_key_id` INT NOT NULL AUTO_INCREMENT, + `spam_key_word` VARCHAR(45) NOT NULL, + `spam_key_created_at` DATETIME NULL, + `spam_key_is_deleted` INT(1) NULL DEFAULT 0, + `spam_key_is_active` INT(1) NULL DEFAULT 1, + PRIMARY KEY (`spam_key_id`) +) + ENGINE = InnoDB; DROP TRIGGER IF EXISTS `spam_keywords_BEFORE_INSERT`; DELIMITER $$ -CREATE DEFINER = CURRENT_USER TRIGGER `spam_keywords_BEFORE_INSERT` BEFORE INSERT ON `spam_keywords` FOR EACH ROW - BEGIN - IF NEW.spam_key_created_at IS NULL THEN - SET NEW.spam_key_created_at = NOW(); +CREATE DEFINER = CURRENT_USER TRIGGER `spam_keywords_BEFORE_INSERT` + BEFORE INSERT + ON `spam_keywords` + FOR EACH ROW +BEGIN + IF `NEW`.`spam_key_created_at` IS NULL THEN + SET `NEW`.`spam_key_created_at` = NOW(); END IF; - END$$ +END$$ DELIMITER ; -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('keto'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('spartan'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('ingredient'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('rdx surge'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('vashikaran'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('muscles'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('viagra'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('s3xual'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('erection'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('praltrix'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('s3x'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('herpes'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('male enhancement'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('astrology'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('megashare'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('body weight'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('diet'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('foreskin'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('fat loss'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('cream'); -INSERT INTO `spam_keywords` (`spam_key_word`) VALUES ('healthy'); \ No newline at end of file +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('keto'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('spartan'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('ingredient'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('rdx surge'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('vashikaran'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('muscles'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('viagra'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('s3xual'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('erection'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('praltrix'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('s3x'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('herpes'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('male enhancement'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('astrology'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('megashare'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('body weight'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('diet'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('foreskin'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('fat loss'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('cream'); +INSERT INTO `spam_keywords` (`spam_key_word`) +VALUES ('healthy'); \ No newline at end of file diff --git a/sql_code/20190110_store_config_show_git.sql b/sql_code/20190110_store_config_show_git.sql index 2471e4f04..d6bed654e 100644 --- a/sql_code/20190110_store_config_show_git.sql +++ b/sql_code/20190110_store_config_show_git.sql @@ -1,2 +1,2 @@ ALTER TABLE `config_store` - ADD COLUMN `is_show_git_projects` INT(1) NULL DEFAULT '1' COMMENT 'Should the latest Git-Projects-Section been shown?' AFTER `is_show_home`; + ADD COLUMN `is_show_git_projects` INT(1) NULL DEFAULT '1' COMMENT 'Should the latest Git-Projects-Section been shown?' AFTER `is_show_home`; diff --git a/sql_code/20190115_stat_cnt_projects_catid_memberid.sql b/sql_code/20190115_stat_cnt_projects_catid_memberid.sql index 33bce56e0..694e360d9 100644 --- a/sql_code/20190115_stat_cnt_projects_catid_memberid.sql +++ b/sql_code/20190115_stat_cnt_projects_catid_memberid.sql @@ -1,39 +1,46 @@ -create table stat_cnt_projects_catid_memberid as -select project_category_id, member_id,count(1) as cnt from project pp -where pp.status = 100 and pp.type_id = 1 -group by project_category_id,member_id; +CREATE TABLE `stat_cnt_projects_catid_memberid` AS +SELECT `project_category_id`, `member_id`, count(1) AS `cnt` +FROM `project` `pp` +WHERE `pp`.`status` = 100 + AND `pp`.`type_id` = 1 +GROUP BY `project_category_id`, `member_id`; ALTER TABLE `stat_cnt_projects_catid_memberid` - ADD INDEX `idx_project_category_id` (`project_category_id`), - ADD INDEX `idx_member_id` (`member_id`); + ADD INDEX `idx_project_category_id` (`project_category_id`), + ADD INDEX `idx_member_id` (`member_id`); - -TRUNCATE TABLE stat_cnt_projects_catid_memberid; -INSERT INTO stat_cnt_projects_catid_memberid -select project_category_id, member_id,count(1) as cnt from project pp -where pp.status = 100 and pp.type_id = 1 -group by project_category_id,member_id; +TRUNCATE TABLE `stat_cnt_projects_catid_memberid`; + +INSERT INTO `stat_cnt_projects_catid_memberid` +SELECT `project_category_id`, `member_id`, count(1) AS `cnt` +FROM `project` `pp` +WHERE `pp`.`status` = 100 + AND `pp`.`type_id` = 1 +GROUP BY `project_category_id`, `member_id`; CREATE EVENT `e_generate_stat_cnt_projects_catid_memberid` - ON SCHEDULE - EVERY 1 DAY STARTS '2019-01-15 03:30:00' - ON COMPLETION NOT PRESERVE - ENABLE - COMMENT '' - DO BEGIN - TRUNCATE TABLE stat_cnt_projects_catid_memberid; - - INSERT INTO stat_cnt_projects_catid_memberid - select project_category_id, member_id,count(1) as cnt from project pp - where pp.status = 100 and pp.type_id = 1 - group by project_category_id,member_id; - -END; + ON SCHEDULE + EVERY 1 DAY STARTS '2019-01-15 03:30:00' + ON COMPLETION NOT PRESERVE + ENABLE + COMMENT '' + DO + BEGIN + TRUNCATE TABLE `stat_cnt_projects_catid_memberid`; + + INSERT INTO `stat_cnt_projects_catid_memberid` + SELECT `project_category_id`, `member_id`, count(1) AS `cnt` + FROM `project` `pp` + WHERE `pp`.`status` = 100 + AND `pp`.`type_id` = 1 + GROUP BY `project_category_id`, `member_id`; + + END; diff --git a/sql_code/20190121_add_tag_group_display_name.sql b/sql_code/20190121_add_tag_group_display_name.sql index 2c5c3e4ef..b027873aa 100644 --- a/sql_code/20190121_add_tag_group_display_name.sql +++ b/sql_code/20190121_add_tag_group_display_name.sql @@ -1,11 +1,21 @@ ALTER TABLE `tag_group` - ADD COLUMN `group_display_name` VARCHAR(255) NOT NULL AFTER `group_name`; + ADD COLUMN `group_display_name` VARCHAR(255) NOT NULL AFTER `group_name`; ALTER TABLE `tag_group` - ADD COLUMN `group_legacy_name` VARCHAR(45) NOT NULL AFTER `group_display_name`; + ADD COLUMN `group_legacy_name` VARCHAR(45) NOT NULL AFTER `group_display_name`; -UPDATE `pling-import`.`tag_group` SET `group_display_name`='Packagetype' WHERE `group_id`=8; -UPDATE `pling-import`.`tag_group` SET `group_display_name`='Architecture' WHERE `group_id`=9; +UPDATE `pling-import`.`tag_group` +SET `group_display_name`='Packagetype' +WHERE `group_id` = 8; +UPDATE `pling-import`.`tag_group` +SET `group_display_name`='Architecture' +WHERE `group_id` = 9; -UPDATE `pling-import`.`tag_group` SET `group_legacy_name`='license' WHERE `group_id`=7; -UPDATE `pling-import`.`tag_group` SET `group_legacy_name`='packagetype' WHERE `group_id`=8; -UPDATE `pling-import`.`tag_group` SET `group_legacy_name`='architecture' WHERE `group_id`=9; +UPDATE `pling-import`.`tag_group` +SET `group_legacy_name`='license' +WHERE `group_id` = 7; +UPDATE `pling-import`.`tag_group` +SET `group_legacy_name`='packagetype' +WHERE `group_id` = 8; +UPDATE `pling-import`.`tag_group` +SET `group_legacy_name`='architecture' +WHERE `group_id` = 9; diff --git a/sql_code/20190123_add_proc_stat_project_tagids.sql b/sql_code/20190123_add_proc_stat_project_tagids.sql index f2e1f620c..0aba3a6c4 100644 --- a/sql_code/20190123_add_proc_stat_project_tagids.sql +++ b/sql_code/20190123_add_proc_stat_project_tagids.sql @@ -1,44 +1,47 @@ -DROP PROCEDURE IF EXISTS generate_stat_project_ids; +DROP PROCEDURE IF EXISTS `generate_stat_project_ids`; DELIMITER $$ CREATE PROCEDURE `generate_stat_project_ids`() BEGIN - DROP TABLE IF EXISTS tmp_stat_project_tagids; - CREATE TABLE tmp_stat_project_tagids - (INDEX `idx_tag_id` (`tag_id`),INDEX `idx_project_id` (`project_id`)) - ENGINE MyISAM - AS - - select distinct tag_id, project_id from ( - - select distinct tag.tag_id, tgo.tag_object_id AS project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select distinct tag.tag_id, tgo.tag_parent_object_id AS project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - ; - RENAME TABLE stat_project_tagids TO old_stat_project_tagids, tmp_stat_project_tagids TO stat_project_tagids; - DROP TABLE IF EXISTS old_stat_project_tagids; + DROP TABLE IF EXISTS `tmp_stat_project_tagids`; + CREATE TABLE `tmp_stat_project_tagids` + ( + INDEX `idx_tag_id` (`tag_id`), + INDEX `idx_project_id` (`project_id`) + ) + ENGINE MyISAM + AS + + SELECT DISTINCT `tag_id`, `project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_id`, `tgo`.`tag_object_id` AS `project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_id`, `tgo`.`tag_parent_object_id` AS `project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A`; + RENAME TABLE `stat_project_tagids` TO `old_stat_project_tagids`, `tmp_stat_project_tagids` TO `stat_project_tagids`; + DROP TABLE IF EXISTS `old_stat_project_tagids`; END$$ DELIMITER ; CREATE EVENT `e_generate_stat_project_ids` - ON SCHEDULE - EVERY 15 MINUTE STARTS '2019-01-23 15:43:00' - ON COMPLETION NOT PRESERVE - ENABLE - COMMENT '' - DO BEGIN - CALL generate_stat_project_ids(); -END \ No newline at end of file + ON SCHEDULE + EVERY 15 MINUTE STARTS '2019-01-23 15:43:00' + ON COMPLETION NOT PRESERVE + ENABLE + COMMENT '' + DO + BEGIN + CALL generate_stat_project_ids(); + END \ No newline at end of file diff --git a/sql_code/20190123_add_stored_prod_for tags.sql b/sql_code/20190123_add_stored_prod_for tags.sql index 42cd236f1..b72f467c2 100644 --- a/sql_code/20190123_add_stored_prod_for tags.sql +++ b/sql_code/20190123_add_stored_prod_for tags.sql @@ -1,34 +1,50 @@ USE `pling-import`; -DROP procedure IF EXISTS `fetchCatTreeWithTags`; +DROP PROCEDURE IF EXISTS `fetchCatTreeWithTags`; DELIMITER $$ USE `pling-import`$$ -CREATE DEFINER=CURRENT_USER PROCEDURE `fetchCatTreeWithTags`(IN STORE_ID int(11), IN TAGS VARCHAR(255)) - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `fetchCatTreeWithTags`(IN `STORE_ID` int(11), IN `TAGS` VARCHAR(255)) +BEGIN DROP TABLE IF EXISTS `tmp_store_cat_tags`; CREATE TEMPORARY TABLE `tmp_store_cat_tags` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; - SET @NEW_ORDER := 0; + SET @`NEW_ORDER` := 0; - UPDATE `tmp_store_cat_tags` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); + UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat_tags` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND FIND_IN_SET(`scpc`.`package_type_id`,TAGS) - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND + FIND_IN_SET(`scpc`.`package_type_id`, `TAGS`) + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; - END$$ +END$$ DELIMITER ; diff --git a/sql_code/20190123_add_table_config_store_tag.sql b/sql_code/20190123_add_table_config_store_tag.sql index 16e2ce300..14dac201e 100644 --- a/sql_code/20190123_add_table_config_store_tag.sql +++ b/sql_code/20190123_add_table_config_store_tag.sql @@ -1,35 +1,39 @@ -CREATE TABLE `config_store_tag` ( - `config_store_tag_id` INT(11) NOT NULL AUTO_INCREMENT, - `store_id` INT(11) NOT NULL, - `tag_id` INT(11) NOT NULL, - `is_active` INT(1) UNSIGNED NOT NULL DEFAULT '1', - `created_at` DATETIME NULL DEFAULT NULL, - `changed_at` DATETIME NULL DEFAULT NULL, - `deleted_at` DATETIME NULL DEFAULT NULL, - PRIMARY KEY (`config_store_tag_id`) +CREATE TABLE `config_store_tag` +( + `config_store_tag_id` INT(11) NOT NULL AUTO_INCREMENT, + `store_id` INT(11) NOT NULL, + `tag_id` INT(11) NOT NULL, + `is_active` INT(1) UNSIGNED NOT NULL DEFAULT '1', + `created_at` DATETIME NULL DEFAULT NULL, + `changed_at` DATETIME NULL DEFAULT NULL, + `deleted_at` DATETIME NULL DEFAULT NULL, + PRIMARY KEY (`config_store_tag_id`) ) ; -CREATE TRIGGER `config_store_tag_before_insert` BEFORE INSERT ON `config_store_tag` FOR EACH ROW BEGIN - IF NEW.created_at IS NULL THEN - SET NEW.created_at = NOW(); +CREATE TRIGGER `config_store_tag_before_insert` + BEFORE INSERT + ON `config_store_tag` + FOR EACH ROW +BEGIN + IF `NEW`.`created_at` IS NULL THEN + SET `NEW`.`created_at` = NOW(); END IF; END; -insert into config_store_tag +INSERT INTO `config_store_tag` -select -null as `config_store_tag_id`, - s.store_id as `store_id`, - s.package_type as `tag_id`, - 1 as `is_active`, - null as `created_at`, - null as `changed_at`, - null as `deleted_at` -from config_store s -where s.package_type is not null; +SELECT NULL AS `config_store_tag_id`, + `s`.`store_id` AS `store_id`, + `s`.`package_type` AS `tag_id`, + 1 AS `is_active`, + NULL AS `created_at`, + NULL AS `changed_at`, + NULL AS `deleted_at` +FROM `config_store` `s` +WHERE `s`.`package_type` IS NOT NULL; diff --git a/sql_code/20190124_add_table_member_setting.sql b/sql_code/20190124_add_table_member_setting.sql index 8600f14c6..ae924d0c9 100644 --- a/sql_code/20190124_add_table_member_setting.sql +++ b/sql_code/20190124_add_table_member_setting.sql @@ -1,24 +1,29 @@ +CREATE TABLE `member_setting_group` +( + `member_setting_group_id` INT(11) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(45) NOT NULL, + PRIMARY KEY (`member_setting_group_id`) +); -CREATE TABLE `member_setting_group` ( - `member_setting_group_id` INT(11) NOT NULL AUTO_INCREMENT, - `title` VARCHAR(45) NOT NULL, - PRIMARY KEY (`member_setting_group_id`)); +CREATE TABLE `member_setting_item` +( + `member_setting_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(45) NOT NULL, + `member_setting_group_id` INT(11) NOT NULL, + PRIMARY KEY (`member_setting_item_id`) +); -CREATE TABLE `member_setting_item` ( - `member_setting_item_id` INT(11) NOT NULL AUTO_INCREMENT, - `title` VARCHAR(45) NOT NULL, - `member_setting_group_id` INT(11) NOT NULL, - PRIMARY KEY (`member_setting_item_id`)); - -CREATE TABLE `member_setting_value` ( - `member_setting_value_id` INT(11) NOT NULL AUTO_INCREMENT, - `member_setting_item_id` INT(11) NOT NULL, - `value` VARCHAR(100) NOT NULL, - `member_id` INT(11) NOT NULL, - `created_at` TIMESTAMP NOT NULL DEFAULT now(), - `changed_at` DATETIME NULL DEFAULT NULL, - `deleted_at` DATETIME NULL DEFAULT NULL, - `is_active` INT(1) NOT NULL DEFAULT 1, - PRIMARY KEY (`member_setting_value_id`)); +CREATE TABLE `member_setting_value` +( + `member_setting_value_id` INT(11) NOT NULL AUTO_INCREMENT, + `member_setting_item_id` INT(11) NOT NULL, + `value` VARCHAR(100) NOT NULL, + `member_id` INT(11) NOT NULL, + `created_at` TIMESTAMP NOT NULL DEFAULT now(), + `changed_at` DATETIME NULL DEFAULT NULL, + `deleted_at` DATETIME NULL DEFAULT NULL, + `is_active` INT(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`member_setting_value_id`) +); diff --git a/sql_code/20190125_change_stat_cat_prod_count.sql b/sql_code/20190125_change_stat_cat_prod_count.sql index 427df6948..4c59d24d3 100644 --- a/sql_code/20190125_change_stat_cat_prod_count.sql +++ b/sql_code/20190125_change_stat_cat_prod_count.sql @@ -1,400 +1,401 @@ DROP PROCEDURE IF EXISTS `generate_stat_cat_prod_count`; DELIMITER $$ CREATE PROCEDURE `generate_stat_cat_prod_count`() BEGIN - DROP TABLE IF EXISTS tmp_stat_cat_prod_count; - CREATE TABLE tmp_stat_cat_prod_count + DROP TABLE IF EXISTS `tmp_stat_cat_prod_count`; + CREATE TABLE `tmp_stat_cat_prod_count` ( - `project_category_id` int(11) NOT NULL, - `tag_id` int(11) NULL, - `count_product` int(11) NULL, - INDEX `idx_tag` (`project_category_id`,`tag_id`) + `project_category_id` int(11) NOT NULL, + `tag_id` int(11) NULL, + `count_product` int(11) NULL, + INDEX `idx_tag` (`project_category_id`, `tag_id`) ) - ENGINE Memory - AS - SELECT - sct2.project_category_id, - NULL as tag_id, - count(distinct p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - LEFT JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - WHERE p.amount_reports is null - GROUP BY sct2.project_category_id - - UNION - - SELECT - sct2.project_category_id, - tg.tag_ids as tag_id, - count(distinct p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - JOIN (select cs.store_id, GROUP_CONCAT(ct.tag_id) as tag_ids from config_store cs - join config_store_tag ct on ct.store_id = cs.store_id and ct.is_active = 1 - group by cs.store_id) tg - JOIN ( - - SELECT DISTINCT project_id,tag_ids - FROM stat_project_tagids - JOIN (select cs.store_id, GROUP_CONCAT(ct.tag_id) as tag_ids from config_store cs - join config_store_tag ct on ct.store_id = cs.store_id and ct.is_active = 1 - group by cs.store_id) tg WHERE tag_id in (tg.tag_ids) - - - ) AS store_tags ON p.project_id = store_tags.project_id AND store_tags.tag_ids = tg.tag_ids - JOIN tag_object AS ppt ON - ((ppt.tag_parent_object_id = p.project_id AND ppt.tag_type_id = 3) OR (ppt.tag_object_id = p.project_id) ) AND ppt.is_deleted = 0 - JOIN ppload.ppload_files AS files ON files.id = ppt.tag_object_id AND files.active = 1 - WHERE p.amount_reports is null - GROUP BY sct2.lft, tg.tag_ids - ; - - IF EXISTS(SELECT table_name - FROM INFORMATION_SCHEMA.TABLES - WHERE table_schema = DATABASE() - AND table_name = 'stat_cat_prod_count') - + ENGINE MEMORY + AS + SELECT `sct2`.`project_category_id`, + NULL AS `tag_id`, + count(DISTINCT `p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + LEFT JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + WHERE `p`.`amount_reports` IS NULL + GROUP BY `sct2`.`project_category_id` + + UNION + + SELECT `sct2`.`project_category_id`, + `tg`.`tag_ids` AS `tag_id`, + count(DISTINCT `p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + JOIN (SELECT `cs`.`store_id`, GROUP_CONCAT(`ct`.`tag_id`) AS `tag_ids` + FROM `config_store` `cs` + JOIN `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id` AND `ct`.`is_active` = 1 + GROUP BY `cs`.`store_id`) `tg` + JOIN ( + SELECT DISTINCT `project_id`, `tag_ids` + FROM `stat_project_tagids` + JOIN (SELECT `cs`.`store_id`, GROUP_CONCAT(`ct`.`tag_id`) AS `tag_ids` + FROM `config_store` `cs` + JOIN `config_store_tag` `ct` + ON `ct`.`store_id` = `cs`.`store_id` AND `ct`.`is_active` = 1 + GROUP BY `cs`.`store_id`) `tg` + WHERE `tag_id` IN (`tg`.`tag_ids`) + ) AS `store_tags` ON `p`.`project_id` = `store_tags`.`project_id` AND `store_tags`.`tag_ids` = `tg`.`tag_ids` + JOIN `tag_object` AS `ppt` ON + ((`ppt`.`tag_parent_object_id` = `p`.`project_id` AND `ppt`.`tag_type_id` = 3) OR + (`ppt`.`tag_object_id` = `p`.`project_id`)) AND `ppt`.`is_deleted` = 0 + JOIN `ppload`.`ppload_files` AS `files` ON `files`.`id` = `ppt`.`tag_object_id` AND `files`.`active` = 1 + WHERE `p`.`amount_reports` IS NULL + GROUP BY `sct2`.`lft`, `tg`.`tag_ids`; + + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_cat_prod_count') THEN - - RENAME TABLE stat_cat_prod_count TO old_stat_cat_prod_count, tmp_stat_cat_prod_count TO stat_cat_prod_count; + RENAME TABLE `stat_cat_prod_count` TO `old_stat_cat_prod_count`, `tmp_stat_cat_prod_count` TO `stat_cat_prod_count`; ELSE - - RENAME TABLE tmp_stat_cat_prod_count TO stat_cat_prod_count; + RENAME TABLE `tmp_stat_cat_prod_count` TO `stat_cat_prod_count`; END IF; - DROP TABLE IF EXISTS old_stat_cat_prod_count; + DROP TABLE IF EXISTS `old_stat_cat_prod_count`; END$$ DELIMITER ; -CALL generate_stat_cat_prod_count; +CALL `generate_stat_cat_prod_count`; DROP PROCEDURE IF EXISTS `generate_stat_cat_prod_count_w_spam`; DELIMITER $$ CREATE PROCEDURE `generate_stat_cat_prod_count_w_spam`() BEGIN - DROP TABLE IF EXISTS tmp_stat_cat_prod_count_w_spam; - CREATE TABLE tmp_stat_cat_prod_count_w_spam + DROP TABLE IF EXISTS `tmp_stat_cat_prod_count_w_spam`; + CREATE TABLE `tmp_stat_cat_prod_count_w_spam` ( - `project_category_id` int(11) NOT NULL, - `tag_id` int(11) NULL, - `count_product` int(11) NULL, - INDEX `idx_tag` (`project_category_id`,`tag_id`) + `project_category_id` int(11) NOT NULL, + `tag_id` int(11) NULL, + `count_product` int(11) NULL, + INDEX `idx_tag` (`project_category_id`, `tag_id`) ) - ENGINE Memory - AS - SELECT - sct2.project_category_id, - NULL as tag_id, - count(distinct p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - LEFT JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - GROUP BY sct2.project_category_id - - UNION - - SELECT - sct2.project_category_id, - tg.tag_ids as tag_id, - count(distinct p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - JOIN (select cs.store_id, GROUP_CONCAT(ct.tag_id) as tag_ids from config_store cs - join config_store_tag ct on ct.store_id = cs.store_id and ct.is_active = 1 - group by cs.store_id) tg - JOIN ( - - SELECT DISTINCT project_id,tag_ids - FROM stat_project_tagids - JOIN (select cs.store_id, GROUP_CONCAT(ct.tag_id) as tag_ids from config_store cs - join config_store_tag ct on ct.store_id = cs.store_id and ct.is_active = 1 - group by cs.store_id) tg WHERE tag_id in (tg.tag_ids) - - - ) AS store_tags ON p.project_id = store_tags.project_id AND store_tags.tag_ids = tg.tag_ids - JOIN tag_object AS ppt ON - ((ppt.tag_parent_object_id = p.project_id AND ppt.tag_type_id = 3) OR (ppt.tag_object_id = p.project_id) ) AND ppt.is_deleted = 0 - JOIN ppload.ppload_files AS files ON files.id = ppt.tag_object_id AND files.active = 1 - - GROUP BY sct2.lft, tg.tag_ids - ; - - IF EXISTS(SELECT table_name - FROM INFORMATION_SCHEMA.TABLES - WHERE table_schema = DATABASE() - AND table_name = 'stat_cat_prod_count_w_spam') - + ENGINE MEMORY + AS + SELECT `sct2`.`project_category_id`, + NULL AS `tag_id`, + count(DISTINCT `p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + LEFT JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + GROUP BY `sct2`.`project_category_id` + + UNION + + SELECT `sct2`.`project_category_id`, + `tg`.`tag_ids` AS `tag_id`, + count(DISTINCT `p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + JOIN (SELECT `cs`.`store_id`, GROUP_CONCAT(`ct`.`tag_id`) AS `tag_ids` + FROM `config_store` `cs` + JOIN `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id` AND `ct`.`is_active` = 1 + GROUP BY `cs`.`store_id`) `tg` + JOIN ( + SELECT DISTINCT `project_id`, `tag_ids` + FROM `stat_project_tagids` + JOIN (SELECT `cs`.`store_id`, GROUP_CONCAT(`ct`.`tag_id`) AS `tag_ids` + FROM `config_store` `cs` + JOIN `config_store_tag` `ct` + ON `ct`.`store_id` = `cs`.`store_id` AND `ct`.`is_active` = 1 + GROUP BY `cs`.`store_id`) `tg` + WHERE `tag_id` IN (`tg`.`tag_ids`) + ) AS `store_tags` ON `p`.`project_id` = `store_tags`.`project_id` AND `store_tags`.`tag_ids` = `tg`.`tag_ids` + JOIN `tag_object` AS `ppt` ON + ((`ppt`.`tag_parent_object_id` = `p`.`project_id` AND `ppt`.`tag_type_id` = 3) OR + (`ppt`.`tag_object_id` = `p`.`project_id`)) AND `ppt`.`is_deleted` = 0 + JOIN `ppload`.`ppload_files` AS `files` ON `files`.`id` = `ppt`.`tag_object_id` AND `files`.`active` = 1 + + GROUP BY `sct2`.`lft`, `tg`.`tag_ids`; + + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_cat_prod_count_w_spam') THEN - - RENAME TABLE stat_cat_prod_count_w_spam TO old_stat_cat_prod_count_w_spam, tmp_stat_cat_prod_count_w_spam TO stat_cat_prod_count_w_spam; + RENAME TABLE `stat_cat_prod_count_w_spam` TO `old_stat_cat_prod_count_w_spam`, `tmp_stat_cat_prod_count_w_spam` TO `stat_cat_prod_count_w_spam`; ELSE - - RENAME TABLE tmp_stat_cat_prod_count_w_spam TO stat_cat_prod_count_w_spam; + RENAME TABLE `tmp_stat_cat_prod_count_w_spam` TO `stat_cat_prod_count_w_spam`; END IF; - DROP TABLE IF EXISTS old_stat_cat_prod_count_w_spam; + DROP TABLE IF EXISTS `old_stat_cat_prod_count_w_spam`; END$$ DELIMITER ; - - DROP PROCEDURE IF EXISTS `fetchCatTreeWithTags`; DELIMITER $$ -CREATE PROCEDURE `fetchCatTreeWithTags`( - IN `STORE_ID` int(11), - IN `TAGS` VARCHAR(255) -) +CREATE PROCEDURE `fetchCatTreeWithTags`(IN `STORE_ID` int(11), + IN `TAGS` VARCHAR(255)) BEGIN DROP TABLE IF EXISTS `tmp_store_cat_tags`; CREATE TEMPORARY TABLE `tmp_store_cat_tags` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; - - SET @NEW_ORDER := 0; - - UPDATE `tmp_store_cat_tags` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); - - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; + + SET @`NEW_ORDER` := 0; + + UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); + + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat_tags` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND FIND_IN_SET(`scpc`.`tag_id`,TAGS) - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + JOIN `stat_cat_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND FIND_IN_SET(`scpc`.`tag_id`, `TAGS`) + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; - END$$ +END$$ DELIMITER ; - - - -drop PROCEDURE generate_stat_project; +DROP PROCEDURE `generate_stat_project`; DELIMITER $$ CREATE PROCEDURE `generate_stat_project`() BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; - - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag_name) AS tag_names, tag_project_id - FROM ( - select distinct tag.tag_name, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select distinct tag.tag_name, tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; - - - DROP TABLE IF EXISTS tmp_project_tagids; - CREATE TEMPORARY TABLE tmp_project_tagids - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT GROUP_CONCAT(tag_id) AS tag_ids, tag_project_id - FROM ( - select distinct tag.tag_id, tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select distinct tag.tag_id, tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; - - - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`),INDEX `idx_source_url` (`source_url`(50))) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `t2`.`tag_ids` AS `tag_ids`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `tmp_project_tagids` AS t2 ON t2.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; - - DROP TABLE IF EXISTS old_stat_projects; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; + + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; + + + DROP TABLE IF EXISTS `tmp_project_tagids`; + CREATE TEMPORARY TABLE `tmp_project_tagids` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_id`) AS `tag_ids`, `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_id`, `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_id`, `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; + + + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `t2`.`tag_ids` AS `tag_ids`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tagids` AS `t2` ON `t2`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; + + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; + + DROP TABLE IF EXISTS `old_stat_projects`; END$$ DELIMITER ; diff --git a/sql_code/20190131_ updated_generate_stat_product.sql b/sql_code/20190131_ updated_generate_stat_product.sql index 14a4f981c..2746a6fef 100644 --- a/sql_code/20190131_ updated_generate_stat_product.sql +++ b/sql_code/20190131_ updated_generate_stat_product.sql @@ -1,180 +1,176 @@ - -DROP procedure IF EXISTS `generate_stat_project`; +DROP PROCEDURE IF EXISTS `generate_stat_project`; DELIMITER $$ -CREATE DEFINER=CURRENT_USER PROCEDURE `generate_stat_project`() - BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_project`() +BEGIN + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id ORDER BY tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id` ORDER BY `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT - GROUP_CONCAT(tag_name) AS tag_names, - GROUP_CONCAT(tag_id ORDER BY tag_id) AS tag_ids, - tag_project_id - FROM ( - select - distinct tag.tag_name, - tag.tag_id, - tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select - distinct tag.tag_name, - tag.tag_ID, - tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, + GROUP_CONCAT(`tag_id` ORDER BY `tag_id`) AS `tag_ids`, + `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_id`, + `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_ID`, + `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`),INDEX `idx_source_url` (`source_url`(50))) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - `project`.`ppload_collection_id` AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `t`.`tag_ids` AS `tag_ids`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + `project`.`ppload_collection_id` AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `t`.`tag_ids` AS `tag_ids`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; diff --git a/sql_code/20190131_update_fetch_tree_with_tags_for_store.sql b/sql_code/20190131_update_fetch_tree_with_tags_for_store.sql index 68a6f7fc7..b6d598da3 100644 --- a/sql_code/20190131_update_fetch_tree_with_tags_for_store.sql +++ b/sql_code/20190131_update_fetch_tree_with_tags_for_store.sql @@ -1,57 +1,55 @@ -DROP procedure IF EXISTS `fetchCatTreeWithTagsForStore`; +DROP PROCEDURE IF EXISTS `fetchCatTreeWithTagsForStore`; DELIMITER $$ -CREATE DEFINER = CURRENT_USER PROCEDURE `fetchCatTreeWithTagsForStore`( - IN `STORE_ID` INT(11), - IN `TAGS` VARCHAR(255) - -) - BEGIN +CREATE + DEFINER = CURRENT_USER PROCEDURE `fetchCatTreeWithTagsForStore`(IN `STORE_ID` INT(11), + IN `TAGS` VARCHAR(255)) +BEGIN DROP TABLE IF EXISTS `tmp_store_cat_tags`; CREATE TEMPORARY TABLE `tmp_store_cat_tags` ( - INDEX `idx_cat_id` (`project_category_id`) + INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT - `csc`.`store_id`, - `csc`.`project_category_id`, - `csc`.`order`, - `pc`.`title`, - `pc`.`lft`, - `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title`; + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, + `csc`.`project_category_id`, + `csc`.`order`, + `pc`.`title`, + `pc`.`lft`, + `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; SET @`NEW_ORDER` := 0; UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT - `sct`.`lft`, - `sct`.`rgt`, - `sct`.`project_category_id` AS `id`, - `sct`.`title`, - `scpc`.`count_product` AS `product_count`, - `sct`.`xdg_type`, - `sct`.`name_legacy`, - if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, - (SELECT `project_category_id` - FROM `stat_cat_tree` AS `sct2` - WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` - ORDER BY `sct2`.`rgt` - `sct`.`rgt` - LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat_tags` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - JOIN `stat_store_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + JOIN `stat_store_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = `TAGS` + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; - END$$ +END$$ DELIMITER ; diff --git a/sql_code/20190131_updated_generate_stat_store_prod_count.sql b/sql_code/20190131_updated_generate_stat_store_prod_count.sql index 5951b106d..a4f0b7bc1 100644 --- a/sql_code/20190131_updated_generate_stat_store_prod_count.sql +++ b/sql_code/20190131_updated_generate_stat_store_prod_count.sql @@ -1,275 +1,297 @@ DROP PROCEDURE IF EXISTS `generate_stat_store_prod_count`; DELIMITER $$ -CREATE DEFINER = CURRENT_USER PROCEDURE `generate_stat_store_prod_count`() - BEGIN - -DECLARE v_finished INTEGER DEFAULT 0; -DECLARE v_store_id varchar(255) DEFAULT ""; -DECLARE v_store_tag_ids varchar(255) DEFAULT ""; - -declare idx,prev_idx int; -declare v_id varchar(10); - +CREATE + DEFINER = CURRENT_USER PROCEDURE `generate_stat_store_prod_count`() +BEGIN + + DECLARE `v_finished` INTEGER DEFAULT 0; + DECLARE `v_store_id` varchar(255) DEFAULT ""; + DECLARE `v_store_tag_ids` varchar(255) DEFAULT ""; + + DECLARE `idx`,`prev_idx` int; + DECLARE `v_id` varchar(10); + -- declare cursor for employee email -DECLARE store_cursor CURSOR FOR - SELECT * FROM tmp_stat_store_tagids; - + DECLARE `store_cursor` CURSOR FOR + SELECT * FROM `tmp_stat_store_tagids`; + -- declare NOT FOUND handler -DECLARE CONTINUE HANDLER -FOR NOT FOUND SET v_finished = 1; + DECLARE CONTINUE HANDLER + FOR NOT FOUND SET `v_finished` = 1; + + + DROP TABLE IF EXISTS `tmp_stat_store_tagids`; + CREATE TEMPORARY TABLE `tmp_stat_store_tagids` + AS + SELECT `cs`.`store_id`, + GROUP_CONCAT(`ct`.`tag_id` + ORDER BY `ct`.`tag_id`) AS `tag_ids` + FROM `config_store` `cs` + LEFT JOIN + `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id` + AND `ct`.`is_active` = 1 +#WHERE `cs`.`store_id` = 7 + GROUP BY `cs`.`store_id`; -DROP TABLE IF EXISTS `tmp_stat_store_tagids`; -CREATE TEMPORARY TABLE `tmp_stat_store_tagids` -AS -SELECT - `cs`.`store_id`, - GROUP_CONCAT(`ct`.`tag_id` - ORDER BY `ct`.`tag_id`) AS `tag_ids` -FROM - `config_store` `cs` -LEFT JOIN - `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id` -AND `ct`.`is_active` = 1 -#WHERE `cs`.`store_id` = 7 -GROUP BY `cs`.`store_id`; - - -DROP TABLE IF EXISTS `tmp_stat_store_prod_count`; - CREATE TABLE `tmp_stat_store_prod_count` - ( - `project_category_id` INT(11) NOT NULL, - `tag_id` VARCHAR(255) NULL, - `count_product` INT(11) NULL, - `stores` VARCHAR(255) NULL, - INDEX `idx_tag` (`project_category_id`, `tag_id`) - ) - ENGINE MyISAM - AS - SELECT - sct2.project_category_id, - NULL as tag_id, - count(distinct p.project_id) as count_product - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - LEFT JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - WHERE p.amount_reports is null - GROUP BY sct2.project_category_id; - - -OPEN store_cursor; - -get_store: LOOP - - FETCH store_cursor INTO v_store_id, v_store_tag_ids; - - IF v_finished = 1 THEN - LEAVE get_store; - END IF; - - -- build email list - - - SET @sql = ' + DROP TABLE IF EXISTS `tmp_stat_store_prod_count`; + CREATE TABLE `tmp_stat_store_prod_count` + ( + `project_category_id` INT(11) NOT NULL, + `tag_id` VARCHAR(255) NULL, + `count_product` INT(11) NULL, + `stores` VARCHAR(255) NULL, + INDEX `idx_tag` (`project_category_id`, `tag_id`) + ) + ENGINE MyISAM + AS + SELECT `sct2`.`project_category_id`, + NULL AS `tag_id`, + count(DISTINCT `p`.`project_id`) AS `count_product` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + LEFT JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + WHERE `p`.`amount_reports` IS NULL + GROUP BY `sct2`.`project_category_id`; + + + OPEN `store_cursor`; + + `get_store`: + LOOP + + FETCH `store_cursor` INTO `v_store_id`, `v_store_tag_ids`; + + IF `v_finished` = 1 THEN + LEAVE `get_store`; + END IF; + + -- build email list + + + SET @`sql` = ' INSERT INTO tmp_stat_store_prod_count SELECT sct2.project_category_id, tg.tag_ids as tag_id, count(distinct p.project_id) as count_product, tg.store_id FROM stat_cat_tree as sct1 JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id JOIN tmp_stat_store_tagids tg WHERE p.amount_reports is null '; - SET @sql = CONCAT(@sql,' AND tg.store_id = ', v_store_id, ' '); - SET @sql = CONCAT(@sql,' AND (1=1 '); - - set idx := locate(',',v_store_tag_ids,1); - - if LENGTH(v_store_tag_ids) > 0 then - - if idx > 0 then - set prev_idx := 1; - WHILE idx > 0 DO - set v_id := substr(v_store_tag_ids,prev_idx,idx-prev_idx); - SET @sql = CONCAT(@sql,' AND FIND_IN_SET(', v_id, ', p.tag_ids) '); - set prev_idx := idx+1; - set idx := locate(',',v_store_tag_ids,prev_idx); - - if idx = 0 then - set v_id := substr(v_store_tag_ids,prev_idx); - SET @sql = CONCAT(@sql,' AND FIND_IN_SET(', v_id, ', p.tag_ids) '); - end if; - - - END WHILE; - else - - SET @sql = CONCAT(@sql,' AND FIND_IN_SET(', v_store_tag_ids, ', p.tag_ids) '); - - end if; - end if; - - SET @sql = CONCAT(@sql,') '); - SET @sql = CONCAT(@sql,'GROUP BY sct2.lft, tg.tag_ids,tg.store_id'); - - select @sql; - - PREPARE stmt FROM @sql; - EXECUTE stmt; - DEALLOCATE PREPARE stmt; - - END LOOP get_store; - -CLOSE store_cursor; - - - IF EXISTS(SELECT `table_name` + SET @`sql` = CONCAT(@`sql`, ' AND tg.store_id = ', `v_store_id`, ' '); + SET @`sql` = CONCAT(@`sql`, ' AND (1=1 '); + + SET `idx` := locate(',', `v_store_tag_ids`, 1); + + IF LENGTH(`v_store_tag_ids`) > 0 THEN + + IF `idx` > 0 THEN + SET `prev_idx` := 1; + WHILE `idx` > 0 DO + SET `v_id` := substr(`v_store_tag_ids`, `prev_idx`, `idx` - `prev_idx`); + SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_id`, ', p.tag_ids) '); + SET `prev_idx` := `idx` + 1; + SET `idx` := locate(',', `v_store_tag_ids`, `prev_idx`); + + IF `idx` = 0 THEN + SET `v_id` := substr(`v_store_tag_ids`, `prev_idx`); + SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_id`, ', p.tag_ids) '); + END IF; + END WHILE; + ELSE + + SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_store_tag_ids`, ', p.tag_ids) '); + + END IF; + END IF; + + SET @`sql` = CONCAT(@`sql`, ') '); + SET @`sql` = CONCAT(@`sql`, 'GROUP BY sct2.lft, tg.tag_ids,tg.store_id'); + + SELECT @`sql`; + + PREPARE `stmt` FROM @`sql`; + EXECUTE `stmt`; + DEALLOCATE PREPARE `stmt`; + + END LOOP `get_store`; + + CLOSE `store_cursor`; + + + IF EXISTS(SELECT `table_name` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `table_schema` = DATABASE() - AND `table_name` = 'stat_store_prod_count') - + AND `table_name` = 'stat_store_prod_count') THEN - - RENAME TABLE - `stat_store_prod_count` TO `old_stat_store_prod_count`, - `tmp_stat_store_prod_count` TO `stat_store_prod_count`; + RENAME TABLE + `stat_store_prod_count` TO `old_stat_store_prod_count`, + `tmp_stat_store_prod_count` TO `stat_store_prod_count`; ELSE - - RENAME TABLE - `tmp_stat_store_prod_count` TO `stat_store_prod_count`; + RENAME TABLE + `tmp_stat_store_prod_count` TO `stat_store_prod_count`; END IF; DROP TABLE IF EXISTS `old_stat_store_prod_count`; END$$ -CREATE PROCEDURE `fetchCatTreeWithTagsForStore`( - IN `STORE_ID` INT(11), - IN `TAGS` VARCHAR(255) -) +CREATE PROCEDURE `fetchCatTreeWithTagsForStore`(IN `STORE_ID` INT(11), + IN `TAGS` VARCHAR(255)) BEGIN DROP TABLE IF EXISTS `tmp_store_cat_tags`; CREATE TEMPORARY TABLE `tmp_store_cat_tags` ( - INDEX `idx_cat_id` (`project_category_id`) + INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT - `csc`.`store_id`, - `csc`.`project_category_id`, - `csc`.`order`, - `pc`.`title`, - `pc`.`lft`, - `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title`; + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, + `csc`.`project_category_id`, + `csc`.`order`, + `pc`.`title`, + `pc`.`lft`, + `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; SET @`NEW_ORDER` := 0; UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT - `sct`.`lft`, - `sct`.`rgt`, - `sct`.`project_category_id` AS `id`, - `sct`.`title`, - `scpc`.`count_product` AS `product_count`, - `sct`.`xdg_type`, - `sct`.`name_legacy`, - if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, - (SELECT `project_category_id` - FROM `stat_cat_tree` AS `sct2` - WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` - ORDER BY `sct2`.`rgt` - `sct`.`rgt` - LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat_tags` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - #LEFT JOIN `stat_store_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS - JOIN stat_store_prod_count AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = STORE_ID - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + #LEFT JOIN `stat_store_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS + JOIN `stat_store_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = `STORE_ID` + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; END$$ - -CREATE PROCEDURE `fetchCatTreeWithTags`( - IN `STORE_ID` int(11), - IN `TAGS` VARCHAR(255) -) +CREATE PROCEDURE `fetchCatTreeWithTags`(IN `STORE_ID` int(11), + IN `TAGS` VARCHAR(255)) BEGIN DROP TABLE IF EXISTS `tmp_store_cat_tags`; CREATE TEMPORARY TABLE `tmp_store_cat_tags` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; - - SET @NEW_ORDER := 0; - - UPDATE `tmp_store_cat_tags` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); - - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; + + SET @`NEW_ORDER` := 0; + + UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); + + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat_tags` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS - JOIN stat_store_prod_count AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = STORE_ID - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS + JOIN `stat_store_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = `STORE_ID` + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; END$$ - -CREATE `fetchCatTreeForStore`( - IN `STORE_ID` int(11) +CREATE +`fetchCatTreeForStore` +( + IN `STORE_ID` INT (11) ) BEGIN - DROP TABLE IF EXISTS `tmp_store_cat`; - CREATE TEMPORARY TABLE `tmp_store_cat` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; - - SET @NEW_ORDER := 0; - - UPDATE `tmp_store_cat` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); - - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` - FROM `tmp_store_cat` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null - JOIN stat_store_prod_count AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null - WHERE cfc.store_id = STORE_ID - ORDER BY cfc.`order`, sct.lft; +DROP TABLE IF EXISTS `tmp_store_cat`; +CREATE TEMPORARY TABLE `tmp_store_cat` +( + INDEX `idx_cat_id` (`project_category_id`) +) + ENGINE MEMORY +AS +SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` +FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` +WHERE `csc`.`store_id` = `STORE_ID` +GROUP BY `csc`.`store_category_id` +ORDER BY `csc`.`order`, `pc`.`title` +; + +SET @`NEW_ORDER` := 0; + +UPDATE `tmp_store_cat` +SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); + +SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` +FROM `tmp_store_cat` AS `cfc` + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null + JOIN `stat_store_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` IS NULL +WHERE `cfc`.`store_id` = `STORE_ID` +ORDER BY `cfc`.`order`, `sct`.`lft`; END$$ DELIMITER ; diff --git a/sql_code/20190205_stat_cat_store_count.sql b/sql_code/20190205_stat_cat_store_count.sql index 933b5b3b5..808e5b924 100644 --- a/sql_code/20190205_stat_cat_store_count.sql +++ b/sql_code/20190205_stat_cat_store_count.sql @@ -1,255 +1,258 @@ DROP PROCEDURE IF EXISTS `generate_stat_store_prod_count`; DELIMITER $$ CREATE PROCEDURE `generate_stat_store_prod_count`() BEGIN - -DECLARE v_finished INTEGER DEFAULT 0; -DECLARE v_store_id varchar(255) DEFAULT ""; -DECLARE v_store_tag_ids varchar(255) DEFAULT ""; - -declare idx,prev_idx int; -declare v_id varchar(10); - + + DECLARE `v_finished` INTEGER DEFAULT 0; + DECLARE `v_store_id` varchar(255) DEFAULT ""; + DECLARE `v_store_tag_ids` varchar(255) DEFAULT ""; + + DECLARE `idx`,`prev_idx` int; + DECLARE `v_id` varchar(10); + -- declare cursor for employee email -DECLARE store_cursor CURSOR FOR - SELECT * FROM tmp_stat_store_tagids; - + DECLARE `store_cursor` CURSOR FOR + SELECT * FROM `tmp_stat_store_tagids`; + -- declare NOT FOUND handler -DECLARE CONTINUE HANDLER -FOR NOT FOUND SET v_finished = 1; - - -DROP TABLE IF EXISTS `tmp_stat_store_tagids`; -CREATE TEMPORARY TABLE `tmp_stat_store_tagids` -AS -SELECT - `cs`.`store_id`, - GROUP_CONCAT(`ct`.`tag_id` - ORDER BY `ct`.`tag_id`) AS `tag_ids` -FROM - `config_store` `cs` -JOIN - `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id` -AND `ct`.`is_active` = 1 + DECLARE CONTINUE HANDLER + FOR NOT FOUND SET `v_finished` = 1; + + + DROP TABLE IF EXISTS `tmp_stat_store_tagids`; + CREATE TEMPORARY TABLE `tmp_stat_store_tagids` + AS + SELECT `cs`.`store_id`, + GROUP_CONCAT(`ct`.`tag_id` + ORDER BY `ct`.`tag_id`) AS `tag_ids` + FROM `config_store` `cs` + JOIN + `config_store_tag` `ct` ON `ct`.`store_id` = `cs`.`store_id` + AND `ct`.`is_active` = 1 #WHERE `cs`.`store_id` = 7 -GROUP BY `cs`.`store_id`; - - -DROP TABLE IF EXISTS `tmp_stat_store_prod_count`; - CREATE TABLE `tmp_stat_store_prod_count` - ( - `project_category_id` INT(11) NOT NULL, - `tag_id` VARCHAR(255) NULL, - `count_product` INT(11) NULL, - `stores` VARCHAR(255) NULL, - INDEX `idx_tag` (`project_category_id`, `tag_id`) - ) - ENGINE MyISAM - AS - SELECT - sct2.project_category_id, - NULL as tag_id, - count(distinct p.project_id) as count_product, - NULL as stores - FROM stat_cat_tree as sct1 - JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt - LEFT JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id - WHERE p.amount_reports is null - GROUP BY sct2.project_category_id; - - -OPEN store_cursor; - -get_store: LOOP - - FETCH store_cursor INTO v_store_id, v_store_tag_ids; - - IF v_finished = 1 THEN - LEAVE get_store; - END IF; - - -- build email list - - - SET @sql = ' + GROUP BY `cs`.`store_id`; + + + DROP TABLE IF EXISTS `tmp_stat_store_prod_count`; + CREATE TABLE `tmp_stat_store_prod_count` + ( + `project_category_id` INT(11) NOT NULL, + `tag_id` VARCHAR(255) NULL, + `count_product` INT(11) NULL, + `stores` VARCHAR(255) NULL, + INDEX `idx_tag` (`project_category_id`, `tag_id`) + ) + ENGINE MyISAM + AS + SELECT `sct2`.`project_category_id`, + NULL AS `tag_id`, + count(DISTINCT `p`.`project_id`) AS `count_product`, + NULL AS `stores` + FROM `stat_cat_tree` AS `sct1` + JOIN `stat_cat_tree` AS `sct2` ON `sct1`.`lft` BETWEEN `sct2`.`lft` AND `sct2`.`rgt` + LEFT JOIN `stat_projects` AS `p` ON `p`.`project_category_id` = `sct1`.`project_category_id` + WHERE `p`.`amount_reports` IS NULL + GROUP BY `sct2`.`project_category_id`; + + + OPEN `store_cursor`; + + `get_store`: + LOOP + + FETCH `store_cursor` INTO `v_store_id`, `v_store_tag_ids`; + + IF `v_finished` = 1 THEN + LEAVE `get_store`; + END IF; + + -- build email list + + + SET @`sql` = ' INSERT INTO tmp_stat_store_prod_count SELECT sct2.project_category_id, tg.tag_ids as tag_id, count(distinct p.project_id) as count_product, tg.store_id FROM stat_cat_tree as sct1 JOIN stat_cat_tree as sct2 ON sct1.lft between sct2.lft AND sct2.rgt JOIN stat_projects as p ON p.project_category_id = sct1.project_category_id JOIN tmp_stat_store_tagids tg WHERE p.amount_reports is null '; - SET @sql = CONCAT(@sql,' AND tg.store_id = ', v_store_id, ' '); - SET @sql = CONCAT(@sql,' AND (1=1 '); - - set idx := locate(',',v_store_tag_ids,1); - - if LENGTH(v_store_tag_ids) > 0 then - - if idx > 0 then - set prev_idx := 1; - WHILE idx > 0 DO - set v_id := substr(v_store_tag_ids,prev_idx,idx-prev_idx); - SET @sql = CONCAT(@sql,' AND FIND_IN_SET(', v_id, ', p.tag_ids) '); - set prev_idx := idx+1; - set idx := locate(',',v_store_tag_ids,prev_idx); - - if idx = 0 then - set v_id := substr(v_store_tag_ids,prev_idx); - SET @sql = CONCAT(@sql,' AND FIND_IN_SET(', v_id, ', p.tag_ids) '); - end if; - - - END WHILE; - else - - SET @sql = CONCAT(@sql,' AND FIND_IN_SET(', v_store_tag_ids, ', p.tag_ids) '); - - end if; - end if; - - SET @sql = CONCAT(@sql,') '); - SET @sql = CONCAT(@sql,'GROUP BY sct2.lft, tg.tag_ids,tg.store_id'); - - #select @sql; - - PREPARE stmt FROM @sql; - EXECUTE stmt; - DEALLOCATE PREPARE stmt; - - END LOOP get_store; - -CLOSE store_cursor; - - - IF EXISTS(SELECT `table_name` - FROM `INFORMATION_SCHEMA`.`TABLES` - WHERE `table_schema` = DATABASE() - AND `table_name` = 'stat_store_prod_count') + SET @`sql` = CONCAT(@`sql`, ' AND tg.store_id = ', `v_store_id`, ' '); + SET @`sql` = CONCAT(@`sql`, ' AND (1=1 '); - THEN + SET `idx` := locate(',', `v_store_tag_ids`, 1); - RENAME TABLE - `stat_store_prod_count` TO `old_stat_store_prod_count`, - `tmp_stat_store_prod_count` TO `stat_store_prod_count`; + IF LENGTH(`v_store_tag_ids`) > 0 THEN - ELSE + IF `idx` > 0 THEN + SET `prev_idx` := 1; + WHILE `idx` > 0 DO + SET `v_id` := substr(`v_store_tag_ids`, `prev_idx`, `idx` - `prev_idx`); + SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_id`, ', p.tag_ids) '); + SET `prev_idx` := `idx` + 1; + SET `idx` := locate(',', `v_store_tag_ids`, `prev_idx`); - RENAME TABLE - `tmp_stat_store_prod_count` TO `stat_store_prod_count`; + IF `idx` = 0 THEN + SET `v_id` := substr(`v_store_tag_ids`, `prev_idx`); + SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_id`, ', p.tag_ids) '); + END IF; + END WHILE; + ELSE - END IF; + SET @`sql` = CONCAT(@`sql`, ' AND FIND_IN_SET(', `v_store_tag_ids`, ', p.tag_ids) '); + END IF; + END IF; - DROP TABLE IF EXISTS `old_stat_store_prod_count`; + SET @`sql` = CONCAT(@`sql`, ') '); + SET @`sql` = CONCAT(@`sql`, 'GROUP BY sct2.lft, tg.tag_ids,tg.store_id'); -END$$ + #select @sql; + PREPARE `stmt` FROM @`sql`; + EXECUTE `stmt`; + DEALLOCATE PREPARE `stmt`; + END LOOP `get_store`; + CLOSE `store_cursor`; -CREATE EVENT `e_generate_stat_store_prod_count` - ON SCHEDULE - EVERY 30 MINUTE STARTS '2019-02-05 15:01:03' - ON COMPLETION NOT PRESERVE - ENABLE - COMMENT '' - DO BEGIN - CALL generate_stat_store_prod_count(); + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_store_prod_count') + THEN + RENAME TABLE + `stat_store_prod_count` TO `old_stat_store_prod_count`, + `tmp_stat_store_prod_count` TO `stat_store_prod_count`; + + ELSE + RENAME TABLE + `tmp_stat_store_prod_count` TO `stat_store_prod_count`; + + END IF; + + + DROP TABLE IF EXISTS `old_stat_store_prod_count`; + END$$ +CREATE EVENT `e_generate_stat_store_prod_count` + ON SCHEDULE + EVERY 30 MINUTE STARTS '2019-02-05 15:01:03' + ON COMPLETION NOT PRESERVE + ENABLE + COMMENT '' + DO + BEGIN + CALL generate_stat_store_prod_count(); + END$$ + CREATE PROCEDURE `fetchCatTreeForStore`( - IN `STORE_ID` int(11) + IN `STORE_ID` int(11) ) BEGIN DROP TABLE IF EXISTS `tmp_store_cat`; CREATE TEMPORARY TABLE `tmp_store_cat` - (INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title` - ; - - SET @NEW_ORDER := 0; - - UPDATE `tmp_store_cat` SET `order` = (@NEW_ORDER := @NEW_ORDER + 10); - - SELECT `sct`.`lft`, `sct`.`rgt`, `sct`.`project_category_id` AS `id`, `sct`.`title`, `scpc`.`count_product` AS `product_count`, `sct`.`xdg_type`, `sct`.`name_legacy`, if(`sct`.`rgt`-`sct`.`lft` = 1, 0, 1) AS `has_children`, (SELECT `project_category_id` FROM `stat_cat_tree` AS `sct2` WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` ORDER BY `sct2`.`rgt` - `sct`.`rgt` LIMIT 1) AS `parent_id` + ( + INDEX `idx_cat_id` (`project_category_id`) + ) + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, `csc`.`project_category_id`, `csc`.`order`, `pc`.`title`, `pc`.`lft`, `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; + + SET @`NEW_ORDER` := 0; + + UPDATE `tmp_store_cat` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); + + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null - JOIN `stat_store_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null - WHERE cfc.store_id = STORE_ID - ORDER BY cfc.`order`, sct.lft; + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + #JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` is null + JOIN `stat_store_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` IS NULL + WHERE `cfc`.`store_id` = `STORE_ID` + ORDER BY `cfc`.`order`, `sct`.`lft`; END$$ -CREATE PROCEDURE `fetchCatTreeWithTagsForStore`( - IN `STORE_ID` INT(11), - IN `TAGS` VARCHAR(255) -) +CREATE PROCEDURE `fetchCatTreeWithTagsForStore`(IN `STORE_ID` INT(11), + IN `TAGS` VARCHAR(255)) BEGIN DROP TABLE IF EXISTS `tmp_store_cat_tags`; CREATE TEMPORARY TABLE `tmp_store_cat_tags` ( - INDEX `idx_cat_id` (`project_category_id`) + INDEX `idx_cat_id` (`project_category_id`) ) - ENGINE MEMORY - AS - SELECT - `csc`.`store_id`, - `csc`.`project_category_id`, - `csc`.`order`, - `pc`.`title`, - `pc`.`lft`, - `pc`.`rgt` - FROM `config_store_category` AS `csc` - JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` - WHERE `csc`.`store_id` = STORE_ID - GROUP BY `csc`.`store_category_id` - ORDER BY `csc`.`order`, `pc`.`title`; + ENGINE MEMORY + AS + SELECT `csc`.`store_id`, + `csc`.`project_category_id`, + `csc`.`order`, + `pc`.`title`, + `pc`.`lft`, + `pc`.`rgt` + FROM `config_store_category` AS `csc` + JOIN `project_category` AS `pc` ON `pc`.`project_category_id` = `csc`.`project_category_id` + WHERE `csc`.`store_id` = `STORE_ID` + GROUP BY `csc`.`store_category_id` + ORDER BY `csc`.`order`, `pc`.`title`; SET @`NEW_ORDER` := 0; UPDATE `tmp_store_cat_tags` SET `order` = (@`NEW_ORDER` := @`NEW_ORDER` + 10); - SELECT - `sct`.`lft`, - `sct`.`rgt`, - `sct`.`project_category_id` AS `id`, - `sct`.`title`, - `scpc`.`count_product` AS `product_count`, - `sct`.`xdg_type`, - `sct`.`name_legacy`, - if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, - (SELECT `project_category_id` - FROM `stat_cat_tree` AS `sct2` - WHERE `sct2`.`lft` < `sct`.`lft` AND `sct2`.`rgt` > `sct`.`rgt` - ORDER BY `sct2`.`rgt` - `sct`.`rgt` - LIMIT 1) AS `parent_id` + SELECT `sct`.`lft`, + `sct`.`rgt`, + `sct`.`project_category_id` AS `id`, + `sct`.`title`, + `scpc`.`count_product` AS `product_count`, + `sct`.`xdg_type`, + `sct`.`name_legacy`, + if(`sct`.`rgt` - `sct`.`lft` = 1, 0, 1) AS `has_children`, + (SELECT `project_category_id` + FROM `stat_cat_tree` AS `sct2` + WHERE `sct2`.`lft` < `sct`.`lft` + AND `sct2`.`rgt` > `sct`.`rgt` + ORDER BY `sct2`.`rgt` - `sct`.`rgt` + LIMIT 1) AS `parent_id` FROM `tmp_store_cat_tags` AS `cfc` - JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) - #LEFT JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS - JOIN `stat_store_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = STORE_ID - WHERE `cfc`.`store_id` = STORE_ID + JOIN `stat_cat_tree` AS `sct` ON find_in_set(`cfc`.`project_category_id`, `sct`.`ancestor_id_path`) + #LEFT JOIN `stat_cat_prod_count` AS `scpc` ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`tag_id` = TAGS + JOIN `stat_store_prod_count` AS `scpc` + ON `sct`.`project_category_id` = `scpc`.`project_category_id` AND `scpc`.`stores` = `STORE_ID` + WHERE `cfc`.`store_id` = `STORE_ID` ORDER BY `cfc`.`order`, `sct`.`lft`; END$$ diff --git a/sql_code/20190212_project_major_updated_at.sql b/sql_code/20190212_project_major_updated_at.sql index 506152b86..4a51b5445 100644 --- a/sql_code/20190212_project_major_updated_at.sql +++ b/sql_code/20190212_project_major_updated_at.sql @@ -1,198 +1,200 @@ -- 1 alter table project add column SET SQL_SAFE_UPDATES = 0; -alter table project add column major_updated_at timestamp default now() AFTER changed_at; -update project set major_updated_at = IFNULL(changed_at, created_at); +ALTER TABLE `project` + ADD COLUMN `major_updated_at` timestamp DEFAULT now() AFTER `changed_at`; +UPDATE `project` +SET `major_updated_at` = IFNULL(`changed_at`, `created_at`); -- 2 create trigger DELIMITER $$ -DROP TRIGGER IF EXISTS trg_project_major_updated_at$$ +DROP TRIGGER IF EXISTS `trg_project_major_updated_at`$$ USE `root`$$ -CREATE DEFINER='root' TRIGGER `trg_project_major_updated_at` BEFORE UPDATE ON `project` FOR EACH ROW - BEGIN - if NEW.changed_at <> OLD.changed_at and DATEDIFF(NEW.changed_at, OLD.major_updated_at)>7 THEN - SET NEW.major_updated_at = NEW.changed_at; - END IF; - END$$ +CREATE DEFINER ='root' TRIGGER `trg_project_major_updated_at` + BEFORE UPDATE + ON `project` + FOR EACH ROW +BEGIN + IF `NEW`.`changed_at` <> `OLD`.`changed_at` AND DATEDIFF(`NEW`.`changed_at`, `OLD`.`major_updated_at`) > 7 THEN + SET `NEW`.`major_updated_at` = `NEW`.`changed_at`; + END IF; +END$$ DELIMITER ; -- 3 alter generate_stat_projects procedure DELIMITER $$ -drop procedure IF EXISTS generate_stat_project$$ +DROP PROCEDURE IF EXISTS `generate_stat_project`$$ CREATE PROCEDURE `generate_stat_project`() BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; + + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, + GROUP_CONCAT(`tag_id`) AS `tag_ids`, + `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_id`, + `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_ID`, + `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT - GROUP_CONCAT(tag_name) AS tag_names, - GROUP_CONCAT(tag_id) AS tag_ids, - tag_project_id - FROM ( - select - distinct tag.tag_name, - tag.tag_id, - tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select - distinct tag.tag_name, - tag.tag_ID, - tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_ppload` (`ppload_collection_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`major_updated_at` AS `major_updated_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `t`.`tag_ids` AS `tag_ids`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND `project`.`type_id` = 1 + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_ppload` (`ppload_collection_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`),INDEX `idx_source_url` (`source_url`(50))) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`major_updated_at` AS `major_updated_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `t`.`tag_ids` AS `tag_ids`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND `project`.`type_id` = 1 - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; diff --git a/sql_code/20190213_system_tags_update.sql b/sql_code/20190213_system_tags_update.sql index 69e8440ad..e1266b7ce 100644 --- a/sql_code/20190213_system_tags_update.sql +++ b/sql_code/20190213_system_tags_update.sql @@ -1,175 +1,178 @@ - -- drop old procedure -drop procedure generate_tmp_cat_tag_proj; - - -DROP TABLE IF EXISTS stat_cat_tree_hierachie; - -create table stat_cat_tree_hierachie -( - project_category_id int, - ancestor_id_path varchar(50), - catid1 int, - catid2 int, - catid3 int, - catid4 int, - catid5 int, - catid6 int, - created_at timestamp not null default now(), - PRIMARY KEY (project_category_id), - INDEX ix_stat_cat_tree_hierachie_1 (catid1), - INDEX ix_stat_cat_tree_hierachie_2 (catid2), - INDEX ix_stat_cat_tree_hierachie_3 (catid3), - INDEX ix_stat_cat_tree_hierachie_4 (catid4), - INDEX ix_stat_cat_tree_hierachie_5 (catid5), - INDEX ix_stat_cat_tree_hierachie_6 (catid6) +DROP PROCEDURE `generate_tmp_cat_tag_proj`; + + +DROP TABLE IF EXISTS `stat_cat_tree_hierachie`; + +CREATE TABLE `stat_cat_tree_hierachie` +( + `project_category_id` int, + `ancestor_id_path` varchar(50), + `catid1` int, + `catid2` int, + `catid3` int, + `catid4` int, + `catid5` int, + `catid6` int, + `created_at` timestamp NOT NULL DEFAULT now(), + PRIMARY KEY (`project_category_id`), + INDEX `ix_stat_cat_tree_hierachie_1` (`catid1`), + INDEX `ix_stat_cat_tree_hierachie_2` (`catid2`), + INDEX `ix_stat_cat_tree_hierachie_3` (`catid3`), + INDEX `ix_stat_cat_tree_hierachie_4` (`catid4`), + INDEX `ix_stat_cat_tree_hierachie_5` (`catid5`), + INDEX `ix_stat_cat_tree_hierachie_6` (`catid6`) ); -truncate table stat_cat_tree_hierachie; -insert into stat_cat_tree_hierachie -select -t.project_category_id, -t.ancestor_id_path, -SPLIT_STRING(t.ancestor_id_path, ',', 1) as catid1, -- root no category tags ignore -SPLIT_STRING(t.ancestor_id_path, ',', 2) as catid2, -SPLIT_STRING(t.ancestor_id_path, ',', 3) as catid3, -SPLIT_STRING(t.ancestor_id_path, ',', 4) as catid4, -SPLIT_STRING(t.ancestor_id_path, ',', 5) as catid5, -SPLIT_STRING(t.ancestor_id_path, ',', 6) as catid6, -now() as created_at -from stat_cat_tree t; - - -DROP TABLE IF EXISTS tmp_project_system_tag; - -CREATE TABLE `tmp_project_system_tag` ( - `project_id` INT(11) NOT NULL, - `project_category_id` INT(11) NOT NULL, - `tag_id` INT(11) NOT NULL, - `ancestor_id_path` VARCHAR(50) NULL DEFAULT NULL, - INDEX(`project_id`, `project_category_id`, `tag_id`) +TRUNCATE TABLE `stat_cat_tree_hierachie`; +INSERT INTO `stat_cat_tree_hierachie` +SELECT `t`.`project_category_id`, + `t`.`ancestor_id_path`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 1) AS `catid1`, -- root no category tags ignore + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 2) AS `catid2`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 3) AS `catid3`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 4) AS `catid4`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 5) AS `catid5`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 6) AS `catid6`, + now() AS `created_at` +FROM `stat_cat_tree` `t`; + + +DROP TABLE IF EXISTS `tmp_project_system_tag`; + +CREATE TABLE `tmp_project_system_tag` +( + `project_id` INT(11) NOT NULL, + `project_category_id` INT(11) NOT NULL, + `tag_id` INT(11) NOT NULL, + `ancestor_id_path` VARCHAR(50) NULL DEFAULT NULL, + INDEX (`project_id`, `project_category_id`, `tag_id`) ); -drop procedure IF EXISTS generate_tmp_cat_tag_proj_init; +DROP PROCEDURE IF EXISTS `generate_tmp_cat_tag_proj_init`; DELIMITER $$ CREATE PROCEDURE `generate_tmp_cat_tag_proj_init`() BEGIN - TRUNCATE table tmp_project_system_tag; - - truncate table stat_cat_tree_hierachie; - insert into stat_cat_tree_hierachie - select - t.project_category_id, - t.ancestor_id_path, - SPLIT_STRING(t.ancestor_id_path, ',', 1) as catid1, -- root no category tags ignore - SPLIT_STRING(t.ancestor_id_path, ',', 2) as catid2, - SPLIT_STRING(t.ancestor_id_path, ',', 3) as catid3, - SPLIT_STRING(t.ancestor_id_path, ',', 4) as catid4, - SPLIT_STRING(t.ancestor_id_path, ',', 5) as catid5, - SPLIT_STRING(t.ancestor_id_path, ',', 6) as catid6, - now() as created_at - from stat_cat_tree t; - - INSERT INTO tmp_project_system_tag - select p.project_id, p.project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree_hierachie t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = t.catid2 - WHERE p.`status` = 100 - ; - - INSERT INTO tmp_project_system_tag - select p.project_id, p.project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree_hierachie t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = t.catid3 - WHERE p.`status` = 100 - ; - - INSERT INTO tmp_project_system_tag - select p.project_id, p.project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree_hierachie t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = t.catid4 - WHERE p.`status` = 100 - ; - - INSERT INTO tmp_project_system_tag - select p.project_id, p.project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree_hierachie t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = t.catid5 - WHERE p.`status` = 100 - ; - - INSERT INTO tmp_project_system_tag - select p.project_id, p.project_category_id, c.tag_id, t.ancestor_id_path from project p - join stat_cat_tree_hierachie t on t.project_category_id = p.project_category_id - join category_tag c on c.category_id = t.catid6 - WHERE p.`status` = 100 - ; - - - DROP TABLE IF EXISTS tmp_tag_object_to_delete; - CREATE TEMPORARY TABLE tmp_tag_object_to_delete - (PRIMARY KEY `primary` (tag_item_id)) - ENGINE MyISAM - AS - SELECT - o.tag_item_id - FROM - tag_object o - LEFT JOIN tmp_project_system_tag t on t.project_id = o.tag_object_id and t.tag_id = o.tag_id - WHERE - o.tag_group_id = 6 and o.is_deleted = 0 and t.project_id is null - ; - + TRUNCATE TABLE `tmp_project_system_tag`; + + TRUNCATE TABLE `stat_cat_tree_hierachie`; + INSERT INTO `stat_cat_tree_hierachie` + SELECT `t`.`project_category_id`, + `t`.`ancestor_id_path`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 1) AS `catid1`, -- root no category tags ignore + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 2) AS `catid2`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 3) AS `catid3`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 4) AS `catid4`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 5) AS `catid5`, + SPLIT_STRING(`t`.`ancestor_id_path`, ',', 6) AS `catid6`, + now() AS `created_at` + FROM `stat_cat_tree` `t`; + + INSERT INTO `tmp_project_system_tag` + SELECT `p`.`project_id`, `p`.`project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree_hierachie` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = `t`.`catid2` + WHERE `p`.`status` = 100; + + INSERT INTO `tmp_project_system_tag` + SELECT `p`.`project_id`, `p`.`project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree_hierachie` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = `t`.`catid3` + WHERE `p`.`status` = 100; + + INSERT INTO `tmp_project_system_tag` + SELECT `p`.`project_id`, `p`.`project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree_hierachie` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = `t`.`catid4` + WHERE `p`.`status` = 100; + + INSERT INTO `tmp_project_system_tag` + SELECT `p`.`project_id`, `p`.`project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree_hierachie` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = `t`.`catid5` + WHERE `p`.`status` = 100; + + INSERT INTO `tmp_project_system_tag` + SELECT `p`.`project_id`, `p`.`project_category_id`, `c`.`tag_id`, `t`.`ancestor_id_path` + FROM `project` `p` + JOIN `stat_cat_tree_hierachie` `t` ON `t`.`project_category_id` = `p`.`project_category_id` + JOIN `category_tag` `c` ON `c`.`category_id` = `t`.`catid6` + WHERE `p`.`status` = 100; + + + DROP TABLE IF EXISTS `tmp_tag_object_to_delete`; + CREATE TEMPORARY TABLE `tmp_tag_object_to_delete` + ( + PRIMARY KEY `primary` (`tag_item_id`) + ) + ENGINE MyISAM + AS + SELECT `o`.`tag_item_id` + FROM `tag_object` `o` + LEFT JOIN `tmp_project_system_tag` `t` + ON `t`.`project_id` = `o`.`tag_object_id` AND `t`.`tag_id` = `o`.`tag_id` + WHERE `o`.`tag_group_id` = 6 + AND `o`.`is_deleted` = 0 + AND `t`.`project_id` IS NULL; + /*DELETE SYSTEM TAGS -- 12155 TO DELETE*/ - update tag_object set is_deleted = 1 , tag_changed = now() - where tag_item_id in - ( - SELECT - o.tag_item_id - FROM - tmp_tag_object_to_delete o - ); - - - - - - DROP TABLE IF EXISTS tmp_tag_object_to_insert; - CREATE TEMPORARY TABLE tmp_tag_object_to_insert - /*(INDEX (project_id,project_category_id,tag_id))*/ - ENGINE MyISAM - AS - SELECT - t.* - FROM - tmp_project_system_tag t - LEFT JOIN tag_object o on t.project_id = o.tag_object_id and t.tag_id = o.tag_id and o.tag_group_id = 6 - WHERE - o.tag_item_id is null - ; - - - INSERT INTO tag_object - SELECT null AS tag_item_id, p.tag_id, 1 AS tag_type_id, 6 AS tag_group_id,p.project_id AS tag_object_id,null as tag_parenet_object_id,NOW() AS tag_created, null AS tag_changed, 0 as is_deleted + UPDATE `tag_object` + SET `is_deleted` = 1, + `tag_changed` = now() + WHERE `tag_item_id` IN + ( + SELECT `o`.`tag_item_id` + FROM `tmp_tag_object_to_delete` `o` + ); + + + DROP TABLE IF EXISTS `tmp_tag_object_to_insert`; + CREATE TEMPORARY TABLE `tmp_tag_object_to_insert` + /*(INDEX (project_id,project_category_id,tag_id))*/ + ENGINE MyISAM + AS + SELECT `t`.* + FROM `tmp_project_system_tag` `t` + LEFT JOIN `tag_object` `o` ON `t`.`project_id` = `o`.`tag_object_id` AND `t`.`tag_id` = `o`.`tag_id` AND + `o`.`tag_group_id` = 6 + WHERE `o`.`tag_item_id` IS NULL; + + + INSERT INTO `tag_object` + SELECT NULL AS `tag_item_id`, + `p`.`tag_id`, + 1 AS `tag_type_id`, + 6 AS `tag_group_id`, + `p`.`project_id` AS `tag_object_id`, + NULL AS `tag_parenet_object_id`, + NOW() AS `tag_created`, + NULL AS `tag_changed`, + 0 AS `is_deleted` FROM ( - select DISTINCT * from tmp_tag_object_to_insert - ) p; - - + SELECT DISTINCT * + FROM `tmp_tag_object_to_insert` + ) `p`; + + END; $$ CREATE EVENT `e_generate_tmp_cat_tag_proj_init` - ON SCHEDULE - EVERY 1 DAY STARTS '2019-02-19 17:00:00' - ON COMPLETION NOT PRESERVE - ENABLE - COMMENT '' - DO BEGIN - call generate_tmp_cat_tag_proj_init(); -END$$ + ON SCHEDULE + EVERY 1 DAY STARTS '2019-02-19 17:00:00' + ON COMPLETION NOT PRESERVE + ENABLE + COMMENT '' + DO + BEGIN + CALL generate_tmp_cat_tag_proj_init(); + END$$ DELIMITER ; diff --git a/sql_code/20190214_store_config_stay_in_context.sql b/sql_code/20190214_store_config_stay_in_context.sql index 8e180f39d..36e6693f1 100644 --- a/sql_code/20190214_store_config_stay_in_context.sql +++ b/sql_code/20190214_store_config_stay_in_context.sql @@ -1,7 +1,7 @@ ALTER TABLE `config_store` - ADD COLUMN `stay_in_context` INT(1) NULL DEFAULT 0 AFTER `render_view_postfix`; + ADD COLUMN `stay_in_context` INT(1) NULL DEFAULT 0 AFTER `render_view_postfix`; -UPDATE config_store s -SET s.stay_in_context = 0 -WHERE s.stay_in_context IS NULL; +UPDATE `config_store` `s` +SET `s`.`stay_in_context` = 0 +WHERE `s`.`stay_in_context` IS NULL; diff --git a/sql_code/20190215_update_solr_query_inactive_files_excluded.sql b/sql_code/20190215_update_solr_query_inactive_files_excluded.sql index 18d1c502c..e4e61e27e 100644 --- a/sql_code/20190215_update_solr_query_inactive_files_excluded.sql +++ b/sql_code/20190215_update_solr_query_inactive_files_excluded.sql @@ -1,311 +1,360 @@ -drop PROCEDURE solr_query_fullimport_prepare; +DROP PROCEDURE `solr_query_fullimport_prepare`; DELIMITER $$ -CREATE PROCEDURE `solr_query_fullimport_prepare`() +CREATE PROCEDURE `solr_query_fullimport_prepare`() BEGIN - - - DROP TABLE IF EXISTS tmp_solr_cat_tree; - CREATE TEMPORARY TABLE tmp_solr_cat_tree - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; - - DROP TABLE IF EXISTS tmp_solr_cat_store; - CREATE TEMPORARY TABLE tmp_solr_cat_store - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_solr_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; - - DROP TABLE IF EXISTS tmp_solr_project_tags; - CREATE TEMPORARY TABLE tmp_solr_project_tags - (PRIMARY KEY `primary` (tag_project_id) ) - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - , tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tgo.tag_type_id = 1 and tgo.tag_group_id in (5,6) and tgo.is_deleted = 0 - GROUP BY tgo.tag_object_id; - - DROP TABLE IF EXISTS tmp_solr_project_license; - CREATE TEMPORARY TABLE tmp_solr_project_license - (PRIMARY KEY `primary` (license_project_id)) + + + DROP TABLE IF EXISTS `tmp_solr_cat_tree`; + CREATE TEMPORARY TABLE `tmp_solr_cat_tree` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; + + DROP TABLE IF EXISTS `tmp_solr_cat_store`; + CREATE TEMPORARY TABLE `tmp_solr_cat_store` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_solr_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_tags`; + CREATE TEMPORARY TABLE `tmp_solr_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + , `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tgo`.`tag_type_id` = 1 + AND `tgo`.`tag_group_id` IN (5, 6) + AND `tgo`.`is_deleted` = 0 + GROUP BY `tgo`.`tag_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_license`; + CREATE TEMPORARY TABLE `tmp_solr_project_license` + ( + PRIMARY KEY `primary` (`license_project_id`) + ) + ENGINE MyISAM + AS + SELECT `t`.`tag_object_id` AS `license_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `license_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + WHERE `t`.`tag_type_id` = 1 + AND `t`.`tag_group_id` = 7 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_package_types`; + CREATE TEMPORARY TABLE `tmp_solr_project_package_types` + ( + PRIMARY KEY `primary` (`package_project_id`) + ) ENGINE MyISAM - AS - SELECT - t.tag_object_id as license_project_id, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `license_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - WHERE t.tag_type_id = 1 and t.tag_group_id = 7 AND t.is_deleted = 0 - group by tag_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_project_package_types; - CREATE TEMPORARY TABLE tmp_solr_project_package_types - (PRIMARY KEY `primary` (package_project_id)) - ENGINE MyISAM - AS - SELECT - t.tag_parent_object_id as package_project_id, - GROUP_CONCAT(DISTINCT ta.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `package_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - JOIN ppload.ppload_files files ON files.id = t.tag_object_id AND files.active = 1 - WHERE t.tag_type_id = 3 and t.tag_group_id = 8 AND t.is_deleted = 0 - group by tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_project_arch_types; - CREATE TEMPORARY TABLE tmp_solr_project_arch_types - (PRIMARY KEY `primary` (arch_project_id)) - ENGINE MyISAM - AS - SELECT - t.tag_parent_object_id as arch_project_id, - GROUP_CONCAT(DISTINCT ta.tag_id) AS arch_type_id_list, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `arch_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - JOIN ppload.ppload_files files ON files.id = t.tag_object_id AND files.active = 1 - WHERE t.tag_type_id = 3 and t.tag_group_id = 9 AND t.is_deleted = 0 - group by tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_query_fullimport; - create table tmp_solr_query_fullimport as - - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - laplace_score(project.count_likes, project.count_dislikes) AS `laplace_score`, - DATE_FORMAT(project.created_at, '%Y-%m-%dT%TZ') AS created_at, - DATE_FORMAT(project.changed_at, '%Y-%m-%dT%TZ') AS changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - sppt.package_name_list AS `package_names`, - appt.arch_name_list AS `arch_names`, - c.license_name_list AS `license_names`, - t.tag_names AS `tags` - FROM project - JOIN member ON member.member_id = project.member_id - LEFT JOIN tmp_solr_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - LEFT JOIN tmp_solr_project_package_types AS sppt ON sppt.package_project_id = project.project_id - LEFT JOIN tmp_solr_project_arch_types AS appt ON appt.arch_project_id = project.project_id - LEFT JOIN tmp_solr_project_license AS c ON c.license_project_id = project.project_id - LEFT JOIN tmp_solr_project_tags AS t ON t.tag_project_id = project.project_id - - WHERE project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND tcs.`is_active` = 1; - + AS + SELECT `t`.`tag_parent_object_id` AS `package_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `package_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `t`.`tag_object_id` AND `files`.`active` = 1 + WHERE `t`.`tag_type_id` = 3 + AND `t`.`tag_group_id` = 8 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_arch_types`; + CREATE TEMPORARY TABLE `tmp_solr_project_arch_types` + ( + PRIMARY KEY `primary` (`arch_project_id`) + ) + ENGINE MyISAM + AS + SELECT `t`.`tag_parent_object_id` AS `arch_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_id`) AS `arch_type_id_list`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `arch_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `t`.`tag_object_id` AND `files`.`active` = 1 + WHERE `t`.`tag_type_id` = 3 + AND `t`.`tag_group_id` = 9 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_query_fullimport`; + CREATE TABLE `tmp_solr_query_fullimport` AS + + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + DATE_FORMAT(`project`.`created_at`, '%Y-%m-%dT%TZ') AS `created_at`, + DATE_FORMAT(`project`.`changed_at`, '%Y-%m-%dT%TZ') AS `changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + `sppt`.`package_name_list` AS `package_names`, + `appt`.`arch_name_list` AS `arch_names`, + `c`.`license_name_list` AS `license_names`, + `t`.`tag_names` AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + LEFT JOIN `tmp_solr_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + LEFT JOIN `tmp_solr_project_package_types` AS `sppt` + ON `sppt`.`package_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_arch_types` AS `appt` ON `appt`.`arch_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_license` AS `c` ON `c`.`license_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + + WHERE `project`.`status` = 100 + AND `project`.`type_id` = 1 + AND `member`.`is_active` = 1 + AND `tcs`.`is_active` = 1; + END$$ DELIMITER ; -call solr_query_fullimport_prepare(); +CALL solr_query_fullimport_prepare(); -drop PROCEDURE solr_query_delta_import_new; +DROP PROCEDURE `solr_query_delta_import_new`; DELIMITER $$ -CREATE PROCEDURE `solr_query_delta_import_new`(IN projectID INT(11)) +CREATE PROCEDURE `solr_query_delta_import_new`(IN `projectID` INT(11)) BEGIN - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; - - DROP TABLE IF EXISTS tmp_solr_cat_store; - CREATE TEMPORARY TABLE tmp_solr_cat_store - (PRIMARY KEY `primary` (project_category_id) ) + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; + + DROP TABLE IF EXISTS `tmp_solr_cat_store`; + CREATE TEMPORARY TABLE `tmp_solr_cat_store` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; - - SELECT - project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - laplace_score(project.count_likes, project.count_dislikes) AS `laplace_score`, - DATE_FORMAT(project.created_at, '%Y-%m-%dT%TZ') AS created_at, - DATE_FORMAT(project.changed_at, '%Y-%m-%dT%TZ') AS changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - ( - - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag , ppload.ppload_files files - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 8 and tag_object.tag_type_id = 3 and tag_object.is_deleted = 0 and tag_object.tag_parent_object_id = project.project_id - and tag_object.tag_object_id = files.id and files.active = 1 - ) as package_names , - ( - - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag , ppload.ppload_files files - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 9 and tag_object.tag_type_id = 3 and tag_object.is_deleted = 0 and tag_object.tag_parent_object_id = project.project_id - and tag_object.tag_object_id = files.id and files.active = 1 - ) as arch_names, - ( - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 7 and tag_object.tag_type_id = 1 and tag_object.is_deleted = 0 and tag_object.tag_object_id = project.project_id - ) as license_names, - ( - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id in (5,6) and tag_object.tag_type_id = 1 and tag_object.is_deleted = 0 and tag_object.tag_object_id = project.project_id - ) as tags - FROM project - JOIN member ON member.member_id = project.member_id - LEFT JOIN tmp_solr_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - WHERE project_id = projectID and project.status=100 and member.is_active=1; - + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; + + SELECT `project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + DATE_FORMAT(`project`.`created_at`, '%Y-%m-%dT%TZ') AS `created_at`, + DATE_FORMAT(`project`.`changed_at`, '%Y-%m-%dT%TZ') AS `changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag`, + `ppload`.`ppload_files` `files` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`tag_type_id` = 3 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_parent_object_id` = `project`.`project_id` + AND `tag_object`.`tag_object_id` = `files`.`id` + AND `files`.`active` = 1 + ) AS `package_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag`, + `ppload`.`ppload_files` `files` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 9 + AND `tag_object`.`tag_type_id` = 3 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_parent_object_id` = `project`.`project_id` + AND `tag_object`.`tag_object_id` = `files`.`id` + AND `files`.`active` = 1 + ) AS `arch_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 7 + AND `tag_object`.`tag_type_id` = 1 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_object_id` = `project`.`project_id` + ) AS `license_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` IN (5, 6) + AND `tag_object`.`tag_type_id` = 1 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_object_id` = `project`.`project_id` + ) AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + LEFT JOIN `tmp_solr_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + WHERE `project_id` = `projectID` + AND `project`.`status` = 100 + AND `member`.`is_active` = 1; + END$$ DELIMITER ; - -drop PROCEDURE solr_query_import_new; + +DROP PROCEDURE `solr_query_import_new`; DELIMITER $$ CREATE PROCEDURE `solr_query_import_new`() BEGIN - select - project_id, - project_member_id, - project_category_id, - project_title, - description, - image_small, - username, - firstname, - lastname, - cat_title, - count_likes, - count_dislikes, - laplace_score, - created_at, - changed_at, - stores, - cat_id_ancestor_path, - package_names, - arch_names, - license_names, - tags - from tmp_solr_query_fullimport; + SELECT `project_id`, + `project_member_id`, + `project_category_id`, + `project_title`, + `description`, + `image_small`, + `username`, + `firstname`, + `lastname`, + `cat_title`, + `count_likes`, + `count_dislikes`, + `laplace_score`, + `created_at`, + `changed_at`, + `stores`, + `cat_id_ancestor_path`, + `package_names`, + `arch_names`, + `license_names`, + `tags` + FROM `tmp_solr_query_fullimport`; END$$ DELIMITER ; -drop PROCEDURE solr_query_delta_new; +DROP PROCEDURE `solr_query_delta_new`; DELIMITER $$ -CREATE PROCEDURE `solr_query_delta_new`(IN lastIndexed varchar(255)) +CREATE PROCEDURE `solr_query_delta_new`(IN `lastIndexed` varchar(255)) BEGIN - select distinct project_id - from - ( - SELECT project_id - FROM project - JOIN member ON member.member_id = project.member_id - WHERE (project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND project.changed_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) ) - union - select distinct tag_object_id as project_id - from tag_object - where tag_type_id = 1 and (tag_created > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) or tag_changed > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) ) - union select distinct tag_parent_object_id as project_id - from tag_object - where tag_type_id in (8,9) and (tag_created > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) or tag_changed > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) ) - union - select project_id - from project - JOIN ppload.ppload_files files ON project.ppload_collection_id= files.collection_id AND files.updated_timestamp > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) - group by project_id - ) t ; + SELECT DISTINCT `project_id` + FROM ( + SELECT `project_id` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + WHERE (`project`.`status` = 100 AND `project`.`type_id` = 1 AND `member`.`is_active` = 1 AND + `project`.`changed_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY))) + UNION + SELECT DISTINCT `tag_object_id` AS `project_id` + FROM `tag_object` + WHERE `tag_type_id` = 1 + AND (`tag_created` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) OR + `tag_changed` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY))) + UNION + SELECT DISTINCT `tag_parent_object_id` AS `project_id` + FROM `tag_object` + WHERE `tag_type_id` IN (8, 9) + AND (`tag_created` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) OR + `tag_changed` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY))) + UNION + SELECT `project_id` + FROM `project` + JOIN `ppload`.`ppload_files` `files` + ON `project`.`ppload_collection_id` = `files`.`collection_id` AND + `files`.`updated_timestamp` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) + GROUP BY `project_id` + ) `t`; END$$ DELIMITER ; - -drop procedure solr_query_deleted_pk_new; +DROP PROCEDURE `solr_query_deleted_pk_new`; DELIMITER $$ -CREATE PROCEDURE `solr_query_deleted_pk_new`(IN lastIndexed VARCHAR(255)) +CREATE PROCEDURE `solr_query_deleted_pk_new`(IN `lastIndexed` VARCHAR(255)) BEGIN - SELECT project_id - FROM project - WHERE - project.`type_id` = 1 - and( - project.deleted_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) - OR (project.changed_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) AND project.status < 100) - ); + SELECT `project_id` + FROM `project` + WHERE `project`.`type_id` = 1 + AND ( + `project`.`deleted_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) + OR (`project`.`changed_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) AND + `project`.`status` < 100) + ); END$$ DELIMITER ; diff --git a/sql_code/20190219_config_store_tag_group.sql b/sql_code/20190219_config_store_tag_group.sql index 221c6b4a1..4904e64e5 100644 --- a/sql_code/20190219_config_store_tag_group.sql +++ b/sql_code/20190219_config_store_tag_group.sql @@ -1,13 +1,14 @@ -CREATE TABLE `config_store_tag_group` ( - `config_store_taggroup_id` INT(11) NOT NULL AUTO_INCREMENT, - `store_id` INT(11) NOT NULL, - `tag_group_id` INT(11) NOT NULL, - `is_active` INT(1) UNSIGNED NOT NULL DEFAULT '1', - `created_at` DATETIME NULL DEFAULT NULL, - `changed_at` DATETIME NULL DEFAULT NULL, - `deleted_at` DATETIME NULL DEFAULT NULL, - PRIMARY KEY (`config_store_taggroup_id`) +CREATE TABLE `config_store_tag_group` +( + `config_store_taggroup_id` INT(11) NOT NULL AUTO_INCREMENT, + `store_id` INT(11) NOT NULL, + `tag_group_id` INT(11) NOT NULL, + `is_active` INT(1) UNSIGNED NOT NULL DEFAULT '1', + `created_at` DATETIME NULL DEFAULT NULL, + `changed_at` DATETIME NULL DEFAULT NULL, + `deleted_at` DATETIME NULL DEFAULT NULL, + PRIMARY KEY (`config_store_taggroup_id`) ) -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB ; diff --git a/sql_code/20190314_add_config_store_show_news_and_forum.sql b/sql_code/20190314_add_config_store_show_news_and_forum.sql index d4f8644cd..cd3ccbc08 100644 --- a/sql_code/20190314_add_config_store_show_news_and_forum.sql +++ b/sql_code/20190314_add_config_store_show_news_and_forum.sql @@ -1,3 +1,3 @@ ALTER TABLE `config_store` - ADD COLUMN `is_show_blog_news` INT(1) NULL DEFAULT '1' AFTER `is_show_git_projects`, - ADD COLUMN `is_show_forum_news` INT(1) NULL DEFAULT '1' AFTER `is_show_blog_news`; + ADD COLUMN `is_show_blog_news` INT(1) NULL DEFAULT '1' AFTER `is_show_git_projects`, + ADD COLUMN `is_show_forum_news` INT(1) NULL DEFAULT '1' AFTER `is_show_blog_news`; diff --git a/sql_code/20190326_project_add_user_category.sql b/sql_code/20190326_project_add_user_category.sql index dacdd6eca..811081400 100644 --- a/sql_code/20190326_project_add_user_category.sql +++ b/sql_code/20190326_project_add_user_category.sql @@ -1,2 +1,2 @@ ALTER TABLE `project` - ADD COLUMN `user_category` TEXT NULL AFTER `use_gitlab_project_readme`; + ADD COLUMN `user_category` TEXT NULL AFTER `use_gitlab_project_readme`; diff --git a/sql_code/20190327_create_tabe_collection_projects.sql b/sql_code/20190327_create_tabe_collection_projects.sql index ab41ad82c..88502da5b 100644 --- a/sql_code/20190327_create_tabe_collection_projects.sql +++ b/sql_code/20190327_create_tabe_collection_projects.sql @@ -1,14 +1,15 @@ -CREATE TABLE `collection_projects` ( - `collection_project_id` INT(11) NOT NULL AUTO_INCREMENT, - `collection_id` INT(11) NOT NULL, - `project_id` INT(11) NOT NULL, - `order` INT(11) NULL DEFAULT NULL, - `active` INT(1) UNSIGNED NULL DEFAULT '1', - `created_at` DATETIME NULL DEFAULT NULL, - `changed_at` DATETIME NULL DEFAULT NULL, - `deleted_at` DATETIME NULL DEFAULT NULL, - PRIMARY KEY (`collection_project_id`) +CREATE TABLE `collection_projects` +( + `collection_project_id` INT(11) NOT NULL AUTO_INCREMENT, + `collection_id` INT(11) NOT NULL, + `project_id` INT(11) NOT NULL, + `order` INT(11) NULL DEFAULT NULL, + `active` INT(1) UNSIGNED NULL DEFAULT '1', + `created_at` DATETIME NULL DEFAULT NULL, + `changed_at` DATETIME NULL DEFAULT NULL, + `deleted_at` DATETIME NULL DEFAULT NULL, + PRIMARY KEY (`collection_project_id`) ) -COLLATE='latin1_swedish_ci' -ENGINE=InnoDB + COLLATE = 'latin1_swedish_ci' + ENGINE = InnoDB ; diff --git a/sql_code/20190411_alter_support_add_type_period.sql b/sql_code/20190411_alter_support_add_type_period.sql index 219b0dde9..170c57aae 100644 --- a/sql_code/20190411_alter_support_add_type_period.sql +++ b/sql_code/20190411_alter_support_add_type_period.sql @@ -1,13 +1,13 @@ ALTER TABLE `support` - ADD COLUMN `type_id` INT(1) UNSIGNED NULL DEFAULT '0' COMMENT '0 = onetime payment, 1 = subsscription signup, 2 = subsscription payment' AFTER `create_time`, - ADD COLUMN `period` VARCHAR(50) NULL AFTER `amount`; + ADD COLUMN `type_id` INT(1) UNSIGNED NULL DEFAULT '0' COMMENT '0 = onetime payment, 1 = subsscription signup, 2 = subsscription payment' AFTER `create_time`, + ADD COLUMN `period` VARCHAR(50) NULL AFTER `amount`; -UPDATE support p -SET p.type_id = 0; +UPDATE `support` `p` +SET `p`.`type_id` = 0; ALTER TABLE `support` - ADD COLUMN `subscription_id` VARCHAR(255) NULL AFTER `type_id`; + ADD COLUMN `subscription_id` VARCHAR(255) NULL AFTER `type_id`; ALTER TABLE `support` - ADD COLUMN `period_frequency` VARCHAR(50) NULL DEFAULT NULL AFTER `period`; \ No newline at end of file + ADD COLUMN `period_frequency` VARCHAR(50) NULL DEFAULT NULL AFTER `period`; \ No newline at end of file diff --git a/sql_code/20190424_cat_tag_group_multiselect.sql b/sql_code/20190424_cat_tag_group_multiselect.sql index 03f537ae4..14742d496 100644 --- a/sql_code/20190424_cat_tag_group_multiselect.sql +++ b/sql_code/20190424_cat_tag_group_multiselect.sql @@ -1,2 +1,2 @@ ALTER TABLE `tag_group` - ADD COLUMN `is_multi_select` INT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Is this Tag-Group a multiselect Dropdown?' AFTER `group_legacy_name`; + ADD COLUMN `is_multi_select` INT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Is this Tag-Group a multiselect Dropdown?' AFTER `group_legacy_name`; diff --git a/sql_code/20190503_alter_support_add_tie.sql b/sql_code/20190503_alter_support_add_tie.sql index 84ae5b6a8..89fa12490 100755 --- a/sql_code/20190503_alter_support_add_tie.sql +++ b/sql_code/20190503_alter_support_add_tie.sql @@ -1,3 +1,4 @@ + ALTER TABLE `support` - ADD COLUMN `tier` double(10,2) COMMENT '0.99, 2,5,10,null' AFTER `amount`; + ADD COLUMN `tier` double(10, 2) COMMENT '0.99, 2,5,10,null' AFTER `amount`; \ No newline at end of file diff --git a/sql_code/20190503_create_files_downloaded_all.sql b/sql_code/20190503_create_files_downloaded_all.sql index a53ec7d4a..cf6f5571f 100644 --- a/sql_code/20190503_create_files_downloaded_all.sql +++ b/sql_code/20190503_create_files_downloaded_all.sql @@ -1,8 +1,8 @@ -CREATE TABLE ppload.ppload_files_downloaded_all LIKE ppload.ppload_files_downloaded -; + +CREATE TABLE `ppload`.`ppload_files_downloaded_all` LIKE `ppload`.`ppload_files_downloaded`; ALTER TABLE `ppload_files_downloaded_all` - ADD COLUMN `source` VARCHAR(39) NULL DEFAULT NULL AFTER `downloaded_ip`; + ADD COLUMN `source` VARCHAR(39) NULL DEFAULT NULL AFTER `downloaded_ip`; ALTER TABLE `ppload_files_downloaded_all` - ADD COLUMN `link_type` VARCHAR(39) NULL DEFAULT NULL AFTER `source`; \ No newline at end of file + ADD COLUMN `link_type` VARCHAR(39) NULL DEFAULT NULL AFTER `source`; \ No newline at end of file diff --git a/sql_code/20190503_stat_files_downloaded.sql b/sql_code/20190503_stat_files_downloaded.sql index 45c40d9e2..1081a690b 100644 --- a/sql_code/20190503_stat_files_downloaded.sql +++ b/sql_code/20190503_stat_files_downloaded.sql @@ -1,37 +1,44 @@ + + +DROP PROCEDURE IF EXISTS `generate_stat_files_downloaded`; + DELIMITER $$ CREATE PROCEDURE `generate_stat_files_downloaded`() -LANGUAGE SQL -NOT DETERMINISTIC -CONTAINS SQL -SQL SECURITY DEFINER -COMMENT '' + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + SQL SECURITY DEFINER + COMMENT '' BEGIN - DROP TABLE IF EXISTS ppload.tmp_stat_ppload_files_downloaded; - - CREATE TABLE ppload.tmp_stat_ppload_files_downloaded - (INDEX `idx_coll` (`collection_id`),INDEX `idx_file` (`file_id`)) - ENGINE MyISAM - AS - SELECT f.owner_id, f.collection_id, f.file_id, COUNT(1) AS count_dl FROM ppload.ppload_files_downloaded f - WHERE f.downloaded_timestamp < DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') - GROUP BY f.collection_id, f.file_id - ; - RENAME TABLE ppload.stat_ppload_files_downloaded TO ppload.old_stat_ppload_files_downloaded, ppload.tmp_stat_ppload_files_downloaded TO ppload.stat_ppload_files_downloaded; - DROP TABLE IF EXISTS ppload.old_stat_ppload_files_downloaded; + DROP TABLE IF EXISTS `ppload`.`tmp_stat_ppload_files_downloaded`; + + CREATE TABLE `ppload`.`tmp_stat_ppload_files_downloaded` + ( + INDEX `idx_coll` (`collection_id`), + INDEX `idx_file` (`file_id`) + ) + ENGINE MyISAM + AS + SELECT `f`.`owner_id`, `f`.`collection_id`, `f`.`file_id`, COUNT(1) AS `count_dl` + FROM `ppload`.`ppload_files_downloaded` `f` + WHERE `f`.`downloaded_timestamp` < DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00') + GROUP BY `f`.`collection_id`, `f`.`file_id`; + RENAME TABLE `ppload`.`stat_ppload_files_downloaded` TO `ppload`.`old_stat_ppload_files_downloaded`, `ppload`.`tmp_stat_ppload_files_downloaded` TO `ppload`.`stat_ppload_files_downloaded`; + DROP TABLE IF EXISTS `ppload`.`old_stat_ppload_files_downloaded`; END$$ DELIMITER ; CREATE EVENT `e_generate_stat_files_downloaded` - ON SCHEDULE - EVERY 1 DAY STARTS '2019-05-01 00:00:00' - ON COMPLETION PRESERVE - ENABLE - COMMENT 'Regenerates ppload.stat_ppload_files_downloaded table' - DO CALL generate_stat_files_downloaded() + ON SCHEDULE + EVERY 1 DAY STARTS '2019-05-01 00:00:00' + ON COMPLETION PRESERVE + ENABLE + COMMENT 'Regenerates ppload.stat_ppload_files_downloaded table' + DO CALL generate_stat_files_downloaded() ; \ No newline at end of file diff --git a/sql_code/20190507_project_rating_score.sql b/sql_code/20190507_project_rating_score.sql index e3fee0a63..3efad84be 100644 --- a/sql_code/20190507_project_rating_score.sql +++ b/sql_code/20190507_project_rating_score.sql @@ -1,8 +1,10 @@ ALTER TABLE project_rating ADD COLUMN score int(2) COMMENT 'vote up = 8 votedown = 3' AFTER user_dislike; select * from project_rating where user_like >1; update project_rating set score = 8 where user_like = 1 ; update project_rating set score = 3 where user_dislike = 1 ; + +// out of date. refer 20190514_score.sql update project_rating set score = round((user_like*8+user_dislike*3+2*5)/(user_like+user_dislike+2),0) where user_like > 1 ; diff --git a/sql_code/20190508_create_stat_ranking_project.sql b/sql_code/20190508_create_stat_ranking_project.sql index 9bc5beb6b..c5287669e 100644 --- a/sql_code/20190508_create_stat_ranking_project.sql +++ b/sql_code/20190508_create_stat_ranking_project.sql @@ -1,53 +1,54 @@ + DROP PROCEDURE IF EXISTS `generate_stat_rating_project`; DELIMITER $$ CREATE PROCEDURE `generate_stat_rating_project`() - BEGIN +BEGIN DROP TABLE IF EXISTS `tmp_stat_rating_project`; CREATE TABLE `tmp_stat_rating_project` ( - `project_id` int(11) NOT NULL, - `likes` int(11) NOT NULL, - `dislikes` int(11) NOT NULL, - `votes_total` int(11) NOT NULL, - `score` int(11) NOT NULL, - PRIMARY KEY `primary` (`project_id`) + `project_id` int(11) NOT NULL, + `likes` int(11) NOT NULL, + `dislikes` int(11) NOT NULL, + `votes_total` int(11) NOT NULL, + `score` int(11) NOT NULL, + PRIMARY KEY `primary` (`project_id`) ) - AS - SELECT `pr`.`project_id`, - sum(`pr`.`user_like`) AS `likes`, - sum(`pr`.`user_dislike`) AS `dislikes`, - sum(`pr`.`user_like`) + sum(`pr`.`user_dislike`) AS `votes_total`, - laplace_score(sum(`pr`.`user_like`), sum(`pr`.`user_dislike`)) AS `score` - FROM `project_rating` AS `pr` - WHERE `pr`.`rating_active` = 1 - AND `pr`.`comment_id` = 0 - GROUP BY `pr`.`project_id`; + AS + SELECT `pr`.`project_id`, + sum(`pr`.`user_like`) AS `likes`, + sum(`pr`.`user_dislike`) AS `dislikes`, + sum(`pr`.`user_like`) + sum(`pr`.`user_dislike`) AS `votes_total`, + laplace_score(sum(`pr`.`user_like`), sum(`pr`.`user_dislike`)) AS `score` + FROM `project_rating` AS `pr` + WHERE `pr`.`rating_active` = 1 + AND `pr`.`comment_id` = 0 + GROUP BY `pr`.`project_id`; IF EXISTS(SELECT `table_name` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `table_schema` = DATABASE() - AND `table_name` = 'stat_rating_project') + AND `table_name` = 'stat_rating_project') THEN - RENAME TABLE `stat_rating_project` TO `old_stat_rating_project`, `tmp_stat_rating_project` TO `stat_rating_project`; + RENAME TABLE `stat_rating_project` TO `old_stat_rating_project`, `tmp_stat_rating_project` TO `stat_rating_project`; ELSE - RENAME TABLE `tmp_stat_rating_project` TO `stat_rating_project`; + RENAME TABLE `tmp_stat_rating_project` TO `stat_rating_project`; END IF; DROP TABLE IF EXISTS `old_stat_rating_project`; - END$$ +END$$ DELIMITER ; CREATE DEFINER = CURRENT_USER EVENT `e_generate_stat_rating_project` ON SCHEDULE - EVERY '5' MINUTE - STARTS '2019-05-08 05:00:00' - ON COMPLETION PRESERVE - ENABLE - COMMENT 'Regenerates stat_rating_project table' -DO - CALL generate_stat_rating_project(); \ No newline at end of file + EVERY '5' MINUTE + STARTS '2019-05-08 05:00:00' + ON COMPLETION PRESERVE + ENABLE + COMMENT 'Regenerates stat_rating_project table' + DO + CALL generate_stat_rating_project(); \ No newline at end of file diff --git a/sql_code/20190508_stat_projects_new_scorecolumn.sql b/sql_code/20190508_stat_projects_new_scorecolumn.sql index 25825a665..fb83407dd 100644 --- a/sql_code/20190508_stat_projects_new_scorecolumn.sql +++ b/sql_code/20190508_stat_projects_new_scorecolumn.sql @@ -1,192 +1,192 @@ + + +DROP FUNCTION IF EXISTS `laplace_score_new`; + DELIMITER $$ -CREATE FUNCTION `laplace_score_new`(upvotes INT, downvotes INT) RETURNS int(3) +CREATE FUNCTION `laplace_score_new`(`upvotes` INT, `downvotes` INT) RETURNS int(3) DETERMINISTIC BEGIN - DECLARE score INT(4); - SET score = round((upvotes*8+downvotes*3+2*5)/(upvotes+downvotes+2),2)*100 ; - RETURN score; + DECLARE `score` INT(4); + SET `score` = round((`upvotes` * 8 + `downvotes` * 3 + 2 * 5) / (`upvotes` + `downvotes` + 2), 2) * 100; + RETURN `score`; END$$ DELIMITER ; - - +DROP PROCEDURE IF EXISTS `generate_stat_project`; DELIMITER $$ CREATE PROCEDURE `generate_stat_project`() BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; + + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, + GROUP_CONCAT(`tag_id`) AS `tag_ids`, + `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_id`, + `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_ID`, + `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT - GROUP_CONCAT(tag_name) AS tag_names, - GROUP_CONCAT(tag_id) AS tag_ids, - tag_project_id - FROM ( - select - distinct tag.tag_name, - tag.tag_id, - tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select - distinct tag.tag_name, - tag.tag_ID, - tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_ppload` (`ppload_collection_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`major_updated_at` AS `major_updated_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, + laplace_score_new(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score_new`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `t`.`tag_ids` AS `tag_ids`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND (`project`.`type_id` = 1 OR `project`.`type_id` = 3) + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_ppload` (`ppload_collection_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`),INDEX `idx_source_url` (`source_url`(50))) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`major_updated_at` AS `major_updated_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - laplace_score(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score`, - laplace_score_new(`project`.`count_likes`, `project`.`count_dislikes`) AS `laplace_score_new`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `t`.`tag_ids` AS `tag_ids`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND (`project`.`type_id` = 1 OR `project`.`type_id` = 3) - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; diff --git a/sql_code/20190509_generate_stat_rating_project.sql b/sql_code/20190509_generate_stat_rating_project.sql index 2b72bd314..0da6668db 100644 --- a/sql_code/20190509_generate_stat_rating_project.sql +++ b/sql_code/20190509_generate_stat_rating_project.sql @@ -1,43 +1,50 @@ + + +DROP PROCEDURE IF EXISTS `generate_stat_rating_project`; + DELIMITER $$ CREATE PROCEDURE `generate_stat_rating_project`() BEGIN - DROP TABLE IF EXISTS tmp_stat_rating_project; - CREATE TABLE tmp_stat_rating_project + DROP TABLE IF EXISTS `tmp_stat_rating_project`; + CREATE TABLE `tmp_stat_rating_project` ( - `project_id` int(11) NOT NULL, - `likes` int(11) NOT NULL, - `dislikes` int(11) NOT NULL, - `votes_total` int(11) NOT NULL, - `score` int(11) NOT NULL, + `project_id` int(11) NOT NULL, + `likes` int(11) NOT NULL, + `dislikes` int(11) NOT NULL, + `votes_total` int(11) NOT NULL, + `score` int(11) NOT NULL, `score_with_pling` int(11) NOT NULL, - PRIMARY KEY `primary` (project_id) + PRIMARY KEY `primary` (`project_id`) ) AS - SELECT pr.project_id, - sum(pr.user_like) AS likes, - sum(pr.user_dislike) AS dislikes, - sum(pr.user_like) + sum(pr.user_dislike) AS votes_total, - laplace_score(sum(pr.user_like), sum(pr.user_dislike)) AS score, - laplace_score_with_plings(sum(pr.user_like), sum(pr.user_dislike) - ,(select count(1) from project_plings p where p.project_id = pr.project_id and is_deleted = 0) - ) AS score_with_pling - FROM project_rating AS pr - WHERE (pr.rating_active = 1 or (rating_active=0 and user_like>1)) - GROUP BY pr.project_id; - - IF EXISTS(SELECT table_name - FROM INFORMATION_SCHEMA.TABLES - WHERE table_schema = DATABASE() - AND table_name = 'stat_rating_project') + SELECT `pr`.`project_id`, + sum(`pr`.`user_like`) AS `likes`, + sum(`pr`.`user_dislike`) AS `dislikes`, + sum(`pr`.`user_like`) + sum(`pr`.`user_dislike`) AS `votes_total`, + laplace_score(sum(`pr`.`user_like`), sum(`pr`.`user_dislike`)) AS `score`, + laplace_score_with_plings(sum(`pr`.`user_like`), sum(`pr`.`user_dislike`) + , (SELECT count(1) + FROM `project_plings` `p` + WHERE `p`.`project_id` = `pr`.`project_id` + AND `is_deleted` = 0) + ) AS `score_with_pling` + FROM `project_rating` AS `pr` + WHERE (`pr`.`rating_active` = 1 OR (`rating_active` = 0 AND `user_like` > 1)) + GROUP BY `pr`.`project_id`; + + IF EXISTS(SELECT `table_name` + FROM `INFORMATION_SCHEMA`.`TABLES` + WHERE `table_schema` = DATABASE() + AND `table_name` = 'stat_rating_project') THEN - RENAME TABLE stat_rating_project TO old_stat_rating_project, tmp_stat_rating_project TO stat_rating_project; + RENAME TABLE `stat_rating_project` TO `old_stat_rating_project`, `tmp_stat_rating_project` TO `stat_rating_project`; ELSE - RENAME TABLE tmp_stat_rating_project TO stat_rating_project; + RENAME TABLE `tmp_stat_rating_project` TO `stat_rating_project`; END IF; - DROP TABLE IF EXISTS old_stat_rating_project; + DROP TABLE IF EXISTS `old_stat_rating_project`; END$$ DELIMITER ; \ No newline at end of file diff --git a/sql_code/20190509_laplace_score_with_plings.sql b/sql_code/20190509_laplace_score_with_plings.sql index 4910a91f4..c7bb8bbdd 100644 --- a/sql_code/20190509_laplace_score_with_plings.sql +++ b/sql_code/20190509_laplace_score_with_plings.sql @@ -1,10 +1,15 @@ + + +DROP FUNCTION IF EXISTS `laplace_score_with_plings`; + DELIMITER $$ -CREATE FUNCTION `laplace_score_with_plings`(upvotes INT, downvotes INT, plings INT) RETURNS int(3) +CREATE FUNCTION `laplace_score_with_plings`(`upvotes` INT, `downvotes` INT, `plings` INT) RETURNS int(3) DETERMINISTIC BEGIN - DECLARE score INT(4); - SET score = round((upvotes*8+downvotes*3+2*5 + plings*11)/(upvotes+downvotes+2+plings),2)*100 ; - RETURN score; + DECLARE `score` INT(4); + SET `score` = round((`upvotes` * 8 + `downvotes` * 3 + 2 * 5 + `plings` * 11) / + (`upvotes` + `downvotes` + 2 + `plings`), 2) * 100; + RETURN `score`; END$$ DELIMITER ; diff --git a/sql_code/20190509_stat_projects_update_scorecolumn.sql b/sql_code/20190509_stat_projects_update_scorecolumn.sql index 4ffb7dffc..509c26e87 100644 --- a/sql_code/20190509_stat_projects_update_scorecolumn.sql +++ b/sql_code/20190509_stat_projects_update_scorecolumn.sql @@ -1,180 +1,179 @@ + +DROP PROCEDURE IF EXISTS `generate_stat_project`; + DELIMITER $$ -drop procedure generate_stat_project; CREATE PROCEDURE `generate_stat_project`() BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; + + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, + GROUP_CONCAT(`tag_id`) AS `tag_ids`, + `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_id`, + `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_ID`, + `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_ppload` (`ppload_collection_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`major_updated_at` AS `major_updated_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + `project`.`count_likes` AS `count_likes`, + `project`.`count_dislikes` AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + `stat_rating_project`.`score` AS `laplace_score`, + `stat_rating_project`.`score_with_pling` AS `laplace_score_new`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `t`.`tag_ids` AS `tag_ids`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + LEFT JOIN `stat_rating_project` ON `stat_rating_project`.`project_id` = `project`.`project_id` - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT - GROUP_CONCAT(tag_name) AS tag_names, - GROUP_CONCAT(tag_id) AS tag_ids, - tag_project_id - FROM ( - select - distinct tag.tag_name, - tag.tag_id, - tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select - distinct tag.tag_name, - tag.tag_ID, - tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND (`project`.`type_id` = 1 OR `project`.`type_id` = 3) + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_ppload` (`ppload_collection_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`),INDEX `idx_source_url` (`source_url`(50))) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`major_updated_at` AS `major_updated_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - `project`.`count_likes` AS `count_likes`, - `project`.`count_dislikes` AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - `stat_rating_project`.`score` AS `laplace_score`, - `stat_rating_project`.`score_with_pling` AS `laplace_score_new`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `t`.`tag_ids` AS `tag_ids`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - LEFT JOIN `stat_rating_project` ON stat_rating_project.project_id = project.project_id - - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND (`project`.`type_id` = 1 OR `project`.`type_id` = 3) - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; diff --git a/sql_code/20190509_v_support.sql b/sql_code/20190509_v_support.sql index 57606dcc5..19460adf4 100644 --- a/sql_code/20190509_v_support.sql +++ b/sql_code/20190509_v_support.sql @@ -1,37 +1,43 @@ -create view v_support as -SELECT - member_id - ,max(active_time) AS active_time_max - ,min(active_time) AS active_time_min - , DATE_ADD(max(active_time), INTERVAL 1 YEAR) as valid_till - ,(DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now()) AS is_valid - ,0 as is_subscription - from support - where status_id = 2 AND type_id = 0 - group by member_id - - union - - SELECT - member_id - ,max(active_time) AS active_time_max - ,min(active_time) AS active_time_min - , DATE_ADD(max(active_time), INTERVAL 1 MONTH) as valid_till - ,(DATE_ADD(max(active_time), INTERVAL 1 MONTH) > now()) AS is_valid - ,1 as is_subscription - from support - where status_id = 2 AND type_id = 2 and period= 'M' - group by member_id - - union - - SELECT - member_id - ,max(active_time) AS active_time_max - ,min(active_time) AS active_time_min - , DATE_ADD(max(active_time), INTERVAL 1 YEAR) as valid_till - ,(DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now()) AS is_valid - ,1 as is_subscription - from support - where status_id = 2 AND type_id = 2 and period= 'Y' - group by member_id; \ No newline at end of file + + +DROP VIEW IF EXISTS `v_support`; + +CREATE VIEW `v_support` AS + SELECT `member_id` + , max(`active_time`) AS `active_time_max` + , min(`active_time`) AS `active_time_min` + , DATE_ADD(max(`active_time`), INTERVAL 1 YEAR) AS `valid_till` + , (DATE_ADD(max(`active_time`), INTERVAL 1 YEAR) > now()) AS `is_valid` + , 0 AS `is_subscription` + FROM `support` + WHERE `status_id` = 2 + AND `type_id` = 0 + GROUP BY `member_id` + + UNION + + SELECT `member_id` + , max(`active_time`) AS `active_time_max` + , min(`active_time`) AS `active_time_min` + , DATE_ADD(max(`active_time`), INTERVAL 1 MONTH) AS `valid_till` + , (DATE_ADD(max(`active_time`), INTERVAL 1 MONTH) > now()) AS `is_valid` + , 1 AS `is_subscription` + FROM `support` + WHERE `status_id` = 2 + AND `type_id` = 2 + AND `period` = 'M' + GROUP BY `member_id` + + UNION + + SELECT `member_id` + , max(`active_time`) AS `active_time_max` + , min(`active_time`) AS `active_time_min` + , DATE_ADD(max(`active_time`), INTERVAL 1 YEAR) AS `valid_till` + , (DATE_ADD(max(`active_time`), INTERVAL 1 YEAR) > now()) AS `is_valid` + , 1 AS `is_subscription` + FROM `support` + WHERE `status_id` = 2 + AND `type_id` = 2 + AND `period` = 'Y' + GROUP BY `member_id`; \ No newline at end of file diff --git a/sql_code/20190513_stat_projects_updates.sql b/sql_code/20190513_stat_projects_updates.sql index c6eaf9a9a..4555cb405 100644 --- a/sql_code/20190513_stat_projects_updates.sql +++ b/sql_code/20190513_stat_projects_updates.sql @@ -1,180 +1,179 @@ + +DROP PROCEDURE IF EXISTS `generate_stat_project`; + DELIMITER $$ -drop procedure generate_stat_project; CREATE PROCEDURE `generate_stat_project`() BEGIN - DROP TABLE IF EXISTS tmp_reported_projects; - CREATE TEMPORARY TABLE tmp_reported_projects - (PRIMARY KEY `primary` (project_id) ) - AS - SELECT - `reports_project`.`project_id` AS `project_id`, - COUNT(`reports_project`.`project_id`) AS `amount_reports`, - MAX(`reports_project`.`created_at`) AS `latest_report` - FROM - `reports_project` - WHERE - (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) - GROUP BY `reports_project`.`project_id` - ; + DROP TABLE IF EXISTS `tmp_reported_projects`; + CREATE TEMPORARY TABLE `tmp_reported_projects` + ( + PRIMARY KEY `primary` (`project_id`) + ) + AS + SELECT `reports_project`.`project_id` AS `project_id`, + COUNT(`reports_project`.`project_id`) AS `amount_reports`, + MAX(`reports_project`.`created_at`) AS `latest_report` + FROM `reports_project` + WHERE (`reports_project`.`is_deleted` = 0 AND `reports_project`.`report_type` = 0) + GROUP BY `reports_project`.`project_id`; + + DROP TABLE IF EXISTS `tmp_project_package_types`; + CREATE TEMPORARY TABLE `tmp_project_package_types` + ( + PRIMARY KEY `primary` (`project_id`) + ) + ENGINE MyISAM + AS + SELECT `tag_object`.`tag_parent_object_id` AS `project_id`, + GROUP_CONCAT(DISTINCT `tag_object`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `tag`.`tag_fullname`) AS `package_name_list` + FROM `tag_object` + JOIN + `tag` ON `tag_object`.`tag_id` = `tag`.`tag_id` + JOIN + `ppload`.`ppload_files` `files` ON `files`.`id` = `tag_object`.`tag_object_id` + WHERE `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`is_deleted` = 0 + AND `files`.`active` = 1 + GROUP BY `tag_object`.`tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_project_tags`; + CREATE TEMPORARY TABLE `tmp_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + ENGINE MyISAM + AS + SELECT GROUP_CONCAT(`tag_name`) AS `tag_names`, + GROUP_CONCAT(`tag_id`) AS `tag_ids`, + `tag_project_id` + FROM ( + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_id`, + `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tag_type_id` = 1 #project + AND `tgo`.`is_deleted` = 0 + UNION ALL + SELECT DISTINCT `tag`.`tag_name`, + `tag`.`tag_ID`, + `tgo`.`tag_parent_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `tgo`.`tag_object_id` + WHERE `tag_type_id` = 3 #file + AND `files`.`active` = 1 + AND `tgo`.`is_deleted` = 0 + ) `A` + GROUP BY `tag_project_id` + ORDER BY `tag_project_id`; - DROP TABLE IF EXISTS tmp_project_package_types; - CREATE TEMPORARY TABLE tmp_project_package_types - (PRIMARY KEY `primary` (project_id)) - ENGINE MyISAM - AS - SELECT - tag_object.tag_parent_object_id as project_id, - GROUP_CONCAT(DISTINCT tag_object.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT tag.tag_fullname) AS `package_name_list` - FROM - tag_object - JOIN - tag ON tag_object.tag_id = tag.tag_id - JOIN - ppload.ppload_files files ON files.id = tag_object.tag_object_id - WHERE - tag_object.tag_group_id = 8 - AND tag_object.is_deleted = 0 - AND files.active = 1 - GROUP BY tag_object.tag_parent_object_id - ; + DROP TABLE IF EXISTS `tmp_stat_projects`; + CREATE TABLE `tmp_stat_projects` + ( + PRIMARY KEY `primary` (`project_id`), + INDEX `idx_ppload` (`ppload_collection_id`), + INDEX `idx_cat` (`project_category_id`), + INDEX `idx_member` (`member_id`), + INDEX `idx_source_url` (`source_url`(50)) + ) + ENGINE MyISAM + AS + SELECT `project`.`project_id` AS `project_id`, + `project`.`member_id` AS `member_id`, + `project`.`content_type` AS `content_type`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`hive_category_id` AS `hive_category_id`, + `project`.`status` AS `status`, + `project`.`uuid` AS `uuid`, + `project`.`pid` AS `pid`, + `project`.`type_id` AS `type_id`, + `project`.`title` AS `title`, + `project`.`description` AS `description`, + `project`.`version` AS `version`, + `project`.`project_license_id` AS `project_license_id`, + `project`.`image_big` AS `image_big`, + `project`.`image_small` AS `image_small`, + `project`.`start_date` AS `start_date`, + `project`.`content_url` AS `content_url`, + `project`.`created_at` AS `created_at`, + `project`.`changed_at` AS `changed_at`, + `project`.`major_updated_at` AS `major_updated_at`, + `project`.`deleted_at` AS `deleted_at`, + `project`.`creator_id` AS `creator_id`, + `project`.`facebook_code` AS `facebook_code`, + `project`.`source_url` AS `source_url`, + `project`.`twitter_code` AS `twitter_code`, + `project`.`google_code` AS `google_code`, + `project`.`link_1` AS `link_1`, + `project`.`embed_code` AS `embed_code`, + CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, + `project`.`validated` AS `validated`, + `project`.`validated_at` AS `validated_at`, + `project`.`featured` AS `featured`, + `project`.`ghns_excluded` AS `ghns_excluded`, + `project`.`amount` AS `amount`, + `project`.`amount_period` AS `amount_period`, + `project`.`claimable` AS `claimable`, + `project`.`claimed_by_member` AS `claimed_by_member`, + IFNULL(`stat_rating_project`.`likes`, 0) AS `count_likes`, + IFNULL(`stat_rating_project`.`dislikes`, 0) AS `count_dislikes`, + `project`.`count_comments` AS `count_comments`, + `project`.`count_downloads_hive` AS `count_downloads_hive`, + `project`.`source_id` AS `source_id`, + `project`.`source_pk` AS `source_pk`, + `project`.`source_type` AS `source_type`, + `project`.`validated` AS `project_validated`, + `project`.`uuid` AS `project_uuid`, + `project`.`status` AS `project_status`, + `project`.`created_at` AS `project_created_at`, + `project`.`changed_at` AS `project_changed_at`, + IFNULL(`stat_rating_project`.`score`, 50) AS `laplace_score_old`, + IFNULL(`stat_rating_project`.`score_with_pling`, 500) AS `laplace_score`, + `member`.`type` AS `member_type`, + `member`.`member_id` AS `project_member_id`, + `member`.`username` AS `username`, + `member`.`profile_image_url` AS `profile_image_url`, + `member`.`city` AS `city`, + `member`.`country` AS `country`, + `member`.`created_at` AS `member_created_at`, + `member`.`paypal_mail` AS `paypal_mail`, + `project_category`.`title` AS `cat_title`, + `project_category`.`xdg_type` AS `cat_xdg_type`, + `project_category`.`name_legacy` AS `cat_name_legacy`, + `project_category`.`show_description` AS `cat_show_description`, + `stat_plings`.`amount_received` AS `amount_received`, + `stat_plings`.`count_plings` AS `count_plings`, + `stat_plings`.`count_plingers` AS `count_plingers`, + `stat_plings`.`latest_pling` AS `latest_pling`, + `trp`.`amount_reports` AS `amount_reports`, + `tppt`.`package_type_id_list` AS `package_types`, + `tppt`.`package_name_list` AS `package_names`, + `t`.`tag_names` AS `tags`, + `t`.`tag_ids` AS `tag_ids`, + `sdqy`.`amount` AS `count_downloads_quarter`, + `project_license`.`title` AS `project_license_title` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` + LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_reported_projects` AS `trp` ON `trp`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_package_types` AS `tppt` ON `tppt`.`project_id` = `project`.`project_id` + LEFT JOIN `tmp_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_downloads_quarter_year` AS `sdqy` ON `sdqy`.`project_id` = `project`.`project_id` + LEFT JOIN `project_license` ON `project_license`.`project_license_id` = `project`.`project_license_id` + LEFT JOIN `stat_rating_project` ON `stat_rating_project`.`project_id` = `project`.`project_id` - DROP TABLE IF EXISTS tmp_project_tags; - CREATE TEMPORARY TABLE tmp_project_tags - (PRIMARY KEY `primary` (tag_project_id)) - ENGINE MyISAM - AS - SELECT - GROUP_CONCAT(tag_name) AS tag_names, - GROUP_CONCAT(tag_id) AS tag_ids, - tag_project_id - FROM ( - select - distinct tag.tag_name, - tag.tag_id, - tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tag_type_id = 1 #project - AND tgo.is_deleted = 0 - UNION ALL - select - distinct tag.tag_name, - tag.tag_ID, - tgo.tag_parent_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - JOIN ppload.ppload_files files ON files.id = tgo.tag_object_id - WHERE tag_type_id = 3 #file - AND files.active = 1 - AND tgo.is_deleted = 0 - ) A - GROUP BY tag_project_id - ORDER BY tag_project_id; + WHERE `member`.`is_deleted` = 0 + AND `member`.`is_active` = 1 + AND (`project`.`type_id` = 1 OR `project`.`type_id` = 3) + AND `project`.`status` = 100 + AND `project_category`.`is_active` = 1; - DROP TABLE IF EXISTS tmp_stat_projects; - CREATE TABLE tmp_stat_projects - (PRIMARY KEY `primary` (`project_id`), INDEX `idx_ppload` (`ppload_collection_id`), INDEX `idx_cat` (`project_category_id`),INDEX `idx_member` (`member_id`),INDEX `idx_source_url` (`source_url`(50))) - ENGINE MyISAM - AS - SELECT - `project`.`project_id` AS `project_id`, - `project`.`member_id` AS `member_id`, - `project`.`content_type` AS `content_type`, - `project`.`project_category_id` AS `project_category_id`, - `project`.`hive_category_id` AS `hive_category_id`, - `project`.`status` AS `status`, - `project`.`uuid` AS `uuid`, - `project`.`pid` AS `pid`, - `project`.`type_id` AS `type_id`, - `project`.`title` AS `title`, - `project`.`description` AS `description`, - `project`.`version` AS `version`, - `project`.`project_license_id` AS `project_license_id`, - `project`.`image_big` AS `image_big`, - `project`.`image_small` AS `image_small`, - `project`.`start_date` AS `start_date`, - `project`.`content_url` AS `content_url`, - `project`.`created_at` AS `created_at`, - `project`.`changed_at` AS `changed_at`, - `project`.`major_updated_at` AS `major_updated_at`, - `project`.`deleted_at` AS `deleted_at`, - `project`.`creator_id` AS `creator_id`, - `project`.`facebook_code` AS `facebook_code`, - `project`.`source_url` AS `source_url`, - `project`.`twitter_code` AS `twitter_code`, - `project`.`google_code` AS `google_code`, - `project`.`link_1` AS `link_1`, - `project`.`embed_code` AS `embed_code`, - CAST(`project`.`ppload_collection_id` AS UNSIGNED) AS `ppload_collection_id`, - `project`.`validated` AS `validated`, - `project`.`validated_at` AS `validated_at`, - `project`.`featured` AS `featured`, - `project`.`ghns_excluded` AS `ghns_excluded`, - `project`.`amount` AS `amount`, - `project`.`amount_period` AS `amount_period`, - `project`.`claimable` AS `claimable`, - `project`.`claimed_by_member` AS `claimed_by_member`, - IFNULL(`stat_rating_project`.`likes`, 0) AS `count_likes`, - IFNULL(`stat_rating_project`.`dislikes`, 0) AS `count_dislikes`, - `project`.`count_comments` AS `count_comments`, - `project`.`count_downloads_hive` AS `count_downloads_hive`, - `project`.`source_id` AS `source_id`, - `project`.`source_pk` AS `source_pk`, - `project`.`source_type` AS `source_type`, - `project`.`validated` AS `project_validated`, - `project`.`uuid` AS `project_uuid`, - `project`.`status` AS `project_status`, - `project`.`created_at` AS `project_created_at`, - `project`.`changed_at` AS `project_changed_at`, - IFNULL(`stat_rating_project`.`score`, 50) AS `laplace_score_old`, - IFNULL(`stat_rating_project`.`score_with_pling`, 500) AS `laplace_score`, - `member`.`type` AS `member_type`, - `member`.`member_id` AS `project_member_id`, - `member`.`username` AS `username`, - `member`.`profile_image_url` AS `profile_image_url`, - `member`.`city` AS `city`, - `member`.`country` AS `country`, - `member`.`created_at` AS `member_created_at`, - `member`.`paypal_mail` AS `paypal_mail`, - `project_category`.`title` AS `cat_title`, - `project_category`.`xdg_type` AS `cat_xdg_type`, - `project_category`.`name_legacy` AS `cat_name_legacy`, - `project_category`.`show_description` AS `cat_show_description`, - `stat_plings`.`amount_received` AS `amount_received`, - `stat_plings`.`count_plings` AS `count_plings`, - `stat_plings`.`count_plingers` AS `count_plingers`, - `stat_plings`.`latest_pling` AS `latest_pling`, - `trp`.`amount_reports` AS `amount_reports`, - `tppt`.`package_type_id_list` AS `package_types`, - `tppt`.`package_name_list` AS `package_names`, - `t`.`tag_names` AS `tags`, - `t`.`tag_ids` AS `tag_ids`, - `sdqy`.amount AS count_downloads_quarter, - `project_license`.title AS project_license_title - FROM - `project` - JOIN `member` ON `member`.`member_id` = `project`.`member_id` - JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id` - LEFT JOIN `stat_plings` ON `stat_plings`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_reported_projects` AS trp ON `trp`.`project_id` = `project`.`project_id` - LEFT JOIN `tmp_project_package_types` AS tppt ON tppt.project_id = `project`.project_id - LEFT JOIN `tmp_project_tags` AS t ON t.`tag_project_id` = project.`project_id` - LEFT JOIN `stat_downloads_quarter_year` AS sdqy ON sdqy.project_id = project.project_id - LEFT JOIN `project_license` ON project_license.project_license_id = project.project_license_id - LEFT JOIN `stat_rating_project` ON stat_rating_project.project_id = project.project_id - - WHERE - `member`.`is_deleted` = 0 - AND `member`.`is_active` = 1 - AND (`project`.`type_id` = 1 OR `project`.`type_id` = 3) - AND `project`.`status` = 100 - AND `project_category`.`is_active` = 1 - ; - - RENAME TABLE stat_projects TO old_stat_projects, tmp_stat_projects TO stat_projects; + RENAME TABLE `stat_projects` TO `old_stat_projects`, `tmp_stat_projects` TO `stat_projects`; - DROP TABLE IF EXISTS old_stat_projects; - END$$ + DROP TABLE IF EXISTS `old_stat_projects`; +END$$ DELIMITER ; diff --git a/sql_code/20190514_score.sql b/sql_code/20190514_score.sql new file mode 100644 index 000000000..515c652e4 --- /dev/null +++ b/sql_code/20190514_score.sql @@ -0,0 +1,2 @@ +update project_rating set score = round(((user_like-6)*8+(user_dislike-6)*3+2*5)/(user_like+user_dislike+2-12),2) + where user_like >=6 and user_dislike>=6 ; \ No newline at end of file diff --git a/sql_code/20190515_media_views.sql b/sql_code/20190515_media_views.sql index 45a4ae715..d354bf98e 100644 --- a/sql_code/20190515_media_views.sql +++ b/sql_code/20190515_media_views.sql @@ -1,44 +1,52 @@ -CREATE TABLE `media_views` ( - `media_view_id` BIGINT(20) NOT NULL, - `media_view_type_id` INT(1) NOT NULL, - `project_id` INT(11) NOT NULL, - `collection_id` INT(11) NOT NULL, - `file_id` INT(11) NOT NULL, - `member_id` INT(11) NULL DEFAULT NULL, - `referer` VARCHAR(255) NULL DEFAULT NULL, - `start_timestamp` DATETIME NULL DEFAULT NULL, - `stop_timestamp` DATETIME NULL DEFAULT NULL, - `ip` VARCHAR(39) NULL DEFAULT NULL, - `source` VARCHAR(39) NULL DEFAULT NULL, - PRIMARY KEY (`media_view_id`) + + +CREATE TABLE `media_views` +( + `media_view_id` BIGINT(20) NOT NULL, + `media_view_type_id` INT(1) NOT NULL, + `project_id` INT(11) NOT NULL, + `collection_id` INT(11) NOT NULL, + `file_id` INT(11) NOT NULL, + `member_id` INT(11) NULL DEFAULT NULL, + `referer` VARCHAR(255) NULL DEFAULT NULL, + `start_timestamp` DATETIME NULL DEFAULT NULL, + `stop_timestamp` DATETIME NULL DEFAULT NULL, + `ip` VARCHAR(39) NULL DEFAULT NULL, + `source` VARCHAR(39) NULL DEFAULT NULL, + PRIMARY KEY (`media_view_id`) ) -COLLATE='utf8_general_ci' -ENGINE=InnoDB + COLLATE = 'utf8_general_ci' + ENGINE = InnoDB ; ALTER TABLE `media_views` - ADD INDEX `idx_file` (`collection_id`, `file_id`), - ADD INDEX `idx_media_type` (`media_view_type_id`); + ADD INDEX `idx_file` (`collection_id`, `file_id`), + ADD INDEX `idx_media_type` (`media_view_type_id`); -CREATE TABLE `media_view_type` ( - `media_view_type_id` INT(1) NOT NULL, - `name` VARCHAR(35) NULL DEFAULT NULL, - `full_name` VARCHAR(255) NULL DEFAULT NULL, - `description` VARCHAR(255) NULL DEFAULT NULL, - PRIMARY KEY (`media_view_type_id`) +CREATE TABLE `media_view_type` +( + `media_view_type_id` INT(1) NOT NULL, + `name` VARCHAR(35) NULL DEFAULT NULL, + `full_name` VARCHAR(255) NULL DEFAULT NULL, + `description` VARCHAR(255) NULL DEFAULT NULL, + PRIMARY KEY (`media_view_type_id`) ) -COLLATE='utf8_general_ci' -ENGINE=InnoDB + COLLATE = 'utf8_general_ci' + ENGINE = InnoDB ; -INSERT INTO media_view_type (media_view_type_id,NAME,full_name,description) VALUES (1,'video','Video','Video'); -INSERT INTO media_view_type (media_view_type_id,NAME,full_name,description) VALUES (2,'music','Music','Music'); -INSERT INTO media_view_type (media_view_type_id,NAME,full_name,description) VALUES (3,'book','Book','Book'); +INSERT INTO `media_view_type` (`media_view_type_id`, `NAME`, `full_name`, `description`) +VALUES (1, 'video', 'Video', 'Video'); +INSERT INTO `media_view_type` (`media_view_type_id`, `NAME`, `full_name`, `description`) +VALUES (2, 'music', 'Music', 'Music'); +INSERT INTO `media_view_type` (`media_view_type_id`, `NAME`, `full_name`, `description`) +VALUES (3, 'book', 'Book', 'Book'); -SELECT * FROM media_views m -JOIN media_view_type mp ON mp.media_view_type_id = m.media_view_type_id +SELECT * +FROM `media_views` `m` + JOIN `media_view_type` `mp` ON `mp`.`media_view_type_id` = `m`.`media_view_type_id` ; diff --git a/sql_code/20190516_solr_query_import_updates.sql b/sql_code/20190516_solr_query_import_updates.sql index 37d9de0db..f116e01b3 100644 --- a/sql_code/20190516_solr_query_import_updates.sql +++ b/sql_code/20190516_solr_query_import_updates.sql @@ -1,255 +1,306 @@ + + DELIMITER $$ -drop PROCEDURE solr_query_fullimport_prepare; -CREATE PROCEDURE `solr_query_fullimport_prepare`() +DROP PROCEDURE IF EXISTS `solr_query_fullimport_prepare`; +CREATE PROCEDURE `solr_query_fullimport_prepare`() BEGIN - - - DROP TABLE IF EXISTS tmp_solr_cat_tree; - CREATE TEMPORARY TABLE tmp_solr_cat_tree - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; - - DROP TABLE IF EXISTS tmp_solr_cat_store; - CREATE TEMPORARY TABLE tmp_solr_cat_store - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_solr_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; - - DROP TABLE IF EXISTS tmp_solr_project_tags; - CREATE TEMPORARY TABLE tmp_solr_project_tags - (PRIMARY KEY `primary` (tag_project_id) ) - AS - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - , tgo.tag_object_id AS tag_project_id - FROM tag_object AS tgo - JOIN tag ON tag.tag_id = tgo.tag_id - WHERE tgo.tag_type_id = 1 and tgo.tag_group_id in (5,6) and tgo.is_deleted = 0 - GROUP BY tgo.tag_object_id; - - DROP TABLE IF EXISTS tmp_solr_project_license; - CREATE TEMPORARY TABLE tmp_solr_project_license - (PRIMARY KEY `primary` (license_project_id)) + + DROP TABLE IF EXISTS `tmp_solr_cat_tree`; + CREATE TEMPORARY TABLE `tmp_solr_cat_tree` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; + + DROP TABLE IF EXISTS `tmp_solr_cat_store`; + CREATE TEMPORARY TABLE `tmp_solr_cat_store` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_solr_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_tags`; + CREATE TEMPORARY TABLE `tmp_solr_project_tags` + ( + PRIMARY KEY `primary` (`tag_project_id`) + ) + AS + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + , `tgo`.`tag_object_id` AS `tag_project_id` + FROM `tag_object` AS `tgo` + JOIN `tag` ON `tag`.`tag_id` = `tgo`.`tag_id` + WHERE `tgo`.`tag_type_id` = 1 + AND `tgo`.`tag_group_id` IN (5, 6) + AND `tgo`.`is_deleted` = 0 + GROUP BY `tgo`.`tag_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_license`; + CREATE TEMPORARY TABLE `tmp_solr_project_license` + ( + PRIMARY KEY `primary` (`license_project_id`) + ) ENGINE MyISAM - AS - SELECT - t.tag_object_id as license_project_id, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `license_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - WHERE t.tag_type_id = 1 and t.tag_group_id = 7 AND t.is_deleted = 0 - group by tag_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_project_package_types; - CREATE TEMPORARY TABLE tmp_solr_project_package_types - (PRIMARY KEY `primary` (package_project_id)) - ENGINE MyISAM - AS - SELECT - t.tag_parent_object_id as package_project_id, - GROUP_CONCAT(DISTINCT ta.tag_id) AS package_type_id_list, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `package_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - JOIN ppload.ppload_files files ON files.id = t.tag_object_id AND files.active = 1 - WHERE t.tag_type_id = 3 and t.tag_group_id = 8 AND t.is_deleted = 0 - group by tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_project_arch_types; - CREATE TEMPORARY TABLE tmp_solr_project_arch_types - (PRIMARY KEY `primary` (arch_project_id)) - ENGINE MyISAM - AS - SELECT - t.tag_parent_object_id as arch_project_id, - GROUP_CONCAT(DISTINCT ta.tag_id) AS arch_type_id_list, - GROUP_CONCAT(DISTINCT ta.tag_name) AS `arch_name_list` - FROM tag_object t - INNER JOIN tag ta on ta.tag_id = t.tag_id - JOIN ppload.ppload_files files ON files.id = t.tag_object_id AND files.active = 1 - WHERE t.tag_type_id = 3 and t.tag_group_id = 9 AND t.is_deleted = 0 - group by tag_parent_object_id - ; - - DROP TABLE IF EXISTS tmp_solr_query_fullimport; - create table tmp_solr_query_fullimport as - - SELECT - project.project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - IFNULL(r.likes, 0) AS count_likes, - IFNULL(r.dislikes, 0) AS count_dislikes, - IFNULL(r.score_with_pling, 500) AS laplace_score, - DATE_FORMAT(project.created_at, '%Y-%m-%dT%TZ') AS created_at, - DATE_FORMAT(project.changed_at, '%Y-%m-%dT%TZ') AS changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - sppt.package_name_list AS `package_names`, - appt.arch_name_list AS `arch_names`, - c.license_name_list AS `license_names`, - t.tag_names AS `tags` - FROM project - JOIN member ON member.member_id = project.member_id - LEFT JOIN tmp_solr_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - LEFT JOIN tmp_solr_project_package_types AS sppt ON sppt.package_project_id = project.project_id - LEFT JOIN tmp_solr_project_arch_types AS appt ON appt.arch_project_id = project.project_id - LEFT JOIN tmp_solr_project_license AS c ON c.license_project_id = project.project_id - LEFT JOIN tmp_solr_project_tags AS t ON t.tag_project_id = project.project_id - LEFT JOIN stat_rating_project r ON r.project_id = project.project_id - WHERE project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND tcs.`is_active` = 1; - + AS + SELECT `t`.`tag_object_id` AS `license_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `license_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + WHERE `t`.`tag_type_id` = 1 + AND `t`.`tag_group_id` = 7 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_object_id`; -END$$ -DELIMITER ; + DROP TABLE IF EXISTS `tmp_solr_project_package_types`; + CREATE TEMPORARY TABLE `tmp_solr_project_package_types` + ( + PRIMARY KEY `primary` (`package_project_id`) + ) + ENGINE MyISAM + AS + SELECT `t`.`tag_parent_object_id` AS `package_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_id`) AS `package_type_id_list`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `package_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `t`.`tag_object_id` AND `files`.`active` = 1 + WHERE `t`.`tag_type_id` = 3 + AND `t`.`tag_group_id` = 8 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_parent_object_id`; + + DROP TABLE IF EXISTS `tmp_solr_project_arch_types`; + CREATE TEMPORARY TABLE `tmp_solr_project_arch_types` + ( + PRIMARY KEY `primary` (`arch_project_id`) + ) + ENGINE MyISAM + AS + SELECT `t`.`tag_parent_object_id` AS `arch_project_id`, + GROUP_CONCAT(DISTINCT `ta`.`tag_id`) AS `arch_type_id_list`, + GROUP_CONCAT(DISTINCT `ta`.`tag_name`) AS `arch_name_list` + FROM `tag_object` `t` + INNER JOIN `tag` `ta` ON `ta`.`tag_id` = `t`.`tag_id` + JOIN `ppload`.`ppload_files` `files` ON `files`.`id` = `t`.`tag_object_id` AND `files`.`active` = 1 + WHERE `t`.`tag_type_id` = 3 + AND `t`.`tag_group_id` = 9 + AND `t`.`is_deleted` = 0 + GROUP BY `tag_parent_object_id`; + DROP TABLE IF EXISTS `tmp_solr_query_fullimport`; + CREATE TABLE `tmp_solr_query_fullimport` AS + SELECT `project`.`project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + IFNULL(`r`.`likes`, 0) AS `count_likes`, + IFNULL(`r`.`dislikes`, 0) AS `count_dislikes`, + IFNULL(`r`.`score_with_pling`, 500) AS `laplace_score`, + DATE_FORMAT(`project`.`created_at`, '%Y-%m-%dT%TZ') AS `created_at`, + DATE_FORMAT(`project`.`changed_at`, '%Y-%m-%dT%TZ') AS `changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + `sppt`.`package_name_list` AS `package_names`, + `appt`.`arch_name_list` AS `arch_names`, + `c`.`license_name_list` AS `license_names`, + `t`.`tag_names` AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + LEFT JOIN `tmp_solr_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + LEFT JOIN `tmp_solr_project_package_types` AS `sppt` + ON `sppt`.`package_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_arch_types` AS `appt` ON `appt`.`arch_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_license` AS `c` ON `c`.`license_project_id` = `project`.`project_id` + LEFT JOIN `tmp_solr_project_tags` AS `t` ON `t`.`tag_project_id` = `project`.`project_id` + LEFT JOIN `stat_rating_project` `r` ON `r`.`project_id` = `project`.`project_id` + WHERE `project`.`status` = 100 + AND `project`.`type_id` = 1 + AND `member`.`is_active` = 1 + AND `tcs`.`is_active` = 1; + + +END$$ +DELIMITER ; DELIMITER $$ -drop PROCEDURE solr_query_delta_import_new; -CREATE PROCEDURE `solr_query_delta_import_new`(IN projectID INT(11)) +DROP PROCEDURE `solr_query_delta_import_new`; +CREATE PROCEDURE `solr_query_delta_import_new`(IN `projectID` INT(11)) BEGIN - DROP TABLE IF EXISTS tmp_cat_tree; - CREATE TEMPORARY TABLE tmp_cat_tree - (PRIMARY KEY `primary` (project_category_id) ) - AS - SELECT - pc.project_category_id, - pc.title, - pc.is_active, - count(pc.lft) AS depth, - GROUP_CONCAT(pc2.project_category_id ORDER BY pc2.lft) AS ancestor_id_path, - GROUP_CONCAT(pc2.title ORDER BY pc2.lft SEPARATOR ' | ') AS ancestor_path - FROM project_category AS pc, project_category AS pc2 - WHERE (pc.lft BETWEEN pc2.lft AND pc2.rgt) - GROUP BY pc.lft - ORDER BY pc.lft; - - DROP TABLE IF EXISTS tmp_solr_cat_store; - CREATE TEMPORARY TABLE tmp_solr_cat_store - (PRIMARY KEY `primary` (project_category_id) ) + DROP TABLE IF EXISTS `tmp_cat_tree`; + CREATE TEMPORARY TABLE `tmp_cat_tree` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) + AS + SELECT `pc`.`project_category_id`, + `pc`.`title`, + `pc`.`is_active`, + count(`pc`.`lft`) AS `depth`, + GROUP_CONCAT(`pc2`.`project_category_id` ORDER BY `pc2`.`lft`) AS `ancestor_id_path`, + GROUP_CONCAT(`pc2`.`title` ORDER BY `pc2`.`lft` SEPARATOR ' | ') AS `ancestor_path` + FROM `project_category` AS `pc`, + `project_category` AS `pc2` + WHERE (`pc`.`lft` BETWEEN `pc2`.`lft` AND `pc2`.`rgt`) + GROUP BY `pc`.`lft` + ORDER BY `pc`.`lft`; + + DROP TABLE IF EXISTS `tmp_solr_cat_store`; + CREATE TEMPORARY TABLE `tmp_solr_cat_store` + ( + PRIMARY KEY `primary` (`project_category_id`) + ) AS - SELECT - tct.project_category_id, - tct.ancestor_id_path, - tct.title, - tct.is_active, - group_concat(store_id) AS stores - FROM tmp_cat_tree AS tct, config_store_category AS csc - WHERE FIND_IN_SET(csc.project_category_id, tct.ancestor_id_path) > 0 - GROUP BY tct.project_category_id - ORDER BY tct.project_category_id; - - SELECT - project.project_id, - project.member_id AS project_member_id, - project.project_category_id AS project_category_id, - project.title AS project_title, - description, - image_small, - member.username, - member.firstname, - member.lastname, - tcs.title AS cat_title, - IFNULL(r.likes, 0) AS count_likes, - IFNULL(r.dislikes, 0) AS count_dislikes, - IFNULL(r.score_with_pling, 500) AS laplace_score, - DATE_FORMAT(project.created_at, '%Y-%m-%dT%TZ') AS created_at, - DATE_FORMAT(project.changed_at, '%Y-%m-%dT%TZ') AS changed_at, - tcs.stores, - tcs.ancestor_id_path AS `cat_id_ancestor_path`, - ( - - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag , ppload.ppload_files files - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 8 and tag_object.tag_type_id = 3 and tag_object.is_deleted = 0 and tag_object.tag_parent_object_id = project.project_id - and tag_object.tag_object_id = files.id and files.active = 1 - ) as package_names , - ( - - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag , ppload.ppload_files files - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 9 and tag_object.tag_type_id = 3 and tag_object.is_deleted = 0 and tag_object.tag_parent_object_id = project.project_id - and tag_object.tag_object_id = files.id and files.active = 1 - ) as arch_names, - ( - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id = 7 and tag_object.tag_type_id = 1 and tag_object.is_deleted = 0 and tag_object.tag_object_id = project.project_id - ) as license_names, - ( - SELECT GROUP_CONCAT(tag.tag_name) AS tag_names - FROM tag_object , tag - WHERE tag.tag_id = tag_object.tag_id and tag_object.tag_group_id in (5,6) and tag_object.tag_type_id = 1 and tag_object.is_deleted = 0 and tag_object.tag_object_id = project.project_id - ) as tags - FROM project - JOIN member ON member.member_id = project.member_id - LEFT JOIN tmp_solr_cat_store AS tcs ON project.project_category_id = tcs.project_category_id - LEFT JOIN stat_rating_project r ON r.project_id = project.project_id - WHERE project.project_id = projectID and project.status=100 and member.`is_active` = 1; - + SELECT `tct`.`project_category_id`, + `tct`.`ancestor_id_path`, + `tct`.`title`, + `tct`.`is_active`, + group_concat(`store_id`) AS `stores` + FROM `tmp_cat_tree` AS `tct`, + `config_store_category` AS `csc` + WHERE FIND_IN_SET(`csc`.`project_category_id`, `tct`.`ancestor_id_path`) > 0 + GROUP BY `tct`.`project_category_id` + ORDER BY `tct`.`project_category_id`; + + SELECT `project`.`project_id`, + `project`.`member_id` AS `project_member_id`, + `project`.`project_category_id` AS `project_category_id`, + `project`.`title` AS `project_title`, + `description`, + `image_small`, + `member`.`username`, + `member`.`firstname`, + `member`.`lastname`, + `tcs`.`title` AS `cat_title`, + IFNULL(`r`.`likes`, 0) AS `count_likes`, + IFNULL(`r`.`dislikes`, 0) AS `count_dislikes`, + IFNULL(`r`.`score_with_pling`, 500) AS `laplace_score`, + DATE_FORMAT(`project`.`created_at`, '%Y-%m-%dT%TZ') AS `created_at`, + DATE_FORMAT(`project`.`changed_at`, '%Y-%m-%dT%TZ') AS `changed_at`, + `tcs`.`stores`, + `tcs`.`ancestor_id_path` AS `cat_id_ancestor_path`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag`, + `ppload`.`ppload_files` `files` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 8 + AND `tag_object`.`tag_type_id` = 3 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_parent_object_id` = `project`.`project_id` + AND `tag_object`.`tag_object_id` = `files`.`id` + AND `files`.`active` = 1 + ) AS `package_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag`, + `ppload`.`ppload_files` `files` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 9 + AND `tag_object`.`tag_type_id` = 3 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_parent_object_id` = `project`.`project_id` + AND `tag_object`.`tag_object_id` = `files`.`id` + AND `files`.`active` = 1 + ) AS `arch_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` = 7 + AND `tag_object`.`tag_type_id` = 1 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_object_id` = `project`.`project_id` + ) AS `license_names`, + ( + SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` + FROM `tag_object`, + `tag` + WHERE `tag`.`tag_id` = `tag_object`.`tag_id` + AND `tag_object`.`tag_group_id` IN (5, 6) + AND `tag_object`.`tag_type_id` = 1 + AND `tag_object`.`is_deleted` = 0 + AND `tag_object`.`tag_object_id` = `project`.`project_id` + ) AS `tags` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + LEFT JOIN `tmp_solr_cat_store` AS `tcs` ON `project`.`project_category_id` = `tcs`.`project_category_id` + LEFT JOIN `stat_rating_project` `r` ON `r`.`project_id` = `project`.`project_id` + WHERE `project`.`project_id` = `projectID` + AND `project`.`status` = 100 + AND `member`.`is_active` = 1; + END$$ DELIMITER ; - DELIMITER $$ -drop procedure solr_query_delta_new; -CREATE PROCEDURE `solr_query_delta_new`(IN lastIndexed varchar(255)) +DROP PROCEDURE `solr_query_delta_new`; +CREATE PROCEDURE `solr_query_delta_new`(IN `lastIndexed` varchar(255)) BEGIN - select distinct project_id - from - ( - SELECT project_id - FROM project - JOIN member ON member.member_id = project.member_id - WHERE (project.`status` = 100 AND project.`type_id` = 1 AND member.`is_active` = 1 AND project.changed_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) ) - union - select distinct tag_object_id as project_id - from tag_object - where tag_type_id = 1 and (tag_created > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) or tag_changed > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) ) - union select distinct tag_parent_object_id as project_id - from tag_object - where tag_type_id in (8,9) and (tag_created > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) or tag_changed > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) ) - union - select project_id - from project - JOIN ppload.ppload_files files ON project.ppload_collection_id= files.collection_id AND files.updated_timestamp > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) - group by project_id - union - select project_id from project_rating where created_at > timestamp(DATE_SUB(lastIndexed, INTERVAL 1 DAY)) - group by project_id - ) t ; + SELECT DISTINCT `project_id` + FROM ( + SELECT `project_id` + FROM `project` + JOIN `member` ON `member`.`member_id` = `project`.`member_id` + WHERE (`project`.`status` = 100 AND `project`.`type_id` = 1 AND `member`.`is_active` = 1 AND + `project`.`changed_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY))) + UNION + SELECT DISTINCT `tag_object_id` AS `project_id` + FROM `tag_object` + WHERE `tag_type_id` = 1 + AND (`tag_created` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) OR + `tag_changed` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY))) + UNION + SELECT DISTINCT `tag_parent_object_id` AS `project_id` + FROM `tag_object` + WHERE `tag_type_id` IN (8, 9) + AND (`tag_created` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) OR + `tag_changed` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY))) + UNION + SELECT `project_id` + FROM `project` + JOIN `ppload`.`ppload_files` `files` + ON `project`.`ppload_collection_id` = `files`.`collection_id` AND + `files`.`updated_timestamp` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) + GROUP BY `project_id` + UNION + SELECT `project_id` + FROM `project_rating` + WHERE `created_at` > timestamp(DATE_SUB(`lastIndexed`, INTERVAL 1 DAY)) + GROUP BY `project_id` + ) `t`; END$$ DELIMITER ; \ No newline at end of file diff --git a/sql_code/20190605_dl_unique.sql b/sql_code/20190605_dl_unique.sql index b7dfea218..c80f7363f 100644 --- a/sql_code/20190605_dl_unique.sql +++ b/sql_code/20190605_dl_unique.sql @@ -1,117 +1,131 @@ +USE ppload; + +CREATE TABLE ppload.stat_ppload_files_downloaded_nounique +(INDEX `idx_coll` (`collection_id`),INDEX `idx_file` (`file_id`)) + ENGINE MyISAM + AS + SELECT f.owner_id, f.collection_id, f.file_id, COUNT(1) AS count_dl FROM ppload.ppload_files_downloaded f + WHERE f.downloaded_timestamp < '2019-06-01 00:00:00' + GROUP BY f.collection_id, f.file_id +; + DROP TABLE IF EXISTS ppload.tmp_stat_ppload_files_downloaded_nounique; CREATE TABLE ppload.tmp_stat_ppload_files_downloaded_nounique (INDEX `idx_coll` (`collection_id`),INDEX `idx_file` (`file_id`)) ENGINE MyISAM AS SELECT f.owner_id, f.collection_id, f.file_id, COUNT(1) AS count_dl FROM ppload.ppload_files_downloaded f WHERE f.downloaded_timestamp < '2019-06-01 00:00:00' GROUP BY f.collection_id, f.file_id ; RENAME TABLE ppload.stat_ppload_files_downloaded_nounique TO ppload.old_stat_ppload_files_downloaded_nounique; RENAME TABLE ppload.tmp_stat_ppload_files_downloaded_nounique TO ppload.stat_ppload_files_downloaded_nounique; DROP TABLE IF EXISTS ppload.old_stat_ppload_files_downloaded_nounique; CREATE TABLE ppload_files_downloaded_unique LIKE ppload_files_downloaded; ALTER TABLE `ppload_files_downloaded_unique` ADD UNIQUE INDEX `uk` (`collection_id`, `file_id`, `downloaded_ip`); INSERT IGNORE INTO ppload.ppload_files_downloaded_unique SELECT MAX(f.id) as id, MAX(f.client_id) AS client_id, f.owner_id, f.collection_id, f.file_id,MAX(f.user_id) AS user_id, MIN(f.referer) AS referer, MIN(f.downloaded_timestamp) AS downloaded_timestamp, f.downloaded_ip FROM ppload.ppload_files_downloaded f WHERE f.downloaded_timestamp >= '2019-05-01 00:00:00' GROUP BY f.collection_id, f.file_id, f.downloaded_ip ; -DROP VIEW stat_member_dl_curent_month; -CREATE VIEW stat_member_dl_curent_month AS -select date_format(now(),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`,count(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((count(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`,(case when ((select count(1) AS `sum_plings` from `project_plings` `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) > 0) then ((select count(1) AS `sum_plings` from `project_plings` `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) + 1) else 1 end) AS `num_plings`,(case when isnull(`tag`.`tag_item_id`) then 1 else 0 end) AS `is_license_missing`,(case when (((`c`.`source_required` = 1) and (`p`.`source_url` is not null) and (length(`p`.`source_url`) > 0)) or (`c`.`source_required` = 0)) then 0 else 1 end) AS `is_source_missing`,`p`.`pling_excluded` AS `is_pling_excluded`,`m`.`pling_excluded` AS `is_member_pling_excluded`,NULL AS `created_at`,NULL AS `updated_at` from ((((`ppload`.`ppload_files_downloaded_unique` `d` join `member` `m` on(((`m`.`member_id` = `d`.`owner_id`) and (`m`.`is_active` = 1)))) join `tmp_project_for_member_dl_plings` `p` on((`p`.`ppload_collection_id` = `d`.`collection_id`))) join `project_category` `c` on((`c`.`project_category_id` = `p`.`project_category_id`))) left join `tag_object` `tag` on(((`tag`.`tag_type_id` = 1) and (`tag`.`tag_group_id` = 7) and (`tag`.`tag_object_id` = `p`.`project_id`)))) where (`d`.`downloaded_timestamp` >= concat(left(now(),7),'-01 00:00:00')) group by `d`.`owner_id`,`p`.`project_id` +DROP VIEW pling.stat_member_dl_curent_month; +CREATE VIEW pling.stat_member_dl_curent_month AS +select date_format(now(),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`,count(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((count(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`,(case when ((select count(1) AS `sum_plings` FROM pling.project_plings `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) > 0) then ((select count(1) AS `sum_plings` from pling.project_plings `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) + 1) else 1 end) AS `num_plings`,(case when isnull(`tag`.`tag_item_id`) then 1 else 0 end) AS `is_license_missing`,(case when (((`c`.`source_required` = 1) and (`p`.`source_url` is not null) and (length(`p`.`source_url`) > 0)) or (`c`.`source_required` = 0)) then 0 else 1 end) AS `is_source_missing`,`p`.`pling_excluded` AS `is_pling_excluded`,`m`.`pling_excluded` AS `is_member_pling_excluded`,NULL AS `created_at`,NULL AS `updated_at` from ((((`ppload`.`ppload_files_downloaded_unique` `d` join pling.member `m` on(((`m`.`member_id` = `d`.`owner_id`) and (`m`.`is_active` = 1)))) join pling.tmp_project_for_member_dl_plings `p` on((`p`.`ppload_collection_id` = `d`.`collection_id`))) join pling.project_category `c` on((`c`.`project_category_id` = `p`.`project_category_id`))) left join pling.tag_object `tag` on(((`tag`.`tag_type_id` = 1) and (`tag`.`tag_group_id` = 7) and (`tag`.`tag_object_id` = `p`.`project_id`)))) where (`d`.`downloaded_timestamp` >= concat(left(now(),7),'-01 00:00:00')) group by `d`.`owner_id`,`p`.`project_id` ; -DROP VIEW stat_member_dl_last_month; -CREATe VIEW stat_member_dl_last_month AS +DROP VIEW pling.stat_member_dl_last_month; +CREATe VIEW pling.stat_member_dl_last_month AS select date_format((now() - interval 1 month),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`,count(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((count(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`,(case when ((select count(1) AS `sum_plings` from `pling`.`project_plings` `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) > 0) then ((select count(1) AS `sum_plings` from `pling`.`project_plings` `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) + 1) else 1 end) AS `num_plings`,(case when isnull(`tag`.`tag_item_id`) then 1 else 0 end) AS `is_license_missing`,(case when (((`c`.`source_required` = 1) and (`p`.`source_url` is not null) and (length(`p`.`source_url`) > 0)) or (`c`.`source_required` = 0)) then 0 else 1 end) AS `is_source_missing`,`p`.`pling_excluded` AS `is_pling_excluded`,`m`.`pling_excluded` AS `is_member_pling_excluded`,NULL AS `created_at`,NULL AS `updated_at` from ((((`ppload`.`ppload_files_downloaded_unique` `d` join `pling`.`member` `m` on(((`m`.`member_id` = `d`.`owner_id`) and (`m`.`is_active` = 1)))) join `pling`.`project` `p` on(((cast(`p`.`ppload_collection_id` as unsigned) = `d`.`collection_id`) and (`p`.`status` = 100)))) join `pling`.`project_category` `c` on((`c`.`project_category_id` = `p`.`project_category_id`))) left join `pling`.`tag_object` `tag` on(((`tag`.`tag_type_id` = 1) and (`tag`.`tag_group_id` = 7) and (`tag`.`tag_object_id` = `p`.`project_id`)))) where ((`d`.`downloaded_timestamp` >= concat(left((now() - interval 1 month),7),'-01 00:00:00')) and (`d`.`downloaded_timestamp` <= concat(left(now(),7),'-01 00:00:00')) and (`p`.`ppload_collection_id` is not null) and (length(`p`.`ppload_collection_id`) > 0) and (not((`p`.`ppload_collection_id` like '!%')))) group by `d`.`owner_id`,`p`.`project_id` ; -DROP VIEW stat_member_dl_curent_month_nouk; -CREATE VIEW stat_member_dl_curent_month_nouk AS -select date_format(now(),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`,count(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((count(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`,(case when ((select count(1) AS `sum_plings` from `project_plings` `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) > 0) then ((select count(1) AS `sum_plings` from `project_plings` `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) + 1) else 1 end) AS `num_plings`,(case when isnull(`tag`.`tag_item_id`) then 1 else 0 end) AS `is_license_missing`,(case when (((`c`.`source_required` = 1) and (`p`.`source_url` is not null) and (length(`p`.`source_url`) > 0)) or (`c`.`source_required` = 0)) then 0 else 1 end) AS `is_source_missing`,`p`.`pling_excluded` AS `is_pling_excluded`,`m`.`pling_excluded` AS `is_member_pling_excluded`,NULL AS `created_at`,NULL AS `updated_at` from ((((`ppload`.`ppload_files_downloaded` `d` join `member` `m` on(((`m`.`member_id` = `d`.`owner_id`) and (`m`.`is_active` = 1)))) join `tmp_project_for_member_dl_plings` `p` on((`p`.`ppload_collection_id` = `d`.`collection_id`))) join `project_category` `c` on((`c`.`project_category_id` = `p`.`project_category_id`))) left join `tag_object` `tag` on(((`tag`.`tag_type_id` = 1) and (`tag`.`tag_group_id` = 7) and (`tag`.`tag_object_id` = `p`.`project_id`)))) +DROP VIEW pling.stat_member_dl_curent_month_nouk; +CREATE VIEW pling.stat_member_dl_curent_month_nouk AS +select date_format(now(),'%Y%m') AS `yearmonth`,`p`.`project_id` AS `project_id`,`p`.`project_category_id` AS `project_category_id`,`d`.`owner_id` AS `member_id`,`m`.`mail` AS `mail`,`m`.`paypal_mail` AS `paypal_mail`,count(`d`.`id`) AS `num_downloads`,`c`.`dl_pling_factor` AS `dl_pling_factor`,((count(`d`.`id`) * `c`.`dl_pling_factor`) / 100) AS `amount`,(case when ((select count(1) AS `sum_plings` from pling.project_plings `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) > 0) then ((select count(1) AS `sum_plings` from pling.project_plings `pp` where ((`pp`.`project_id` = `p`.`project_id`) and (`pp`.`is_deleted` = 0) and (`pp`.`is_active` = 1)) group by `pp`.`project_id`) + 1) else 1 end) AS `num_plings`,(case when isnull(`tag`.`tag_item_id`) then 1 else 0 end) AS `is_license_missing`,(case when (((`c`.`source_required` = 1) and (`p`.`source_url` is not null) and (length(`p`.`source_url`) > 0)) or (`c`.`source_required` = 0)) then 0 else 1 end) AS `is_source_missing`,`p`.`pling_excluded` AS `is_pling_excluded`,`m`.`pling_excluded` AS `is_member_pling_excluded`,NULL AS `created_at`,NULL AS `updated_at` from ((((`ppload`.`ppload_files_downloaded` `d` join pling.member `m` on(((`m`.`member_id` = `d`.`owner_id`) and (`m`.`is_active` = 1)))) join pling.tmp_project_for_member_dl_plings `p` on((`p`.`ppload_collection_id` = `d`.`collection_id`))) join pling.project_category `c` on((`c`.`project_category_id` = `p`.`project_category_id`))) left join pling.tag_object `tag` on(((`tag`.`tag_type_id` = 1) and (`tag`.`tag_group_id` = 7) and (`tag`.`tag_object_id` = `p`.`project_id`)))) WHERE ( `d`.`downloaded_timestamp` >= concat(left(now(),7),'-01 00:00:00') ) group by `d`.`owner_id`,`p`.`project_id` ; -CREATE TABLE member_dl_plings_nouk LIKE member_dl_plings; - -INSERT LOW_PRIORITY INTO member_dl_plings_nouk -(SELECT * FROM stat_member_dl_curent_month_nouk); +CREATE TABLE pling.member_dl_plings_nouk LIKE pling.member_dl_plings; +INSERT LOW_PRIORITY INTO pling.member_dl_plings_nouk +(SELECT * FROM pling.stat_member_dl_curent_month_nouk); +USE pling; +DROP EVENT `e_update_member_dl_plings_current_month`; +DELIMITER $$ CREATE EVENT `e_update_member_dl_plings_current_month` ON SCHEDULE EVERY 1 DAY STARTS '2018-06-07 01:00:00' ON COMPLETION NOT PRESERVE ENABLE COMMENT '' DO BEGIN #Generate tmp table for active projects DROP TABLE IF EXISTS tmp_project_for_member_dl_plings; CREATE TABLE tmp_project_for_member_dl_plings AS select * from project p where p.ppload_collection_id is not null and p.type_id = 1 and p.`status` = 100; #ppload_collection_id from char to int ALTER TABLE `tmp_project_for_member_dl_plings` CHANGE COLUMN `ppload_collection_id` `ppload_collection_id` INT NULL DEFAULT NULL COLLATE 'utf8_general_ci' AFTER `embed_code`; #add index ALTER TABLE `tmp_project_for_member_dl_plings` ADD INDEX `idx_ppload` (`ppload_collection_id`); ALTER TABLE `tmp_project_for_member_dl_plings` ADD INDEX `idx_pk` (`project_id`); #fill tmp member_dl_plings table DROP TABLE IF EXISTS tmp_member_dl_plings; CREATE TABLE tmp_member_dl_plings LIKE member_dl_plings; INSERT INTO tmp_member_dl_plings (SELECT * FROM stat_member_dl_curent_month); #delete plings from actual month DELETE FROM member_dl_plings WHERE yearmonth = (DATE_FORMAT(NOW(),'%Y%m')); #insert ping for this month from tmp member_dl_plings table INSERT INTO member_dl_plings (SELECT * FROM tmp_member_dl_plings); #remove tmp member_dl_plings table DROP TABLE tmp_member_dl_plings; #fill tmp member_dl_plings_nouk table DROP TABLE IF EXISTS tmp_member_dl_plings_nouk; CREATE TABLE tmp_member_dl_plings_nouk LIKE member_dl_plings_nouk; INSERT INTO tmp_member_dl_plings_nouk (SELECT * FROM stat_member_dl_curent_month_nouk); #delete plings from actual month DELETE FROM member_dl_plings_nouk WHERE yearmonth = (DATE_FORMAT(NOW(),'%Y%m')); #insert ping for this month from tmp member_dl_plings table INSERT INTO member_dl_plings_nouk (SELECT * FROM tmp_member_dl_plings_nouk); #remove tmp member_dl_plings table DROP TABLE tmp_member_dl_plings_nouk; -END +END$$ +DELIMITER ; diff --git a/sql_code/20190607_add_fields_to_config_store.sql b/sql_code/20190607_add_fields_to_config_store.sql index ddc65f35f..244750dbc 100644 --- a/sql_code/20190607_add_fields_to_config_store.sql +++ b/sql_code/20190607_add_fields_to_config_store.sql @@ -1,6 +1,9 @@ +USE pling; + + ALTER TABLE `config_store` ADD COLUMN `is_show_in_menu` INT(1) NULL DEFAULT '0' AFTER `is_show_forum_news`; ALTER TABLE `config_store` ADD COLUMN `is_show_real_domain_as_url` INT(1) NULL DEFAULT '0' AFTER `is_show_in_menu`;