]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/profilesettings.php
generate an etag for shownotice
[quix0rs-gnu-social.git] / actions / profilesettings.php
index 0474c693751509e135609866e23eae1516aeea4b..81e589c6e01649e108d5300ddadc2358bde2b06f 100644 (file)
@@ -35,6 +35,8 @@ class ProfilesettingsAction extends SettingsAction {
                $this->show_avatar_form();
                common_element('h2', NULL, _('Change password'));
                $this->show_password_form();
+               common_element('h2', NULL, _('Delete my account'));
+               $this->show_delete_form();
                common_show_footer();
        }
 
@@ -54,7 +56,10 @@ class ProfilesettingsAction extends SettingsAction {
                        $this->upload_avatar();
                } else if ($this->arg('changepass')) {
                        $this->change_password();
+               } else if ($this->arg('deleteaccount')) {
+                       $this->delete_account();
                }
+
        }
 
        function show_settings_form() {
@@ -67,10 +72,9 @@ class ProfilesettingsAction extends SettingsAction {
                                                                                   'action' =>
                                                                                   common_local_url('profilesettings')));
                common_hidden('token', common_session_token());
-
-
-
+               
                # too much common patterns here... abstractable?
+               
                common_input('nickname', _('Nickname'),
                                         ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
                                         _('1-64 lowercase letters or numbers, no punctuation or spaces'));
@@ -85,6 +89,9 @@ class ProfilesettingsAction extends SettingsAction {
                common_input('location', _('Location'),
                                         ($this->arg('location')) ? $this->arg('location') : $profile->location,
                                         _('Where you are, like "City, State (or Region), Country"'));
+               common_input('tags', _('Tags'),
+                                        ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
+                                        _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
 
                $language = common_language();
                common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
@@ -110,6 +117,12 @@ class ProfilesettingsAction extends SettingsAction {
                $user = common_current_user();
                $profile = $user->getProfile();
 
+               if (!$profile) {
+                       common_log_db_error($user, 'SELECT', __FILE__);
+                       $this->server_error(_('User without matching profile'));
+                       return;
+               }
+               
                $original = $profile->getOriginalAvatar();
 
 
@@ -179,6 +192,75 @@ class ProfilesettingsAction extends SettingsAction {
                common_element_end('form');
        }
 
+
+       function show_feeds_list($feeds) {
+               common_element_start('div', array('class' => 'feedsdel'));
+               common_element('p', null, 'Feeds:');
+               common_element_start('ul', array('class' => 'xoxo'));
+
+               foreach ($feeds as $key => $value) {
+                       $this->common_feed_item($feeds[$key]);
+               }
+               common_element_end('ul');
+               common_element_end('div');
+       }
+
+       function common_feed_item($feed) {
+        $user = common_current_user();
+               $nickname = $user->nickname;
+
+               switch($feed['item']) {
+                       case 'notices': default:
+                               $feed_classname = $feed['type'];
+                               $feed_mimetype = "application/".$feed['type']."+xml";
+                               $feed_title = "$nickname's ".$feed['version']." notice feed";
+                               $feed['textContent'] = "RSS";
+                               break;
+
+                       case 'foaf':
+                               $feed_classname = "foaf";
+                               $feed_mimetype = "application/".$feed['type']."+xml";
+                               $feed_title = "$nickname's FOAF file";
+                               $feed['textContent'] = "FOAF";
+                               break;
+               }
+               common_element_start('li');
+               common_element('a', array('href' => $feed['href'],
+                                                                 'class' => $feed_classname,
+                                                                 'type' => $feed_mimetype,
+                                                                 'title' => $feed_title),
+                                                       $feed['textContent']);
+               common_element_end('li');
+       }
+
+       function show_delete_form() {
+               $user = common_current_user();
+        $notices = DB_DataObject::factory('notice');
+        $notices->profile_id = $user->id;
+        $notice_count = (int) $notices->count();
+
+               common_element_start('form', array('method' => 'POST',
+                                                                                  'id' => 'delete',
+                                                                                  'action' =>
+                                                                                  common_local_url('profilesettings')));
+
+               common_hidden('token', common_session_token());
+        common_element('p', null, "You can copy your notices and contacts by saving the two links belowxbefore deleting your account. Be careful, this operation cannot be undone.");
+
+
+               $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)), 
+                                                                                         'type' => 'rss',
+                                                                                         'version' => 'RSS 1.0',
+                                                                                         'item' => 'notices'),
+                                                                        1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+                                                                                         'type' => 'rdf',
+                                                                                         'version' => 'FOAF',
+                                                                                         'item' => 'foaf')));
+
+               common_submit('deleteaccount', _('Delete my account'));
+               common_element_end('form');
+       }
+
        function save_profile() {
                $nickname = $this->trimmed('nickname');
                $fullname = $this->trimmed('fullname');
@@ -188,7 +270,8 @@ class ProfilesettingsAction extends SettingsAction {
                $autosubscribe = $this->boolean('autosubscribe');
                $language = $this->trimmed('language');
                $timezone = $this->trimmed('timezone');
-
+               $tagstring = $this->trimmed('tags');
+               
                # Some validation
 
                if (!Validate::string($nickname, array('min_length' => 1,
@@ -218,10 +301,24 @@ class ProfilesettingsAction extends SettingsAction {
                } else if ($this->nickname_exists($nickname)) {
                        $this->show_form(_('Nickname already in use. Try another one.'));
                        return;
-                } else if (!is_null($language) && strlen($language) > 50) {
-                        $this->show_form(_('Language is too long (max 50 chars).'));
+        } else if (!is_null($language) && strlen($language) > 50) {
+               $this->show_form(_('Language is too long (max 50 chars).'));
+                       return;
                }
 
+               if ($tagstring) {
+                       $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
+               } else {
+                       $tags = array();
+               }
+                       
+               foreach ($tags as $tag) {
+                       if (!common_valid_profile_tag($tag)) {
+                               $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
+                               return;
+                       }
+               }
+               
                $user = common_current_user();
 
                $user->query('BEGIN');
@@ -294,6 +391,15 @@ class ProfilesettingsAction extends SettingsAction {
                        return;
                }
 
+               # Set the user tags
+               
+               $result = $user->setSelfTags($tags);
+
+               if (!$result) {
+                       common_server_error(_('Couldn\'t save tags.'));
+                       return;
+               }
+               
                $user->query('COMMIT');
 
                common_broadcast_profile($profile);
@@ -402,4 +508,23 @@ class ProfilesettingsAction extends SettingsAction {
                $this->show_form(_('Password saved.'), true);
        }
 
+       function delete_account() {
+
+               $user = common_current_user();
+               assert(!is_null($user)); # should already be checked
+
+        // delete avatar (profile_id and filename)
+        // delete fave (user_id)
+        // delete message (from_profile, to_profile)
+        // delete notice (profile_id) (also delete from notice_source and notice_tag)
+        // delete notice_inbox (user_id)
+        // delete subscription (subscriber, subscribed)
+        // delete user (id)
+        // delete user_openid (user_id)
+        // delete profile (id)
+        // delete tags tables (to verify)
+        // delete all the users notices
+
+               $this->show_form(_('Your account has been deleted.'), true);
+    }
 }