Skip to content

Commit

Permalink
Add list warrants method and update sessions client (#50)
Browse files Browse the repository at this point in the history
* Add nil check for nil params

* Add relation field to QueryResult

* Add ListWarrants method

* Update session client and types to support additional params

* Update error message

Co-authored-by: Karan Kajla <kkajla12@users.noreply.github.com>

* Update warrant and session tests

---------

Co-authored-by: Karan Kajla <kkajla12@users.noreply.github.com>
  • Loading branch information
stanleyphu and kkajla12 authored Apr 2, 2024
1 parent dd2091f commit 5dd7866
Show file tree
Hide file tree
Showing 15 changed files with 290 additions and 29 deletions.
2 changes: 1 addition & 1 deletion apiclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func (client ApiClient) MakeRequest(method string, path string, payload interfac
if client.Config.ApiKey != "" {
request.Header.Add("Authorization", fmt.Sprintf("ApiKey %s", client.Config.ApiKey))
}
if options.WarrantToken != "" {
if options != nil && options.WarrantToken != "" {
request.Header.Add("Warrant-Token", options.WarrantToken)
}
request.Header.Add("User-Agent", fmt.Sprintf("warrant-go/%s", ClientVersion))
Expand Down
48 changes: 48 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,40 @@ func BatchDelete(params []WarrantParams) (string, error) {
return getClient().BatchDelete(params)
}

func (c WarrantClient) ListWarrants(listParams *ListWarrantParams) (ListResponse[Warrant], error) {
if listParams == nil {
listParams = &ListWarrantParams{}
}
var warrantsListResponse ListResponse[Warrant]
queryParams, err := query.Values(listParams)
if err != nil {
return warrantsListResponse, WrapError("Error parsing ListWarrantParams", err)
}

resp, err := c.apiClient.MakeRequest("GET", fmt.Sprintf("/v2/warrants?%s", queryParams.Encode()), warrantsListResponse, &listParams.RequestOptions)
if err != nil {
return warrantsListResponse, err
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return warrantsListResponse, WrapError("Error reading response", err)
}
defer resp.Body.Close()
err = json.Unmarshal([]byte(body), &warrantsListResponse)
if err != nil {
return warrantsListResponse, WrapError("Invalid response from server", err)
}
return warrantsListResponse, nil
}

func ListWarrants(listParams *ListWarrantParams) (ListResponse[Warrant], error) {
return getClient().ListWarrants(listParams)
}

func (c WarrantClient) Query(queryString string, params *QueryParams) (ListResponse[QueryResult], error) {
if params == nil {
params = &QueryParams{}
}
var queryResponse ListResponse[QueryResult]
queryParams, err := query.Values(params)
if err != nil {
Expand Down Expand Up @@ -129,6 +162,9 @@ func Query(queryString string, params *QueryParams) (ListResponse[QueryResult],
}

func (c WarrantClient) Check(params *WarrantCheckParams) (bool, error) {
if params == nil {
params = &WarrantCheckParams{}
}
accessCheckRequest := AccessCheckRequest{
RequestOptions: params.RequestOptions,
Warrants: []WarrantCheck{params.WarrantCheck},
Expand All @@ -152,6 +188,9 @@ func Check(params *WarrantCheckParams) (bool, error) {
}

func (c WarrantClient) CheckMany(params *WarrantCheckManyParams) (bool, error) {
if params == nil {
params = &WarrantCheckManyParams{}
}
warrants := make([]WarrantCheck, 0)
for _, warrantCheck := range params.Warrants {
warrants = append(warrants, warrantCheck)
Expand Down Expand Up @@ -181,6 +220,9 @@ func CheckMany(params *WarrantCheckManyParams) (bool, error) {
}

func (c WarrantClient) CheckUserHasPermission(params *PermissionCheckParams) (bool, error) {
if params == nil {
params = &PermissionCheckParams{}
}
return c.Check(&WarrantCheckParams{
RequestOptions: params.RequestOptions,
WarrantCheck: WarrantCheck{
Expand All @@ -204,6 +246,9 @@ func CheckUserHasPermission(params *PermissionCheckParams) (bool, error) {
}

func (c WarrantClient) CheckUserHasRole(params *RoleCheckParams) (bool, error) {
if params == nil {
params = &RoleCheckParams{}
}
return c.Check(&WarrantCheckParams{
RequestOptions: params.RequestOptions,
WarrantCheck: WarrantCheck{
Expand All @@ -227,6 +272,9 @@ func CheckUserHasRole(params *RoleCheckParams) (bool, error) {
}

func (c WarrantClient) CheckHasFeature(params *FeatureCheckParams) (bool, error) {
if params == nil {
params = &FeatureCheckParams{}
}
return c.Check(&WarrantCheckParams{
RequestOptions: params.RequestOptions,
WarrantCheck: WarrantCheck{
Expand Down
109 changes: 95 additions & 14 deletions examples/live_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,7 @@ func TestMultiTenancy(t *testing.T) {
if err != nil {
t.Fatal(err)
}
user2, err := user.Create(&warrant.UserParams{})
user2, err := user.Create(nil)
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -1749,12 +1749,21 @@ func TestSessions(t *testing.T) {
}
assert.NotEmpty(authzSessionToken)

ssDashUrl, err := session.CreateSelfServiceSession((&warrant.SelfServiceSessionParams{
authzSessionTokenWithTenant, err := session.CreateAuthorizationSession(&warrant.AuthorizationSessionParams{
UserId: user1.UserId,
TenantId: tenant1.TenantId,
})
if err != nil {
t.Fatal(err)
}
assert.NotEmpty(authzSessionTokenWithTenant)

ssDashUrl, err := session.CreateSelfServiceSession(&warrant.SelfServiceSessionParams{
UserId: user1.UserId,
TenantId: tenant1.TenantId,
RedirectUrl: "http://localhost:8080",
SelfServiceStrategy: warrant.SelfServiceStrategyFGAC,
}))
})
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -1783,7 +1792,7 @@ func TestWarrants(t *testing.T) {
t.Fatal(err)
}

newPermission, err := permission.Create(&warrant.PermissionParams{
permission1, err := permission.Create(&warrant.PermissionParams{
PermissionId: "perm1",
Meta: map[string]interface{}{
"name": "Permission 1",
Expand All @@ -1794,14 +1803,25 @@ func TestWarrants(t *testing.T) {
t.Fatal(err)
}

permission2, err := permission.Create(&warrant.PermissionParams{
PermissionId: "perm2",
Meta: map[string]interface{}{
"name": "Permission 2",
"description": "Permission with id 2",
},
})
if err != nil {
t.Fatal(err)
}

checkResult, err := warrant.Check(&warrant.WarrantCheckParams{
RequestOptions: warrant.RequestOptions{
WarrantToken: "latest",
},
WarrantCheck: warrant.WarrantCheck{
Object: warrant.Object{
ObjectType: warrant.ObjectTypePermission,
ObjectId: newPermission.PermissionId,
ObjectId: permission1.PermissionId,
},
Relation: "member",
Subject: warrant.Subject{
Expand All @@ -1815,9 +1835,9 @@ func TestWarrants(t *testing.T) {
}
assert.False(checkResult)

newWarrant, err := warrant.Create(&warrant.WarrantParams{
permission1Warrant, err := warrant.Create(&warrant.WarrantParams{
ObjectType: warrant.ObjectTypePermission,
ObjectId: newPermission.PermissionId,
ObjectId: permission1.PermissionId,
Relation: "member",
Subject: warrant.Subject{
ObjectType: warrant.ObjectTypeUser,
Expand All @@ -1827,7 +1847,7 @@ func TestWarrants(t *testing.T) {
if err != nil {
t.Fatal(err)
}
assert.NotNil(newWarrant.WarrantToken)
assert.NotNil(permission1Warrant.WarrantToken)

checkResult, err = warrant.Check(&warrant.WarrantCheckParams{
RequestOptions: warrant.RequestOptions{
Expand All @@ -1836,7 +1856,7 @@ func TestWarrants(t *testing.T) {
WarrantCheck: warrant.WarrantCheck{
Object: warrant.Object{
ObjectType: warrant.ObjectTypePermission,
ObjectId: newPermission.PermissionId,
ObjectId: permission1.PermissionId,
},
Relation: "member",
Subject: warrant.Subject{
Expand All @@ -1850,23 +1870,78 @@ func TestWarrants(t *testing.T) {
}
assert.True(checkResult)

permission2Warrant, err := warrant.Create(&warrant.WarrantParams{
ObjectType: warrant.ObjectTypePermission,
ObjectId: permission2.PermissionId,
Relation: "member",
Subject: warrant.Subject{
ObjectType: warrant.ObjectTypeUser,
ObjectId: newUser.UserId,
},
})
if err != nil {
t.Fatal(err)
}
assert.NotNil(permission2Warrant.WarrantToken)

warrantsList, err := warrant.ListWarrants(&warrant.ListWarrantParams{
ObjectType: warrant.ObjectTypePermission,
ObjectId: permission1.PermissionId,
})
if err != nil {
t.Fatal(err)
}

assert.Equal(1, len(warrantsList.Results))
assert.Equal("permission", warrantsList.Results[0].ObjectType)
assert.Equal("perm1", warrantsList.Results[0].ObjectId)
assert.Equal("member", warrantsList.Results[0].Relation)
assert.Equal("user", warrantsList.Results[0].Subject.ObjectType)
assert.Equal(newUser.UserId, warrantsList.Results[0].Subject.ObjectId)

warrantsList, err = warrant.ListWarrants(&warrant.ListWarrantParams{
SubjectType: warrant.ObjectTypeUser,
SubjectId: newUser.UserId,
})
if err != nil {
t.Fatal(err)
}

assert.Equal(2, len(warrantsList.Results))
assert.Equal("permission", warrantsList.Results[0].ObjectType)
assert.Equal("perm1", warrantsList.Results[0].ObjectId)
assert.Equal("member", warrantsList.Results[0].Relation)
assert.Equal("user", warrantsList.Results[0].Subject.ObjectType)
assert.Equal(newUser.UserId, warrantsList.Results[0].Subject.ObjectId)
assert.Equal("permission", warrantsList.Results[1].ObjectType)
assert.Equal("perm2", warrantsList.Results[1].ObjectId)
assert.Equal("member", warrantsList.Results[1].Relation)
assert.Equal("user", warrantsList.Results[1].Subject.ObjectType)
assert.Equal(newUser.UserId, warrantsList.Results[1].Subject.ObjectId)

queryResult, err := warrant.Query(fmt.Sprintf("select * where %s:%s is *", "user", newUser.UserId), &warrant.QueryParams{})
if err != nil {
fmt.Println(err)
return
}

assert.Equal(1, len(queryResult.Results))
assert.Equal(2, len(queryResult.Results))
assert.Equal("permission", queryResult.Results[0].ObjectType)
assert.Equal("perm1", queryResult.Results[0].ObjectId)
assert.Equal("member", queryResult.Results[0].Warrant.Relation)
assert.Equal("member", queryResult.Results[0].Relation)
assert.NotNil(queryResult.Results[0].Meta)
assert.Equal("Permission 1", queryResult.Results[0].Meta["name"])
assert.Equal("Permission with id 1", queryResult.Results[0].Meta["description"])
assert.Equal("permission", queryResult.Results[1].ObjectType)
assert.Equal("perm2", queryResult.Results[1].ObjectId)
assert.Equal("member", queryResult.Results[1].Relation)
assert.NotNil(queryResult.Results[1].Meta)
assert.Equal("Permission 2", queryResult.Results[1].Meta["name"])
assert.Equal("Permission with id 2", queryResult.Results[1].Meta["description"])

warrantToken, err := warrant.Delete(&warrant.WarrantParams{
ObjectType: warrant.ObjectTypePermission,
ObjectId: newPermission.PermissionId,
ObjectId: permission1.PermissionId,
Relation: "member",
Subject: warrant.Subject{
ObjectType: warrant.ObjectTypeUser,
Expand All @@ -1885,7 +1960,7 @@ func TestWarrants(t *testing.T) {
WarrantCheck: warrant.WarrantCheck{
Object: warrant.Object{
ObjectType: warrant.ObjectTypePermission,
ObjectId: newPermission.PermissionId,
ObjectId: permission1.PermissionId,
},
Relation: "member",
Subject: warrant.Subject{
Expand All @@ -1906,7 +1981,13 @@ func TestWarrants(t *testing.T) {
}
assert.NotNil(warrantToken)

warrantToken, err = permission.Delete(newPermission.PermissionId)
warrantToken, err = permission.Delete(permission1.PermissionId)
if err != nil {
t.Fatal(err)
}
assert.NotNil(warrantToken)

warrantToken, err = permission.Delete(permission2.PermissionId)
if err != nil {
t.Fatal(err)
}
Expand Down
21 changes: 21 additions & 0 deletions feature/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ func NewClient(config warrant.ClientConfig) Client {
}

func (c Client) Create(params *warrant.FeatureParams) (*warrant.Feature, error) {
if params == nil {
params = &warrant.FeatureParams{}
}
objectParams := warrant.ObjectParams{
ObjectType: warrant.ObjectTypeFeature,
RequestOptions: params.RequestOptions,
Expand All @@ -43,6 +46,9 @@ func Create(params *warrant.FeatureParams) (*warrant.Feature, error) {
}

func (c Client) Get(featureId string, params *warrant.FeatureParams) (*warrant.Feature, error) {
if params == nil {
params = &warrant.FeatureParams{}
}
objectParams := warrant.ObjectParams{
ObjectType: warrant.ObjectTypeFeature,
ObjectId: featureId,
Expand All @@ -64,6 +70,9 @@ func Get(featureId string, params *warrant.FeatureParams) (*warrant.Feature, err
}

func (c Client) Update(featureId string, params *warrant.FeatureParams) (*warrant.Feature, error) {
if params == nil {
params = &warrant.FeatureParams{}
}
objectParams := warrant.ObjectParams{
ObjectType: warrant.ObjectTypeFeature,
ObjectId: featureId,
Expand Down Expand Up @@ -93,6 +102,9 @@ func Delete(featureId string) (string, error) {
}

func (c Client) ListFeatures(listParams *warrant.ListFeatureParams) (warrant.ListResponse[warrant.Feature], error) {
if listParams == nil {
listParams = &warrant.ListFeatureParams{}
}
var featuresListResponse warrant.ListResponse[warrant.Feature]

objectsListResponse, err := object.ListObjects(&warrant.ListObjectParams{
Expand Down Expand Up @@ -125,6 +137,9 @@ func ListFeatures(listParams *warrant.ListFeatureParams) (warrant.ListResponse[w
}

func (c Client) ListFeaturesForPricingTier(pricingTierId string, listParams *warrant.ListFeatureParams) (warrant.ListResponse[warrant.Feature], error) {
if listParams == nil {
listParams = &warrant.ListFeatureParams{}
}
var featuresListResponse warrant.ListResponse[warrant.Feature]

queryResponse, err := warrant.Query(fmt.Sprintf("select feature where pricing-tier:%s is *", pricingTierId), &warrant.QueryParams{
Expand Down Expand Up @@ -188,6 +203,9 @@ func RemoveFeatureFromPricingTier(featureId string, pricingTierId string) (strin
}

func (c Client) ListFeaturesForTenant(tenantId string, listParams *warrant.ListFeatureParams) (warrant.ListResponse[warrant.Feature], error) {
if listParams == nil {
listParams = &warrant.ListFeatureParams{}
}
var featuresListResponse warrant.ListResponse[warrant.Feature]

queryResponse, err := warrant.Query(fmt.Sprintf("select feature where tenant:%s is *", tenantId), &warrant.QueryParams{
Expand Down Expand Up @@ -251,6 +269,9 @@ func RemoveFeatureFromTenant(featureId string, tenantId string) (string, error)
}

func (c Client) ListFeaturesForUser(userId string, listParams *warrant.ListFeatureParams) (warrant.ListResponse[warrant.Feature], error) {
if listParams == nil {
listParams = &warrant.ListFeatureParams{}
}
var featuresListResponse warrant.ListResponse[warrant.Feature]

queryResponse, err := warrant.Query(fmt.Sprintf("select feature where user:%s is *", userId), &warrant.QueryParams{
Expand Down
6 changes: 6 additions & 0 deletions object/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ func BatchCreate(params []warrant.ObjectParams) ([]warrant.Object, error) {
}

func (c Client) Get(objectType string, objectId string, params *warrant.ObjectParams) (*warrant.Object, error) {
if params == nil {
params = &warrant.ObjectParams{}
}
resp, err := c.apiClient.MakeRequest("GET", fmt.Sprintf("/v2/objects/%s/%s", objectType, objectId), nil, &params.RequestOptions)
if err != nil {
return nil, err
Expand Down Expand Up @@ -136,6 +139,9 @@ func BatchDelete(params []warrant.ObjectParams) (string, error) {
}

func (c Client) ListObjects(listParams *warrant.ListObjectParams) (warrant.ListResponse[warrant.Object], error) {
if listParams == nil {
listParams = &warrant.ListObjectParams{}
}
var objectsListResponse warrant.ListResponse[warrant.Object]
queryParams, err := query.Values(listParams)
if err != nil {
Expand Down
Loading

0 comments on commit 5dd7866

Please sign in to comment.