// SPDX-License-Identifier: MIT package driver import ( "context" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "lab.forgefriends.org/friendlyforgeformat/gof3/format" "lab.forgefriends.org/friendlyforgeformat/gof3/util" ) type Topic struct { repo_model.Topic } func TopicConverter(f *repo_model.Topic) *Topic { return &Topic{ Topic: *f, } } func (o Topic) GetID() int64 { return o.ID } func (o *Topic) SetID(id int64) { o.ID = id } func (o *Topic) IsNil() bool { return o.ID == 0 } func (o *Topic) Equals(other *Topic) bool { return o.Name == other.Name } func (o *Topic) ToFormat() *format.Topic { return &format.Topic{ Common: format.NewCommon(o.ID), Name: o.Name, } } func (o *Topic) FromFormat(topic *format.Topic) { *o = Topic{ Topic: repo_model.Topic{ ID: topic.Index.GetID(), Name: topic.Name, }, } } type TopicProvider struct { g *Forgejo } func (o *TopicProvider) ToFormat(ctx context.Context, topic *Topic) *format.Topic { return topic.ToFormat() } func (o *TopicProvider) FromFormat(ctx context.Context, m *format.Topic) *Topic { var topic Topic topic.FromFormat(m) return &topic } func (o *TopicProvider) GetObjects(ctx context.Context, user *User, project *Project, page int) []*Topic { topics, _, err := repo_model.FindTopics(&repo_model.FindTopicOptions{ ListOptions: db.ListOptions{Page: page, PageSize: o.g.perPage}, RepoID: project.GetID(), }) if err != nil { panic(err) } return util.ConvertMap[*repo_model.Topic, *Topic](topics, TopicConverter) } func (o *TopicProvider) ProcessObject(ctx context.Context, user *User, project *Project, topic *Topic) { } func (o *TopicProvider) Get(ctx context.Context, user *User, project *Project, exemplar *Topic) *Topic { id := exemplar.GetID() topic, err := repo_model.GetRepoTopicByID(ctx, project.GetID(), id) if repo_model.IsErrTopicNotExist(err) { return &Topic{} } if err != nil { panic(err) } return TopicConverter(topic) } func (o *TopicProvider) Put(ctx context.Context, user *User, project *Project, topic *Topic) *Topic { t, err := repo_model.AddTopic(project.GetID(), topic.Name) if err != nil { panic(err) } return o.Get(ctx, user, project, TopicConverter(t)) } func (o *TopicProvider) Delete(ctx context.Context, user *User, project *Project, topic *Topic) *Topic { t := o.Get(ctx, user, project, topic) if !t.IsNil() { t, err := repo_model.DeleteTopic(project.GetID(), t.Name) if err != nil { panic(err) } return TopicConverter(t) } return t }