repository.go

 1package webhook
 2
 3import (
 4	"context"
 5
 6	"github.com/charmbracelet/soft-serve/pkg/config"
 7	"github.com/charmbracelet/soft-serve/pkg/db"
 8	"github.com/charmbracelet/soft-serve/pkg/proto"
 9	"github.com/charmbracelet/soft-serve/pkg/store"
10)
11
12// RepositoryEvent is a repository payload.
13type RepositoryEvent struct {
14	Common
15
16	// Action is the repository event action.
17	Action RepositoryEventAction `json:"action" url:"action"`
18}
19
20// RepositoryEventAction is a repository event action.
21type RepositoryEventAction string
22
23const (
24	// RepositoryEventActionDelete is a repository deleted event.
25	RepositoryEventActionDelete RepositoryEventAction = "delete"
26	// RepositoryEventActionRename is a repository renamed event.
27	RepositoryEventActionRename RepositoryEventAction = "rename"
28	// RepositoryEventActionVisibilityChange is a repository visibility changed event.
29	RepositoryEventActionVisibilityChange RepositoryEventAction = "visibility_change"
30	// RepositoryEventActionDefaultBranchChange is a repository default branch changed event.
31	RepositoryEventActionDefaultBranchChange RepositoryEventAction = "default_branch_change"
32)
33
34// NewRepositoryEvent sends a repository event.
35func NewRepositoryEvent(ctx context.Context, user proto.User, repo proto.Repository, action RepositoryEventAction) (RepositoryEvent, error) {
36	var event Event
37	switch action {
38	case RepositoryEventActionVisibilityChange:
39		event = EventRepositoryVisibilityChange
40	case RepositoryEventActionDelete, RepositoryEventActionRename, RepositoryEventActionDefaultBranchChange:
41		event = EventRepository
42	default:
43		event = EventRepository
44	}
45
46	payload := RepositoryEvent{
47		Action: action,
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 RepositoryEvent{}, db.WrapError(err)
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}