summaryrefslogtreecommitdiffstats
path: root/models/repo/repo_flags.go
blob: de76ed2b3798d7290f83d79273469b55e1cc7e14 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
// SPDX-License-Identifier: MIT

package repo

import (
	"context"

	"code.gitea.io/gitea/models/db"

	"xorm.io/builder"
)

// RepoFlag represents a single flag against a repository
type RepoFlag struct { //revive:disable-line:exported
	ID     int64  `xorm:"pk autoincr"`
	RepoID int64  `xorm:"UNIQUE(s) INDEX"`
	Name   string `xorm:"UNIQUE(s) INDEX"`
}

func init() {
	db.RegisterModel(new(RepoFlag))
}

// TableName provides the real table name
func (RepoFlag) TableName() string {
	return "forgejo_repo_flag"
}

// ListFlags returns the array of flags on the repo.
func (repo *Repository) ListFlags(ctx context.Context) ([]RepoFlag, error) {
	var flags []RepoFlag
	err := db.GetEngine(ctx).Table(&RepoFlag{}).Where("repo_id = ?", repo.ID).Find(&flags)
	if err != nil {
		return nil, err
	}
	return flags, nil
}

// IsFlagged returns whether a repo has any flags or not
func (repo *Repository) IsFlagged(ctx context.Context) bool {
	has, _ := db.Exist[RepoFlag](ctx, builder.Eq{"repo_id": repo.ID})
	return has
}

// GetFlag returns a single RepoFlag based on its name
func (repo *Repository) GetFlag(ctx context.Context, flagName string) (bool, *RepoFlag, error) {
	flag, has, err := db.Get[RepoFlag](ctx, builder.Eq{"repo_id": repo.ID, "name": flagName})
	if err != nil {
		return false, nil, err
	}
	return has, flag, nil
}

// HasFlag returns true if a repo has a given flag, false otherwise
func (repo *Repository) HasFlag(ctx context.Context, flagName string) bool {
	has, _ := db.Exist[RepoFlag](ctx, builder.Eq{"repo_id": repo.ID, "name": flagName})
	return has
}

// AddFlag adds a new flag to the repo
func (repo *Repository) AddFlag(ctx context.Context, flagName string) error {
	return db.Insert(ctx, RepoFlag{
		RepoID: repo.ID,
		Name:   flagName,
	})
}

// DeleteFlag removes a flag from the repo
func (repo *Repository) DeleteFlag(ctx context.Context, flagName string) (int64, error) {
	return db.DeleteByBean(ctx, &RepoFlag{RepoID: repo.ID, Name: flagName})
}

// ReplaceAllFlags replaces all flags of a repo with a new set
func (repo *Repository) ReplaceAllFlags(ctx context.Context, flagNames []string) error {
	ctx, committer, err := db.TxContext(ctx)
	if err != nil {
		return err
	}
	defer committer.Close()

	if err := db.DeleteBeans(ctx, &RepoFlag{RepoID: repo.ID}); err != nil {
		return err
	}

	if len(flagNames) == 0 {
		return committer.Commit()
	}

	var flags []RepoFlag
	for _, name := range flagNames {
		flags = append(flags, RepoFlag{
			RepoID: repo.ID,
			Name:   name,
		})
	}
	if err := db.Insert(ctx, &flags); err != nil {
		return err
	}

	return committer.Commit()
}