mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Move AddCollabrator and CreateRepositoryByExample to service layer (#32419)
- [x] Move `CreateRepositoryByExample` to service layer - [x] Move `AddCollabrator` to service layer - [x] Add a new parameter for `AddCollabrator` so that changing mode immediately after that will become unnecessary.
This commit is contained in:
		| @@ -12,9 +12,15 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/models/db" | ||||
| 	"code.gitea.io/gitea/models/organization" | ||||
| 	"code.gitea.io/gitea/models/perm" | ||||
| 	access_model "code.gitea.io/gitea/models/perm/access" | ||||
| 	repo_model "code.gitea.io/gitea/models/repo" | ||||
| 	"code.gitea.io/gitea/models/unit" | ||||
| 	user_model "code.gitea.io/gitea/models/user" | ||||
| 	"code.gitea.io/gitea/models/webhook" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/gitrepo" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| @@ -243,7 +249,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt | ||||
| 	var rollbackRepo *repo_model.Repository | ||||
|  | ||||
| 	if err := db.WithTx(ctx, func(ctx context.Context) error { | ||||
| 		if err := repo_module.CreateRepositoryByExample(ctx, doer, u, repo, false, false); err != nil { | ||||
| 		if err := CreateRepositoryByExample(ctx, doer, u, repo, false, false); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| @@ -335,3 +341,136 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt | ||||
|  | ||||
| 	return repo, nil | ||||
| } | ||||
|  | ||||
| // CreateRepositoryByExample creates a repository for the user/organization. | ||||
| func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository, overwriteOrAdopt, isFork bool) (err error) { | ||||
| 	if err = repo_model.IsUsableRepoName(repo.Name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	has, err := repo_model.IsRepositoryModelExist(ctx, u, repo.Name) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("IsRepositoryExist: %w", err) | ||||
| 	} else if has { | ||||
| 		return repo_model.ErrRepoAlreadyExist{ | ||||
| 			Uname: u.Name, | ||||
| 			Name:  repo.Name, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	repoPath := repo_model.RepoPath(u.Name, repo.Name) | ||||
| 	isExist, err := util.IsExist(repoPath) | ||||
| 	if err != nil { | ||||
| 		log.Error("Unable to check if %s exists. Error: %v", repoPath, err) | ||||
| 		return err | ||||
| 	} | ||||
| 	if !overwriteOrAdopt && isExist { | ||||
| 		log.Error("Files already exist in %s and we are not going to adopt or delete.", repoPath) | ||||
| 		return repo_model.ErrRepoFilesAlreadyExist{ | ||||
| 			Uname: u.Name, | ||||
| 			Name:  repo.Name, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if err = db.Insert(ctx, repo); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err = repo_model.DeleteRedirect(ctx, u.ID, repo.Name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// insert units for repo | ||||
| 	defaultUnits := unit.DefaultRepoUnits | ||||
| 	if isFork { | ||||
| 		defaultUnits = unit.DefaultForkRepoUnits | ||||
| 	} | ||||
| 	units := make([]repo_model.RepoUnit, 0, len(defaultUnits)) | ||||
| 	for _, tp := range defaultUnits { | ||||
| 		if tp == unit.TypeIssues { | ||||
| 			units = append(units, repo_model.RepoUnit{ | ||||
| 				RepoID: repo.ID, | ||||
| 				Type:   tp, | ||||
| 				Config: &repo_model.IssuesConfig{ | ||||
| 					EnableTimetracker:                setting.Service.DefaultEnableTimetracking, | ||||
| 					AllowOnlyContributorsToTrackTime: setting.Service.DefaultAllowOnlyContributorsToTrackTime, | ||||
| 					EnableDependencies:               setting.Service.DefaultEnableDependencies, | ||||
| 				}, | ||||
| 			}) | ||||
| 		} else if tp == unit.TypePullRequests { | ||||
| 			units = append(units, repo_model.RepoUnit{ | ||||
| 				RepoID: repo.ID, | ||||
| 				Type:   tp, | ||||
| 				Config: &repo_model.PullRequestsConfig{ | ||||
| 					AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true, | ||||
| 					DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), | ||||
| 					AllowRebaseUpdate: true, | ||||
| 				}, | ||||
| 			}) | ||||
| 		} else if tp == unit.TypeProjects { | ||||
| 			units = append(units, repo_model.RepoUnit{ | ||||
| 				RepoID: repo.ID, | ||||
| 				Type:   tp, | ||||
| 				Config: &repo_model.ProjectsConfig{ProjectsMode: repo_model.ProjectsModeAll}, | ||||
| 			}) | ||||
| 		} else { | ||||
| 			units = append(units, repo_model.RepoUnit{ | ||||
| 				RepoID: repo.ID, | ||||
| 				Type:   tp, | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if err = db.Insert(ctx, units); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Remember visibility preference. | ||||
| 	u.LastRepoVisibility = repo.IsPrivate | ||||
| 	if err = user_model.UpdateUserCols(ctx, u, "last_repo_visibility"); err != nil { | ||||
| 		return fmt.Errorf("UpdateUserCols: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	if err = user_model.IncrUserRepoNum(ctx, u.ID); err != nil { | ||||
| 		return fmt.Errorf("IncrUserRepoNum: %w", err) | ||||
| 	} | ||||
| 	u.NumRepos++ | ||||
|  | ||||
| 	// Give access to all members in teams with access to all repositories. | ||||
| 	if u.IsOrganization() { | ||||
| 		teams, err := organization.FindOrgTeams(ctx, u.ID) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("FindOrgTeams: %w", err) | ||||
| 		} | ||||
| 		for _, t := range teams { | ||||
| 			if t.IncludesAllRepositories { | ||||
| 				if err := models.AddRepository(ctx, t, repo); err != nil { | ||||
| 					return fmt.Errorf("AddRepository: %w", err) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if isAdmin, err := access_model.IsUserRepoAdmin(ctx, repo, doer); err != nil { | ||||
| 			return fmt.Errorf("IsUserRepoAdmin: %w", err) | ||||
| 		} else if !isAdmin { | ||||
| 			// Make creator repo admin if it wasn't assigned automatically | ||||
| 			if err = AddOrUpdateCollaborator(ctx, repo, doer, perm.AccessModeAdmin); err != nil { | ||||
| 				return fmt.Errorf("AddCollaborator: %w", err) | ||||
| 			} | ||||
| 		} | ||||
| 	} else if err = access_model.RecalculateAccesses(ctx, repo); err != nil { | ||||
| 		// Organization automatically called this in AddRepository method. | ||||
| 		return fmt.Errorf("RecalculateAccesses: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	if setting.Service.AutoWatchNewRepos { | ||||
| 		if err = repo_model.WatchRepo(ctx, doer, repo, true); err != nil { | ||||
| 			return fmt.Errorf("WatchRepo: %w", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if err = webhook.CopyDefaultWebhooksToRepo(ctx, repo.ID); err != nil { | ||||
| 		return fmt.Errorf("CopyDefaultWebhooksToRepo: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user