mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +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), | ||||
| 	// 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 | ||||
|   | ||||
							
								
								
									
										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 | ||||
| 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 | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user