From c3ac222613ca82c6e8ba364ca6ffc67b356b6a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Bischoff?= Date: Thu, 7 Nov 2024 12:57:47 +0100 Subject: [PATCH] fix: expose command class + add v2 events commands --- deno.json | 2 +- deno.lock | 131 +++++++++++++++++- src/commands/index.ts | 5 + .../events.fetch-time-buckets-by-name.ts | 78 +++++++++++ .../v2/events/events.fetch-time-buckets.ts | 78 +++++++++++ src/commands/v2/events/events.fetch.ts | 77 ++++++++++ src/{main.ts => mod.ts} | 1 + 7 files changed, 369 insertions(+), 3 deletions(-) create mode 100644 src/commands/v2/events/events.fetch-time-buckets-by-name.ts create mode 100644 src/commands/v2/events/events.fetch-time-buckets.ts create mode 100644 src/commands/v2/events/events.fetch.ts rename src/{main.ts => mod.ts} (80%) diff --git a/deno.json b/deno.json index 0ded035..aca47e6 100644 --- a/deno.json +++ b/deno.json @@ -4,7 +4,7 @@ "description": "Flowcore SDK", "version": "1.0.0", "license": "MIT", - "exports": "./src/main.ts", + "exports": "./src/mod.ts", "tasks": {}, "imports": { "@sinclair/typebox": "npm:@sinclair/typebox@0.32.15", diff --git a/deno.lock b/deno.lock index 26cdf1a..e1c4542 100644 --- a/deno.lock +++ b/deno.lock @@ -1,35 +1,162 @@ { "version": "4", "specifiers": { + "jsr:@luca/esbuild-deno-loader@*": "0.11.0", + "jsr:@luca/esbuild-deno-loader@0.11": "0.11.0", "jsr:@std/assert@^1.0.6": "1.0.6", + "jsr:@std/bytes@^1.0.2": "1.0.3", + "jsr:@std/encoding@^1.0.5": "1.0.5", "jsr:@std/internal@^1.0.4": "1.0.4", + "jsr:@std/path@^1.0.6": "1.0.8", "jsr:@std/semver@^1.0.3": "1.0.3", - "npm:@sinclair/typebox@0.32.15": "0.32.15" + "npm:@sinclair/typebox@0.32.15": "0.32.15", + "npm:esbuild@*": "0.24.0", + "npm:esbuild@0.24": "0.24.0" }, "jsr": { + "@luca/esbuild-deno-loader@0.11.0": { + "integrity": "c05a989aa7c4ee6992a27be5f15cfc5be12834cab7ff84cabb47313737c51a2c", + "dependencies": [ + "jsr:@std/bytes", + "jsr:@std/encoding", + "jsr:@std/path" + ] + }, "@std/assert@1.0.6": { "integrity": "1904c05806a25d94fe791d6d883b685c9e2dcd60e4f9fc30f4fc5cf010c72207", "dependencies": [ "jsr:@std/internal" ] }, + "@std/bytes@1.0.3": { + "integrity": "e5d5b9e685966314e4edb4be60dfc4bd7624a075bfd4ec8109252b4320f76452" + }, + "@std/encoding@1.0.5": { + "integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04" + }, "@std/internal@1.0.4": { "integrity": "62e8e4911527e5e4f307741a795c0b0a9e6958d0b3790716ae71ce085f755422" }, + "@std/path@1.0.8": { + "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + }, "@std/semver@1.0.3": { "integrity": "7c139c6076a080eeaa4252c78b95ca5302818d7eafab0470d34cafd9930c13c8" } }, "npm": { + "@esbuild/aix-ppc64@0.24.0": { + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==" + }, + "@esbuild/android-arm64@0.24.0": { + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==" + }, + "@esbuild/android-arm@0.24.0": { + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==" + }, + "@esbuild/android-x64@0.24.0": { + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==" + }, + "@esbuild/darwin-arm64@0.24.0": { + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==" + }, + "@esbuild/darwin-x64@0.24.0": { + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==" + }, + "@esbuild/freebsd-arm64@0.24.0": { + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==" + }, + "@esbuild/freebsd-x64@0.24.0": { + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==" + }, + "@esbuild/linux-arm64@0.24.0": { + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==" + }, + "@esbuild/linux-arm@0.24.0": { + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==" + }, + "@esbuild/linux-ia32@0.24.0": { + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==" + }, + "@esbuild/linux-loong64@0.24.0": { + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==" + }, + "@esbuild/linux-mips64el@0.24.0": { + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==" + }, + "@esbuild/linux-ppc64@0.24.0": { + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==" + }, + "@esbuild/linux-riscv64@0.24.0": { + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==" + }, + "@esbuild/linux-s390x@0.24.0": { + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==" + }, + "@esbuild/linux-x64@0.24.0": { + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==" + }, + "@esbuild/netbsd-x64@0.24.0": { + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==" + }, + "@esbuild/openbsd-arm64@0.24.0": { + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==" + }, + "@esbuild/openbsd-x64@0.24.0": { + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==" + }, + "@esbuild/sunos-x64@0.24.0": { + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==" + }, + "@esbuild/win32-arm64@0.24.0": { + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==" + }, + "@esbuild/win32-ia32@0.24.0": { + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==" + }, + "@esbuild/win32-x64@0.24.0": { + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==" + }, "@sinclair/typebox@0.32.15": { "integrity": "sha512-5Lrwo7VOiWEBJBhHmqNmf3TPB9ll8gcEshvYJyAIJyCZ2PF48MFOtiDHJNj8+FsNcqImaQYmxVkKBCBlyAa/wg==" + }, + "esbuild@0.24.0": { + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ] } }, "workspace": { "dependencies": [ + "jsr:@luca/esbuild-deno-loader@0.11", "jsr:@std/assert@^1.0.6", "jsr:@std/semver@^1.0.3", - "npm:@sinclair/typebox@0.32.15" + "npm:@sinclair/typebox@0.32.15", + "npm:esbuild@0.24" ] } } diff --git a/src/commands/index.ts b/src/commands/index.ts index 2cc553e..9949d59 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -11,3 +11,8 @@ export * from "./event-type/event-type.list.ts" // Events export * from "./events/events.fetch.ts" export * from "./events/events.fetch-indexes.ts" + +// V2 +export * from "./v2/events/events.fetch-time-buckets-by-name.ts" +export * from "./v2/events/events.fetch-time-buckets.ts" +export * from "./v2/events/events.fetch.ts" diff --git a/src/commands/v2/events/events.fetch-time-buckets-by-name.ts b/src/commands/v2/events/events.fetch-time-buckets-by-name.ts new file mode 100644 index 0000000..78f6d48 --- /dev/null +++ b/src/commands/v2/events/events.fetch-time-buckets-by-name.ts @@ -0,0 +1,78 @@ +import { Type } from "@sinclair/typebox" +import { Command } from "../../../common/command.ts" +import { parseResponseHelper } from "../../../utils/parse-response-helper.ts" + +/** + * The input for the events fetch indexes command + */ +export interface V2EventsFetchTimeBucketsByNameInput { + /** the tenant name */ + tenant: string + /** the data core id */ + dataCoreId: string + /** the flow type name */ + flowType: string + /** the event type name */ + eventType: string + /** the paging cursor */ + cursor?: number + /** the page size (default is 10.000) */ + pageSize?: number + /** start from this time bucket */ + fromTimeBucket?: string + /** end at this time bucket */ + toTimeBucket?: string +} + +/** + * The output for the events fetch indexes command + */ +export interface V2EventsFetchTimeBucketsByNameOutput { + /** the time buckets */ + timeBuckets: string[] + /** the next page cursor */ + nextCursor?: string +} + +const responseSchema = Type.Object({ + timeBuckets: Type.Array(Type.String()), + nextCursor: Type.Optional(Type.String()), +}) + +/** + * Fetch time buckets for an event type + */ +export class V2EventsFetchTimeBucketsByNameCommand + extends Command { + /** + * Get the base url for the request + */ + protected override getBaseUrl(): string { + return "https://event-source.api.flowcore.io" + } + /** + * Get the path for the request + */ + protected override getPath(): string { + return `/api/v1/time-buckets/byName/${this.input.tenant}/${this.input.dataCoreId}/${this.input.flowType}/${this.input.eventType}` + } + /** + * Parse the response + */ + protected override parseResponse(rawResponse: unknown): V2EventsFetchTimeBucketsByNameOutput { + const response = parseResponseHelper(responseSchema, rawResponse) + return response + } + + /** + * Get the body for the request + */ + protected override getBody(): string { + return JSON.stringify({ + cursor: this.input.cursor, + pageSize: this.input.pageSize, + fromTimeBucket: this.input.fromTimeBucket, + toTimeBucket: this.input.toTimeBucket, + }) + } +} diff --git a/src/commands/v2/events/events.fetch-time-buckets.ts b/src/commands/v2/events/events.fetch-time-buckets.ts new file mode 100644 index 0000000..3849b61 --- /dev/null +++ b/src/commands/v2/events/events.fetch-time-buckets.ts @@ -0,0 +1,78 @@ +import { Type } from "@sinclair/typebox" +import { Command } from "../../../common/command.ts" +import { parseResponseHelper } from "../../../utils/parse-response-helper.ts" + +/** + * The input for the events fetch indexes command + */ +export interface V2EventsFetchTimeBucketsInput { + /** the tenant id */ + tenantId: string + /** the data core id */ + dataCoreId: string + /** the flow type id */ + flowTypeId: string + /** the event type id */ + eventTypeId: string + /** the paging cursor */ + cursor?: number + /** the page size (default is 10.000) */ + pageSize?: number + /** start from this time bucket */ + fromTimeBucket?: string + /** end at this time bucket */ + toTimeBucket?: string +} + +/** + * The output for the events fetch indexes command + */ +export interface V2EventsFetchTimeBucketsOutput { + /** the time buckets */ + timeBuckets: string[] + /** the next page cursor */ + nextCursor?: string +} + +const responseSchema = Type.Object({ + timeBuckets: Type.Array(Type.String()), + nextCursor: Type.Optional(Type.String()), +}) + +/** + * Fetch time buckets for an event type + */ +export class V2EventsFetchTimeBucketsCommand + extends Command { + /** + * Get the base url for the request + */ + protected override getBaseUrl(): string { + return "https://event-source.api.flowcore.io" + } + /** + * Get the path for the request + */ + protected override getPath(): string { + return `/api/v1/time-buckets/byId/${this.input.tenantId}/${this.input.dataCoreId}/${this.input.flowTypeId}/${this.input.eventTypeId}` + } + /** + * Parse the response + */ + protected override parseResponse(rawResponse: unknown): V2EventsFetchTimeBucketsOutput { + const response = parseResponseHelper(responseSchema, rawResponse) + return response + } + + /** + * Get the body for the request + */ + protected override getBody(): string { + return JSON.stringify({ + cursor: this.input.cursor, + pageSize: this.input.pageSize, + fromTimeBucket: this.input.fromTimeBucket, + toTimeBucket: this.input.toTimeBucket, + }) + } +} diff --git a/src/commands/v2/events/events.fetch.ts b/src/commands/v2/events/events.fetch.ts new file mode 100644 index 0000000..4ddbff6 --- /dev/null +++ b/src/commands/v2/events/events.fetch.ts @@ -0,0 +1,77 @@ +import { Type } from "@sinclair/typebox" +import { Command } from "../../../common/command.ts" +import { parseResponseHelper } from "../../../utils/parse-response-helper.ts" + +/** + * The input for the events fetch indexes command + */ +export interface V2EventsFetchEventsInput { + /** the tenant id */ + tenantId: string + /** the data core id */ + dataCoreId: string + /** the flow type id */ + flowTypeId: string + /** the event type id */ + eventTypeId: string + /** the paging cursor */ + cursor?: number + /** the page size (default is 10.000) */ + pageSize?: number + /** start from this time bucket */ + fromTimeBucket?: string + /** end at this time bucket */ + toTimeBucket?: string +} + +/** + * The output for the events fetch indexes command + */ +export interface V2EventsFetchEventsOutput { + /** the time buckets */ + timeBuckets: string[] + /** the next page cursor */ + nextCursor?: string +} + +const responseSchema = Type.Object({ + timeBuckets: Type.Array(Type.String()), + nextCursor: Type.Optional(Type.String()), +}) + +/** + * Fetch time buckets for an event type + */ +export class V2EventsFetchCommand extends Command { + /** + * Get the base url for the request + */ + protected override getBaseUrl(): string { + return "https://event-source.api.flowcore.io" + } + /** + * Get the path for the request + */ + protected override getPath(): string { + return `/api/v1/time-buckets/byId/${this.input.tenantId}/${this.input.dataCoreId}/${this.input.flowTypeId}/${this.input.eventTypeId}` + } + /** + * Parse the response + */ + protected override parseResponse(rawResponse: unknown): V2EventsFetchEventsOutput { + const response = parseResponseHelper(responseSchema, rawResponse) + return response + } + + /** + * Get the body for the request + */ + protected override getBody(): string { + return JSON.stringify({ + cursor: this.input.cursor, + pageSize: this.input.pageSize, + fromTimeBucket: this.input.fromTimeBucket, + toTimeBucket: this.input.toTimeBucket, + }) + } +} diff --git a/src/main.ts b/src/mod.ts similarity index 80% rename from src/main.ts rename to src/mod.ts index 54ddcea..2b79307 100644 --- a/src/main.ts +++ b/src/mod.ts @@ -1,4 +1,5 @@ export * from "./commands/index.ts" export * from "./common/client.ts" +export * from "./common/command.ts" export * from "./contracts/index.ts" export * from "./exceptions/index.ts"