Files
2026-01-06 23:23:47 +00:00

113 lines
3.8 KiB
Go

package webhooks
import (
"github.com/OliveTin/OliveTin/internal/config"
)
// ApplyGitHubTemplate applies GitHub-specific template configurations
// This allows users to use simple template names instead of configuring everything manually
func ApplyGitHubTemplate(cfg *config.WebhookConfig, template string) {
applier := getTemplateApplier(template)
if applier != nil {
applier(cfg)
}
}
type templateApplier func(*config.WebhookConfig)
func getTemplateApplier(template string) templateApplier {
templateMap := map[string]templateApplier{
"github-push": applyGitHubPushTemplate,
"github-pr": applyGitHubPRTemplate,
"github-pull-request": applyGitHubPRTemplate,
"github-release": applyGitHubReleaseTemplate,
"github-workflow": applyGitHubWorkflowTemplate,
}
return templateMap[template]
}
func setDefaultAuth(cfg *config.WebhookConfig) {
if cfg.AuthHeader == "" {
cfg.AuthHeader = "X-Hub-Signature-256"
}
if cfg.AuthType == "" {
cfg.AuthType = "hmac-sha256"
}
}
func ensureMatchHeaders(cfg *config.WebhookConfig) {
if len(cfg.MatchHeaders) == 0 {
cfg.MatchHeaders = make(map[string]string)
}
}
func ensureExtract(cfg *config.WebhookConfig) {
if len(cfg.Extract) == 0 {
cfg.Extract = make(map[string]string)
}
}
func setExtractIfMissing(cfg *config.WebhookConfig, key, value string) {
if _, exists := cfg.Extract[key]; !exists {
cfg.Extract[key] = value
}
}
func setMatchHeaderIfMissing(cfg *config.WebhookConfig, key, value string) {
if _, exists := cfg.MatchHeaders[key]; !exists {
cfg.MatchHeaders[key] = value
}
}
func applyGitHubPushTemplate(cfg *config.WebhookConfig) {
setDefaultAuth(cfg)
ensureMatchHeaders(cfg)
setMatchHeaderIfMissing(cfg, "X-GitHub-Event", "push")
ensureExtract(cfg)
setExtractIfMissing(cfg, "git_repository", "$.repository.full_name")
setExtractIfMissing(cfg, "git_ref", "$.ref")
setExtractIfMissing(cfg, "git_commit", "$.head_commit.id")
setExtractIfMissing(cfg, "git_branch", "$.ref")
setExtractIfMissing(cfg, "git_message", "$.head_commit.message")
setExtractIfMissing(cfg, "git_author", "$.head_commit.author.name")
}
func applyGitHubPRTemplate(cfg *config.WebhookConfig) {
setDefaultAuth(cfg)
ensureMatchHeaders(cfg)
setMatchHeaderIfMissing(cfg, "X-GitHub-Event", "pull_request")
ensureExtract(cfg)
setExtractIfMissing(cfg, "pr_number", "$.number")
setExtractIfMissing(cfg, "pr_title", "$.pull_request.title")
setExtractIfMissing(cfg, "pr_author", "$.pull_request.user.login")
setExtractIfMissing(cfg, "pr_action", "$.action")
setExtractIfMissing(cfg, "git_repository", "$.repository.full_name")
setExtractIfMissing(cfg, "pr_state", "$.pull_request.state")
setExtractIfMissing(cfg, "pr_head_sha", "$.pull_request.head.sha")
}
func applyGitHubReleaseTemplate(cfg *config.WebhookConfig) {
setDefaultAuth(cfg)
ensureMatchHeaders(cfg)
setMatchHeaderIfMissing(cfg, "X-GitHub-Event", "release")
ensureExtract(cfg)
setExtractIfMissing(cfg, "release_action", "$.action")
setExtractIfMissing(cfg, "release_tag", "$.release.tag_name")
setExtractIfMissing(cfg, "release_name", "$.release.name")
setExtractIfMissing(cfg, "git_repository", "$.repository.full_name")
setExtractIfMissing(cfg, "release_author", "$.release.author.login")
}
func applyGitHubWorkflowTemplate(cfg *config.WebhookConfig) {
setDefaultAuth(cfg)
ensureMatchHeaders(cfg)
setMatchHeaderIfMissing(cfg, "X-GitHub-Event", "workflow_run")
ensureExtract(cfg)
setExtractIfMissing(cfg, "workflow_name", "$.workflow_run.name")
setExtractIfMissing(cfg, "workflow_status", "$.workflow_run.status")
setExtractIfMissing(cfg, "workflow_conclusion", "$.workflow_run.conclusion")
setExtractIfMissing(cfg, "git_repository", "$.repository.full_name")
setExtractIfMissing(cfg, "git_commit", "$.workflow_run.head_sha")
setExtractIfMissing(cfg, "git_branch", "$.workflow_run.head_branch")
}