File size: 4,658 Bytes
ff3fc75
fde8374
7230c8c
27f34ba
0ea130d
57896de
5d2a27a
3da121b
884a60b
dbfff3c
9e0fa9c
0ea130d
 
 
 
 
 
bca9901
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27f34ba
aa9a7c9
ddfa90b
 
 
27f34ba
5f014d7
27f34ba
5f014d7
 
ddfa90b
24f7b24
7230c8c
5d2a27a
dbfff3c
 
27f34ba
dbfff3c
 
 
 
7230c8c
efa22ad
53be93f
 
27f34ba
efa22ad
5d2a27a
 
27f34ba
5d2a27a
27f34ba
5d2a27a
24f7b24
efa22ad
 
 
e01bdd4
9052625
 
 
 
 
efa22ad
 
9052625
efa22ad
 
24f7b24
dbfff3c
 
 
 
 
9e0fa9c
27f34ba
9e0fa9c
 
 
 
 
 
 
3da121b
20b5a1e
9e0fa9c
 
6e6e56f
 
 
884a60b
6e6e56f
 
 
 
 
 
884a60b
6e6e56f
 
884a60b
 
 
6e6e56f
 
884a60b
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# app.py
from fastapi import FastAPI, HTTPException, Query, Depends, Header
from pydantic import BaseModel, HttpUrl, Field
from typing import List, Dict, Optional, Any
from parser.assembler import parse_law_from_texts
from supabase_utils import save_law_to_supabase
from helpers.indexer import build_indexed_response
from helpers.blocks_all import extract_from_url
from parser.extract_tables_by_article import extract_tables_from_url
import os

app = FastAPI(
    title="Text Extractor API",
    description="API لاستخراج النصوص من صفحات الويب مع إمكانية التحكم في النطاقات",
    version="2.1.0"
)

API_TOKEN = os.getenv("API_TOKEN")

def verify_api_token(x_api_token: str = Header(None)):
    # إذا لم يتم إرسال التوكن
    if not x_api_token:
        raise HTTPException(
            status_code=401,
            detail="API token is required"
        )

    # إذا لم يكن التوكن مضبوط في secrets
    if not API_TOKEN:
        raise HTTPException(
            status_code=500,
            detail="API token not configured on server"
        )

    # إذا كان التوكن غير مطابق
    if x_api_token != API_TOKEN:
        raise HTTPException(
            status_code=401,
            detail="Invalid API token"
        )


class IndexedURLRequest(BaseModel):
    url: HttpUrl
    save_to_supabase: bool = False
    timeout: int = Field(10, ge=1, le=60)
    title_index: Optional[int] = Field(None, ge=0)
    preamble_start: Optional[int] = Field(None, ge=0)
    preamble_end: Optional[int] = Field(None, ge=0)
    body_start: Optional[int] = Field(None, ge=0)
    body_end: Optional[int] = Field(None, ge=0)
    return_parsed: bool = Field(False, description="إرجاع النتيجة محلّلة (parsed) بدلاً من raw texts")
    ranges: Optional[List[List[int]]] = None


from fastapi import Depends

@app.post("/extract")
async def extract_indexed(
    request: IndexedURLRequest,
    _: None = Depends(verify_api_token)
):
    try:
        # 1) استخراج النصوص الخام من الرابط
        raw_texts = await extract_from_url(str(request.url), request.timeout)
        
        # 2) بناء قائمة مفهرسة بالخيارات المرسلة (قد تكون None)
        datalist = build_indexed_response(
            texts=raw_texts,
            title_index=request.title_index,
            preamble_start=request.preamble_start,
            preamble_end=request.preamble_end,
            body_start=request.body_start,
            body_end=request.body_end
        )

        # 3) إذا كان return_parsed = True → نرجّع البيانات بعد التحليل
        if request.return_parsed:
            parsed = parse_law_from_texts(datalist, str(request.url))

            # 4) حفظ إلى Supabase إذا طُلب
            if request.save_to_supabase:
                save_law_to_supabase(parsed["law"])

            return parsed

        # 5) وإلا نرجّع القائمة المفهرسة كما هي
        return datalist

    except Exception as e:
        raise HTTPException(
            status_code=500,
            detail=f"خطأ في معالجة المحتوى: {str(e)}"
        )
        
# ============================
# نقطة GET بسيطة لإرجاع النصوص بدون فهرسة
# ============================
@app.get("/extract_link")
async def extract_link_get(
    url: HttpUrl = Query(..., description="رابط الصفحة المراد استخراج النصوص منها"),
    timeout: int = Query(10, ge=1, le=60, description="مهلة الطلب بالثواني")
):
    try:
        raw_texts = await extract_from_url(str(url), timeout)
        return raw_texts

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"خطأ في معالجة المحتوى: {str(e)}")



@app.get("/extract_tables")
async def extract_tables_get(
    url: HttpUrl = Query(..., description="رابط الصفحة المراد استخراج الجداول منها"),
    timeout: int = Query(10, ge=1, le=60, description="مهلة الطلب بالثواني")
):
    """
    استخراج جميع الجداول المرتبطة بالمواد من صفحة الويب وإرجاعها كهيكل JSON مرتب.
    """
    try:
        # استخدام الوظيفة المستقلة الجديدة
        result = await extract_tables_from_url(str(url), timeout)
        return result

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"خطأ في معالجة الجداول: {str(e)}")