Skip to content

Commit 34aba7c

Browse files
Support cursor-based pagination
1 parent cb43499 commit 34aba7c

31 files changed

Lines changed: 1405 additions & 903 deletions

README.md

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,22 @@ import (
2020
"github.com/auth0/go-jwt-middleware/v2"
2121
"github.com/auth0/go-jwt-middleware/v2/jwks"
2222
"github.com/auth0/go-jwt-middleware/v2/validator"
23-
"github.com/elimity-com/insights-sdk"
24-
commonv1alpha1 "github.com/elimity-com/insights-sdk/gen/elimity/insights/common/v1alpha1"
25-
customgatewayv1alpha1 "github.com/elimity-com/insights-sdk/gen/elimity/insights/customgateway/v1alpha1"
23+
"github.com/elimity-com/insights-sdk/v2"
24+
"github.com/elimity-com/insights-sdk/v2/gen/elimity/insights/common/v1alpha1"
25+
"github.com/elimity-com/insights-sdk/v2/gen/elimity/insights/customgateway/v1alpha2"
2626
"iter"
2727
"log"
2828
"net/http"
2929
"net/url"
3030
"os"
3131
)
3232

33-
func generateResponses(bytes []byte) iter.Seq2[*customgatewayv1alpha1.PerformImportResponse, error] {
34-
return responseGenerator{bytes: bytes}.generate
33+
func generateResponses(bytes []byte, cursor any) iter.Seq2[*v1alpha2.PerformImportResponse, error] {
34+
generator := responseGenerator{
35+
bytes: bytes,
36+
cursor: cursor,
37+
}
38+
return generator.generate
3539
}
3640

3741
func makeClaims() validator.CustomClaims {
@@ -44,7 +48,7 @@ func main() {
4448
audiences := []string{"gateway"}
4549
option := validator.WithCustomClaims(makeClaims)
4650
validator, _ := validator.New(provider.KeyFunc, "RS256", "https://auth.elimity.com/", audiences, option)
47-
innerHandler := insightssdk.Handler(generateResponses)
51+
innerHandler := insightssdk.Handler(generateResponses, nil, "v1.0.0")
4852
outerHandler := jwtmiddleware.New(validator.ValidateToken).CheckJWT(innerHandler)
4953
err := http.ListenAndServe(":8080", outerHandler)
5054
log.Fatal(err)
@@ -71,24 +75,25 @@ func (c *claims) Validate(context.Context) error {
7175
}
7276

7377
type responseGenerator struct {
74-
bytes []byte
78+
bytes []byte
79+
cursor any
7580
}
7681

77-
func (g responseGenerator) generate(yield func(*customgatewayv1alpha1.PerformImportResponse, error) bool) {
82+
func (g responseGenerator) generate(yield func(*v1alpha2.PerformImportResponse, error) bool) {
7883
var request request
7984
if err := json.Unmarshal(g.bytes, &request); err != nil {
8085
err := fmt.Errorf("failed unmarshalling request: %v", err)
8186
yield(nil, err)
8287
return
8388
}
84-
info := &customgatewayv1alpha1.Level_Info{}
85-
level := &customgatewayv1alpha1.Level{Value: info}
86-
log := &customgatewayv1alpha1.Log{
89+
info := &v1alpha2.Level_Info{}
90+
level := &v1alpha2.Level{Value: info}
91+
log := &v1alpha2.Log{
8792
Level: level,
8893
Message: "Reading directory contents",
8994
}
90-
lo := &customgatewayv1alpha1.PerformImportResponse_Log{Log: log}
91-
response := &customgatewayv1alpha1.PerformImportResponse{Value: lo}
95+
lo := &v1alpha2.PerformImportResponse_Log{Log: log}
96+
response := &v1alpha2.PerformImportResponse{Value: lo}
9297
if !yield(response, nil) {
9398
return
9499
}
@@ -100,13 +105,13 @@ func (g responseGenerator) generate(yield func(*customgatewayv1alpha1.PerformImp
100105
}
101106
for _, entry := range entries {
102107
name := entry.Name()
103-
entity := &commonv1alpha1.Entity{
108+
entity := &v1alpha1.Entity{
104109
Id: name,
105110
Name: name,
106111
Type: "file",
107112
}
108-
ent := &customgatewayv1alpha1.PerformImportResponse_Entity{Entity: entity}
109-
response := &customgatewayv1alpha1.PerformImportResponse{Value: ent}
113+
ent := &v1alpha2.PerformImportResponse_Entity{Entity: entity}
114+
response := &v1alpha2.PerformImportResponse{Value: ent}
110115
if !yield(response, nil) {
111116
return
112117
}
@@ -129,6 +134,7 @@ import { readdir } from "node:fs/promises";
129134
import { z } from "zod";
130135

131136
async function* generateItems(
137+
cursor: JsonValue,
132138
fields: Record<string, JsonValue>,
133139
): AsyncGenerator<Item> {
134140
const request = z.strictObject({ path: z.string() }).parse(fields);
@@ -161,7 +167,7 @@ const config = {
161167
validators,
162168
};
163169
const authHandler = auth(config);
164-
const sdkHandler = handler(generateItems);
170+
const sdkHandler = handler(generateItems, null, "v1.0.0");
165171
express().use(authHandler, sdkHandler).listen(8080);
166172
```
167173

@@ -204,15 +210,15 @@ class _Request(BaseModel):
204210
path: str
205211

206212

207-
async def _generate_items(fields: dict[str, object]) -> AsyncIterator[Item]:
213+
async def _generate_items(cursor: object, fields: dict[str, object]) -> AsyncIterator[Item]:
208214
request = _Request.model_validate(fields)
209215
yield LogItem(Level.INFO, "Reading directory contents")
210216
for file in listdir(request.path):
211217
assignments: dict[str, Value] = {}
212218
yield EntityItem(assignments, file, file, "file")
213219

214220

215-
_app = app(_generate_items)
221+
_app = app(_generate_items, None, "v1.0.0")
216222
_middleware = _Middleware(_app)
217223
run(_middleware)
218224
```
@@ -222,7 +228,7 @@ run(_middleware)
222228
### Go
223229

224230
```sh
225-
$ go get github.com/elimity-com/insights-sdk
231+
$ go get github.com/elimity-com/insights-sdk/v2
226232
```
227233

228234
### NodeJS
@@ -242,3 +248,4 @@ $ pip install elimity-insights-sdk
242248
| SDK version | Insights version |
243249
| ----------- | ---------------- |
244250
| 1 | >=3.42 |
251+
| 2 | >=3.46 |

gen/elimity/insights/common/v1alpha1/common.pb.go

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/elimity/insights/common/v1alpha1/common_pb.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type { Message } from "@bufbuild/protobuf";
1212
* Describes the file elimity/insights/common/v1alpha1/common.proto.
1313
*/
1414
export const file_elimity_insights_common_v1alpha1_common: GenFile = /*@__PURE__*/
15-
fileDesc("Ci1lbGltaXR5L2luc2lnaHRzL2NvbW1vbi92MWFscGhhMS9jb21tb24ucHJvdG8SIGVsaW1pdHkuaW5zaWdodHMuY29tbW9uLnYxYWxwaGExIvkBCgZFbnRpdHkSYQoVYXR0cmlidXRlX2Fzc2lnbm1lbnRzGAEgAygLMkIuZWxpbWl0eS5pbnNpZ2h0cy5jb21tb24udjFhbHBoYTEuRW50aXR5LkF0dHJpYnV0ZUFzc2lnbm1lbnRzRW50cnkSCgoCaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgR0eXBlGAQgASgJGmQKGUF0dHJpYnV0ZUFzc2lnbm1lbnRzRW50cnkSCwoDa2V5GAEgASgJEjYKBXZhbHVlGAIgASgLMicuZWxpbWl0eS5pbnNpZ2h0cy5jb21tb24udjFhbHBoYTEuVmFsdWU6AjgBIr0CCgxSZWxhdGlvbnNoaXASZwoVYXR0cmlidXRlX2Fzc2lnbm1lbnRzGAEgAygLMkguZWxpbWl0eS5pbnNpZ2h0cy5jb21tb24udjFhbHBoYTEuUmVsYXRpb25zaGlwLkF0dHJpYnV0ZUFzc2lnbm1lbnRzRW50cnkSFgoOZnJvbV9lbnRpdHlfaWQYAiABKAkSGAoQZnJvbV9lbnRpdHlfdHlwZRgDIAEoCRIUCgx0b19lbnRpdHlfaWQYBCABKAkSFgoOdG9fZW50aXR5X3R5cGUYBSABKAkaZAoZQXR0cmlidXRlQXNzaWdubWVudHNFbnRyeRILCgNrZXkYASABKAkSNgoFdmFsdWUYAiABKAsyJy5lbGltaXR5Lmluc2lnaHRzLmNvbW1vbi52MWFscGhhMS5WYWx1ZToCOAEi0AEKBVZhbHVlEhEKB2Jvb2xlYW4YASABKAhIABIqCgRkYXRlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAEi8KCWRhdGVfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIABIQCgZudW1iZXIYBCABKAFIABIQCgZzdHJpbmcYBSABKAlIABIqCgR0aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAQgcKBXZhbHVlQkpaSGdpdGh1Yi5jb20vZWxpbWl0eS1jb20vaW5zaWdodHMtc2RrL2dlbi9lbGltaXR5L2luc2lnaHRzL2NvbW1vbi92MWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp]);
15+
fileDesc("Ci1lbGltaXR5L2luc2lnaHRzL2NvbW1vbi92MWFscGhhMS9jb21tb24ucHJvdG8SIGVsaW1pdHkuaW5zaWdodHMuY29tbW9uLnYxYWxwaGExIvkBCgZFbnRpdHkSYQoVYXR0cmlidXRlX2Fzc2lnbm1lbnRzGAEgAygLMkIuZWxpbWl0eS5pbnNpZ2h0cy5jb21tb24udjFhbHBoYTEuRW50aXR5LkF0dHJpYnV0ZUFzc2lnbm1lbnRzRW50cnkSCgoCaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgR0eXBlGAQgASgJGmQKGUF0dHJpYnV0ZUFzc2lnbm1lbnRzRW50cnkSCwoDa2V5GAEgASgJEjYKBXZhbHVlGAIgASgLMicuZWxpbWl0eS5pbnNpZ2h0cy5jb21tb24udjFhbHBoYTEuVmFsdWU6AjgBIr0CCgxSZWxhdGlvbnNoaXASZwoVYXR0cmlidXRlX2Fzc2lnbm1lbnRzGAEgAygLMkguZWxpbWl0eS5pbnNpZ2h0cy5jb21tb24udjFhbHBoYTEuUmVsYXRpb25zaGlwLkF0dHJpYnV0ZUFzc2lnbm1lbnRzRW50cnkSFgoOZnJvbV9lbnRpdHlfaWQYAiABKAkSGAoQZnJvbV9lbnRpdHlfdHlwZRgDIAEoCRIUCgx0b19lbnRpdHlfaWQYBCABKAkSFgoOdG9fZW50aXR5X3R5cGUYBSABKAkaZAoZQXR0cmlidXRlQXNzaWdubWVudHNFbnRyeRILCgNrZXkYASABKAkSNgoFdmFsdWUYAiABKAsyJy5lbGltaXR5Lmluc2lnaHRzLmNvbW1vbi52MWFscGhhMS5WYWx1ZToCOAEi0AEKBVZhbHVlEhEKB2Jvb2xlYW4YASABKAhIABIqCgRkYXRlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAEi8KCWRhdGVfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIABIQCgZudW1iZXIYBCABKAFIABIQCgZzdHJpbmcYBSABKAlIABIqCgR0aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAQgcKBXZhbHVlQk1aS2dpdGh1Yi5jb20vZWxpbWl0eS1jb20vaW5zaWdodHMtc2RrL3YyL2dlbi9lbGltaXR5L2luc2lnaHRzL2NvbW1vbi92MWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp]);
1616

1717
/**
1818
* @generated from message elimity.insights.common.v1alpha1.Entity

gen/elimity/insights/common/v1alpha1/common_pb2.py

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import v1alpha1
2+
from . import v1alpha2

0 commit comments

Comments
 (0)