Add OnlyOfficeTemplates module
This commit is contained in:
78
modules/OnlyOfficeTemplates/actions/OnlyOfficeCallback.php
Normal file
78
modules/OnlyOfficeTemplates/actions/OnlyOfficeCallback.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?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]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user