Files
crm.clientright.ru/modules/OnlyOfficeTemplates/actions/OnlyOfficeCallback.php
2026-02-16 09:27:19 +03:00

79 lines
3.1 KiB
PHP

<?php
/**
* OnlyOffice Document Server callback: receive saved document and store in S3.
* Expects JSON body: status, key, url (when status 2,3,6,7). Returns {"error":0}.
*/
class OnlyOfficeTemplates_OnlyOfficeCallback_Action extends Vtiger_Action_Controller
{
public function checkPermission(Vtiger_Request $request)
{
// Callback is called by Document Server, not by user. We validate by key matching template.
}
public function process(Vtiger_Request $request)
{
header('Content-Type: application/json; charset=utf-8');
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!$data || !isset($data['key']) || !isset($data['status'])) {
echo json_encode(['error' => 1, 'message' => 'Invalid callback body']);
return;
}
$key = $data['key'];
$status = (int)$data['status'];
$templateId = (int)$key;
if ($templateId <= 0) {
echo json_encode(['error' => 0]);
return;
}
if (!in_array($status, [2, 3, 6, 7], true)) {
echo json_encode(['error' => 0]);
return;
}
$url = isset($data['url']) ? trim($data['url']) : '';
if ($url === '') {
echo json_encode(['error' => 0]);
return;
}
$fileType = isset($data['filetype']) ? strtolower(trim($data['filetype'])) : 'docx';
if ($fileType !== 'docx') {
$fileType = 'docx';
}
require_once dirname(__DIR__) . '/config.php';
require_once dirname(__DIR__) . '/resources/S3Helper.php';
$config = OnlyOfficeTemplates_getConfig();
$adb = PearDatabase::getInstance();
$res = $adb->pquery("SELECT id, file_name FROM vtiger_oot_templates WHERE id = ?", [$templateId]);
$row = $adb->fetchByAssoc($res);
if (!$row) {
echo json_encode(['error' => 0]);
return;
}
$fileName = $row['file_name'] ?: ('template_' . $templateId . '.' . $fileType);
if (pathinfo($fileName, PATHINFO_EXTENSION) !== $fileType) {
$fileName = pathinfo($fileName, PATHINFO_FILENAME) . '.' . $fileType;
}
$s3 = new OnlyOfficeTemplates_S3Helper($config);
$s3Key = $s3->getTemplateKey($templateId, $fileName);
$tmpFile = tempnam(sys_get_temp_dir(), 'oot_callback_') . '.' . $fileType;
try {
$ctx = stream_context_create(['http' => ['timeout' => 30]]);
$content = @file_get_contents($url, false, $ctx);
if ($content === false || strlen($content) === 0) {
echo json_encode(['error' => 1, 'message' => 'Failed to download document']);
return;
}
file_put_contents($tmpFile, $content);
$s3->uploadFile($tmpFile, $s3Key, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
$adb->pquery("UPDATE vtiger_oot_templates SET s3_key = ?, file_name = ? WHERE id = ?", [$s3Key, $fileName, $templateId]);
} finally {
@unlink($tmpFile);
}
echo json_encode(['error' => 0]);
}
}