--- title: "Configurar el directorio de funciones" url: https://docs.catalyst.zoho.com/es/tutorials/leadmanager/java/configure-functions-directory/ description: "Construye una aplicación Lead Manager que se conecte a tu cuenta de Zoho CRM usando el conector de Catalyst, y te permita ver, crear, actualizar o eliminar leads directamente desde el módulo Leads" last_updated: 2026-03-20T16:21:56Z service: All Services type: tutorial related_links: - name: "Advanced I/O Functions" url: /es/serverless/help/functions/advanced-io/ - name: "Functions Directory Structure" url: /es/cli/v1/project-directory-structure/functions-directory --- # Configurar el directorio de Functions Ahora comenzaremos a codificar la aplicación Lead Manager configurando la Advanced I/O function. El directorio de funciones[](https://docs.catalyst.zoho.com/es/cli/v1/project-directory-structure/functions-directory) `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** ```java 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](https://docs.catalyst.zoho.com/es/tutorials/leadmanager/java/register-client) en la línea 32 * [Client Secret](https://docs.catalyst.zoho.com/es/tutorials/leadmanager/java/register-client) en la línea 33 * [Table ID](https://docs.catalyst.zoho.com/es/tutorials/leadmanager/java/create-table) 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.