// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package models import "fmt" // ActionList defines a list of actions type ActionList []*Action func (actions ActionList) getUserIDs() []int64 { userIDs := make(map[int64]struct{}, len(actions)) for _, action := range actions { if _, ok := userIDs[action.ActUserID]; !ok { userIDs[action.ActUserID] = struct{}{} } } return keysInt64(userIDs) } func (actions ActionList) loadUsers(e Engine) ([]*User, error) { if len(actions) == 0 { return nil, nil } userIDs := actions.getUserIDs() userMaps := make(map[int64]*User, len(userIDs)) err := e. In("id", userIDs). Find(&userMaps) if err != nil { return nil, fmt.Errorf("find user: %v", err) } for _, action := range actions { action.ActUser = userMaps[action.ActUserID] } return valuesUser(userMaps), nil } // LoadUsers loads actions' all users func (actions ActionList) LoadUsers() ([]*User, error) { return actions.loadUsers(x) } func (actions ActionList) getRepoIDs() []int64 { repoIDs := make(map[int64]struct{}, len(actions)) for _, action := range actions { if _, ok := repoIDs[action.RepoID]; !ok { repoIDs[action.RepoID] = struct{}{} } } return keysInt64(repoIDs) } func (actions ActionList) loadRepositories(e Engine) ([]*Repository, error) { if len(actions) == 0 { return nil, nil } repoIDs := actions.getRepoIDs() repoMaps := make(map[int64]*Repository, len(repoIDs)) err := e. In("id", repoIDs). Find(&repoMaps) if err != nil { return nil, fmt.Errorf("find repository: %v", err) } for _, action := range actions { action.Repo = repoMaps[action.RepoID] } return valuesRepository(repoMaps), nil } // LoadRepositories loads actions' all repositories func (actions ActionList) LoadRepositories() ([]*Repository, error) { return actions.loadRepositories(x) } func (actions ActionList) getCommentIDs() []int64 { commentIDs := make(map[int64]struct{}, len(actions)) for _, action := range actions { if action.CommentID == 0 { continue } if _, ok := commentIDs[action.CommentID]; !ok { commentIDs[action.CommentID] = struct{}{} } } return keysInt64(commentIDs) } func (actions ActionList) loadComments(e Engine) ([]*Comment, error) { if len(actions) == 0 { return nil, nil } commentIDs := actions.getCommentIDs() commentMaps := make(map[int64]*Comment, len(commentIDs)) if len(commentIDs) == 0 { return make([]*Comment, 0), nil } err := e. In("id", commentIDs). Find(&commentMaps) if err != nil { return nil, fmt.Errorf("find comment: %v", err) } for _, action := range actions { action.Comment = commentMaps[action.CommentID] } return valuesComment(commentMaps), nil } // LoadComments loads actions' all comments func (actions ActionList) LoadComments() ([]*Comment, error) { return actions.loadComments(x) } // loadAttributes loads all attributes func (actions ActionList) loadAttributes(e Engine) (err error) { if _, err = actions.loadUsers(e); err != nil { return } if _, err = actions.loadRepositories(e); err != nil { return } return nil } // LoadAttributes loads attributes of the actions func (actions ActionList) LoadAttributes() error { return actions.loadAttributes(x) } // LoadAllAttributes loads all attributes of the actions // compare with LoadAttributes() ,LoadAllAttributes() loads Comment attribute func (actions ActionList) LoadAllAttributes() error { return actions.loadAllAttributes(x) } // loadAllAttributes func (actions ActionList) loadAllAttributes(e Engine) (err error) { if _, err = actions.loadUsers(e); err != nil { return } if _, err = actions.loadRepositories(e); err != nil { return } if _, err = actions.loadComments(e); err != nil { return } return nil }