mobility-accounts/grpcapi/accounts.go

94 lines
1.9 KiB
Go

package grpcapi
import (
"encoding/json"
"fmt"
"git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/types/known/structpb"
)
func (a Account) ToStorageType() storage.Account {
var localauth storage.LocalAuth
if a.Authentication != nil && a.Authentication.Local != nil {
localauth = a.Authentication.Local.ToStorageType()
}
account := storage.Account{
ID: a.Id,
Namespace: a.Namespace,
Data: map[string]any{},
Authentication: storage.AccountAuth{
Local: localauth,
},
}
for k, d := range a.Data.GetFields() {
jsondata, err := protojson.Marshal(d)
if err != nil {
fmt.Println(err)
break
}
var data any
json.Unmarshal(jsondata, &data)
account.Data[k] = data
}
return account
}
func (lc LocalAuth) ToStorageType() storage.LocalAuth {
return storage.LocalAuth{
Username: lc.Username,
Password: lc.Password,
Email: lc.Email,
PhoneNumber: lc.PhoneNumber,
}
}
func AccountFromStorageType(account *storage.Account) (*Account, error) {
lc := LocalAuthFromStorageType(account.Authentication.Local)
d, err := sanitizeData(account.Data)
if err != nil {
return nil, err
}
data, err := structpb.NewStruct(d)
if err != nil {
fmt.Println(err)
return nil, err
}
return &Account{
Id: account.ID,
Namespace: account.Namespace,
Data: data,
Authentication: &AccountAuth{
Local: lc,
},
}, nil
}
func LocalAuthFromStorageType(lc storage.LocalAuth) *LocalAuth {
return &LocalAuth{
Username: lc.Username,
Password: lc.Password,
Email: lc.Email,
PhoneNumber: lc.PhoneNumber,
}
}
func sanitizeData(data map[string]any) (d map[string]any, err error) {
j, err := json.Marshal(data)
if err != nil {
return nil, err
}
if err = json.Unmarshal(j, &d); err != nil {
return nil, err
}
return d, nil
}