export async function main(
authentication: {
owner: RT.Nextcloud,
trigger: RT.Nextcloud
},
user: {
uid: string,
displayName: string,
},
time: number,
event: any
) {
// process event
}Submitted by hugo989 118 days ago
// Nextcloud webhook payload types
export interface NextcloudWebhookPayload {
event: NextcloudEvent;
user: NextcloudUser;
time: number; // UNIX timestamp in seconds
}
export interface NextcloudEvent {
node: NextcloudNode;
class: string; // e.g. "OCP\\Files\\Events\\Node\\NodeWrittenEvent"
}
export interface NextcloudNode {
id: number;
path: string;
// optional fields you may see in other events
storage?: string;
size?: number;
name?: string;
}
export interface NextcloudUser {
uid: string;
displayName?: string;
}
/**
* Nextcloud Trigger Preprocessor
*
* This function runs BEFORE the main function.
*
* It processes raw Nextcloud webhook trigger data before passing it to `main()`.
* Supports the available Nextcloud events:
* - FormSubmittedEvent: Form submissions from Nextcloud Forms
* - NodeWrittenEvent: File/folder operations (create, update, delete)
*
* The returned object determines `main()` parameters based on event type.
*
* @param event - Nextcloud trigger data and details
* @returns Processed data for `main()`
*/
export async function preprocessor(
event: {
kind: 'nextcloud',
payload: NextcloudWebhookPayload,
},
) {
if (event.kind === 'nextcloud') {
const payload = event.payload;
const baseEvent = {
eventType: payload.event.class,
userId: payload.user.uid,
timestamp: new Date(payload.time * 1000).toISOString(), // Convert UNIX timestamp to ISO
};
// Extract event type from class name
const eventTypeMatch = payload.event.class.match(/(\w+)Event$/);
const eventType = eventTypeMatch ? eventTypeMatch[1] : 'Unknown';
// Handle specific Nextcloud event types
switch (eventType) {
case 'FormSubmitted':
return {
...baseEvent,
category: 'form',
user: {
uid: payload.user.uid,
displayName: payload.user.displayName || ''
},
rawPayload: payload
};
case 'NodeWritten':
return {
...baseEvent,
category: 'file',
user: {
uid: payload.user.uid,
displayName: payload.user.displayName || ''
},
node: {
id: payload.event.node.id,
path: payload.event.node.path,
storage: payload.event.node.storage,
size: payload.event.node.size,
name: payload.event.node.name
},
rawPayload: payload
};
default:
return {
...baseEvent,
category: 'other',
eventClass: payload.event.class,
data: payload.event
};
}
}
throw new Error(`Expected nextcloud trigger kind, got: ${event.kind}`);
}
/**
* Main Function - Handles processed Nextcloud events
*
* Called AFTER `preprocessor()`, with its return values.
*
* This example demonstrates integrating with Nextcloud APIs using openapi-fetch
* and windmill-client, following the official Nextcloud Hub example patterns.
*
* @param eventType - Type of Nextcloud event class name
* @param category - Event category ('form', 'file', or 'other')
* @param userId - ID of the user who triggered the event
* @param user - User information
* @param node - Node information (for file events)
* @param eventClass - Full event class name (for other events)
* @param data - Generic event data (for other events)
* @param timestamp - Event timestamp
* @param rawPayload - Raw event payload from Nextcloud
*/
export async function main(
eventType: string,
category: string,
userId?: string,
user?: {
uid: string;
displayName: string;
},
node?: {
id?: number;
path?: string;
storage?: string;
size?: number;
name?: string;
},
eventClass?: string,
data?: any,
timestamp?: string,
rawPayload?: NextcloudWebhookPayload,
) {
}Submitted by dieriba.pro916 204 days ago