New settings panel & &subscription

This commit is contained in:
2020-04-05 18:56:42 +02:00
parent 7a03fa94ab
commit 13a9155634
20 changed files with 887 additions and 241 deletions

View File

@@ -21,6 +21,8 @@ class Spot extends Main
const FEED_CHUNK_SIZE = 15;
const DEFAULT_LANG = 'en';
/**
* Active Project
* @var Project
@@ -33,18 +35,27 @@ class Spot extends Main
*/
private $oMedia;
/**
* User
* @var User
*/
private $oUser;
public function __construct($oClassManagement, $sProcessPage, $sTimezone)
{
$asClasses = array(
array('name'=>'feed', 'project'=>true),
array('name'=>'project', 'project'=>true),
array('name'=>'media', 'project'=>true),
array('name'=>'converter', 'project'=>true)
array('name'=>'converter', 'project'=>true),
array('name'=>'user', 'project'=>true)
);
parent::__construct($oClassManagement, $sProcessPage, $asClasses, true, __FILE__, $sTimezone);
$this->oUser = new User($this->oDb);
$this->oClassManagement->incClass('translator');
$this->oLang = new Translator('', 'en');
$this->oLang = new Translator($this->oUser->getLang(), self::DEFAULT_LANG);
$this->oProject = new Project($this->oDb);
$this->oMedia = new Media($this->oDb, $this->oProject);
@@ -60,16 +71,17 @@ class Spot extends Main
{
return array
(
'tables' => array
'tables' => array
(
Feed::MSG_TABLE => array('ref_msg_id', Db::getId(Feed::FEED_TABLE), 'type', 'latitude', 'longitude', 'iso_time', 'site_time', 'unix_time', 'content', 'battery_state'),
Feed::FEED_TABLE => array('ref_feed_id', Db::getId(Feed::SPOT_TABLE), Db::getId(Project::PROJ_TABLE), 'name', 'description', 'status', 'last_update'),
Feed::SPOT_TABLE => array('ref_spot_id', 'name', 'model'),
Project::PROJ_TABLE => array('name', 'codename', 'active_from', 'active_to', 'timezone'),
self::POST_TABLE => array(Db::getId(Project::PROJ_TABLE), 'name', 'content', 'site_time'),
Media::MEDIA_TABLE => array(Db::getId(Project::PROJ_TABLE), 'filename', 'type', 'taken_on', 'posted_on', 'rotate', 'comment')
self::POST_TABLE => array(Db::getId(Project::PROJ_TABLE), Db::getId(User::USER_TABLE), 'name', 'content', 'site_time'),
Media::MEDIA_TABLE => array(Db::getId(Project::PROJ_TABLE), 'filename', 'type', 'taken_on', 'posted_on', 'rotate', 'comment'),
User::USER_TABLE => array('name', 'email', 'language', 'active')
),
'types' => array
'types' => array
(
'ref_msg_id' => "INT",
'type' => "VARCHAR(20)",
@@ -95,19 +107,23 @@ class Spot extends Main
'taken_on' => "TIMESTAMP DEFAULT 0",
'posted_on' => "TIMESTAMP DEFAULT 0",
'rotate' => "SMALLINT",
'comment' => "LONGTEXT"
'comment' => "LONGTEXT",
'email' => "VARCHAR(320)",
'language' => "VARCHAR(2)",
'active' => "BOOLEAN"
),
'constraints' => array
'constraints' => array
(
Feed::MSG_TABLE => array("UNIQUE KEY `uni_ref_msg_id` (`ref_msg_id`)", "INDEX(`ref_msg_id`)"),
Feed::FEED_TABLE => array("UNIQUE KEY `uni_ref_feed_id` (`ref_feed_id`)", "INDEX(`ref_feed_id`)"),
Feed::SPOT_TABLE => array("UNIQUE KEY `uni_ref_spot_id` (`ref_spot_id`)", "INDEX(`ref_spot_id`)"),
Project::PROJ_TABLE => "UNIQUE KEY `uni_proj_name` (`codename`)",
Media::MEDIA_TABLE => "UNIQUE KEY `uni_file_name` (`filename`)"
Media::MEDIA_TABLE => "UNIQUE KEY `uni_file_name` (`filename`)",
User::USER_TABLE => "UNIQUE KEY `uni_email` (`email`)"
),
'cascading_delete' => array
'cascading_delete' => array
(
Feed::SPOT_TABLE=>array(Feed::MSG_TABLE)
Feed::SPOT_TABLE => array(Feed::MSG_TABLE)
)
);
}
@@ -119,7 +135,8 @@ class Spot extends Main
'vars' => array(
'chunk_size' => self::FEED_CHUNK_SIZE,
'default_project_codename' => $this->oProject->getProjectCodeName(),
'projects' => $this->oProject->getProjects()
'projects' => $this->oProject->getProjects(),
'user' => $this->oUser->getUserInfo()
),
'consts' => array(
'geo_server' => Settings::GEO_SERVER,
@@ -155,7 +172,7 @@ class Spot extends Main
public function getMarkers()
{
$asMessages = $this->getSpotMessages();
$bSuccess = !empty($asMessages);
$bSuccess = !empty($this->getMedias('posted_on') + $asMessages + $this->getPosts());
$sDesc = $bSuccess?'':self::NO_DATA;
//Add medias
@@ -183,6 +200,35 @@ class Spot extends Main
return self::getJsonResult($bSuccess, $sDesc, $asMessages);
}
public function subscribe($sEmail) {
$asResult = $this->oUser->addUser($sEmail, $this->oLang->getLanguage());
//Send Confirmation Email
if($asResult['result']) {
$this->oClassManagement->incClass('email', true);
$oConfEmail = new Email($this->asContext['serv_name'],'email_confirmation');
$oConfEmail->setDestInfo($this->oUser->getUserInfo());
$oConfEmail->send();
}
return self::getJsonResult($asResult['result'], $asResult['desc'], $asResult['data']);
}
public function unsubscribe() {
$asResult = $this->oUser->removeUser();
return self::getJsonResult($asResult['result'], $asResult['desc'], $asResult['data']);
}
public function unsubscribeFromEmail($iUserId) {
$this->oUser->setUserId($iUserId);
$this->oLang->setLanguage($this->oUser->getLang(), self::DEFAULT_LANG);
$asResult = $this->oUser->removeUser();
$sDesc = $asResult['desc'];
if($sDesc=='') $sDesc = $this->oLang->getTranslation('nl_unsubscribed');
return $sDesc;
}
private function getSpotMessages()
{
$asMessages = array();
@@ -192,20 +238,22 @@ class Spot extends Main
foreach($asFeeds as $iFeedId) {
$oFeed = new Feed($this->oDb, $iFeedId);
$asMessages = $oFeed->getMessages($this->oProject->getActivePeriod());
foreach($asMessages as $iIndex=>&$asMessage)
foreach($asMessages as &$asMessage)
{
$asMessage['latitude'] = floatval($asMessage['latitude']);
$asMessage['longitude'] = floatval($asMessage['longitude']);
$asMessage['lat_dms'] = self::decToDms($asMessage['latitude'], 'lat');
$asMessage['lon_dms'] = self::decToDms($asMessage['longitude'], 'lon');
$asMessage['displayed_id'] = $iIndex + 1;
$this->addTimeStamp($asMessage, $asMessage['unix_time']);
}
}
usort($asMessages, function($a, $b){return $a['unix_time'] > $b['unix_time'];});
return $asMessages;
$asSortedMessages = array_values($asMessages);
foreach($asSortedMessages as $iIndex=>&$asSortedMessage) $asSortedMessage['displayed_id'] = $iIndex + 1;
return $asSortedMessages;
}
/**
@@ -219,20 +267,23 @@ class Spot extends Main
{
$asMedias = $this->oMedia->getMediasInfo();
$asValidMedias = array();
foreach($asMedias as $iIndex=>$asMedia) {
foreach($asMedias as $asMedia) {
$sTimeRef = $asMedia[$sTimeRefField];
if($sTimeRef >= $this->oProject->getActivePeriod('from') && $sTimeRef <= $this->oProject->getActivePeriod('to')) {
$asMedia['taken_on_formatted'] = $this->getTimeFormat(strtotime($asMedia['taken_on']));
$asMedia['posted_on_formatted'] = $this->getTimeFormat(strtotime($asMedia['posted_on']));
$asMedia['displayed_id'] = $iIndex + 1;
$this->addTimeStamp($asMedia, strtotime($sTimeRef));
$asValidMedias[] = $asMedia;
}
}
usort($asValidMedias, function($a, $b){return $a['unix_time'] > $b['unix_time'];});
return $asValidMedias;
$asSortedMedias = array_values($asValidMedias);
foreach($asSortedMedias as $iIndex=>&$asSortedMedia) $asSortedMedia['displayed_id'] = $iIndex + 1;
return $asSortedMedias;
}
private function getPosts()
@@ -251,6 +302,7 @@ class Spot extends Main
foreach($asPosts as &$asPost) {
$iUnixTimeStamp = strtotime($asPost['site_time']); //assumes site timezone (Settings::TIMEZONE)
$asPost['formatted_name'] = Toolbox::mb_ucwords($asPost['name']);
unset($asPost[Db::getId(User::USER_TABLE)]);
$this->addTimeStamp($asPost, $iUnixTimeStamp);
}
@@ -314,12 +366,16 @@ class Spot extends Main
public function addPost($sName, $sPost)
{
$asData = array(
Db::getId(Project::PROJ_TABLE) => $this->oProject->getProjectId(),
Db::getId(Project::PROJ_TABLE) => $this->oProject->getProjectId(),
Db::getId(User::USER_TABLE) => $this->oUser->getUserId(),
'name' => mb_strtolower(trim($sName)),
'content' => trim($sPost),
'site_time' => date(Db::TIMESTAMP_FORMAT) //site time (Settings::TIMEZONE)
);
$iPostId = $this->oDb->insertRow(self::POST_TABLE, $asData);
$this->oUser->updateNickname($sName);
return self::getJsonResult(($iPostId > 0), '');
}
@@ -342,7 +398,7 @@ class Spot extends Main
return self::getJsonResult(true, '', array(
'project' => $this->oProject->getProjects(),
'feed' => $oFeed->getFeeds(),
'spot' => $oFeed->getSpots()
'spot' => $oFeed->getSpots()
));
}