Address.TryParse десериализует data как JSON Address (street/city/state/zip/country).
отдельный POST .../addressdata принимает Address из body, но на нашем билде отдаёт address=null.
Рабочий путь (проверено live): POST /api/2.0/crm/contact/{id}/data c infoType=Address, category=Billing, data={"street":...,"city":...,"state":...,"zip":...,"country":...}. oo contacts info-add --type Address --value '<json>' --category Billing → адрес виден в addresses.
Что изменено
AddContactAddress теперь строит Address JSON и вызывает существующий AddContactInfo(..., "Address", ...) (endpoint /data). Сигнатура не менялась.
go build ./..., go vet ./..., go test -race ./catalog/ . — зелёные.
Live: oo companies create --street ... → адрес в контакте (addresses), повтор не дублирует (HasContactAddress).
## fix(crm): адреса контактов через ContactInfo типа Address
Блокирует office-assistant #288 (нужны адреса в OO CRM). SE не мержит.
### Что было не так (evidence)
- `AddContactAddress` постил форму на `/api/2.0/crm/contact/{id}/address` → **500**.
- В OO CommunityServer адрес — это `ContactInfo` типа `Address`, а не отдельный ресурс:
- `CRMApi.ContactInfo.cs` → `CreateContactInfo` + `ContactInfo.GetCategory(Address)`.
- `ContactInfoType.Address` (`ContactInfoTypeEnum.cs`).
- `Address.TryParse` десериализует `data` как JSON `Address` (`street/city/state/zip/country`).
- отдельный `POST .../addressdata` принимает `Address` из body, но на нашем билде отдаёт `address=null`.
- Рабочий путь (проверено live): `POST /api/2.0/crm/contact/{id}/data` c `infoType=Address`, `category=Billing`, `data={"street":...,"city":...,"state":...,"zip":...,"country":...}`.
`oo contacts info-add --type Address --value '<json>' --category Billing` → адрес виден в `addresses`.
### Что изменено
- `AddContactAddress` теперь строит `Address` JSON и вызывает существующий `AddContactInfo(..., "Address", ...)` (endpoint `/data`). Сигнатура не менялась.
- `crm_address.go`: `AddressCategoryCode` (Home0 Postal1 Office2 Billing3 Other4 Work5), `ContactAddresses`, `HasContactAddress` (нормализованное сравнение для идемпотентности).
- `catalog`: `Entry.Addresses []Address` (+ merge), apply пишет адреса после email/phone и пропускает уже существующие (`HasContactAddress`).
- Тесты: `crm_address_test.go`, `catalog/address_test.go`.
### Проверки
- `go build ./...`, `go vet ./...`, `go test -race ./catalog/ .` — зелёные.
- Live: `oo companies create --street ...` → адрес в контакте (`addresses`), повтор не дублирует (HasContactAddress).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
fix(crm): адреса контактов через ContactInfo типа Address
Блокирует office-assistant #288 (нужны адреса в OO CRM). SE не мержит.
Что было не так (evidence)
AddContactAddressпостил форму на/api/2.0/crm/contact/{id}/address→ 500.ContactInfoтипаAddress, а не отдельный ресурс:CRMApi.ContactInfo.cs→CreateContactInfo+ContactInfo.GetCategory(Address).ContactInfoType.Address(ContactInfoTypeEnum.cs).Address.TryParseдесериализуетdataкак JSONAddress(street/city/state/zip/country).POST .../addressdataпринимаетAddressиз body, но на нашем билде отдаётaddress=null.POST /api/2.0/crm/contact/{id}/datacinfoType=Address,category=Billing,data={"street":...,"city":...,"state":...,"zip":...,"country":...}.oo contacts info-add --type Address --value '<json>' --category Billing→ адрес виден вaddresses.Что изменено
AddContactAddressтеперь строитAddressJSON и вызывает существующийAddContactInfo(..., "Address", ...)(endpoint/data). Сигнатура не менялась.crm_address.go:AddressCategoryCode(Home0 Postal1 Office2 Billing3 Other4 Work5),ContactAddresses,HasContactAddress(нормализованное сравнение для идемпотентности).catalog:Entry.Addresses []Address(+ merge), apply пишет адреса после email/phone и пропускает уже существующие (HasContactAddress).crm_address_test.go,catalog/address_test.go.Проверки
go build ./...,go vet ./...,go test -race ./catalog/ .— зелёные.oo companies create --street ...→ адрес в контакте (addresses), повтор не дублирует (HasContactAddress).