2018-02-21 13:55:34 +03:00
// Copyright 2018 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2018-02-21 13:55:34 +03:00
2022-08-25 05:31:57 +03:00
package activities
2018-02-21 13:55:34 +03:00
2021-09-19 14:49:59 +03:00
import (
2022-05-20 17:08:52 +03:00
"context"
2021-09-19 14:49:59 +03:00
"fmt"
"code.gitea.io/gitea/models/db"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2022-03-31 12:20:39 +03:00
"code.gitea.io/gitea/modules/container"
2021-09-19 14:49:59 +03:00
)
2018-02-21 13:55:34 +03:00
// ActionList defines a list of actions
type ActionList [ ] * Action
func ( actions ActionList ) getUserIDs ( ) [ ] int64 {
2022-10-12 08:18:26 +03:00
userIDs := make ( container . Set [ int64 ] , len ( actions ) )
2018-02-21 13:55:34 +03:00
for _ , action := range actions {
2022-10-12 08:18:26 +03:00
userIDs . Add ( action . ActUserID )
2018-02-21 13:55:34 +03:00
}
2022-10-12 08:18:26 +03:00
return userIDs . Values ( )
2018-02-21 13:55:34 +03:00
}
2022-05-20 17:08:52 +03:00
func ( actions ActionList ) loadUsers ( ctx context . Context ) ( map [ int64 ] * user_model . User , error ) {
2018-02-21 13:55:34 +03:00
if len ( actions ) == 0 {
return nil , nil
}
userIDs := actions . getUserIDs ( )
2021-11-24 12:49:20 +03:00
userMaps := make ( map [ int64 ] * user_model . User , len ( userIDs ) )
2022-05-20 17:08:52 +03:00
err := db . GetEngine ( ctx ) .
2018-02-21 13:55:34 +03:00
In ( "id" , userIDs ) .
Find ( & userMaps )
if err != nil {
2022-10-24 22:29:17 +03:00
return nil , fmt . Errorf ( "find user: %w" , err )
2018-02-21 13:55:34 +03:00
}
for _ , action := range actions {
action . ActUser = userMaps [ action . ActUserID ]
}
2022-03-13 19:40:47 +03:00
return userMaps , nil
2018-02-21 13:55:34 +03:00
}
func ( actions ActionList ) getRepoIDs ( ) [ ] int64 {
2022-10-12 08:18:26 +03:00
repoIDs := make ( container . Set [ int64 ] , len ( actions ) )
2018-02-21 13:55:34 +03:00
for _ , action := range actions {
2022-10-12 08:18:26 +03:00
repoIDs . Add ( action . RepoID )
2018-02-21 13:55:34 +03:00
}
2022-10-12 08:18:26 +03:00
return repoIDs . Values ( )
2018-02-21 13:55:34 +03:00
}
2022-05-20 17:08:52 +03:00
func ( actions ActionList ) loadRepositories ( ctx context . Context ) error {
2018-02-21 13:55:34 +03:00
if len ( actions ) == 0 {
2022-03-13 19:40:47 +03:00
return nil
2018-02-21 13:55:34 +03:00
}
repoIDs := actions . getRepoIDs ( )
2021-12-10 04:27:50 +03:00
repoMaps := make ( map [ int64 ] * repo_model . Repository , len ( repoIDs ) )
2022-05-20 17:08:52 +03:00
err := db . GetEngine ( ctx ) . In ( "id" , repoIDs ) . Find ( & repoMaps )
2018-02-21 13:55:34 +03:00
if err != nil {
2022-10-24 22:29:17 +03:00
return fmt . Errorf ( "find repository: %w" , err )
2018-02-21 13:55:34 +03:00
}
for _ , action := range actions {
action . Repo = repoMaps [ action . RepoID ]
}
2022-03-13 19:40:47 +03:00
return nil
2018-02-21 13:55:34 +03:00
}
2022-05-20 17:08:52 +03:00
func ( actions ActionList ) loadRepoOwner ( ctx context . Context , userMap map [ int64 ] * user_model . User ) ( err error ) {
2022-03-13 19:40:47 +03:00
if userMap == nil {
userMap = make ( map [ int64 ] * user_model . User )
2018-02-21 13:55:34 +03:00
}
2022-03-13 19:40:47 +03:00
for _ , action := range actions {
2022-05-05 18:39:26 +03:00
if action . Repo == nil {
continue
}
2022-03-13 19:40:47 +03:00
repoOwner , ok := userMap [ action . Repo . OwnerID ]
if ! ok {
2022-12-03 05:48:26 +03:00
repoOwner , err = user_model . GetUserByID ( ctx , action . Repo . OwnerID )
2022-03-13 19:40:47 +03:00
if err != nil {
if user_model . IsErrUserNotExist ( err ) {
continue
}
return err
}
userMap [ repoOwner . ID ] = repoOwner
}
action . Repo . Owner = repoOwner
2018-02-21 13:55:34 +03:00
}
return nil
}
2022-03-13 19:40:47 +03:00
// loadAttributes loads all attributes
2022-05-20 17:08:52 +03:00
func ( actions ActionList ) loadAttributes ( ctx context . Context ) error {
userMap , err := actions . loadUsers ( ctx )
2022-03-13 19:40:47 +03:00
if err != nil {
return err
}
2022-05-20 17:08:52 +03:00
if err := actions . loadRepositories ( ctx ) ; err != nil {
2022-03-13 19:40:47 +03:00
return err
}
2022-05-20 17:08:52 +03:00
return actions . loadRepoOwner ( ctx , userMap )
2018-02-21 13:55:34 +03:00
}