participant.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package models
  2. import (
  3. "crypto/sha256"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "sort"
  8. "strings"
  9. )
  10. type AttributeList map[string]string
  11. type Participant struct {
  12. Meta
  13. Firstname string
  14. Lastname string
  15. Token string
  16. Attributes AttributeList `csv:"Attributes"`
  17. }
  18. func (p *Participant) String() string {
  19. return fmt.Sprintf("%s %s", p.Lastname, p.Firstname)
  20. }
  21. func (p *Participant) GetHash() string {
  22. return fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join(append([]string{p.Lastname, p.Firstname}, p.AttributesToSlice()...), ""))))
  23. }
  24. func (p *Participant) AttributesToSlice() []string {
  25. result := make([]string, 0)
  26. for k, v := range p.Attributes {
  27. result = append(result, k, v)
  28. }
  29. return result
  30. }
  31. func (p *Participant) Marshal() ([]byte, error) {
  32. return json.Marshal(p)
  33. }
  34. func (p *Participant) Unmarshal(data []byte) error {
  35. return json.Unmarshal(data, p)
  36. }
  37. func (al AttributeList) MarshalCSV() (string, error) {
  38. result := convertMapToKeyValueOrderedString(al)
  39. return result, nil
  40. }
  41. func (al *AttributeList) UnmarshalCSV(csv string) error {
  42. if *al == nil {
  43. *al = make(AttributeList)
  44. }
  45. pairs := strings.Split(csv, ",")
  46. for _, pair := range pairs {
  47. attrVal := strings.Split(pair, ":")
  48. if len(attrVal) != 2 {
  49. return errors.New("Invalid input format for attribute list.")
  50. }
  51. attr := strings.TrimSpace(attrVal[0])
  52. val := strings.TrimSpace(attrVal[1])
  53. (*al)[attr] = val
  54. }
  55. return nil
  56. }
  57. func (al AttributeList) Get(key string) string {
  58. return al[key]
  59. }
  60. func (al AttributeList) String() string {
  61. result := make([]string, 0)
  62. for k, v := range al {
  63. result = append(result, fmt.Sprintf("%s: %s", k, v))
  64. }
  65. return strings.Join(result, ",")
  66. }
  67. func convertMapToKeyValueOrderedString(m map[string]string) string {
  68. keys := make([]string, 0, len(m))
  69. for key := range m {
  70. keys = append(keys, key)
  71. }
  72. sort.Strings(keys)
  73. var result strings.Builder
  74. for _, key := range keys {
  75. result.WriteString(key)
  76. result.WriteString(":")
  77. result.WriteString(m[key])
  78. result.WriteString(",")
  79. }
  80. return strings.TrimSuffix(result.String(), ",")
  81. }