Skip to content

Commit

Permalink
Add field-level selects for individual record reads
Browse files Browse the repository at this point in the history
  • Loading branch information
Eric Mann committed Oct 18, 2017
1 parent a48acb5 commit 27a6e9f
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
23 changes: 20 additions & 3 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -350,8 +350,19 @@ func (c *Client) getClientKey(ctx context.Context, clientID string) (PublicKey,

// readRaw reads a record given a record ID and returns the record without
// decrypting data fields.
func (c *Client) readRaw(ctx context.Context, recordID string) (*Record, error) {
req, err := http.NewRequest("GET", fmt.Sprintf("%s/v1/storage/records/%s", c.apiURL(), recordID), nil)
func (c *Client) readRaw(ctx context.Context, recordID string, fields []string) (*Record, error) {
path := fmt.Sprintf("%s/v1/storage/records/%s", c.apiURL(), recordID)

if fields != nil {
mappedFields := make([]string, len(fields))
for i, v := range fields {
mappedFields[i] = fmt.Sprintf("field=%s", v)
}
fieldList := strings.Join(mappedFields, "&")
path = fmt.Sprintf("%s?%s", path, fieldList)
}

req, err := http.NewRequest("GET", path, nil)
if err != nil {
return nil, err
}
Expand All @@ -368,7 +379,13 @@ func (c *Client) readRaw(ctx context.Context, recordID string) (*Record, error)

// Read reads a record given a record ID, decrypts it, and returns the result.
func (c *Client) Read(ctx context.Context, recordID string) (*Record, error) {
record, err := c.readRaw(ctx, recordID)
return c.ReadFields(ctx, recordID, nil)
}

// ReadFields reads a record given a record ID, selecting a subset of fields,
// and returns a decrypted result.
func (c *Client) ReadFields(ctx context.Context, recordID string, fields []string) (*Record, error) {
record, err := c.readRaw(ctx, recordID, fields)
if err != nil {
return nil, err
}
Expand Down
34 changes: 34 additions & 0 deletions client_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,40 @@ func TestWriteRead(t *testing.T) {
}
}

func TestFieldSelect(t *testing.T) {
data := make(map[string]string)
data["visible"] = "This will come back"
data["alsovisible"] = "So will this"
data["hidden"] = "This will not"
record, err := client.Write(context.Background(), "test-fields", data, nil)
if err != nil {
t.Fatal(err)
}

fields := []string{"visible", "alsovisible"}

retrieved, err := client.ReadFields(context.Background(), record.Meta.RecordID, fields)
if err != nil {
t.Fatal(err)
}

if record.Meta.RecordID != retrieved.Meta.RecordID {
t.Errorf("Record IDs don't match: %s != %s", record.Meta.RecordID, retrieved.Meta.RecordID)
}

if retrieved.Data["visible"] != "This will come back" {
t.Error("Record field 'visible' was not found")
}

if retrieved.Data["alsovisible"] != "So will this" {
t.Error("Record field 'alsovisible' was not found")
}

if _, hasKey := retrieved.Data["hidden"]; hasKey {
t.Error("Record field 'hidden' was not filtered out")
}
}

func TestWriteReadNoCache(t *testing.T) {
data := make(map[string]string)
data["message"] = "Hello, world!"
Expand Down

0 comments on commit 27a6e9f

Please sign in to comment.