mobility-accounts/grpcapi/accounts.go

114 lines
2.5 KiB
Go
Executable File

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 {
la := a.Authentication.Local.ToStorageType()
localauth = &la
}
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,
EmailValidation: &storage.Validation{
Validated: lc.EmailValidation.Validated,
ValidationCode: lc.EmailValidation.ValidationCode,
},
PhoneNumber: lc.PhoneNumber,
PhoneNumberValidation: &storage.Validation{
Validated: lc.PhoneNumberValidation.Validated,
ValidationCode: lc.PhoneNumberValidation.ValidationCode,
},
}
}
func AccountFromStorageType(account *storage.Account) (*Account, error) {
var lc *LocalAuth
if account.Authentication.Local != nil {
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,
EmailValidation: &Validation{
Validated: lc.EmailValidation.Validated,
ValidationCode: lc.EmailValidation.ValidationCode,
},
PhoneNumberValidation: &Validation{
Validated: lc.PhoneNumberValidation.Validated,
ValidationCode: lc.PhoneNumberValidation.ValidationCode,
},
}
}
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
}