1import{serve}from"https://deno.land/std@0.224.0/http/server.ts";
2
3interfaceSalesforcePayload{
4action:"query"|"describe"|"create"|"update";
5soql?:string;
6objectType?:string;
7recordId?:string;
8body?:Record<string,unknown>;
9}
10
11constINSTANCE_URL=Deno.env.get("SF_INSTANCE_URL")!;
12constACCESS_TOKEN=Deno.env.get("SF_ACCESS_TOKEN")!;
13
14asyncfunctionhandleSalesforce(req:Request):Promise<Response>{
15constpayload:SalesforcePayload=awaitreq.json();
16
17switch(payload.action){
18case"query":{
19if(!payload.soql){
20returnnewResponse(JSON.stringify({error:"SOQL query required"}),{
21status:400,
22headers:{"content-type":"application/json"},
23});
24}
25constres=awaitfetch(
26`${INSTANCE_URL}/services/data/v61.0/query?q=${encodeURIComponent(payload.soql)}`,
27{
28headers:{Authorization:`Bearer ${ACCESS_TOKEN}`},
29},
30);
31constdata=awaitres.json();
32returnnewResponse(JSON.stringify(data.records??[]),{
33headers:{"content-type":"application/json"},
34});
35}
36case"describe":{
37constres=awaitfetch(
38`${INSTANCE_URL}/services/data/v61.0/sobjects/${payload.objectType}/describe`,
39{
40headers:{Authorization:`Bearer ${ACCESS_TOKEN}`},
41},
42);
43returnnewResponse(JSON.stringify(awaitres.json()),{
44headers:{"content-type":"application/json"},
45});
46}
47default:
48returnnewResponse("Unknown action",{status:400});
49}
50}
51
52serve(handleSalesforce,{port:8080});