forgejo/services/f3/driver/label.go

127 lines
2.8 KiB
Go

// SPDX-License-Identifier: MIT
package driver
import (
"context"
"fmt"
"code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
"lab.forgefriends.org/friendlyforgeformat/gof3/format"
"lab.forgefriends.org/friendlyforgeformat/gof3/util"
)
type Label struct {
issues_model.Label
}
func LabelConverter(f *issues_model.Label) *Label {
return &Label{
Label: *f,
}
}
func (o Label) GetID() int64 {
return o.ID
}
func (o Label) GetName() string {
return o.Name
}
func (o *Label) SetID(id int64) {
o.ID = id
}
func (o *Label) IsNil() bool {
return o.ID == 0
}
func (o *Label) Equals(other *Label) bool {
return o.Name == other.Name
}
func (o *Label) ToFormat() *format.Label {
return &format.Label{
Common: format.NewCommon(o.ID),
Name: o.Name,
Color: o.Color,
Description: o.Description,
}
}
func (o *Label) FromFormat(label *format.Label) {
*o = Label{
Label: issues_model.Label{
ID: label.GetID(),
Name: label.Name,
Description: label.Description,
Color: label.Color,
},
}
}
type LabelProvider struct {
g *Forgejo
project *ProjectProvider
}
func (o *LabelProvider) ToFormat(ctx context.Context, label *Label) *format.Label {
return label.ToFormat()
}
func (o *LabelProvider) FromFormat(ctx context.Context, m *format.Label) *Label {
var label Label
label.FromFormat(m)
return &label
}
func (o *LabelProvider) GetObjects(ctx context.Context, user *User, project *Project, page int) []*Label {
labels, err := issues_model.GetLabelsByRepoID(ctx, project.GetID(), "", db.ListOptions{Page: page, PageSize: o.g.perPage})
if err != nil {
panic(fmt.Errorf("error while listing labels: %v", err))
}
r := util.ConvertMap[*issues_model.Label, *Label](labels, LabelConverter)
if o.project != nil {
o.project.labels = util.NewNameIDMap[*Label](r)
}
return r
}
func (o *LabelProvider) ProcessObject(ctx context.Context, user *User, project *Project, label *Label) {
}
func (o *LabelProvider) Get(ctx context.Context, user *User, project *Project, exemplar *Label) *Label {
id := exemplar.GetID()
label, err := issues_model.GetLabelInRepoByID(ctx, project.GetID(), id)
if issues_model.IsErrRepoLabelNotExist(err) {
return &Label{}
}
if err != nil {
panic(err)
}
return LabelConverter(label)
}
func (o *LabelProvider) Put(ctx context.Context, user *User, project *Project, label *Label) *Label {
l := label.Label
l.RepoID = project.GetID()
if err := issues_model.NewLabel(ctx, &l); err != nil {
panic(err)
}
return o.Get(ctx, user, project, LabelConverter(&l))
}
func (o *LabelProvider) Delete(ctx context.Context, user *User, project *Project, label *Label) *Label {
l := o.Get(ctx, user, project, label)
if !l.IsNil() {
if err := issues_model.DeleteLabel(project.GetID(), l.GetID()); err != nil {
panic(err)
}
}
return l
}