79 lines
3.1 KiB
PHP
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]);
|
|
}
|
|
}
|