gitea源码

payload.go 1.7KB

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