feat(n8n-webhook): add calendar list update delete approval flows
This commit is contained in:
@@ -199,7 +199,16 @@ def build_email_drafts_list_command(item: dict, account: str, dry_run: bool):
|
||||
return cmd
|
||||
|
||||
|
||||
def build_calendar_command(item: dict, account: str, dry_run: bool):
|
||||
def normalize_send_updates(value: str) -> str:
|
||||
raw = (value or '').strip()
|
||||
if raw == 'all':
|
||||
return 'all'
|
||||
if raw.lower() == 'externalonly':
|
||||
return 'externalOnly'
|
||||
return 'none'
|
||||
|
||||
|
||||
def build_calendar_create_command(item: dict, account: str, dry_run: bool):
|
||||
payload = item.get('payload') or {}
|
||||
calendar = payload.get('calendar') or 'primary'
|
||||
cmd = [
|
||||
@@ -210,7 +219,7 @@ def build_calendar_command(item: dict, account: str, dry_run: bool):
|
||||
'--summary', payload.get('title') or '',
|
||||
'--from', payload.get('start') or '',
|
||||
'--to', payload.get('end') or '',
|
||||
'--send-updates', 'none',
|
||||
'--send-updates', normalize_send_updates(payload.get('send_updates') or 'none'),
|
||||
]
|
||||
if payload.get('description'):
|
||||
cmd.extend(['--description', payload['description']])
|
||||
@@ -224,6 +233,104 @@ def build_calendar_command(item: dict, account: str, dry_run: bool):
|
||||
return cmd
|
||||
|
||||
|
||||
def build_calendar_list_events_command(item: dict, account: str, dry_run: bool):
|
||||
payload = item.get('payload') or {}
|
||||
calendar = (payload.get('calendar') or 'primary').strip() or 'primary'
|
||||
max_results = payload.get('max')
|
||||
if max_results is None:
|
||||
max_results = 20
|
||||
try:
|
||||
max_results = max(1, min(100, int(max_results)))
|
||||
except Exception:
|
||||
max_results = 20
|
||||
|
||||
days = payload.get('days')
|
||||
if days is None:
|
||||
days = 7
|
||||
try:
|
||||
days = max(1, min(90, int(days)))
|
||||
except Exception:
|
||||
days = 7
|
||||
|
||||
cmd = [
|
||||
'gog', 'calendar', 'events', calendar,
|
||||
'--account', account,
|
||||
'--json',
|
||||
'--no-input',
|
||||
'--max', str(max_results),
|
||||
]
|
||||
from_value = (payload.get('from') or '').strip()
|
||||
to_value = (payload.get('to') or '').strip()
|
||||
query = (payload.get('query') or '').strip()
|
||||
if from_value:
|
||||
cmd.extend(['--from', from_value])
|
||||
if to_value:
|
||||
cmd.extend(['--to', to_value])
|
||||
if not from_value and not to_value:
|
||||
cmd.extend(['--days', str(days)])
|
||||
if query:
|
||||
cmd.extend(['--query', query])
|
||||
if payload.get('all_pages') is True:
|
||||
cmd.append('--all-pages')
|
||||
if payload.get('fail_empty') is True:
|
||||
cmd.append('--fail-empty')
|
||||
if dry_run:
|
||||
cmd.append('--dry-run')
|
||||
return cmd
|
||||
|
||||
|
||||
def build_calendar_update_command(item: dict, account: str, dry_run: bool):
|
||||
payload = item.get('payload') or {}
|
||||
calendar = (payload.get('calendar') or 'primary').strip() or 'primary'
|
||||
event_id = (payload.get('event_id') or payload.get('id') or '').strip()
|
||||
if not event_id:
|
||||
fail('calendar_event_update payload missing event_id')
|
||||
cmd = [
|
||||
'gog', 'calendar', 'update', calendar, event_id,
|
||||
'--account', account,
|
||||
'--json',
|
||||
'--no-input',
|
||||
'--send-updates', normalize_send_updates(payload.get('send_updates') or 'none'),
|
||||
]
|
||||
if payload.get('title'):
|
||||
cmd.extend(['--summary', payload['title']])
|
||||
if payload.get('start'):
|
||||
cmd.extend(['--from', payload['start']])
|
||||
if payload.get('end'):
|
||||
cmd.extend(['--to', payload['end']])
|
||||
if payload.get('description'):
|
||||
cmd.extend(['--description', payload['description']])
|
||||
if payload.get('location'):
|
||||
cmd.extend(['--location', payload['location']])
|
||||
attendees = payload.get('attendees')
|
||||
if isinstance(attendees, list):
|
||||
cmd.extend(['--attendees', ','.join(str(x) for x in attendees if str(x).strip())])
|
||||
elif isinstance(attendees, str) and attendees.strip():
|
||||
cmd.extend(['--attendees', attendees.strip()])
|
||||
if dry_run:
|
||||
cmd.append('--dry-run')
|
||||
return cmd
|
||||
|
||||
|
||||
def build_calendar_delete_command(item: dict, account: str, dry_run: bool):
|
||||
payload = item.get('payload') or {}
|
||||
calendar = (payload.get('calendar') or 'primary').strip() or 'primary'
|
||||
event_id = (payload.get('event_id') or payload.get('id') or '').strip()
|
||||
if not event_id:
|
||||
fail('calendar_event_delete payload missing event_id')
|
||||
cmd = [
|
||||
'gog', 'calendar', 'delete', calendar, event_id,
|
||||
'--account', account,
|
||||
'--json',
|
||||
'--no-input',
|
||||
'--force',
|
||||
'--send-updates', normalize_send_updates(payload.get('send_updates') or 'none'),
|
||||
]
|
||||
if dry_run:
|
||||
cmd.append('--dry-run')
|
||||
return cmd
|
||||
|
||||
|
||||
def parse_json(output: str):
|
||||
text = output.strip()
|
||||
if not text:
|
||||
@@ -299,11 +406,29 @@ def main():
|
||||
'uses_tmpfile': False,
|
||||
},
|
||||
'calendar_event': {
|
||||
'builder': build_calendar_command,
|
||||
'builder': build_calendar_create_command,
|
||||
'op': 'calendar.create',
|
||||
'success_status': 'event_created',
|
||||
'uses_tmpfile': False,
|
||||
},
|
||||
'calendar_list_events': {
|
||||
'builder': build_calendar_list_events_command,
|
||||
'op': 'calendar.events.list',
|
||||
'success_status': 'events_listed',
|
||||
'uses_tmpfile': False,
|
||||
},
|
||||
'calendar_event_update': {
|
||||
'builder': build_calendar_update_command,
|
||||
'op': 'calendar.update',
|
||||
'success_status': 'event_updated',
|
||||
'uses_tmpfile': False,
|
||||
},
|
||||
'calendar_event_delete': {
|
||||
'builder': build_calendar_delete_command,
|
||||
'op': 'calendar.delete',
|
||||
'success_status': 'event_deleted',
|
||||
'uses_tmpfile': False,
|
||||
},
|
||||
}
|
||||
|
||||
spec = executors.get(kind)
|
||||
|
||||
@@ -31,6 +31,9 @@ SAMPLE_FILES = [
|
||||
'test-send-gmail-draft.json',
|
||||
'test-send-approved-email.json',
|
||||
'test-create-calendar-event.json',
|
||||
'test-list-upcoming-events.json',
|
||||
'test-update-calendar-event.json',
|
||||
'test-delete-calendar-event.json',
|
||||
'test-fetch-and-normalize-url.json',
|
||||
'test-approval-queue-list.json',
|
||||
'test-inbound-event-filter.json',
|
||||
@@ -47,6 +50,9 @@ ROUTER_SNIPPETS = [
|
||||
'send_gmail_draft',
|
||||
'send_approved_email',
|
||||
'create_calendar_event',
|
||||
'list_upcoming_events',
|
||||
'update_calendar_event',
|
||||
'delete_calendar_event',
|
||||
'approval_queue_add',
|
||||
'approval_queue_list',
|
||||
'approval_queue_resolve',
|
||||
@@ -61,6 +67,9 @@ ROUTER_SNIPPETS = [
|
||||
'email_draft_send',
|
||||
'email_draft_delete',
|
||||
'email_list_drafts',
|
||||
'calendar_list_events',
|
||||
'calendar_event_update',
|
||||
'calendar_event_delete',
|
||||
'makeApprovalPolicy',
|
||||
'inboundEvents',
|
||||
'eventDedup',
|
||||
|
||||
Reference in New Issue
Block a user