code.gitea.io/gitea@v1.21.7/services/mailer/incoming/payload/payload.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package payload
     5  
     6  import (
     7  	"context"
     8  
     9  	issues_model "code.gitea.io/gitea/models/issues"
    10  	"code.gitea.io/gitea/modules/util"
    11  )
    12  
    13  const replyPayloadVersion1 byte = 1
    14  
    15  type payloadReferenceType byte
    16  
    17  const (
    18  	payloadReferenceIssue payloadReferenceType = iota
    19  	payloadReferenceComment
    20  )
    21  
    22  // CreateReferencePayload creates data which GetReferenceFromPayload resolves to the reference again.
    23  func CreateReferencePayload(reference any) ([]byte, error) {
    24  	var refType payloadReferenceType
    25  	var refID int64
    26  
    27  	switch r := reference.(type) {
    28  	case *issues_model.Issue:
    29  		refType = payloadReferenceIssue
    30  		refID = r.ID
    31  	case *issues_model.Comment:
    32  		refType = payloadReferenceComment
    33  		refID = r.ID
    34  	default:
    35  		return nil, util.NewInvalidArgumentErrorf("unsupported reference type: %T", r)
    36  	}
    37  
    38  	payload, err := util.PackData(refType, refID)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	return append([]byte{replyPayloadVersion1}, payload...), nil
    44  }
    45  
    46  // GetReferenceFromPayload resolves the reference from the payload
    47  func GetReferenceFromPayload(ctx context.Context, payload []byte) (any, error) {
    48  	if len(payload) < 1 {
    49  		return nil, util.NewInvalidArgumentErrorf("payload to small")
    50  	}
    51  
    52  	if payload[0] != replyPayloadVersion1 {
    53  		return nil, util.NewInvalidArgumentErrorf("unsupported payload version")
    54  	}
    55  
    56  	var ref payloadReferenceType
    57  	var id int64
    58  	if err := util.UnpackData(payload[1:], &ref, &id); err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	switch ref {
    63  	case payloadReferenceIssue:
    64  		return issues_model.GetIssueByID(ctx, id)
    65  	case payloadReferenceComment:
    66  		return issues_model.GetCommentByID(ctx, id)
    67  	default:
    68  		return nil, util.NewInvalidArgumentErrorf("unsupported reference type: %T", ref)
    69  	}
    70  }