Skip to content

Commit 8260e19

Browse files
authored
Add methods for ObjectTypes and Objects APIs (#41)
* Add methods for ObjectTypes and Objects APIs * Add example test for objecttype and object * Edit assertions
1 parent 7241424 commit 8260e19

File tree

8 files changed

+445
-10
lines changed

8 files changed

+445
-10
lines changed

apiclient.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
)
1010

1111
const (
12-
ClientVersion string = "5.0.0"
12+
ClientVersion string = "5.1.0"
1313
)
1414

1515
type ApiClient struct {
@@ -65,9 +65,13 @@ func (client ApiClient) MakeRequest(method string, path string, payload interfac
6565
}
6666
respStatus := resp.StatusCode
6767
if respStatus < 200 || respStatus >= 400 {
68-
msg, _ := io.ReadAll(resp.Body)
68+
msg, err := io.ReadAll(resp.Body)
69+
errMsg := ""
70+
if err == nil {
71+
errMsg = string(msg)
72+
}
6973
return nil, Error{
70-
Message: fmt.Sprintf("HTTP %d %s", respStatus, string(msg)),
74+
Message: fmt.Sprintf("HTTP %d %s", respStatus, errMsg),
7175
}
7276
}
7377

examples/live_test.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"github.com/stretchr/testify/assert"
77
"github.com/warrant-dev/warrant-go/v5"
88
"github.com/warrant-dev/warrant-go/v5/feature"
9+
"github.com/warrant-dev/warrant-go/v5/object"
10+
"github.com/warrant-dev/warrant-go/v5/objecttype"
911
"github.com/warrant-dev/warrant-go/v5/permission"
1012
"github.com/warrant-dev/warrant-go/v5/pricingtier"
1113
"github.com/warrant-dev/warrant-go/v5/role"
@@ -1858,3 +1860,118 @@ func TestWarrantPolicies(t *testing.T) {
18581860
t.Fatal(err)
18591861
}
18601862
}
1863+
1864+
func TestObjectTypes(t *testing.T) {
1865+
setup()
1866+
assert := assert.New(t)
1867+
1868+
relations := make(map[string]interface{})
1869+
relations["relation-1"] = struct{}{}
1870+
1871+
newType, err := objecttype.Create(&warrant.ObjectTypeParams{
1872+
Type: "new-type",
1873+
Relations: relations,
1874+
})
1875+
if err != nil {
1876+
t.Fatal(err)
1877+
}
1878+
assert.Equal("new-type", newType.Type)
1879+
assert.NotNil(newType.Relations["relation-1"])
1880+
assert.Nil(newType.Relations["relation-2"])
1881+
1882+
objType, err := objecttype.Get("new-type", &warrant.ObjectTypeParams{})
1883+
if err != nil {
1884+
t.Fatal(err)
1885+
}
1886+
assert.Equal("new-type", objType.Type)
1887+
assert.Len(objType.Relations, 1)
1888+
assert.NotNil(objType.Relations["relation-1"])
1889+
1890+
types, err := objecttype.ListObjectTypes(&warrant.ListObjectTypeParams{})
1891+
if err != nil {
1892+
t.Fatal(err)
1893+
}
1894+
assert.Len(types, 7)
1895+
1896+
newRelations := make(map[string]interface{})
1897+
newRelations["relation-1"] = struct{}{}
1898+
newRelations["relation-2"] = struct{}{}
1899+
objType, err = objecttype.Update("new-type", &warrant.ObjectTypeParams{
1900+
Type: "new-type",
1901+
Relations: newRelations,
1902+
})
1903+
if err != nil {
1904+
t.Fatal(err)
1905+
}
1906+
assert.Equal("new-type", objType.Type)
1907+
assert.Len(objType.Relations, 2)
1908+
assert.NotNil(objType.Relations["relation-1"])
1909+
assert.NotNil(objType.Relations["relation-2"])
1910+
1911+
err = objecttype.Delete("new-type")
1912+
if err != nil {
1913+
t.Fatal(err)
1914+
}
1915+
1916+
types, err = objecttype.ListObjectTypes(&warrant.ListObjectTypeParams{})
1917+
if err != nil {
1918+
t.Fatal(err)
1919+
}
1920+
assert.Len(types, 6)
1921+
}
1922+
1923+
func TestObjects(t *testing.T) {
1924+
setup()
1925+
assert := assert.New(t)
1926+
1927+
newObj, err := object.Create(&warrant.ObjectParams{
1928+
ObjectType: "role",
1929+
ObjectId: "admin2",
1930+
})
1931+
if err != nil {
1932+
t.Fatal(err)
1933+
}
1934+
assert.Equal("role", newObj.ObjectType)
1935+
assert.Equal("admin2", newObj.ObjectId)
1936+
assert.Len(newObj.Meta, 0)
1937+
1938+
obj, err := object.Get("role", "admin2", &warrant.ObjectParams{})
1939+
if err != nil {
1940+
t.Fatal(err)
1941+
}
1942+
assert.Equal("role", obj.ObjectType)
1943+
assert.Equal("admin2", obj.ObjectId)
1944+
assert.Len(obj.Meta, 0)
1945+
1946+
objects, err := object.ListObjects(&warrant.ListObjectParams{})
1947+
if err != nil {
1948+
t.Fatal(err)
1949+
}
1950+
assert.Len(objects, 1)
1951+
1952+
meta := make(map[string]interface{})
1953+
meta["name"] = "new name"
1954+
obj, err = object.Update("role", "admin2", &warrant.ObjectParams{
1955+
ObjectType: "role",
1956+
ObjectId: "admin2",
1957+
Meta: meta,
1958+
})
1959+
if err != nil {
1960+
t.Fatal(err)
1961+
}
1962+
assert.Equal("role", obj.ObjectType)
1963+
assert.Equal("admin2", obj.ObjectId)
1964+
assert.Len(obj.Meta, 1)
1965+
assert.Equal("new name", obj.Meta["name"])
1966+
1967+
err = object.Delete("role", "admin2")
1968+
if err != nil {
1969+
t.Fatal(err)
1970+
}
1971+
1972+
objects, err = object.ListObjects(&warrant.ListObjectParams{})
1973+
if err != nil {
1974+
t.Fatal(err)
1975+
}
1976+
assert.Len(objects, 0)
1977+
}

feature/client.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,13 @@ func (c Client) Delete(featureId string) error {
6868
}
6969
respStatus := resp.StatusCode
7070
if respStatus < 200 || respStatus >= 400 {
71-
msg, _ := io.ReadAll(resp.Body)
71+
msg, err := io.ReadAll(resp.Body)
72+
errMsg := ""
73+
if err == nil {
74+
errMsg = string(msg)
75+
}
7276
return warrant.Error{
73-
Message: fmt.Sprintf("HTTP %d %s", respStatus, string(msg)),
77+
Message: fmt.Sprintf("HTTP %d %s", respStatus, errMsg),
7478
}
7579
}
7680
return nil

object/client.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package object
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
7+
8+
"github.com/google/go-querystring/query"
9+
"github.com/warrant-dev/warrant-go/v5"
10+
)
11+
12+
type Client struct {
13+
apiClient *warrant.ApiClient
14+
}
15+
16+
func NewClient(config warrant.ClientConfig) Client {
17+
return Client{
18+
apiClient: warrant.NewApiClient(config),
19+
}
20+
}
21+
22+
func (c Client) Create(params *warrant.ObjectParams) (*warrant.Object, error) {
23+
resp, err := c.apiClient.MakeRequest("POST", "/v1/objects", params, &warrant.RequestOptions{})
24+
if err != nil {
25+
return nil, err
26+
}
27+
body, err := io.ReadAll(resp.Body)
28+
if err != nil {
29+
return nil, warrant.WrapError("Error reading response", err)
30+
}
31+
var newObject warrant.Object
32+
err = json.Unmarshal([]byte(body), &newObject)
33+
if err != nil {
34+
return nil, warrant.WrapError("Invalid response from server", err)
35+
}
36+
return &newObject, nil
37+
}
38+
39+
func Create(params *warrant.ObjectParams) (*warrant.Object, error) {
40+
return getClient().Create(params)
41+
}
42+
43+
func (c Client) Get(objectType string, objectId string, params *warrant.ObjectParams) (*warrant.Object, error) {
44+
resp, err := c.apiClient.MakeRequest("GET", fmt.Sprintf("/v1/objects/%s/%s", objectType, objectId), nil, &params.RequestOptions)
45+
if err != nil {
46+
return nil, err
47+
}
48+
body, err := io.ReadAll(resp.Body)
49+
if err != nil {
50+
return nil, warrant.WrapError("Error reading response", err)
51+
}
52+
var foundObject warrant.Object
53+
err = json.Unmarshal([]byte(body), &foundObject)
54+
if err != nil {
55+
return nil, warrant.WrapError("Invalid response from server", err)
56+
}
57+
return &foundObject, nil
58+
}
59+
60+
func Get(objectType string, objectId string, params *warrant.ObjectParams) (*warrant.Object, error) {
61+
return getClient().Get(objectType, objectId, params)
62+
}
63+
64+
func (c Client) Update(objectType string, objectId string, params *warrant.ObjectParams) (*warrant.Object, error) {
65+
resp, err := c.apiClient.MakeRequest("PUT", fmt.Sprintf("/v1/objects/%s/%s", objectType, objectId), params, &warrant.RequestOptions{})
66+
if err != nil {
67+
return nil, err
68+
}
69+
body, err := io.ReadAll(resp.Body)
70+
if err != nil {
71+
return nil, warrant.WrapError("Error reading response", err)
72+
}
73+
var updatedObject warrant.Object
74+
err = json.Unmarshal([]byte(body), &updatedObject)
75+
if err != nil {
76+
return nil, warrant.WrapError("Invalid response from server", err)
77+
}
78+
return &updatedObject, nil
79+
}
80+
81+
func Update(objectType string, objectId string, params *warrant.ObjectParams) (*warrant.Object, error) {
82+
return getClient().Update(objectType, objectId, params)
83+
}
84+
85+
func (c Client) Delete(objectType string, objectId string) error {
86+
_, err := c.apiClient.MakeRequest("DELETE", fmt.Sprintf("/v1/objects/%s/%s", objectType, objectId), nil, &warrant.RequestOptions{})
87+
if err != nil {
88+
return err
89+
}
90+
return nil
91+
}
92+
93+
func Delete(objectType string, objectId string) error {
94+
return getClient().Delete(objectType, objectId)
95+
}
96+
97+
func (c Client) ListObjects(listParams *warrant.ListObjectParams) ([]warrant.Object, error) {
98+
queryParams, err := query.Values(listParams)
99+
if err != nil {
100+
return nil, warrant.WrapError("Could not parse listParams", err)
101+
}
102+
103+
resp, err := c.apiClient.MakeRequest("GET", fmt.Sprintf("/v1/objects?%s", queryParams.Encode()), nil, &listParams.RequestOptions)
104+
if err != nil {
105+
return nil, err
106+
}
107+
body, err := io.ReadAll(resp.Body)
108+
if err != nil {
109+
return nil, warrant.WrapError("Error reading response", err)
110+
}
111+
var permissions []warrant.Object
112+
err = json.Unmarshal([]byte(body), &permissions)
113+
if err != nil {
114+
return nil, warrant.WrapError("Invalid response from server", err)
115+
}
116+
return permissions, nil
117+
}
118+
119+
func ListObjects(listParams *warrant.ListObjectParams) ([]warrant.Object, error) {
120+
return getClient().ListObjects(listParams)
121+
}
122+
123+
func getClient() Client {
124+
config := warrant.ClientConfig{
125+
ApiKey: warrant.ApiKey,
126+
ApiEndpoint: warrant.ApiEndpoint,
127+
AuthorizeEndpoint: warrant.AuthorizeEndpoint,
128+
SelfServiceDashEndpoint: warrant.SelfServiceDashEndpoint,
129+
HttpClient: warrant.HttpClient,
130+
}
131+
132+
return Client{
133+
&warrant.ApiClient{
134+
HttpClient: warrant.HttpClient,
135+
Config: config,
136+
},
137+
}
138+
}

objecttype.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package warrant
2+
3+
type ObjectType struct {
4+
Type string `json:"type"`
5+
Relations map[string]interface{} `json:"relations"`
6+
}
7+
8+
type ListObjectTypeParams struct {
9+
ListParams
10+
}
11+
12+
type ObjectTypeParams struct {
13+
RequestOptions
14+
Type string `json:"type"`
15+
Relations map[string]interface{} `json:"relations"`
16+
}

0 commit comments

Comments
 (0)