participant.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package models
  2. import (
  3. "crypto/sha256"
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "sort"
  8. "strings"
  9. )
  10. type AttributeList map[string]string
  11. type Participant struct {
  12. // ID string `csv:"id" gorm:"primaryKey"`
  13. Meta
  14. Firstname string
  15. Lastname string
  16. Token string
  17. Attributes AttributeList `csv:"Attributes"`
  18. }
  19. func (p *Participant) String() string {
  20. return fmt.Sprintf("%s %s", p.Lastname, p.Firstname)
  21. }
  22. func (p *Participant) GetHash() string {
  23. return fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join(append([]string{p.Lastname, p.Firstname}, p.AttributesToSlice()...), ""))))
  24. }
  25. func (p *Participant) AttributesToSlice() []string {
  26. result := make([]string, len(p.Attributes)*2)
  27. for k, v := range p.Attributes {
  28. result = append(result, k, v)
  29. }
  30. return result
  31. }
  32. func (p *Participant) Marshal() ([]byte, error) {
  33. return json.Marshal(p)
  34. }
  35. func (p *Participant) Unmarshal(data []byte) error {
  36. return json.Unmarshal(data, p)
  37. }
  38. func (al AttributeList) MarshalCSV() (string, error) {
  39. result := convertMapToKeyValueOrderedString(al)
  40. return result, nil
  41. }
  42. func (al AttributeList) UnmarshalCSV(csv string) error {
  43. log.Println("test")
  44. al = make(map[string]string)
  45. al["foo"] = "bar"
  46. return nil
  47. }
  48. func (al AttributeList) Get(key string) string {
  49. return al[key]
  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. }