mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	Do not store user projects as organization projects (#23353)
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>
This commit is contained in:
		| @@ -471,6 +471,8 @@ var migrations = []Migration{ | |||||||
| 	NewMigration("Rename Webhook org_id to owner_id", v1_20.RenameWebhookOrgToOwner), | 	NewMigration("Rename Webhook org_id to owner_id", v1_20.RenameWebhookOrgToOwner), | ||||||
| 	// v246 -> v247 | 	// v246 -> v247 | ||||||
| 	NewMigration("Add missed column owner_id for project table", v1_20.AddNewColumnForProject), | 	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 | // GetCurrentDBVersion returns the current db version | ||||||
|   | |||||||
							
								
								
									
										50
									
								
								models/migrations/v1_20/v247.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								models/migrations/v1_20/v247.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | // IsTypeValid checks if a project type is valid | ||||||
| func IsTypeValid(p Type) bool { | func IsTypeValid(p Type) bool { | ||||||
| 	switch p { | 	switch p { | ||||||
| 	case TypeRepository, TypeOrganization: | 	case TypeIndividual, TypeRepository, TypeOrganization: | ||||||
| 		return true | 		return true | ||||||
| 	default: | 	default: | ||||||
| 		return false | 		return false | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ func TestIsProjectTypeValid(t *testing.T) { | |||||||
| 		typ   Type | 		typ   Type | ||||||
| 		valid bool | 		valid bool | ||||||
| 	}{ | 	}{ | ||||||
| 		{TypeIndividual, false}, | 		{TypeIndividual, true}, | ||||||
| 		{TypeRepository, true}, | 		{TypeRepository, true}, | ||||||
| 		{TypeOrganization, true}, | 		{TypeOrganization, true}, | ||||||
| 		{UnknownType, false}, | 		{UnknownType, false}, | ||||||
|   | |||||||
| @@ -51,12 +51,18 @@ func Projects(ctx *context.Context) { | |||||||
| 		page = 1 | 		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{ | 	projects, total, err := project_model.FindProjects(ctx, project_model.SearchOptions{ | ||||||
| 		OwnerID:  ctx.ContextUser.ID, | 		OwnerID:  ctx.ContextUser.ID, | ||||||
| 		Page:     page, | 		Page:     page, | ||||||
| 		IsClosed: util.OptionalBoolOf(isShowClosed), | 		IsClosed: util.OptionalBoolOf(isShowClosed), | ||||||
| 		SortType: sortType, | 		SortType: sortType, | ||||||
| 		Type:     project_model.TypeOrganization, | 		Type:     projectType, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.ServerError("FindProjects", err) | 		ctx.ServerError("FindProjects", err) | ||||||
| @@ -66,7 +72,7 @@ func Projects(ctx *context.Context) { | |||||||
| 	opTotal, err := project_model.CountProjects(ctx, project_model.SearchOptions{ | 	opTotal, err := project_model.CountProjects(ctx, project_model.SearchOptions{ | ||||||
| 		OwnerID:  ctx.ContextUser.ID, | 		OwnerID:  ctx.ContextUser.ID, | ||||||
| 		IsClosed: util.OptionalBoolOf(!isShowClosed), | 		IsClosed: util.OptionalBoolOf(!isShowClosed), | ||||||
| 		Type:     project_model.TypeOrganization, | 		Type:     projectType, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.ServerError("CountProjects", err) | 		ctx.ServerError("CountProjects", err) | ||||||
| @@ -143,14 +149,21 @@ func NewProjectPost(ctx *context.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err := project_model.NewProject(&project_model.Project{ | 	newProject := project_model.Project{ | ||||||
| 		OwnerID:     ctx.ContextUser.ID, | 		OwnerID:     ctx.ContextUser.ID, | ||||||
| 		Title:       form.Title, | 		Title:       form.Title, | ||||||
| 		Description: form.Content, | 		Description: form.Content, | ||||||
| 		CreatorID:   ctx.Doer.ID, | 		CreatorID:   ctx.Doer.ID, | ||||||
| 		BoardType:   form.BoardType, | 		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) | 		ctx.ServerError("NewProject", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user