/ src / controllers / components / ResourceComponent.php
<?php
/**
 * SeekQuarry/Yioop --
 * Open Source Pure PHP Search Engine, Crawler, and Indexer
 *
 * Copyright (C) 2009 - 2026  Chris Pollett chris@pollett.org
 *
 * LICENSE:
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * END LICENSE
 *
 * @author Chris Pollett chris@pollett.org
 * @license https://www.gnu.org/licenses/ GPL3
 * @link https://www.seekquarry.com/
 * @copyright 2009 - 2026
 * @filesource
 */
namespace seekquarry\yioop\controllers\components;

use seekquarry\yioop as B;
use seekquarry\yioop\configs as C;
use seekquarry\yioop\library as L;
use seekquarry\yioop\library\mail as ML;
use seekquarry\yioop\models\MailAccountModel;
use seekquarry\yioop\models\SigninModel;
use seekquarry\yioop\library\CrawlConstants;
use seekquarry\yioop\library\mail\MailScheduledDispatcher;
use seekquarry\yioop\library\mail\MailHeaderParser;
use seekquarry\yioop\library\mail\MailSiteFactory;
use seekquarry\yioop\library\mail\SmtpClient;
use seekquarry\yioop\library\UrlParser;
use seekquarry\yioop\library\wiki\WikiParser;
use seekquarry\yioop\library\FetchUrl;
use seekquarry\yioop\library\language_processing\PhraseParser;
use seekquarry\yioop\library\processors\ImageProcessor;
use seekquarry\yioop\library\mail\ImapEnvelopeParser;
use seekquarry\yioop\library\mail\ImapListing;
use seekquarry\yioop\library\mail\ImapFolderListParser;
use seekquarry\yioop\library\mail\ImapResponseParser;
use seekquarry\yioop\library\mail\MimeMessage;
use seekquarry\yioop\library\mail\MailComposeBuilder;
use seekquarry\yioop\views\elements\MailElement;
use seekquarry\yioop\library\media_jobs as LMJ;
use seekquarry\yioop\library\version_control as LVC;
use seekquarry\yioop\library\wiki as LW;
/**
 * ResourceComponent handles the files a group keeps beside its wiki
 * pages: a picture, a document, a sound file, anything a writer
 * uploads.
 *
 * It takes an uploaded file and puts it in the folder that page keeps
 * its files in. It makes a small picture of a file where one can be
 * made, so a list of files can show what each one is. It serves a file
 * back to a reader, and copies or moves one from one page to another.
 *
 * This component extends SocialComponent, the base every component
 * about a group extends. The base holds what more than one of them
 * needs, so no component calls another.
 *
 * @author Chris Pollett
 */
class ResourceComponent extends SocialComponent
{

    /**
     * isStaticFolderPage whether a page's settings say it is served as a static
     * HTML folder. This lets a controller know, before it does anything that
     * would send the reader elsewhere, that what was asked for is a file of a
     * folder and has to be answered where it was asked for.
     * @param array $head the page's settings as saved with it
     * @return bool whether the page is a static HTML folder
     */
    public function isStaticFolderPage($head)
    {
        $settings = $this->staticFolderSettings($head);
        return !empty($settings['static_html_folder']);
    }
    /**
     * deleteClip takes one post off the clipboard.
     *
     * groupFeeds calls it for the deleteclip argument, so each thing
     * a reader can do to a feed is read on its own rather than
     * inside one long switch.
     *
     * @param array $data what the page will show, added to here
     * @param int $user_id which reader is asking
     * @return mixed what is handed back to the browser, or
     *     nothing where the page is drawn as usual
     */
    public function deleteClip(&$data, $user_id)
    {
        $parent = $this->parent;
        $group_model = $parent->model("group");
        $wiki_model = $parent->model("wiki");
        $feed_model = $parent->model("feed");
        $clipboard_id = $feed_model->getFeedClipboardId($user_id);
        $clip_group_id = $group_model->getPersonalGroupId($user_id);
        $post_id = $parent->clean($_REQUEST['post_id'], "int");
        $group_item = $feed_model->getGroupItem($post_id);
        if (empty($group_item)) {
            return $parent->redirectWithMessage(
                tl('social_component_invalid_message_id'));
        }
        if ($group_item) {
            // this method checks if user can delete post
            $success =
                $feed_model->deleteGroupItem($post_id, $user_id);
        }
        if ($success) {
            $wiki_model->deleteResources($clip_group_id,
                "post" . $post_id);
            return $parent->redirectWithMessage(
                tl('social_component_clip_item_deleted'));
        }
        return $parent->redirectWithMessage(
            tl('social_component_not_clip_item_deleted'));
    }
    /**
     * emptyClip takes every post off the clipboard.
     *
     * groupFeeds calls it for the emptyclip argument, so each thing
     * a reader can do to a feed is read on its own rather than
     * inside one long switch.
     *
     * @param array $data what the page will show, added to here
     * @param int $user_id which reader is asking
     * @return mixed what is handed back to the browser, or
     *     nothing where the page is drawn as usual
     */
    public function emptyClip(&$data, $user_id)
    {
        $parent = $this->parent;
        $group_model = $parent->model("group");
        $wiki_model = $parent->model("wiki");
        $feed_model = $parent->model("feed");
        $clipboard_id = $feed_model->getFeedClipboardId($user_id);
        $clip_group_id = $group_model->getPersonalGroupId($user_id);
        $clip_search_array = [
            ["parent_id", "=", $clipboard_id, ""]];
        $clip_items = $feed_model->getGroupItems(0,
            C\MAX_THREAD_CLIPBOARD_ITEMS, $clip_search_array,
            $user_id, -2);
        foreach ($clip_items as $clip_item) {
            if ($clip_item['DESCRIPTION'] == 'start_feed_clip') {
                continue;
            }
            $success = $feed_model->deleteGroupItem(
                $clip_item['ID'], $user_id);
            if ($success) {
                $wiki_model->deleteResources($clip_group_id,
                    "post" . $clip_item['ID']);
            }
        }
        return $parent->redirectWithMessage(
            tl('social_component_clipboard_emptied'));
    }
}
X