carddav: implement AddressBook.CreateAddressObject

This commit is contained in:
emersion 2017-09-12 22:45:13 +02:00
parent 5cc5a2f843
commit 49ff810a48
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
2 changed files with 53 additions and 6 deletions

View File

@ -1,6 +1,8 @@
package carddav
import (
"bytes"
"errors"
"net/http"
"os"
"strings"
@ -53,6 +55,10 @@ func (ao *addressObject) ID() string {
return ao.contact.ID
}
func (ao *addressObject) Stat() (os.FileInfo, error) {
return &addressFileInfo{ao.contact}, nil
}
func (ao *addressObject) Card() (vcard.Card, error) {
card := make(vcard.Card)
@ -80,8 +86,8 @@ func (ao *addressObject) Card() (vcard.Card, error) {
return card, nil
}
func (ao *addressObject) Stat() (os.FileInfo, error) {
return &addressFileInfo{ao.contact}, nil
func (ao *addressObject) SetCard(card vcard.Card) error {
return errors.New("hydroxide/carddav: not yet implemented")
}
type addressBook struct {
@ -207,6 +213,42 @@ func (ab *addressBook) GetAddressObject(id string) (carddav.AddressObject, error
return ao, nil
}
func (ab *addressBook) CreateAddressObject(card vcard.Card) (carddav.AddressObject, error) {
// TODO: sign/encrypt stuff
var b bytes.Buffer
if err := vcard.NewEncoder(&b).Encode(card); err != nil {
return nil, err
}
contactImport := &protonmail.ContactImport{
Cards: []*protonmail.ContactCard{
{Data: b.String()},
},
}
resps, err := ab.c.CreateContacts([]*protonmail.ContactImport{contactImport})
if err != nil {
return nil, err
}
if len(resps) != 1 {
return nil, errors.New("hydroxide/carddav: expected exactly one response when creating contact")
}
resp := resps[0]
if err := resp.Err(); err != nil {
return nil, err
}
contact := resp.Response.Contact
contact.Cards = contactImport.Cards // Not returned by the server
ao := &addressObject{
c: ab.c,
contact: contact,
}
ab.cacheAddressObject(ao)
return ao, nil
}
func (ab *addressBook) receiveEvents(events <-chan *protonmail.Event) {
for event := range events {
ab.locker.Lock()

View File

@ -73,6 +73,10 @@ type ContactExport struct {
Cards []*ContactCard
}
type ContactImport struct {
Cards []*ContactCard
}
func (c *Client) ListContacts(page, pageSize int) (total int, contacts []*Contact, err error) {
v := url.Values{}
v.Set("Page", strconv.Itoa(page))
@ -163,7 +167,7 @@ func (c *Client) GetContact(id string) (*Contact, error) {
}
type CreateContactResp struct {
Input *Contact
Index int
Response struct {
resp
Contact *Contact
@ -174,10 +178,11 @@ func (resp *CreateContactResp) Err() error {
return resp.Response.Err()
}
func (c *Client) CreateContacts(contacts []*Contact) ([]*CreateContactResp, error) {
func (c *Client) CreateContacts(contacts []*ContactImport) ([]*CreateContactResp, error) {
reqData := struct {
Contacts []*Contact
}{contacts}
Contacts []*ContactImport
Overwrite, Groups, Labels int
}{contacts, 0, 0, 0}
req, err := c.newJSONRequest(http.MethodPost, "/contacts", &reqData)
if err != nil {
return nil, err