branch_tag.go

 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}