EventTriggerList.utils.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import {
  2. ident,
  3. joinSqlFragments,
  4. keyword,
  5. literal,
  6. safeSql,
  7. type SafeSqlFragment,
  8. } from '@supabase/pg-meta'
  9. import type { DatabaseEventTrigger } from '@/data/database-event-triggers/database-event-triggers-query'
  10. export type EventTrigger = Omit<DatabaseEventTrigger, 'function_definition'> & {
  11. function_definition: SafeSqlFragment | null
  12. }
  13. export const generateEventTriggerCreateSQL = (trigger: EventTrigger): SafeSqlFragment => {
  14. const parts: SafeSqlFragment[] = []
  15. if (trigger.function_definition) {
  16. const hasTrailingSemicolon = /;\s*$/.test(trigger.function_definition)
  17. parts.push(
  18. hasTrailingSemicolon ? trigger.function_definition : safeSql`${trigger.function_definition};`
  19. )
  20. }
  21. if (trigger.event && trigger.function_schema && trigger.function_name) {
  22. parts.push(safeSql`DROP EVENT TRIGGER IF EXISTS ${ident(trigger.name)};`)
  23. const tagClause =
  24. trigger.tags && trigger.tags.length > 0
  25. ? safeSql`\nWHEN TAG IN (${joinSqlFragments(
  26. trigger.tags.map((tag) => literal(tag)),
  27. ', '
  28. )})`
  29. : safeSql``
  30. parts.push(safeSql`CREATE EVENT TRIGGER ${ident(trigger.name)}
  31. ON ${keyword(trigger.event)}${tagClause}
  32. EXECUTE FUNCTION ${ident(trigger.function_schema)}.${ident(trigger.function_name)}();`)
  33. }
  34. return parts.length > 0 ? joinSqlFragments(parts, '\n\n') : safeSql``
  35. }