code.gitea.io/gitea@v1.21.7/models/migrations/v1_12/v130.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package v1_12 //nolint
     5  
     6  import (
     7  	"code.gitea.io/gitea/modules/json"
     8  	"code.gitea.io/gitea/modules/setting"
     9  
    10  	"xorm.io/xorm"
    11  )
    12  
    13  func ExpandWebhooks(x *xorm.Engine) error {
    14  	type HookEvents struct {
    15  		Create               bool `json:"create"`
    16  		Delete               bool `json:"delete"`
    17  		Fork                 bool `json:"fork"`
    18  		Issues               bool `json:"issues"`
    19  		IssueAssign          bool `json:"issue_assign"`
    20  		IssueLabel           bool `json:"issue_label"`
    21  		IssueMilestone       bool `json:"issue_milestone"`
    22  		IssueComment         bool `json:"issue_comment"`
    23  		Push                 bool `json:"push"`
    24  		PullRequest          bool `json:"pull_request"`
    25  		PullRequestAssign    bool `json:"pull_request_assign"`
    26  		PullRequestLabel     bool `json:"pull_request_label"`
    27  		PullRequestMilestone bool `json:"pull_request_milestone"`
    28  		PullRequestComment   bool `json:"pull_request_comment"`
    29  		PullRequestReview    bool `json:"pull_request_review"`
    30  		PullRequestSync      bool `json:"pull_request_sync"`
    31  		Repository           bool `json:"repository"`
    32  		Release              bool `json:"release"`
    33  	}
    34  
    35  	type HookEvent struct {
    36  		PushOnly       bool   `json:"push_only"`
    37  		SendEverything bool   `json:"send_everything"`
    38  		ChooseEvents   bool   `json:"choose_events"`
    39  		BranchFilter   string `json:"branch_filter"`
    40  
    41  		HookEvents `json:"events"`
    42  	}
    43  
    44  	type Webhook struct {
    45  		ID     int64
    46  		Events string
    47  	}
    48  
    49  	var bytes []byte
    50  	var last int
    51  	batchSize := setting.Database.IterateBufferSize
    52  	sess := x.NewSession()
    53  	defer sess.Close()
    54  	for {
    55  		if err := sess.Begin(); err != nil {
    56  			return err
    57  		}
    58  		results := make([]Webhook, 0, batchSize)
    59  		err := x.OrderBy("id").
    60  			Limit(batchSize, last).
    61  			Find(&results)
    62  		if err != nil {
    63  			return err
    64  		}
    65  		if len(results) == 0 {
    66  			break
    67  		}
    68  		last += len(results)
    69  
    70  		for _, res := range results {
    71  			var events HookEvent
    72  			if err = json.Unmarshal([]byte(res.Events), &events); err != nil {
    73  				return err
    74  			}
    75  
    76  			if !events.ChooseEvents {
    77  				continue
    78  			}
    79  
    80  			if events.Issues {
    81  				events.IssueAssign = true
    82  				events.IssueLabel = true
    83  				events.IssueMilestone = true
    84  				events.IssueComment = true
    85  			}
    86  
    87  			if events.PullRequest {
    88  				events.PullRequestAssign = true
    89  				events.PullRequestLabel = true
    90  				events.PullRequestMilestone = true
    91  				events.PullRequestComment = true
    92  				events.PullRequestReview = true
    93  				events.PullRequestSync = true
    94  			}
    95  
    96  			if bytes, err = json.Marshal(&events); err != nil {
    97  				return err
    98  			}
    99  
   100  			_, err = sess.Exec("UPDATE webhook SET events = ? WHERE id = ?", string(bytes), res.ID)
   101  			if err != nil {
   102  				return err
   103  			}
   104  		}
   105  
   106  		if err := sess.Commit(); err != nil {
   107  			return err
   108  		}
   109  	}
   110  	return nil
   111  }