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}