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