1// Package webhook provides webhook functionality.
2package webhook
3
4import (
5 "context"
6 "fmt"
7
8 "github.com/charmbracelet/soft-serve/git"
9 "github.com/charmbracelet/soft-serve/pkg/config"
10 "github.com/charmbracelet/soft-serve/pkg/db"
11 "github.com/charmbracelet/soft-serve/pkg/proto"
12 "github.com/charmbracelet/soft-serve/pkg/store"
13)
14
15// BranchTagEvent is a branch or tag event.
16type BranchTagEvent struct {
17 Common
18
19 // Ref is the branch or tag name.
20 Ref string `json:"ref" url:"ref"`
21 // Before is the previous commit SHA.
22 Before string `json:"before" url:"before"`
23 // After is the current commit SHA.
24 After string `json:"after" url:"after"`
25 // Created is whether the branch or tag was created.
26 Created bool `json:"created" url:"created"`
27 // Deleted is whether the branch or tag was deleted.
28 Deleted bool `json:"deleted" url:"deleted"`
29}
30
31// NewBranchTagEvent sends a branch or tag event.
32func NewBranchTagEvent(ctx context.Context, user proto.User, repo proto.Repository, ref, before, after string) (BranchTagEvent, error) {
33 var event Event
34 if git.IsZeroHash(before) {
35 event = EventBranchTagCreate
36 } else if git.IsZeroHash(after) {
37 event = EventBranchTagDelete
38 } else {
39 return BranchTagEvent{}, fmt.Errorf("invalid branch or tag event: before=%q after=%q", before, after)
40 }
41
42 payload := BranchTagEvent{
43 Ref: ref,
44 Before: before,
45 After: after,
46 Created: git.IsZeroHash(before),
47 Deleted: git.IsZeroHash(after),
48 Common: Common{
49 EventType: event,
50 Repository: Repository{
51 ID: repo.ID(),
52 Name: repo.Name(),
53 Description: repo.Description(),
54 ProjectName: repo.ProjectName(),
55 Private: repo.IsPrivate(),
56 CreatedAt: repo.CreatedAt(),
57 UpdatedAt: repo.UpdatedAt(),
58 },
59 Sender: User{
60 ID: user.ID(),
61 Username: user.Username(),
62 },
63 },
64 }
65
66 cfg := config.FromContext(ctx)
67 payload.Repository.HTTPURL = repoURL(cfg.HTTP.PublicURL, repo.Name())
68 payload.Repository.SSHURL = repoURL(cfg.SSH.PublicURL, repo.Name())
69 payload.Repository.GitURL = repoURL(cfg.Git.PublicURL, repo.Name())
70
71 // Find repo owner.
72 dbx := db.FromContext(ctx)
73 datastore := store.FromContext(ctx)
74 owner, err := datastore.GetUserByID(ctx, dbx, repo.UserID())
75 if err != nil {
76 return BranchTagEvent{}, db.WrapError(err) //nolint:wrapcheck
77 }
78
79 payload.Repository.Owner.ID = owner.ID
80 payload.Repository.Owner.Username = owner.Username
81 payload.Repository.DefaultBranch, _ = getDefaultBranch(repo)
82
83 return payload, nil
84}