forgejo/services/f3/driver/project.go

158 lines
4.0 KiB
Go

// SPDX-License-Identifier: MIT
package driver
import (
"context"
"fmt"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
repo_module "code.gitea.io/gitea/modules/repository"
repo_service "code.gitea.io/gitea/services/repository"
"lab.forgefriends.org/friendlyforgeformat/gof3/format"
f3_util "lab.forgefriends.org/friendlyforgeformat/gof3/util"
)
type Project struct {
repo_model.Repository
}
func ProjectConverter(f *repo_model.Repository) *Project {
return &Project{
Repository: *f,
}
}
func (o Project) GetID() int64 {
return o.ID
}
func (o *Project) SetID(id int64) {
o.ID = id
}
func (o *Project) IsNil() bool {
return o.ID == 0
}
func (o *Project) Equals(other *Project) bool {
return (o.Name == other.Name)
}
func (o *Project) ToFormat() *format.Project {
return &format.Project{
Common: format.NewCommon(o.ID),
Name: o.Name,
Owner: o.Owner.Name,
IsPrivate: o.IsPrivate,
Description: o.Description,
CloneURL: repo_model.ComposeHTTPSCloneURL(o.Owner.Name, o.Name),
OriginalURL: o.OriginalURL,
DefaultBranch: o.DefaultBranch,
}
}
func (o *Project) FromFormat(project *format.Project) {
*o = Project{
Repository: repo_model.Repository{
ID: project.GetID(),
Name: project.Name,
Owner: &user_model.User{
Name: project.Owner,
},
IsPrivate: project.IsPrivate,
Description: project.Description,
OriginalURL: project.OriginalURL,
DefaultBranch: project.DefaultBranch,
},
}
}
type ProjectProvider struct {
g *Forgejo
milestones f3_util.NameIDMap
labels f3_util.NameIDMap
}
func (o *ProjectProvider) ToFormat(ctx context.Context, project *Project) *format.Project {
return project.ToFormat()
}
func (o *ProjectProvider) FromFormat(ctx context.Context, p *format.Project) *Project {
var project Project
project.FromFormat(p)
return &project
}
func (o *ProjectProvider) GetObjects(ctx context.Context, user *User, page int) []*Project {
repoList, _, err := repo_model.GetUserRepositories(&repo_model.SearchRepoOptions{
ListOptions: db.ListOptions{Page: page, PageSize: o.g.perPage},
Actor: &user.User,
Private: true,
})
if err != nil {
panic(fmt.Errorf("error while listing projects: %T %v", err, err))
}
if err := repoList.LoadAttributes(ctx); err != nil {
panic(nil)
}
return f3_util.ConvertMap[*repo_model.Repository, *Project](([]*repo_model.Repository)(repoList), ProjectConverter)
}
func (o *ProjectProvider) ProcessObject(ctx context.Context, user *User, project *Project) {
}
func (o *ProjectProvider) Get(ctx context.Context, user *User, exemplar *Project) *Project {
var project *repo_model.Repository
var err error
if exemplar.GetID() > 0 {
project, err = repo_model.GetRepositoryByID(ctx, exemplar.GetID())
} else if exemplar.Name != "" {
project, err = repo_model.GetRepositoryByName(user.GetID(), exemplar.Name)
} else {
panic("GetID() == 0 and ProjectName == \"\"")
}
if repo_model.IsErrRepoNotExist(err) {
return &Project{}
}
if err != nil {
panic(fmt.Errorf("project %v %w", exemplar, err))
}
if err := project.LoadOwner(ctx); err != nil {
panic(err)
}
return ProjectConverter(project)
}
func (o *ProjectProvider) Put(ctx context.Context, user *User, project *Project) *Project {
repo, err := repo_module.CreateRepository(o.g.GetDoer(), &user.User, repo_module.CreateRepoOptions{
Name: project.Name,
Description: project.Description,
OriginalURL: project.OriginalURL,
IsPrivate: project.IsPrivate,
})
if err != nil {
panic(err)
}
return o.Get(ctx, user, ProjectConverter(repo))
}
func (o *ProjectProvider) Delete(ctx context.Context, user *User, project *Project) *Project {
if project.IsNil() {
return project
}
if project.ID > 0 {
project = o.Get(ctx, user, project)
}
if !project.IsNil() {
err := repo_service.DeleteRepository(ctx, o.g.GetDoer(), &project.Repository, true)
if err != nil {
panic(err)
}
}
return project
}