mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-23 14:53:34 +01: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:
parent
1dfaf83798
commit
edd8ea0b0d
1 changed files with 25 additions and 20 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue