@hed-hog/core 0.0.325 → 0.0.327

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/core.module.d.ts.map +1 -1
  2. package/dist/core.module.js +3 -0
  3. package/dist/core.module.js.map +1 -1
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +4 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/integration/services/outbox.processor.d.ts.map +1 -1
  9. package/dist/integration/services/outbox.processor.js +1 -0
  10. package/dist/integration/services/outbox.processor.js.map +1 -1
  11. package/dist/integration/types/event.types.d.ts +1 -0
  12. package/dist/integration/types/event.types.d.ts.map +1 -1
  13. package/dist/mail/mail.controller.d.ts +2 -0
  14. package/dist/mail/mail.controller.d.ts.map +1 -1
  15. package/dist/mail/mail.module.d.ts.map +1 -1
  16. package/dist/mail/mail.module.js +33 -53
  17. package/dist/mail/mail.module.js.map +1 -1
  18. package/dist/mail/mail.service.d.ts +5 -1
  19. package/dist/mail/mail.service.d.ts.map +1 -1
  20. package/dist/mail/mail.service.js +64 -84
  21. package/dist/mail/mail.service.js.map +1 -1
  22. package/dist/role/role.service.d.ts +3 -1
  23. package/dist/role/role.service.d.ts.map +1 -1
  24. package/dist/role/role.service.js +33 -5
  25. package/dist/role/role.service.js.map +1 -1
  26. package/dist/setting/setting.service.d.ts.map +1 -1
  27. package/dist/setting/setting.service.js +1 -0
  28. package/dist/setting/setting.service.js.map +1 -1
  29. package/dist/user/user.service.d.ts +3 -1
  30. package/dist/user/user.service.d.ts.map +1 -1
  31. package/dist/user/user.service.js +31 -4
  32. package/dist/user/user.service.js.map +1 -1
  33. package/dist/webhook-integration/event-webhook.controller.d.ts +29 -0
  34. package/dist/webhook-integration/event-webhook.controller.d.ts.map +1 -0
  35. package/dist/webhook-integration/event-webhook.controller.js +93 -0
  36. package/dist/webhook-integration/event-webhook.controller.js.map +1 -0
  37. package/dist/webhook-integration/event-webhook.service.d.ts +54 -0
  38. package/dist/webhook-integration/event-webhook.service.d.ts.map +1 -0
  39. package/dist/webhook-integration/event-webhook.service.js +334 -0
  40. package/dist/webhook-integration/event-webhook.service.js.map +1 -0
  41. package/dist/webhook-integration/integration-event-catalog.controller.d.ts +21 -0
  42. package/dist/webhook-integration/integration-event-catalog.controller.d.ts.map +1 -0
  43. package/dist/webhook-integration/integration-event-catalog.controller.js +91 -0
  44. package/dist/webhook-integration/integration-event-catalog.controller.js.map +1 -0
  45. package/dist/webhook-integration/integration-event-catalog.service.d.ts +26 -0
  46. package/dist/webhook-integration/integration-event-catalog.service.d.ts.map +1 -0
  47. package/dist/webhook-integration/integration-event-catalog.service.js +112 -0
  48. package/dist/webhook-integration/integration-event-catalog.service.js.map +1 -0
  49. package/dist/webhook-integration/webhook-integration.controller.d.ts +44 -0
  50. package/dist/webhook-integration/webhook-integration.controller.d.ts.map +1 -0
  51. package/dist/webhook-integration/webhook-integration.controller.js +181 -0
  52. package/dist/webhook-integration/webhook-integration.controller.js.map +1 -0
  53. package/dist/webhook-integration/webhook-integration.module.d.ts +3 -0
  54. package/dist/webhook-integration/webhook-integration.module.d.ts.map +1 -0
  55. package/dist/webhook-integration/webhook-integration.module.js +54 -0
  56. package/dist/webhook-integration/webhook-integration.module.js.map +1 -0
  57. package/dist/webhook-integration/webhook-integration.service.d.ts +73 -0
  58. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -0
  59. package/dist/webhook-integration/webhook-integration.service.js +569 -0
  60. package/dist/webhook-integration/webhook-integration.service.js.map +1 -0
  61. package/dist/webhook-integration/webhook-utils.d.ts +7 -0
  62. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -0
  63. package/dist/webhook-integration/webhook-utils.js +104 -0
  64. package/dist/webhook-integration/webhook-utils.js.map +1 -0
  65. package/hedhog/data/integration_event_catalog.yaml +118 -0
  66. package/hedhog/data/mail_profile.yaml +18 -0
  67. package/hedhog/data/menu.yaml +26 -12
  68. package/hedhog/data/route.yaml +152 -8
  69. package/hedhog/data/setting_group.yaml +7 -156
  70. package/hedhog/data/setting_subgroup.yaml +0 -32
  71. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +205 -0
  72. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +1835 -0
  73. package/hedhog/frontend/messages/en.json +2 -1
  74. package/hedhog/frontend/messages/pt.json +2 -1
  75. package/hedhog/table/event_webhook.yaml +55 -0
  76. package/hedhog/table/event_webhook_delivery_log.yaml +66 -0
  77. package/hedhog/table/event_webhook_event.yaml +26 -0
  78. package/hedhog/table/integration_event_catalog.yaml +41 -0
  79. package/hedhog/table/setting.yaml +1 -0
  80. package/hedhog/table/webhook_action.yaml +85 -0
  81. package/hedhog/table/webhook_call_log.yaml +46 -0
  82. package/hedhog/table/webhook_integration.yaml +43 -0
  83. package/package.json +3 -3
  84. package/src/core.module.ts +10 -7
  85. package/src/index.ts +10 -5
  86. package/src/integration/services/outbox.processor.ts +5 -4
  87. package/src/integration/types/event.types.ts +4 -3
  88. package/src/mail/mail.module.ts +36 -59
  89. package/src/mail/mail.service.ts +84 -89
  90. package/src/role/role.service.ts +41 -8
  91. package/src/setting/setting.service.ts +7 -6
  92. package/src/user/user.service.ts +34 -3
  93. package/src/webhook-integration/event-webhook.controller.ts +50 -0
  94. package/src/webhook-integration/event-webhook.service.ts +384 -0
  95. package/src/webhook-integration/integration-event-catalog.controller.ts +50 -0
  96. package/src/webhook-integration/integration-event-catalog.service.ts +117 -0
  97. package/src/webhook-integration/webhook-integration.controller.ts +103 -0
  98. package/src/webhook-integration/webhook-integration.module.ts +45 -0
  99. package/src/webhook-integration/webhook-integration.service.ts +735 -0
  100. package/src/webhook-integration/webhook-utils.ts +79 -0
@@ -1,5 +1,6 @@
1
1
  import { Button } from '@/components/ui/button';
2
2
  import { Checkbox } from '@/components/ui/checkbox';
3
+ import { EntityPicker } from '@/components/ui/entity-picker';
3
4
  import { Input } from '@/components/ui/input';
4
5
  import { Label } from '@/components/ui/label';
5
6
  import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
@@ -430,6 +431,210 @@ export const SettingField = ({ setting, className }: SettingFieldProps) => {
430
431
  </div>
431
432
  );
432
433
 
434
+ case SettingComponentEnum.ENTITY_PICKER:
435
+ if (setting.slug !== 'mail-profile-id') {
436
+ return (
437
+ <Input
438
+ type="text"
439
+ value={parsedValue || ''}
440
+ onChange={(e) => handleChangeValue(formatValue(e.target.value))}
441
+ className={cn(className, 'bg-background')}
442
+ />
443
+ );
444
+ }
445
+ return (
446
+ <EntityPicker
447
+ placeholder={t('selectMailProfile')}
448
+ value={parsedValue ? Number(parsedValue) : null}
449
+ onChange={(id) =>
450
+ handleChangeValue(id != null ? String(id) : '', true)
451
+ }
452
+ valueType="number"
453
+ loadOptions={async ({ page, pageSize, search }) => {
454
+ const qs = new URLSearchParams({
455
+ page: String(page),
456
+ pageSize: String(pageSize),
457
+ });
458
+ if (search) qs.set('search', search);
459
+ const response: any = await request({
460
+ url: `/mail-profile?${qs}`,
461
+ });
462
+ const paged = response.data;
463
+ return {
464
+ items: paged?.data ?? [],
465
+ hasMore: (paged?.page ?? 0) < (paged?.lastPage ?? 0),
466
+ };
467
+ }}
468
+ getOptionValue={(opt) => opt.id as number}
469
+ getOptionLabel={(opt) => String(opt.name ?? '')}
470
+ getOptionDescription={(opt) => String((opt as any).from_email ?? '')}
471
+ mapSearchToCreateValues={(search) => ({
472
+ name: search,
473
+ provider: 'SMTP',
474
+ })}
475
+ showCreateButton
476
+ onCreate={async (values) => {
477
+ const slug = (values.name || 'profile')
478
+ .toLowerCase()
479
+ .normalize('NFD')
480
+ .replace(/[\u0300-\u036f]/g, '')
481
+ .replace(/[^a-z0-9]+/g, '-')
482
+ .replace(/^-+|-+$/g, '');
483
+ const response: any = await request({
484
+ url: '/mail-profile',
485
+ method: 'POST',
486
+ data: { ...values, slug },
487
+ });
488
+ return response.data;
489
+ }}
490
+ renderCreateContent={({ values, setValue }) => {
491
+ const provider = values.provider || 'SMTP';
492
+ return (
493
+ <div className="space-y-4">
494
+ <div className="space-y-1">
495
+ <Label>Name *</Label>
496
+ <Input
497
+ value={values.name || ''}
498
+ onChange={(e) => setValue('name', e.target.value)}
499
+ placeholder="My Mail Profile"
500
+ />
501
+ </div>
502
+ <div className="space-y-1">
503
+ <Label>From Email *</Label>
504
+ <Input
505
+ type="email"
506
+ value={values.from_email || ''}
507
+ onChange={(e) => setValue('from_email', e.target.value)}
508
+ placeholder="no-reply@example.com"
509
+ />
510
+ </div>
511
+ <div className="space-y-1">
512
+ <Label>Provider *</Label>
513
+ <Select
514
+ value={provider}
515
+ onValueChange={(v) => setValue('provider', v)}
516
+ >
517
+ <SelectTrigger className="w-full">
518
+ <SelectValue />
519
+ </SelectTrigger>
520
+ <SelectContent>
521
+ <SelectItem value="SMTP">SMTP</SelectItem>
522
+ <SelectItem value="GMAIL">Gmail</SelectItem>
523
+ <SelectItem value="SES">Amazon SES</SelectItem>
524
+ </SelectContent>
525
+ </Select>
526
+ </div>
527
+ {provider === 'SMTP' && (
528
+ <>
529
+ <div className="space-y-1">
530
+ <Label>SMTP Host *</Label>
531
+ <Input
532
+ value={values.smtp_host || ''}
533
+ onChange={(e) => setValue('smtp_host', e.target.value)}
534
+ placeholder="smtp.example.com"
535
+ />
536
+ </div>
537
+ <div className="space-y-1">
538
+ <Label>SMTP Port *</Label>
539
+ <Input
540
+ type="number"
541
+ value={values.smtp_port || '587'}
542
+ onChange={(e) => setValue('smtp_port', e.target.value)}
543
+ placeholder="587"
544
+ />
545
+ </div>
546
+ <div className="space-y-1">
547
+ <Label>SMTP Username *</Label>
548
+ <Input
549
+ value={values.smtp_username || ''}
550
+ onChange={(e) =>
551
+ setValue('smtp_username', e.target.value)
552
+ }
553
+ placeholder="user@example.com"
554
+ />
555
+ </div>
556
+ <div className="space-y-1">
557
+ <Label>SMTP Password *</Label>
558
+ <Input
559
+ type="password"
560
+ value={values.smtp_password || ''}
561
+ onChange={(e) =>
562
+ setValue('smtp_password', e.target.value)
563
+ }
564
+ />
565
+ </div>
566
+ </>
567
+ )}
568
+ {provider === 'GMAIL' && (
569
+ <>
570
+ <div className="space-y-1">
571
+ <Label>Client ID *</Label>
572
+ <Input
573
+ value={values.gmail_client_id || ''}
574
+ onChange={(e) =>
575
+ setValue('gmail_client_id', e.target.value)
576
+ }
577
+ />
578
+ </div>
579
+ <div className="space-y-1">
580
+ <Label>Client Secret *</Label>
581
+ <Input
582
+ type="password"
583
+ value={values.gmail_client_secret || ''}
584
+ onChange={(e) =>
585
+ setValue('gmail_client_secret', e.target.value)
586
+ }
587
+ />
588
+ </div>
589
+ <div className="space-y-1">
590
+ <Label>Refresh Token *</Label>
591
+ <Input
592
+ value={values.gmail_refresh_token || ''}
593
+ onChange={(e) =>
594
+ setValue('gmail_refresh_token', e.target.value)
595
+ }
596
+ />
597
+ </div>
598
+ </>
599
+ )}
600
+ {provider === 'SES' && (
601
+ <>
602
+ <div className="space-y-1">
603
+ <Label>Access Key ID *</Label>
604
+ <Input
605
+ value={values.ses_access_key_id || ''}
606
+ onChange={(e) =>
607
+ setValue('ses_access_key_id', e.target.value)
608
+ }
609
+ />
610
+ </div>
611
+ <div className="space-y-1">
612
+ <Label>Secret Access Key *</Label>
613
+ <Input
614
+ type="password"
615
+ value={values.ses_secret_access_key || ''}
616
+ onChange={(e) =>
617
+ setValue('ses_secret_access_key', e.target.value)
618
+ }
619
+ />
620
+ </div>
621
+ <div className="space-y-1">
622
+ <Label>Region *</Label>
623
+ <Input
624
+ value={values.ses_region || ''}
625
+ onChange={(e) => setValue('ses_region', e.target.value)}
626
+ placeholder="us-east-1"
627
+ />
628
+ </div>
629
+ </>
630
+ )}
631
+ </div>
632
+ );
633
+ }}
634
+ className={cn(className, 'w-full min-w-0 md:min-w-50')}
635
+ />
636
+ );
637
+
433
638
  default:
434
639
  return (
435
640
  <Input