participant.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package models
  2. import (
  3. "crypto/sha256"
  4. "encoding/json"
  5. "fmt"
  6. "sort"
  7. "strings"
  8. )
  9. type AttributeList map[string]string
  10. type Participant struct {
  11. ID string `csv:"id" gorm:"primaryKey"`
  12. Firstname string `csv:"firstname"`
  13. Lastname string `csv:"lastname"`
  14. Token int `csv:"token"`
  15. Attributes AttributeList `csv:"attributes"`
  16. }
  17. func (p *Participant) String() string {
  18. return fmt.Sprintf("%s %s", p.Lastname, p.Firstname)
  19. }
  20. func (p *Participant) GetID() string {
  21. return p.ID
  22. }
  23. func (p *Participant) SetID(id string) {
  24. p.ID = id
  25. }
  26. func (p *Participant) GetHash() string {
  27. return fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join(append([]string{p.Lastname, p.Firstname}, p.AttributesToSlice()...), ""))))
  28. }
  29. func (p *Participant) AttributesToSlice() []string {
  30. result := make([]string, len(p.Attributes)*2)
  31. for k, v := range p.Attributes {
  32. result = append(result, k, v)
  33. }
  34. return result
  35. }
  36. func (p *Participant) Marshal() ([]byte, error) {
  37. return json.Marshal(p)
  38. }
  39. func (p *Participant) Unmarshal(data []byte) error {
  40. return json.Unmarshal(data, p)
  41. }
  42. func (al AttributeList) MarshalCSV() (string, error) {
  43. result := convertMapToKeyValueOrderedString(al)
  44. return result, nil
  45. }
  46. func (al AttributeList) UnmarshalCSV(csv string) error {
  47. al = make(map[string]string)
  48. al["foo"] = "bar"
  49. return nil
  50. }
  51. func convertMapToKeyValueOrderedString(m map[string]string) string {
  52. keys := make([]string, 0, len(m))
  53. for key := range m {
  54. keys = append(keys, key)
  55. }
  56. sort.Strings(keys)
  57. var result strings.Builder
  58. for _, key := range keys {
  59. result.WriteString(key)
  60. result.WriteString(":")
  61. result.WriteString(m[key])
  62. result.WriteString(",")
  63. }
  64. return strings.TrimSuffix(result.String(), ",")
  65. }