]> source.dussan.org Git - gitea.git/commitdiff
Do not store user projects as organization projects (#23353)
authoryp05327 <576951401@qq.com>
Fri, 17 Mar 2023 13:07:23 +0000 (22:07 +0900)
committerGitHub <noreply@github.com>
Fri, 17 Mar 2023 13:07:23 +0000 (21:07 +0800)
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>
models/migrations/migrations.go
models/migrations/v1_20/v247.go [new file with mode: 0644]
models/project/project.go
models/project/project_test.go
routers/web/org/projects.go

index d7a4d6e4b59803f0bf8ba67268bbd7f869c07434..5401ae2fa6352a8adea44597823b14b157066969 100644 (file)
@@ -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 (file)
index 0000000..59fc5c4
--- /dev/null
@@ -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()
+}
index f3ed723030cdbb7223d5e2301f4b71d29eb5b6f1..679d695881c84b90715138d4b518c2e41cfc7861 100644 (file)
@@ -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
index 6caa244f540a399d7fa3ae48be0889778184acd3..71ceda7aa5ad28f72286c787bae2e30ee3d6fefa 100644 (file)
@@ -20,7 +20,7 @@ func TestIsProjectTypeValid(t *testing.T) {
                typ   Type
                valid bool
        }{
-               {TypeIndividual, false},
+               {TypeIndividual, true},
                {TypeRepository, true},
                {TypeOrganization, true},
                {UnknownType, false},
index c9d63fec5df0c1d7f8164c57b49794d7ddf8215f..df16d0a4c7623d94fe9ee952aafb84321d7abf41 100644 (file)
@@ -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
        }