mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix topics deleted via API not being deleted in org page (#24825)
The topics are saved in the `repo_topic` table. They are also saved directly in the `repository` table. Before this PR, only `AddTopic` and `SaveTopics` made sure the `topics` field in the `repository` table was synced with the `repo_topic` table. This PR makes sure `GenerateTopics` and `DeleteTopic` also sync the `topics` in the repository table. `RemoveTopicsFromRepo` doesn't need to sync the data as it is only used to delete a repository. Fixes #24820
This commit is contained in:
		@@ -253,16 +253,7 @@ func AddTopic(repoID int64, topicName string) (*Topic, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	topicNames := make([]string, 0, 25)
 | 
						if err = syncTopicsInRepository(sess, repoID); err != nil {
 | 
				
			||||||
	if err := sess.Select("name").Table("topic").
 | 
					 | 
				
			||||||
		Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id").
 | 
					 | 
				
			||||||
		Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{
 | 
					 | 
				
			||||||
		Topics: topicNames,
 | 
					 | 
				
			||||||
	}); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -281,6 +272,11 @@ func DeleteTopic(repoID int64, topicName string) (*Topic, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = removeTopicFromRepo(db.DefaultContext, repoID, topic)
 | 
						err = removeTopicFromRepo(db.DefaultContext, repoID, topic)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = syncTopicsInRepository(db.GetEngine(db.DefaultContext), repoID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return topic, err
 | 
						return topic, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -347,16 +343,7 @@ func SaveTopics(repoID int64, topicNames ...string) error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	topicNames = make([]string, 0, 25)
 | 
						if err := syncTopicsInRepository(sess, repoID); err != nil {
 | 
				
			||||||
	if err := sess.Table("topic").Cols("name").
 | 
					 | 
				
			||||||
		Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id").
 | 
					 | 
				
			||||||
		Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{
 | 
					 | 
				
			||||||
		Topics: topicNames,
 | 
					 | 
				
			||||||
	}); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -370,5 +357,23 @@ func GenerateTopics(ctx context.Context, templateRepo, generateRepo *Repository)
 | 
				
			|||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return syncTopicsInRepository(db.GetEngine(ctx), generateRepo.ID)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// syncTopicsInRepository makes sure topics in the topics table are copied into the topics field of the repository
 | 
				
			||||||
 | 
					func syncTopicsInRepository(sess db.Engine, repoID int64) error {
 | 
				
			||||||
 | 
						topicNames := make([]string, 0, 25)
 | 
				
			||||||
 | 
						if err := sess.Table("topic").Cols("name").
 | 
				
			||||||
 | 
							Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id").
 | 
				
			||||||
 | 
							Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{
 | 
				
			||||||
 | 
							Topics: topicNames,
 | 
				
			||||||
 | 
						}); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user