HEX
Server: LiteSpeed
System: Linux s3604.bom1.stableserver.net 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User: dmstechonline (1480)
PHP: 7.4.33
Disabled: NONE
Upload Files
File: /home/dmstechonline/whatsapp.dmstech.online/modules/IntelliReply/Controllers/DocumentController.php
<?php

namespace Modules\IntelliReply\Controllers;

use App\Http\Controllers\Controller as BaseController;
use App\Models\Organization;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Modules\IntelliReply\Models\Document;
use Modules\IntelliReply\Requests\StoreDocuments;
use OpenAI;
use Smalot\PdfParser\Parser as PdfParser;
use PhpOffice\PhpWord\IOFactory as WordIOFactory;

class DocumentController extends BaseController
{
    public function store(StoreDocuments $request)
    {
        $organizationId = session()->get('current_organization');
        $organizationConfig = Organization::where('id', $organizationId)->first();
        $organizationConfig = $organizationConfig ? json_decode($organizationConfig->metadata, true) : [];

        $file = $request->file('file');
        $extension = $file->getClientOriginalExtension();

        try{
            // Extract text content based on file type
            if ($extension == 'txt') {
                $content = file_get_contents($file->getPathname());
            } elseif ($extension == 'pdf') {
                $parser = new PdfParser();
                $pdf = $parser->parseFile($file->getPathname());
                $content = $pdf->getText();
            } elseif (in_array($extension, ['doc', 'docx'])) {
                $phpWord = WordIOFactory::load($file->getPathname());
                $content = $this->extractTextFromWord($phpWord);
            } else {
                return redirect()->back()->withErrors(['file' => 'Unsupported file type.']);
            }

            DB::transaction(function () use ($organizationConfig, $organizationId, $request, $content) {
                $api_key = $organizationConfig['ai']['api_key'];
                $client = OpenAI::client($api_key);

                $document = new Document();
                $document->organization_id = $organizationId;
                $document->source = 'File';
                $document->title = $request->input('title');
                $document->content = $content;
                $document->status = 'Pending';
                $document->save();

                // Generate embeddings
                $chunks = $this->splitDocument($content);

                $embeddings = [];
                foreach ($chunks as $chunk) {
                    $response = $client->embeddings()->create([
                        'input' => $chunk,
                        'model' => 'text-embedding-ada-002'
                    ]);
                    $embeddings[] = $response->embeddings[0]->embedding;
                }

                $document->embeddings = json_encode($embeddings);
                $document->status = 'Complete';
                $document->save();
            });

            return redirect()->back()->with(
                'status', [
                    'type' => 'success', 
                    'message' => __('Document uploaded successfully!'),
                ]
            );
        } catch (\Exception $e) {
            return redirect()->back()->with(
                'status', [
                    'type' => 'error', 
                    'message' => $e->getMessage(),
                ]
            );
        }  
    }

    public function update(Request $request, $uuid){
        
    }

    public function delete($uuid){
        $query = Document::where('uuid', $uuid)->delete();

        return Redirect::back()->with(
            'status', [
                'type' => 'success', 
                'message' => __('Row deleted successfully!')
            ]
        );
    }

    private function extractTextFromWord($phpWord)
    {
        $content = '';
        foreach ($phpWord->getSections() as $section) {
            foreach ($section->getElements() as $element) {
                if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) {
                    foreach ($element->getElements() as $textElement) {
                        if (method_exists($textElement, 'getText')) {
                            $content .= $textElement->getText() . " ";
                        }
                    }
                } elseif ($element instanceof \PhpOffice\PhpWord\Element\Text) {
                    $content .= $element->getText() . " ";
                } elseif ($element instanceof \PhpOffice\PhpWord\Element\Table) {
                    foreach ($element->getRows() as $row) {
                        foreach ($row->getCells() as $cell) {
                            foreach ($cell->getElements() as $cellElement) {
                                if (method_exists($cellElement, 'getText')) {
                                    $content .= $cellElement->getText() . " ";
                                }
                            }
                        }
                    }
                } else {
                    // Handle other element types as needed or skip
                    continue;
                }
            }
        }
        return $content;
    }

    private function splitDocument($content)
    {
        // Split the document into chunks (e.g., paragraphs)
        return explode("\n\n", $content); // Adjust splitting logic as needed
    }
}