Configurar la función Event
Ahora comenzaremos a codificar la aplicación WorkDrive Sync configurando la función Event.
El directorio de funcionesfunctions/WorkDrive contiene:
- El archivo principal de la función WorkDriveSync.java
- El archivo de configuración catalyst-config.json
- Archivos de biblioteca Java en la carpeta lib
- Archivos de dependencias .classpath y .project
Agregará código en WorkDriveSync.java.
Puede usar cualquier IDE para configurar la función.
Puede copiar directamente el código a continuación y pegarlo en WorkDriveSync.java ubicado en el directorio functions/WorkDrive y guardar el archivo.
import com.catalyst.Context;
import com.catalyst.event.EVENT_STATUS;
import com.catalyst.event.EventRequest;
import com.catalyst.event.CatalystEventHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.List;
import java.util.ArrayList;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.json.JSONObject;
import org.json.JSONArray;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.component.zcql.ZCQL;
import com.zc.component.object.ZCObject;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.auth.connectors.ZCConnection;
import com.zc.component.stratus.ZCStratus;
import com.zc.component.stratus.ZCBucket;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class WorkDriveSync implements CatalystEventHandler {
private static final Logger LOGGER = Logger.getLogger(WorkDriveSync.class.getName());
private static final String CLIENT_ID = "{{YOUR_CLIENT_ID}}"; //Ingrese su Client ID
private static final String CLIENT_SECRET = "{{YOUR_CLIENT_SECRET}}"; //Ingrese su Client Secret
private static final String AUTH_URL = "https://accounts.zoho.com/oauth/v2/token";
private static final String REFRESH_URL = "https://accounts.zoho.com/oauth/v2/token";
private static final String REFRESH_TOKEN = "{{YOUR_REFRESH_TOKEN}}"; //Ingrese su Refresh Token
private static final String WORKDRIVE_FOLDER_ID = "{{YOUR_WORKDRIVE_FOLDER_ID}}"; //Ingrese su WorkDrive Folder ID
private static final String STRATUS_BUCKET_NAME = "{{YOUR_STRATUS_BUCKET_NAME}}"; // Ingrese el nombre de su bucket
private static final String FILE_VAULT_TABLE_NAME = "FileVault";
private static final OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
@Override
public EVENT_STATUS handleEvent(EventRequest paramEventRequest, Context paramContext) throws Exception {
try {
JSONObject eventData = (JSONObject) paramEventRequest.getRawData();
JSONArray eventsArray = (JSONArray) eventData.get("events");
JSONObject firstEvent = (JSONObject) eventsArray.get(0);
String eventType = (String) ((JSONObject) firstEvent.get("event_config")).get("api_name");
String fileName = (String) ((JSONObject) ((JSONArray) ((JSONObject) firstEvent.get("data")).get("object_details")).get(0)).get("key");
LOGGER.log(Level.INFO, "Received event: " + eventType + " for file: " + fileName);
String query = "SELECT ROWID, WorkDriveFileID FROM " + FILE_VAULT_TABLE_NAME + " WHERE FileName='" + fileName + "'";
List<ZCRowObject> queryResult = ZCQL.getInstance().executeQuery(query);
if (queryResult.isEmpty()) {
LOGGER.log(Level.INFO, "No entry found in " + FILE_VAULT_TABLE_NAME + " for file: " + fileName);
return EVENT_STATUS.SUCCESS;
}
ZCRowObject fileVaultEntry = queryResult.get(0);
Long rowId = Long.valueOf((String) fileVaultEntry.get("ROWID"));
String workDriveFileId = (String) fileVaultEntry.get("WorkDriveFileID");
LOGGER.log(Level.INFO, "Row Id: " + rowId + " , WorkDriveFileID: " + workDriveFileId);
if ("stratus_object_uploaded".equals(eventType)) {
handleUploadEvent(paramContext, fileName, rowId);
} else if ("stratus_object_deleted".equals(eventType)) {
handleDeleteEvent(paramContext, fileName, rowId, workDriveFileId);
}
return EVENT_STATUS.SUCCESS;
} catch(Exception ex) {
LOGGER.log(Level.SEVERE, "Exception in WorkDriveSync Function: ", ex);
return EVENT_STATUS.FAILURE;
}
}
private void handleUploadEvent(Context context, String fileName, Long rowId) throws Exception {
ZCStratus stratus = ZCStratus.getInstance();
ZCBucket bucket = stratus.bucketInstance(STRATUS_BUCKET_NAME);
LOGGER.log(Level.INFO, "Going to fetch the file " + fileName + " from the bucket " + STRATUS_BUCKET_NAME);
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
InputStream dataStream = bucket.getObject(encodedFileName);
byte[] buffer = new byte[dataStream.available()];
dataStream.read(buffer);
File targetFile = new File(fileName);
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);
outStream.close();
String accessToken = getAccessToken();
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("content", fileName, RequestBody.create(MediaType.parse("application/octet-stream"), new File(fileName)))
.build();
Request request = new Request.Builder()
.url("https://workdrive.zoho.com/api/v1/upload?filename=" + fileName + "&override-name-exist=true&parent_id=" + WORKDRIVE_FOLDER_ID)
.method("POST", body)
.addHeader("Authorization", "Zoho-oauthtoken " + accessToken)
.build();
Response response = okHttpClient.newCall(request).execute();
JSONObject responseJSON = new JSONObject(response.body().string());
JSONObject data = responseJSON.getJSONArray("data").getJSONObject(0);
String resourceId = data.getJSONObject("attributes").getString("resource_id");
LOGGER.log(Level.INFO, "WorkDrive File ID :: " + resourceId);
ZCObject object = ZCObject.getInstance();
ZCTable table = object.getTable(FILE_VAULT_TABLE_NAME);
List<ZCRowObject> rowsToUpdate = new ArrayList<>();
ZCRowObject row = ZCRowObject.getInstance();
row.set("ROWID", rowId);
row.set("WorkDriveFileID", resourceId);
row.set("WorkDriveSync", "Uploaded");
rowsToUpdate.add(row);
table.updateRows(rowsToUpdate);
LOGGER.log(Level.INFO, "FileVault table updated for ROWID: " + rowId + " with WorkDriveFileID: " + resourceId);
}
private void handleDeleteEvent(Context context, String fileName, Long rowId, String workDriveFileId) throws Exception {
JSONObject requestBody = new JSONObject();
JSONObject dataObject = new JSONObject();
JSONObject attributesObject = new JSONObject();
attributesObject.put("status", "51");
dataObject.put("attributes", attributesObject);
dataObject.put("type", "files");
requestBody.put("data", dataObject);
Request request = new Request.Builder()
.url(String.format("https://workdrive.zoho.com/api/v1/files/%s", workDriveFileId))
.patch(RequestBody.create(MediaType.parse("application/json"), requestBody.toString()))
.addHeader("Authorization", "Zoho-oauthtoken " + getAccessToken())
.addHeader("Accept", "application/vnd.api+json")
.addHeader("Content-Type", "application/json")
.build();
Response response = okHttpClient.newCall(request).execute();
LOGGER.log(Level.INFO, "WorkDrive Delete Response Status: " + response.code());
LOGGER.log(Level.INFO, "WorkDrive Delete Response Body: " + response.body().string());
ZCObject object = ZCObject.getInstance();
ZCTable table = object.getTable(FILE_VAULT_TABLE_NAME);
table.deleteRow(rowId);
LOGGER.log(Level.INFO, "FileVault table entry deleted for ROWID: " + rowId);
}
@SuppressWarnings("unchecked")
public String getAccessToken() throws Exception {
org.json.simple.JSONObject authJson = new org.json.simple.JSONObject();
org.json.simple.JSONObject connectorJson = new org.json.simple.JSONObject();
authJson.put("client_id", CLIENT_ID);
authJson.put("client_secret", CLIENT_SECRET);
authJson.put("auth_url", AUTH_URL);
authJson.put("refresh_url", REFRESH_URL);
authJson.put("refresh_token", REFRESH_TOKEN);
connectorJson.put("WorkDriveConnector", authJson);
return ZCConnection.getInstance(connectorJson).getConnector("WorkDriveConnector").getAccessToken();
}
}
-
Los enlaces de servicio de Zoho usados en este código (por ejemplo, accounts.zoho.com, workdrive.zoho.com, etc.) son específicos del Centro de Datos (DC). Reemplace .com con el dominio correspondiente de su centro de datos de Zoho. Asegúrese de que todas las URLs en el código usen el mismo dominio DC para evitar errores de autenticación o API.
-
WorkDrive Folder ID: Puede obtener este valor abriendo la carpeta que creó en WorkDrive anteriormente. La URL contiene el Folder ID de la carpeta de WorkDrive. Copie el ID que se muestra después de folders/ en la URL.

-
Table ID: Puede obtener el ID de la tabla en el Data Store debajo de su nombre.

La función Event está ahora configurada.
Última actualización 2026-03-20 21:51:56 +0530 IST