Skip to content
DocumentManagement.php 7.63 KiB
Newer Older
<?php

/**
 * This file is part of ILIAS, a powerful learning management system
 * published by ILIAS open source e-Learning e.V.
 *
 * ILIAS is licensed with the GPL-3.0,
 * see https://www.gnu.org/licenses/gpl-3.0.en.html
 * You should have received a copy of said license along with the
 * source code, too.
 *
 * If this is not the case or you just want to try ILIAS, you'll find
 * us at:
 * https://www.ilias.de
 * https://github.com/ILIAS-eLearning
 *
 *********************************************************************/

declare(strict_types=1);

namespace ILIAS\Plugin\PlagScanExercise\PlagScan;

use ilDBConstants;
use ilDBStatement;
use ilExAssignment;
use ilExSubmission;
use ilObject;
use ilSetting;
Ingmar Szmais's avatar
Ingmar Szmais committed
use PlagScan\Helper\Documents;

class DocumentManagement
{
    public static function getDocumentStatus(int $user_id, int $assignment_id): string
    {
        global $DIC;

        $result = $DIC->database()->queryF(
            'SELECT * FROM psx_submissions WHERE assignment_id = %s AND user_id = %s',
            [ilDBConstants::T_INTEGER, ilDBConstants::T_INTEGER],
            [$assignment_id, $user_id]
        );
        if ($DIC->database()->numRows($result) === 0) {
            return 'no_submission';
        }

        $row = $DIC->database()->fetchAssoc($result);
        return $row['plagscan_status'] ?: 'not_checked';
    }

    public static function handInDocumentAsText(int $user_id, int $assignment_id, string $text): void
    {
        global $DIC;

        $document = new Document();
        $document->getByUserAssignment($user_id, $assignment_id);
        $settings = new ilSetting('psx');
        $documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));

        if ($document->getPlagscanStatus() === '') {
            $response = $documents->add($text, true);
            $document->setPlagscanId((int) $response['docID']);
            $document->setPlagscanStatus('not_checked');
            $document->setAssignmentExcObj(ilObject::_lookupObjectId((int) $DIC->http()->request()->getQueryParams()['ref_id']));
            $document->setUserNonConsent(false);
            $document->setSubmissionIliasId(0);
            $document->setShareLink('');
        }
    }

    public static function handInDocumentAsFile(int $user_id, int $assignment_id): void
    {
        global $DIC;

        $document = new Document();
        $document->getByUserAssignment($user_id, $assignment_id);
        $settings = new ilSetting('psx');
        $documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));

        if ($document->getPlagscanStatus() === '') {
            $ex_submission = new ilExSubmission(new ilExAssignment($assignment_id), $user_id);
            $files = $ex_submission->getFiles();
            $file_info = end($files);
            $response = $documents->add($file_info['filename'], false);
            $document->setPlagscanId((int) $response['docID']);
            $document->setPlagscanStatus('not_checked');
            $document->setAssignmentExcObj(ilObject::_lookupObjectId((int) $DIC->http()->request()->getQueryParams()['ref_id']));
            $document->setUserNonConsent(false);
            $document->setSubmissionIliasId(0);
            $document->setShareLink('');
        }
    }

    public static function handInAllDocumentAsFile($assignment_id): void
    {
        $ex_assignment = new ilExAssignment($assignment_id);
        $participants = ilExSubmission::getAssignmentParticipants($ex_assignment->getExerciseId(), $ex_assignment->getId());
        foreach($participants as $participant) {
            self::handInDocumentAsFile((int) $participant, $assignment_id);
        }
    }


    public static function checkAllDocuments(): void
    {
        global $DIC;

        $result = $DIC->database()->queryF(
Ingmar Szmais's avatar
Ingmar Szmais committed
            'SELECT * FROM psx_submissions WHERE plagscan_status = %s',
            [ilDBConstants::T_TEXT],
        self::checkDocuments($result);
    }

    public static function checkAllDocumentsForAssignment($assignment_id)
    {
        global $DIC;

        $result = $DIC->database()->queryF(
            'SELECT * FROM psx_submissions WHERE plagscan_status = %s AND assignment_id = %s',
            [ilDBConstants::T_TEXT, ilDBConstants::T_INTEGER],
            ['not_checked', $assignment_id]
        );

        self::checkDocuments($result);
    }
    private static function checkDocuments(ilDBStatement $result): void
    {
        global $DIC;
        $psx_assignment_persistence = new AssignmentConfigPersistence($DIC->database());
        while ($row = $DIC->database()->fetchAssoc($result)) {
            $id = (int) $row['plagscan_id'];
            $psx_assignment = $psx_assignment_persistence->getByAssignmentId((int) $row['assignment_id']);
            $assignment = new ilExAssignment((int) $row['assignment_id']);
            if ($id !== 0) {
                if (
                    ($assignment->afterDeadline() && $psx_assignment->getStartCheck() === 'automatic') ||
                    $psx_assignment->getStartCheck() === 'immediate'
                ) {
                    self::checkDocument($id);
                }
            }
        }
    }

    public static function updateAllDocuments(): void
    {
        global $DIC;

        $result = $DIC->database()->queryF(
            'SELECT * FROM psx_submissions WHERE plagscan_status = %s',
            [ilDBConstants::T_TEXT],
            ['in_progress']
        );

        while ($row = $DIC->database()->fetchAssoc($result)) {
            self::updateDocumentStatus((int) $row['plagscan_id']);
        }
    }

    public static function checkDocument(int $document_id): void
    {
        global $DIC;

        $logger = $DIC->logger()->root();
        $logger->info('PSX: Manual checking requested for docID ' . $document_id);
        $document = new Document();
        $document->getByPlagScanId($document_id);
        if ($document->getPlagscanStatus() === 'not_checked') {
            $settings = new ilSetting('psx');
            $documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));
            $documents->check($document_id);
            $logger->info('PSX: Manual check-call complete, storing document status');
            $document->setPlagscanStatus('in_progress');
            $document->store();
            $logger->info('PSX: Document ' . $document_id . ' stored as in_progress');
        } else {
            $logger->info('PSX: Document not uploaded, already in_progress or finished');
        }
    }

    public static function updateDocumentStatus(int $document_id): void
    {
        global $DIC;

        $logger = $DIC->logger()->root();
        $document = new Document();
        $document->getByPlagScanId($document_id);
        if ($document->getPlagscanStatus() === 'in_progress') {
            $settings = new ilSetting('psx');
            $documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));
            $document_status = $documents->getStatus($document_id);
            if (isset($document_status['state']) && $document_status['state'] === '3') {
                $documents->share($document_id);
                $document_link = $documents->getShareLink($document_id);
                $document_report = $documents->retrieveReport($document_id, 4);
                $document->setPlagscanStatus('plagLevel_' . $document_report['plagLevel']);
                $document->setShareLink($document_link['shareLink']);
                $document->store();
                $logger->info('PSX: updateDocumentStatus - stored document ' . $document_id);
            }
        }
    }
}