loading up the forgejo repo on tangled to test page performance
1// Copyright 2025 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package packages
5
6import (
7 "context"
8 "fmt"
9
10 org_model "forgejo.org/models/organization"
11 packages_model "forgejo.org/models/packages"
12 access_model "forgejo.org/models/perm/access"
13 repo_model "forgejo.org/models/repo"
14 "forgejo.org/models/unit"
15 user_model "forgejo.org/models/user"
16 "forgejo.org/modules/util"
17)
18
19func LinkToRepository(ctx context.Context, pkg *packages_model.Package, repo *repo_model.Repository, doer *user_model.User) error {
20 if pkg.OwnerID != repo.OwnerID {
21 return util.ErrPermissionDenied
22 }
23 if pkg.RepoID > 0 {
24 return util.ErrInvalidArgument
25 }
26
27 perms, err := access_model.GetUserRepoPermission(ctx, repo, doer)
28 if err != nil {
29 return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err)
30 }
31 if !perms.CanWrite(unit.TypePackages) {
32 return util.ErrPermissionDenied
33 }
34
35 if err := packages_model.SetRepositoryLink(ctx, pkg.ID, repo.ID); err != nil {
36 return fmt.Errorf("error while linking package '%v' to repo '%v' : %w", pkg.Name, repo.FullName(), err)
37 }
38 return nil
39}
40
41func UnlinkFromRepository(ctx context.Context, pkg *packages_model.Package, doer *user_model.User) error {
42 if pkg.RepoID == 0 {
43 return util.ErrInvalidArgument
44 }
45
46 repo, err := repo_model.GetRepositoryByID(ctx, pkg.RepoID)
47 if err != nil && !repo_model.IsErrRepoNotExist(err) {
48 return fmt.Errorf("error getting repository %d: %w", pkg.RepoID, err)
49 }
50 if err == nil {
51 perms, err := access_model.GetUserRepoPermission(ctx, repo, doer)
52 if err != nil {
53 return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err)
54 }
55 if !perms.CanWrite(unit.TypePackages) {
56 return util.ErrPermissionDenied
57 }
58 }
59
60 user, err := user_model.GetUserByID(ctx, pkg.OwnerID)
61 if err != nil {
62 return err
63 }
64 if !doer.IsAdmin {
65 if !user.IsOrganization() {
66 if doer.ID != pkg.OwnerID {
67 return fmt.Errorf("no permission to unlink package '%v' from its repository, or packages are disabled", pkg.Name)
68 }
69 } else {
70 isOrgAdmin, err := org_model.OrgFromUser(user).IsOrgAdmin(ctx, doer.ID)
71 if err != nil {
72 return err
73 } else if !isOrgAdmin {
74 return fmt.Errorf("no permission to unlink package '%v' from its repository, or packages are disabled", pkg.Name)
75 }
76 }
77 }
78 return packages_model.UnlinkRepository(ctx, pkg.ID)
79}