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 }