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}