"""Generator de exemple de cod multi-limbaj pentru integrarea cu AutoPass. Modul PUR: fara I/O, fara DB, fara stare globala. Folosit de pagina de documentatie a hub-ului de integrare (Etapa 5). Campurile obligatorii din payload-ul JSON sunt derivate dinamic din PrezentareIn.model_fields pentru rezistenta la drift de schema. """ from __future__ import annotations import json from app.models import PrezentareIn # Placeholder pentru cheia API — niciodata o cheie reala _CHEIE_PLACEHOLDER = "rfak_..." def _campuri_obligatorii() -> list[str]: """Intoarce lista campurilor obligatorii din PrezentareIn (is_required()).""" return [camp for camp, field in PrezentareIn.model_fields.items() if field.is_required()] def _payload_prezentari_dict(account_id: int) -> dict: """Construieste un payload JSON exemplu cu toate campurile obligatorii. Campurile cu default (odometru_initial, obs, b64_image, sistem_reparat) sunt omise pentru concizie — nu sunt obligatorii. `rar_credentials` NU e inclus: cererea trimite doar cheia API + datele prezentarii, iar worker-ul foloseste credentialele RAR salvate pe cont (tab-ul Cont). Trimiterea lor in payload e optionala (suprascrie creds-urile contului pe acea cerere). """ # Construim un dict cu toate campurile obligatorii campuri = _campuri_obligatorii() prezentare: dict = {} # Valori exemplu pentru campuri obligatorii cunoscute valori_exemplu: dict = { "vin": "WVWZZZ1JZXW000001", "nr_inmatriculare": "B123ABC", "data_prestatie": "2026-06-22", "odometru_final": "150000", "prestatii": [{"cod_prestatie": "OE-1"}], } for camp in campuri: if camp in valori_exemplu: prezentare[camp] = valori_exemplu[camp] else: # Fallback generic pentru campuri neasteptate adaugate ulterior prezentare[camp] = f"<{camp}>" return {"prezentari": [prezentare]} def _payload_json_str(account_id: int, indent: int = 2) -> str: """Payload JSON formatat ca string pentru includere in snippet-uri.""" return json.dumps(_payload_prezentari_dict(account_id), indent=indent, ensure_ascii=False) def _payload_json_compact(account_id: int) -> str: """Payload JSON pe o singura linie (fara newline) pentru string literal C#/VFP. Foloseste separators=(',', ':') pentru a elimina spatiile si newline-urile. Rezultatul e un JSON valid pe o singura linie, fara newline in interior. """ return json.dumps(_payload_prezentari_dict(account_id), separators=(",", ":"), ensure_ascii=False) def _snippet_curl_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_str(account_id) return f"""curl -X POST "{base_url}/v1/prezentari" \\ -H "Content-Type: application/json" \\ -H "X-API-Key: {_CHEIE_PLACEHOLDER}" \\ -d '{payload}'""" def _snippet_curl_import(base_url: str, account_id: int) -> str: fisier = '"file=@prezentari.xlsx"' return ( f'curl -X POST "{base_url}/v1/import" \\\n' f' -H "X-API-Key: {_CHEIE_PLACEHOLDER}" \\\n' f" -F {fisier}" ) def _snippet_python_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_str(account_id) return f"""import requests url = "{base_url}/v1/prezentari" headers = {{ "X-API-Key": "{_CHEIE_PLACEHOLDER}", "Content-Type": "application/json", }} payload = {payload} response = requests.post(url, json=payload, headers=headers) print(response.json())""" def _snippet_python_import(base_url: str, account_id: int) -> str: return f"""import requests url = "{base_url}/v1/import" headers = {{ "X-API-Key": "{_CHEIE_PLACEHOLDER}", }} with open("prezentari.xlsx", "rb") as f: files = {{"file": ("prezentari.xlsx", f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")}} response = requests.post(url, headers=headers, files=files) print(response.json())""" def _snippet_php_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_str(account_id) # Escapeaza apostrof-urile pentru PHP heredoc payload_php = payload.replace("'", "\\'") return f""" str: return f""" $fisier]); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "X-API-Key: {_CHEIE_PLACEHOLDER}", ]); $response = curl_exec($ch); curl_close($ch); echo $response;""" def _snippet_csharp_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_compact(account_id) # Escape ghilimele duble pentru string C# (literal pe o singura linie) payload_cs = payload.replace('"', '\\"') return f"""using System.Net.Http; using System.Text; using System.Threading.Tasks; var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-API-Key", "{_CHEIE_PLACEHOLDER}"); var json = "{payload_cs}"; var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PostAsync("{base_url}/v1/prezentari", content); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);""" def _snippet_csharp_import(base_url: str, account_id: int) -> str: return f"""using System.Net.Http; using System.Threading.Tasks; var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-API-Key", "{_CHEIE_PLACEHOLDER}"); using var form = new MultipartFormDataContent(); var fileBytes = File.ReadAllBytes("prezentari.xlsx"); var fileContent = new ByteArrayContent(fileBytes); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); form.Add(fileContent, "file", "prezentari.xlsx"); var response = await client.PostAsync("{base_url}/v1/import", form); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);""" def _snippet_node_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_str(account_id) return f"""const payload = {payload}; const response = await fetch("{base_url}/v1/prezentari", {{ method: "POST", headers: {{ "Content-Type": "application/json", "X-API-Key": "{_CHEIE_PLACEHOLDER}", }}, body: JSON.stringify(payload), }}); const data = await response.json(); console.log(data);""" def _snippet_node_import(base_url: str, account_id: int) -> str: # FormData si Blob sunt globale in Node 18+ — nu necesita import din node:buffer return f"""import {{ readFileSync }} from "fs"; const form = new FormData(); const continut = readFileSync("prezentari.xlsx"); form.append("file", new Blob([continut], {{ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }}), "prezentari.xlsx"); const response = await fetch("{base_url}/v1/import", {{ method: "POST", headers: {{ "X-API-Key": "{_CHEIE_PLACEHOLDER}" }}, body: form, }}); const data = await response.json(); console.log(data);""" def _snippet_vfp_msxml_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_compact(account_id) # VFP: ghilimele in string se dubleaza; payload compact = o singura linie payload_vfp = payload.replace('"', '""') return f"""* Visual FoxPro — MSXML2.ServerXMLHTTP.6.0 LOCAL oHTTP, cURL, cPayload, cRaspuns cURL = "{base_url}/v1/prezentari" cPayload = "{payload_vfp}" oHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0") oHTTP.open("POST", cURL, .F.) oHTTP.setRequestHeader("Content-Type", "application/json") oHTTP.setRequestHeader("X-API-Key", "{_CHEIE_PLACEHOLDER}") oHTTP.send(cPayload) cRaspuns = oHTTP.responseText ? cRaspuns""" def _snippet_vfp_msxml_import(base_url: str, account_id: int) -> str: return f"""* Visual FoxPro — MSXML2.ServerXMLHTTP.6.0 — upload fisier * Necesita ADODB.Stream pentru a citi fisierul binar LOCAL oHTTP, oStream, oBody LOCAL cURL, cGranita, cCRLF, cDisp, cType cURL = "{base_url}/v1/import" cGranita = "----AutoPassBoundary" cCRLF = CHR(13) + CHR(10) * Citire fisier in ADODB.Stream oStream = CREATEOBJECT("ADODB.Stream") oStream.Type = 1 && adTypeBinary oStream.Open() oStream.LoadFromFile("prezentari.xlsx") * Construire body multipart (simplificat — pentru fisiere mici) oBody = CREATEOBJECT("ADODB.Stream") oBody.Type = 1 oBody.Open() oHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0") oHTTP.open("POST", cURL, .F.) oHTTP.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + cGranita) oHTTP.setRequestHeader("X-API-Key", "{_CHEIE_PLACEHOLDER}") * Nota: pentru upload binar complet folositi un helper COM sau ADODB. oHTTP.send(oBody) ? oHTTP.responseText""" def _snippet_vfp_winhttp_prezentari(base_url: str, account_id: int) -> str: payload = _payload_json_compact(account_id) # VFP: ghilimele in string se dubleaza; payload compact = o singura linie payload_vfp = payload.replace('"', '""') return f"""* Visual FoxPro — WinHttp.WinHttpRequest.5.1 LOCAL oHTTP, cURL, cPayload, cRaspuns cURL = "{base_url}/v1/prezentari" cPayload = "{payload_vfp}" oHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1") oHTTP.Open("POST", cURL, .F.) oHTTP.SetRequestHeader("Content-Type", "application/json") oHTTP.SetRequestHeader("X-API-Key", "{_CHEIE_PLACEHOLDER}") oHTTP.Send(cPayload) cRaspuns = oHTTP.ResponseText ? cRaspuns""" def _snippet_vfp_winhttp_import(base_url: str, account_id: int) -> str: return f"""* Visual FoxPro — WinHttp.WinHttpRequest.5.1 — upload fisier * Necesita ADODB.Stream pentru a citi fisierul binar LOCAL oHTTP, oStream LOCAL cURL, cGranita, cCRLF cURL = "{base_url}/v1/import" cGranita = "----AutoPassBoundary" cCRLF = CHR(13) + CHR(10) oStream = CREATEOBJECT("ADODB.Stream") oStream.Type = 1 && adTypeBinary oStream.Open() oStream.LoadFromFile("prezentari.xlsx") oHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1") oHTTP.Open("POST", cURL, .F.) oHTTP.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + cGranita) oHTTP.SetRequestHeader("X-API-Key", "{_CHEIE_PLACEHOLDER}") * Nota: pentru upload binar complet folositi un helper COM sau ADODB. oHTTP.Send() ? oHTTP.ResponseText""" def exemple(base_url: str, account_id: int) -> dict: """Genereaza snippet-uri de cod multi-limbaj pentru integrarea cu AutoPass. Parametri: base_url: URL-ul de baza al gateway-ului (ex. "https://autopass.example.com") account_id: ID-ul contului (inclus in context, nu in snippet-uri) Intoarce un dict structurat astfel: { "": { "prezentari": "", "import": "", }, ... } Limbaje: curl, python, php, csharp, node, vfp_msxml, vfp_winhttp. Functie pura: fara I/O, fara DB, fara stare globala. """ return { "curl": { "prezentari": _snippet_curl_prezentari(base_url, account_id), "import": _snippet_curl_import(base_url, account_id), }, "python": { "prezentari": _snippet_python_prezentari(base_url, account_id), "import": _snippet_python_import(base_url, account_id), }, "php": { "prezentari": _snippet_php_prezentari(base_url, account_id), "import": _snippet_php_import(base_url, account_id), }, "csharp": { "prezentari": _snippet_csharp_prezentari(base_url, account_id), "import": _snippet_csharp_import(base_url, account_id), }, "node": { "prezentari": _snippet_node_prezentari(base_url, account_id), "import": _snippet_node_import(base_url, account_id), }, "vfp_msxml": { "prezentari": _snippet_vfp_msxml_prezentari(base_url, account_id), "import": _snippet_vfp_msxml_import(base_url, account_id), }, "vfp_winhttp": { "prezentari": _snippet_vfp_winhttp_prezentari(base_url, account_id), "import": _snippet_vfp_winhttp_import(base_url, account_id), }, }