ikurotime / gitgud

public
main / internal/app/git_access_service.go
928 B · Go Raw
 1package app
 2
 3import (
 4	"context"
 5
 6	"gitgud/internal/domain"
 7)
 8
 9type GitAccessService struct {
10	repos domain.RepositoryRepository
11}
12
13func NewGitAccessService(repos domain.RepositoryRepository) *GitAccessService {
14	return &GitAccessService{repos: repos}
15}
16
17func (s *GitAccessService) Authorize(ctx context.Context, owner, name string, push bool, user *domain.User) (allow, needAuth bool, remoteUser string, err error) {
18	repo, err := s.repos.ByOwnerAndName(ctx, owner, name)
19	if err != nil {
20		return false, false, "", err
21	}
22
23	if push {
24		if user == nil {
25			return false, true, "", nil
26		}
27		if !CanPush(repo, user) {
28			return false, false, "", domain.ErrPermission
29		}
30	} else if repo.IsPrivate {
31		if user == nil {
32			return false, true, "", nil
33		}
34		if err := CanView(repo, user); err != nil {
35			return false, false, "", err
36		}
37	}
38
39	if user != nil {
40		remoteUser = user.Username
41	}
42	return true, false, remoteUser, nil
43}