Configurar el directorio de Functions
Ahora comenzaremos a codificar la aplicación Lead Manager configurando la Advanced I/O function.
El directorio de funciones functions/crmCRUD contiene:
- El archivo principal de la función CRMCRUD.java
- El archivo de configuración catalyst-config.json
- Archivos de biblioteca Java en la carpeta lib
- Archivos de dependencias .classpath y .project
Agregarás código en CRMCRUD.java.
Puedes usar cualquier IDE para configurar la función.
Nota: Revisa el código en esta sección para asegurarte de comprenderlo completamente. Discutiremos el código de la función y el cliente después de que configures el cliente.
Puedes copiar directamente el código a continuación y pegarlo en CRMCRUD.java ubicado en el directorio functions/crmCRUD y guardar el archivo.
CRMCRUD.java
copy
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.catalyst.advanced.CatalystAdvancedIOHandler;
import com.zc.auth.connectors.ZCConnection;
import com.zc.component.ZCUserDetail;
import com.zc.component.object.ZCObject;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.component.users.ZCUser;
import com.zc.component.zcql.ZCQL;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
public class CRMCRUD implements CatalystAdvancedIOHandler {
private static final Logger LOGGER = Logger.getLogger(CRMCRUD.class.getName());
private String apiUrl = "https://www.zohoapis.com/crm/v2/Leads";
private String GET = "GET";
private String POST = "POST";
private String PUT = "PUT";
private String DELETE = "DELETE";
private String CLIENT_ID = "{{YOUR_CLIENT_ID}}"; //Agrega tu Client ID
private String CLIENT_SECRET = "{{YOUR_CLIENT_SECRET}}"; //Agrega tu Client Secret
OkHttpClient client = new OkHttpClient();
@Override
@SuppressWarnings("unchecked")
public void runner(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
LOGGER.info("STARTED!!!");
String url = request.getRequestURI();
String method = request.getMethod();
String responseData = "";
String recordID = "";
Pattern p = Pattern.compile("([0-9]+)");
MediaType mediaType = MediaType.parse("application/json");
JSONParser jsonParser = new JSONParser();
JSONObject data = new JSONObject();
org.json.simple.JSONArray reqData = new org.json.simple.JSONArray();
//Obtiene el Refresh Token llamando a la función getRefreshToken(), y lo inserta junto con el userID en la tabla Token
if (Pattern.matches("/generateToken", url) && method.equals(GET)) {
LOGGER.info("generateToken!!!");
String code = request.getParameter("code");
String domain = (request.getHeader("host").contains("localhost") ? ("http://" + request.getHeader("host")) : ("https://") + request.getHeader("host").split(":")[0]);
LOGGER.info("Domain: "+domain);
LOGGER.info("Code: "+code);
ZCUserDetail details = ZCUser.getInstance().getCurrentUser();
ZCObject object = ZCObject.getInstance();
ZCRowObject row = ZCRowObject.getInstance();
row.set("refresh_token", getRefreshToken(code, domain));
row.set("userId", details.getUserId());
ZCTable tab = object.getTable(1824000000686079L); //Reemplaza esto con el Table ID de tu tabla
tab.insertRow(row);
response.setStatus(200);
response.sendRedirect(domain + "/app/index.html");
//Obtiene los detalles del usuario llamando a la función getUserDetails()
} else if (Pattern.matches("/getUserDetails", url) && method.equals(GET)) {
ArrayList<ZCRowObject> user = getUserDetails();
JSONObject resp = new JSONObject();
if (user.isEmpty()) {
resp.put("userId", null);
response.setContentType("application/json");
response.getWriter().write(resp.toJSONString());
response.setStatus(200);
} else {
resp.put("userId", user.get(0).get("Token", "userId"));
response.setContentType("application/json");
response.getWriter().write(resp.toJSONString());
response.setStatus(200);
}
//Ejecuta varias APIs para acceder, agregar o modificar leads en CRM
//Obtiene todos los leads
} else if (Pattern.matches("/crmData", url) && method.equals(GET)) {
responseData = getResponse(GET, null);
//Obtiene un lead en particular
} else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(GET)) {
Matcher m = p.matcher(url);
if (m.find()) {
recordID = m.group(1);
}
apiUrl = apiUrl + "/" + recordID;
responseData = getResponse(GET, null);
//Agrega un nuevo lead
} else if (Pattern.matches("/crmData", url) && method.equals(POST)) {
ServletInputStream requestBody = request.getInputStream();
JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8"));
reqData.add(jsonObject);
data.put("data", reqData);
RequestBody body = RequestBody.create(mediaType, data.toString());
responseData = getResponse(POST, body);
//Elimina un lead
} else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(DELETE)) {
Matcher m = p.matcher(url);
if (m.find()) {
recordID = m.group(1);
}
apiUrl = apiUrl + "/" + recordID;
responseData = getResponse(DELETE, null);
//Edita un lead
} else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(PUT)) {
Matcher m = p.matcher(url);
if (m.find()) {
recordID = m.group(1);
}
apiUrl = apiUrl + "/" + recordID;
ServletInputStream requestBody = request.getInputStream();
JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8"));
reqData.add(jsonObject);
data.put("data", reqData);
RequestBody body = RequestBody.create(mediaType, data.toJSONString());
responseData = getResponse(PUT, body);
} else {
LOGGER.log(Level.SEVERE, "Error. Invalid Request"); //Las acciones se registran en logs. Puedes verificar los logs desde Catalyst
response.setStatus(404);
responseData = "Error. Invalid Request";
response.getWriter().write(responseData);
}
response.setContentType("application/json");
response.getWriter().write(responseData);
response.setStatus(200);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Exception in CRM Function ", e);
response.setStatus(500);
response.getWriter().write(e.toString());
}
}
@SuppressWarnings("unchecked")
//Obtiene un Access Token usando el Refresh Token
public String getAccessToken(Long userId) throws Exception {
JSONObject authJson = new JSONObject();
JSONObject connectorJson = new JSONObject();
String query = "SELECT refresh_token FROM Token where UserId=" + userId;
if (rowList.isEmpty()) {
throw new RuntimeException("No token found for userId: " + userId);
}
Object refreshTokenObj = rowList.get(0).get("Token", "refresh_token");
if (refreshTokenObj == null) {
throw new RuntimeException("Refresh token is null for userId: " + userId);
}
authJson.put("refresh_token", refreshTokenObj.toString());
ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query);
authJson.put("client_id", CLIENT_ID);
authJson.put("client_secret", CLIENT_SECRET);
authJson.put("auth_url", "https://accounts.zoho.com/oauth/v2/token");
authJson.put("refresh_url", "https://accounts.zoho.com/oauth/v2/token");
authJson.put("refresh_token", rowList.get(0).get("Token", "refresh_token"));
connectorJson.put(userId.toString(), authJson);
return ZCConnection.getInstance(connectorJson).getConnector(userId.toString()).getAccessToken();
}
//Obtiene el Refresh Token pasando los detalles requeridos
public String getRefreshToken(String code, String domain) throws Exception {
HttpUrl.Builder urlBuilder = HttpUrl.parse("https://accounts.zoho.com/oauth/v2/token").newBuilder();
urlBuilder.addQueryParameter("code", code);
urlBuilder.addQueryParameter("client_id", CLIENT_ID);
urlBuilder.addQueryParameter("client_secret", CLIENT_SECRET);
urlBuilder.addQueryParameter("grant_type", "authorization_code");
urlBuilder.addQueryParameter("redirect_uri", domain + "/server/crmcrud/generateToken");
String URL = urlBuilder.build().toString();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request getResponse = new Request.Builder().url(URL).method(POST, body).build();
JSONParser jsonParser = new JSONParser();
JSONObject data = (JSONObject) jsonParser.parse(client.newCall(getResponse).execute().body().string());
return data.get("refresh_token").toString();
}
//Pasa el Access Token obtenido para conseguir la autorización necesaria para realizar cada acción en el módulo de CRM
public String getResponse(String METHOD, RequestBody body) throws Exception {
Long userId = ZCUser.getInstance().getCurrentUser().getUserId();
String accessToken = getAccessToken(userId);
Request getResponse = new Request.Builder().url(apiUrl).method(METHOD, body)
.addHeader("Authorization", "Zoho-oauthtoken " + accessToken).build();
return client.newCall(getResponse).execute().body().string();
}
//Obtiene el registro de la tabla Token que contiene el Refresh Token, pasando el userID
public ArrayList<ZCRowObject> getUserDetails() throws Exception {
Long userId = ZCUser.getInstance().getCurrentUser().getUserId();
String query = "SELECT * FROM Token where UserId=" + userId;
ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query);
return rowList;
}
}
Nota: Después de copiar y pegar este código en tu archivo de función, asegúrate
de reemplazar los siguientes valores en él:
- Client ID en la línea 32
- Client Secret en la línea 33
- Table ID en la línea 61
El directorio de funciones ahora está configurado. Discutiremos el código de la función y el cliente después de que configures el cliente.
Última actualización 2026-03-20 21:51:56 +0530 IST