-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrigger.go
More file actions
106 lines (96 loc) · 3.45 KB
/
Copy pathtrigger.go
File metadata and controls
106 lines (96 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package server
import (
"context"
"database/sql"
"github.com/dvflw/mantle/internal/auth"
)
// TriggerRecord represents a registered trigger in the database.
type TriggerRecord struct {
ID string
WorkflowName string
WorkflowVersion int
Type string
Schedule string
Path string
Secret string
Enabled bool
TeamID string
// Email trigger fields (populated only when Type == "email").
Mailbox string
Folder string
Filter string
PollInterval string
}
// Trigger registration lives in the workflow package (workflow.Save), which
// reconciles workflow_triggers whenever a definition is applied. The functions
// below are the read side consumed by the cron scheduler, webhook handler, and
// email poller.
// ListCronTriggers returns all enabled cron triggers, including team_id for proper scoping.
func ListCronTriggers(ctx context.Context, db *sql.DB) ([]TriggerRecord, error) {
rows, err := db.QueryContext(ctx,
`SELECT id, workflow_name, workflow_version, type, COALESCE(schedule, ''), COALESCE(path, ''), enabled, team_id
FROM workflow_triggers WHERE type = 'cron' AND enabled = true`)
if err != nil {
return nil, err
}
defer rows.Close()
return scanTriggers(rows)
}
// LookupWebhookTrigger finds the trigger matching a webhook path, scoped to the team.
func LookupWebhookTrigger(ctx context.Context, db *sql.DB, path string) (*TriggerRecord, error) {
teamID := auth.TeamIDFromContext(ctx)
var t TriggerRecord
err := db.QueryRowContext(ctx,
`SELECT id, workflow_name, workflow_version, type, COALESCE(schedule, ''), COALESCE(path, ''), COALESCE(secret, ''), enabled
FROM workflow_triggers WHERE type = 'webhook' AND path = $1 AND enabled = true AND team_id = $2`, path, teamID,
).Scan(&t.ID, &t.WorkflowName, &t.WorkflowVersion, &t.Type, &t.Schedule, &t.Path, &t.Secret, &t.Enabled)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, err
}
return &t, nil
}
func scanTriggers(rows *sql.Rows) ([]TriggerRecord, error) {
var triggers []TriggerRecord
for rows.Next() {
var t TriggerRecord
if err := rows.Scan(&t.ID, &t.WorkflowName, &t.WorkflowVersion, &t.Type, &t.Schedule, &t.Path, &t.Enabled, &t.TeamID); err != nil {
return nil, err
}
triggers = append(triggers, t)
}
return triggers, rows.Err()
}
// ListEmailTriggers returns all enabled email triggers, including email-specific fields.
func ListEmailTriggers(ctx context.Context, db *sql.DB) ([]TriggerRecord, error) {
rows, err := db.QueryContext(ctx,
`SELECT id, workflow_name, workflow_version, type,
COALESCE(mailbox, ''), COALESCE(folder, 'INBOX'),
COALESCE(filter, 'unseen'), COALESCE(poll_interval, '60s'),
enabled, team_id
FROM workflow_triggers WHERE type = 'email' AND enabled = true`)
if err != nil {
return nil, err
}
defer rows.Close()
return scanEmailTriggers(rows)
}
// scanEmailTriggers scans rows from ListEmailTriggers (10 columns:
// id, workflow_name, workflow_version, type, mailbox, folder, filter, poll_interval, enabled, team_id).
func scanEmailTriggers(rows *sql.Rows) ([]TriggerRecord, error) {
var triggers []TriggerRecord
for rows.Next() {
var t TriggerRecord
if err := rows.Scan(
&t.ID, &t.WorkflowName, &t.WorkflowVersion, &t.Type,
&t.Mailbox, &t.Folder, &t.Filter, &t.PollInterval,
&t.Enabled, &t.TeamID,
); err != nil {
return nil, err
}
triggers = append(triggers, t)
}
return triggers, rows.Err()
}