@@ -329,8 +329,61 @@ func (repo *Repository) getUnits(e Engine) (err error) {
329329 return err
330330}
331331
332- func getUnitsByRepoID (e Engine , repoID int64 ) (units []* RepoUnit , err error ) {
333- return units , e .Where ("repo_id = ?" , repoID ).Find (& units )
332+ // CheckUnitUser check whether user could visit the unit of this repository
333+ func (repo * Repository ) CheckUnitUser (userID int64 , unitType UnitType ) bool {
334+ if err := repo .getUnitsByUserID (x , userID ); err != nil {
335+ return false
336+ }
337+
338+ for _ , unit := range repo .Units {
339+ if unit .Type == unitType {
340+ return true
341+ }
342+ }
343+ return false
344+ }
345+
346+ // LoadUnitsByUserID loads units according userID's permissions
347+ func (repo * Repository ) LoadUnitsByUserID (userID int64 ) error {
348+ return repo .getUnitsByUserID (x , userID )
349+ }
350+
351+ func (repo * Repository ) getUnitsByUserID (e Engine , userID int64 ) (err error ) {
352+ if repo .Units != nil {
353+ return nil
354+ }
355+
356+ err = repo .getUnits (e )
357+ if err != nil {
358+ return err
359+ }
360+
361+ if ! repo .Owner .IsOrganization () || userID == 0 {
362+ return nil
363+ }
364+
365+ teams , err := getUserTeams (e , repo .OwnerID , userID )
366+ if err != nil {
367+ return err
368+ }
369+
370+ var allTypes = make (map [UnitType ]struct {}, len (allRepUnitTypes ))
371+ for _ , team := range teams {
372+ for _ , unitType := range team .UnitTypes {
373+ allTypes [unitType ] = struct {}{}
374+ }
375+ }
376+
377+ // unique
378+ var newRepoUnits = make ([]* RepoUnit , 0 , len (repo .Units ))
379+ for _ , u := range repo .Units {
380+ if _ , ok := allTypes [u .Type ]; ok {
381+ newRepoUnits = append (newRepoUnits , u )
382+ }
383+ }
384+
385+ repo .Units = newRepoUnits
386+ return nil
334387}
335388
336389// EnableUnit if this repository enabled some unit
@@ -1595,6 +1648,7 @@ func DeleteRepository(uid, repoID int64) error {
15951648 & Release {RepoID : repoID },
15961649 & Collaboration {RepoID : repoID },
15971650 & PullRequest {BaseRepoID : repoID },
1651+ & RepoUnit {RepoID : repoID },
15981652 ); err != nil {
15991653 return fmt .Errorf ("deleteBeans: %v" , err )
16001654 }
0 commit comments