diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index d7a4d6e4b598..5401ae2fa635 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -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 diff --git a/models/migrations/v1_20/v247.go b/models/migrations/v1_20/v247.go new file mode 100644 index 000000000000..59fc5c46b5db --- /dev/null +++ b/models/migrations/v1_20/v247.go @@ -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() +} diff --git a/models/project/project.go b/models/project/project.go index f3ed723030cd..679d695881c8 100644 --- a/models/project/project.go +++ b/models/project/project.go @@ -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 diff --git a/models/project/project_test.go b/models/project/project_test.go index 6caa244f540a..71ceda7aa5ad 100644 --- a/models/project/project_test.go +++ b/models/project/project_test.go @@ -20,7 +20,7 @@ func TestIsProjectTypeValid(t *testing.T) { typ Type valid bool }{ - {TypeIndividual, false}, + {TypeIndividual, true}, {TypeRepository, true}, {TypeOrganization, true}, {UnknownType, false}, diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go index c9d63fec5df0..df16d0a4c762 100644 --- a/routers/web/org/projects.go +++ b/routers/web/org/projects.go @@ -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 }