probo/lib/models/participant.go

102 lines
1.9 KiB
Go
Raw Normal View History

2023-10-18 13:40:21 +02:00
package models
import (
"crypto/sha256"
2023-11-20 14:14:09 +01:00
"encoding/json"
2023-12-27 15:05:11 +01:00
"errors"
"fmt"
2023-11-21 15:12:13 +01:00
"sort"
"strings"
)
2023-11-21 15:12:13 +01:00
type AttributeList map[string]string
2023-10-18 13:40:21 +02:00
type Participant struct {
2023-12-05 22:11:08 +01:00
// ID string `csv:"id" gorm:"primaryKey"`
Meta
2023-10-18 13:40:21 +02:00
2023-12-21 17:38:05 +01:00
Firstname string
Lastname string
2023-12-21 17:38:05 +01:00
Token string
2023-12-21 17:38:05 +01:00
Attributes AttributeList `csv:"Attributes"`
2023-10-18 13:40:21 +02:00
}
func (p *Participant) String() string {
return fmt.Sprintf("%s %s", p.Lastname, p.Firstname)
}
func (p *Participant) GetHash() string {
return fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join(append([]string{p.Lastname, p.Firstname}, p.AttributesToSlice()...), ""))))
}
func (p *Participant) AttributesToSlice() []string {
result := make([]string, len(p.Attributes)*2)
for k, v := range p.Attributes {
result = append(result, k, v)
}
return result
}
2023-11-20 14:14:09 +01:00
func (p *Participant) Marshal() ([]byte, error) {
return json.Marshal(p)
}
func (p *Participant) Unmarshal(data []byte) error {
return json.Unmarshal(data, p)
}
2023-11-21 15:12:13 +01:00
func (al AttributeList) MarshalCSV() (string, error) {
result := convertMapToKeyValueOrderedString(al)
return result, nil
}
2023-12-27 15:05:11 +01:00
func (al *AttributeList) UnmarshalCSV(csv string) error {
if *al == nil {
*al = make(AttributeList)
}
pairs := strings.Split(csv, ",")
for _, pair := range pairs {
attrVal := strings.Split(pair, ":")
if len(attrVal) != 2 {
return errors.New("Invalid input format for attribute list.")
}
attr := strings.TrimSpace(attrVal[0])
val := strings.TrimSpace(attrVal[1])
(*al)[attr] = val
}
2023-11-21 18:24:10 +01:00
return nil
}
2023-12-21 17:38:05 +01:00
func (al AttributeList) Get(key string) string {
return al[key]
}
2023-11-21 15:12:13 +01:00
func convertMapToKeyValueOrderedString(m map[string]string) string {
keys := make([]string, 0, len(m))
for key := range m {
keys = append(keys, key)
}
sort.Strings(keys)
var result strings.Builder
for _, key := range keys {
result.WriteString(key)
result.WriteString(":")
result.WriteString(m[key])
result.WriteString(",")
}
return strings.TrimSuffix(result.String(), ",")
}