A part of https://github.com/go-gitea/gitea/pull/22865 At first, I think we do not need 3 ProjectTypes, as we can check user type, but it seems that it is not database friendly. --------- Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: 6543 <6543@obermui.de>tags/v1.20.0-rc0
@@ -471,6 +471,8 @@ var migrations = []Migration{ | |||
NewMigration("Rename Webhook org_id to owner_id", v1_20.RenameWebhookOrgToOwner), | |||
// v246 -> v247 | |||
NewMigration("Add missed column owner_id for project table", v1_20.AddNewColumnForProject), | |||
// v247 -> v248 | |||
NewMigration("Fix incorrect project type", v1_20.FixIncorrectProjectType), | |||
} | |||
// GetCurrentDBVersion returns the current db version |
@@ -0,0 +1,50 @@ | |||
// Copyright 2023 The Gitea Authors. All rights reserved. | |||
// SPDX-License-Identifier: MIT | |||
package v1_20 //nolint | |||
import ( | |||
"code.gitea.io/gitea/modules/log" | |||
"xorm.io/xorm" | |||
) | |||
// FixIncorrectProjectType: set individual project's type from 3(TypeOrganization) to 1(TypeIndividual) | |||
func FixIncorrectProjectType(x *xorm.Engine) error { | |||
type User struct { | |||
ID int64 `xorm:"pk autoincr"` | |||
Type int | |||
} | |||
const ( | |||
UserTypeIndividual int = 0 | |||
TypeIndividual uint8 = 1 | |||
TypeOrganization uint8 = 3 | |||
) | |||
type Project struct { | |||
OwnerID int64 `xorm:"INDEX"` | |||
Type uint8 | |||
Owner *User `xorm:"extends"` | |||
} | |||
sess := x.NewSession() | |||
defer sess.Close() | |||
if err := sess.Begin(); err != nil { | |||
return err | |||
} | |||
count, err := sess.Table("project"). | |||
Where("type = ? AND owner_id IN (SELECT id FROM `user` WHERE type = ?)", TypeOrganization, UserTypeIndividual). | |||
Update(&Project{ | |||
Type: TypeIndividual, | |||
}) | |||
if err != nil { | |||
return err | |||
} | |||
log.Debug("Updated %d projects to belong to a user instead of an organization", count) | |||
return sess.Commit() | |||
} |
@@ -172,7 +172,7 @@ func GetCardConfig() []CardConfig { | |||
// IsTypeValid checks if a project type is valid | |||
func IsTypeValid(p Type) bool { | |||
switch p { | |||
case TypeRepository, TypeOrganization: | |||
case TypeIndividual, TypeRepository, TypeOrganization: | |||
return true | |||
default: | |||
return false |
@@ -20,7 +20,7 @@ func TestIsProjectTypeValid(t *testing.T) { | |||
typ Type | |||
valid bool | |||
}{ | |||
{TypeIndividual, false}, | |||
{TypeIndividual, true}, | |||
{TypeRepository, true}, | |||
{TypeOrganization, true}, | |||
{UnknownType, false}, |
@@ -51,12 +51,18 @@ func Projects(ctx *context.Context) { | |||
page = 1 | |||
} | |||
var projectType project_model.Type | |||
if ctx.ContextUser.IsOrganization() { | |||
projectType = project_model.TypeOrganization | |||
} else { | |||
projectType = project_model.TypeIndividual | |||
} | |||
projects, total, err := project_model.FindProjects(ctx, project_model.SearchOptions{ | |||
OwnerID: ctx.ContextUser.ID, | |||
Page: page, | |||
IsClosed: util.OptionalBoolOf(isShowClosed), | |||
SortType: sortType, | |||
Type: project_model.TypeOrganization, | |||
Type: projectType, | |||
}) | |||
if err != nil { | |||
ctx.ServerError("FindProjects", err) | |||
@@ -66,7 +72,7 @@ func Projects(ctx *context.Context) { | |||
opTotal, err := project_model.CountProjects(ctx, project_model.SearchOptions{ | |||
OwnerID: ctx.ContextUser.ID, | |||
IsClosed: util.OptionalBoolOf(!isShowClosed), | |||
Type: project_model.TypeOrganization, | |||
Type: projectType, | |||
}) | |||
if err != nil { | |||
ctx.ServerError("CountProjects", err) | |||
@@ -143,14 +149,21 @@ func NewProjectPost(ctx *context.Context) { | |||
return | |||
} | |||
if err := project_model.NewProject(&project_model.Project{ | |||
newProject := project_model.Project{ | |||
OwnerID: ctx.ContextUser.ID, | |||
Title: form.Title, | |||
Description: form.Content, | |||
CreatorID: ctx.Doer.ID, | |||
BoardType: form.BoardType, | |||
Type: project_model.TypeOrganization, | |||
}); err != nil { | |||
} | |||
if ctx.ContextUser.IsOrganization() { | |||
newProject.Type = project_model.TypeOrganization | |||
} else { | |||
newProject.Type = project_model.TypeIndividual | |||
} | |||
if err := project_model.NewProject(&newProject); err != nil { | |||
ctx.ServerError("NewProject", err) | |||
return | |||
} |