У меня есть два сервера
- Пользовательский сервер : обрабатывать все операции пользователя CRUD
Сервер продукта : обрабатыватьРабота с продуктом CRUD и получение информации о пользователе с пользовательского сервера с помощью вызова gRPC
type User struct {
ID string `json:"id"`
FirstName string `json:"firstName"`
MiddleName *string `json:"middleName,omitempty"`
LastName string `json:"lastName"`
Email string `json:"email"`
Disabled bool `json:"disabled"`
LastSignedInAt *time.Time `json:"lastSignedInAt,omitempty"`
Bio *string `json:"bio,omitempty"`
BirthDate *time.Time `json:"birthDate,omitempty"`
}
Здесь некоторые поля являются дополнительными, и поскольку я использую cockroachDB (расширенный postgreSQL), я сохранил их в качестве указателя, чтобы их было легко сканироватьРезультат запроса переменной формы.
А вот мой прото-файл:
message User {
int64 id = 1;
string firstName = 2;
string lastName = 3;
string email = 5;
bool disabled = 6;
string lastSignedInAt = 8;
string bio = 9;
string birthdate = 10;
string profession = 14;
}
Теперь сгенерированная модель из прото-файла выглядит следующим образом: "
type User struct {
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
FirstName string `protobuf:"bytes,2,opt,name=firstName,proto3" json:"firstName,omitempty"`
LastName string `protobuf:"bytes,3,opt,name=lastName,proto3" json:"lastName,omitempty"`
Email string `protobuf:"bytes,4,opt,name=email,json=email,proto3" json:"email,omitempty"`
Disabled bool `protobuf:"varint,6,opt,name=disabled,proto3" json:"disabled,omitempty"`
LastSignedInAt string `protobuf:"bytes,8,opt,name=lastSignedInAt,proto3" json:"lastSignedInAt,omitempty"`
Bio string `protobuf:"bytes,9,opt,name=bio,proto3" json:"bio,omitempty"`
Birthdate string `protobuf:"bytes,10,opt,name=birthdate,proto3" json:"birthdate,omitempty"`
}
Теперь проблема в том, что я использую указатель для необязательного поля, он будет хранить ноль в случае отсутствия значения, но на противоположном сайте gRPC не поймет значение ноль и выдаст ошибку.
Я пробовал google.protobuf.StringValue
значение как тип grpc, как это
google.protobuf.StringValue lastSignedInAt = 8;
Это работает, но проблема в том, что я должен написать условие для каждого поля в обработчике:
if lastSignedInAt != nil {
user.LastSignedInAt = &wrappers.StringValue{Value:*lastSignedInAt}
}
Каков наилучший способ решения этой проблемы? Должен ли я изменитьмодель базы данных или какие-либо изменения в модели gRPC?