From 0585355b3b80090d124cfd98dab9f5f72298773a Mon Sep 17 00:00:00 2001 From: Korrrba Date: Tue, 30 Jan 2024 19:51:27 +0100 Subject: [PATCH] feat: ubiquibot-logger integration The ubiquibot-logger integration enables supabase logging for ubiquibot-kernel. On top of SUPABASE_KEY and SUPABASE_URL environment variables, LOG_RETRY_LIMIT and LOG_LEVEL must be specified. Example: LOG_RETRY_LIMIT=3 LOG_LEVEL=DEBUG Resolves: #5 --- .dev.vars.example | 6 + .prettierignore | 1 + .vscode/settings.json | 1 - README.md | 10 +- bun.lockb | Bin 264571 -> 339561 bytes package.json | 4 +- src/event-handler.ts | 24 ++ src/types/database.ts | 589 ++++++++++++++++++++++++++++++++++++++++++ src/types/env.ts | 10 +- src/worker.ts | 11 +- wrangler.toml | 1 + 11 files changed, 648 insertions(+), 9 deletions(-) create mode 100644 src/types/database.ts diff --git a/.dev.vars.example b/.dev.vars.example index 05f212a..970b644 100644 --- a/.dev.vars.example +++ b/.dev.vars.example @@ -1,2 +1,8 @@ WEBHOOK_PROXY_URL=https://smee.io/new WEBHOOK_SECRET=xxxxxx + +SUPABASE_URL= +SUPABASE_KEY= + +LOG_RETRY_LIMIT= +LOG_LEVEL= diff --git a/.prettierignore b/.prettierignore index e69de29..1d74e21 100644 --- a/.prettierignore +++ b/.prettierignore @@ -0,0 +1 @@ +.vscode/ diff --git a/.vscode/settings.json b/.vscode/settings.json index 7d91fbd..ad1294b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,4 @@ { - "typescript.enablePromptUseWorkspaceTsdk": true, "cSpell.words": ["smee"] } diff --git a/README.md b/README.md index 2855b87..31cad26 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,17 @@ The bot kernel is designed to: ## Environment variables - PRIVATE_KEY -You need to get a private key from Github App settings and convert it to PKCS#8 using this command: -`openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs8.key -out pkcs8.key` + You need to get a private key from Github App settings and convert it to PKCS#8 using this command: + `openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs8.key -out pkcs8.key` - WEBHOOK_SECRET -You need to set it in Github App settings and also set it here. + You need to set it in Github App settings and also set it here. - APP_ID -You can find this in Github App settings. + You can find this in Github App settings. - WEBHOOK_PROXY_URL (only for development) -You need to get a webhook URL at and set it in the Github App settings + You need to get a webhook URL at and set it in the Github App settings ### Quick Start diff --git a/bun.lockb b/bun.lockb index c1d84809f64cffbc0c33148df2c1bf4af0be75fc..7606c7c446915341bcb0f376aa6bdf176c759539 100755 GIT binary patch delta 98743 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®(NA=8*cQ`5* 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 delta 54740 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 diff --git a/package.json b/package.json index 32a2125..9295323 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,11 @@ "@octokit/webhooks": "^12.0.10", "@octokit/webhooks-types": "^7.3.1", "@sinclair/typebox": "^0.32.5", + "@supabase/supabase-js": "^2.4.0", "create-cloudflare": "^2.8.3", "octokit": "^3.1.2", - "smee-client": "^2.0.0" + "smee-client": "^2.0.0", + "ubiquibot-logger": "^0.3.5" }, "devDependencies": { "@cloudflare/workers-types": "^4.20240117.0", diff --git a/src/event-handler.ts b/src/event-handler.ts index 39a6802..6470efe 100644 --- a/src/event-handler.ts +++ b/src/event-handler.ts @@ -1,11 +1,19 @@ import { Webhooks } from "@octokit/webhooks"; import { Context, SimplifiedContext } from "./context"; import { customOctokit } from "./octokit"; +import { createClient } from "@supabase/supabase-js"; +import { Database } from "./types/database"; +import { Logs } from "ubiquibot-logger"; +import { LogLevel } from "ubiquibot-logger/pretty-logs"; export type Options = { webhookSecret: string; appId: string | number; privateKey: string; + supabaseUrl: string; + supabaseKey: string; + logRetryLimit: number; + logLevel: LogLevel; }; export class EventHandler { @@ -13,15 +21,24 @@ export class EventHandler { public on: Webhooks["on"]; public onAny: Webhooks["onAny"]; public onError: Webhooks["onError"]; + public log: Logs; private _webhookSecret: string; private _privateKey: string; private _appId: number; + private _supabaseUrl: string; + private _supabaseKey: string; + private _logRetryLimit: number; + private _logLevel: LogLevel; constructor(options: Options) { this._privateKey = options.privateKey; this._appId = Number(options.appId); this._webhookSecret = options.webhookSecret; + this._supabaseKey = options.supabaseKey; + this._supabaseUrl = options.supabaseUrl; + this._logRetryLimit = options.logRetryLimit; + this._logLevel = options.logLevel; this.webhooks = new Webhooks({ secret: this._webhookSecret, @@ -42,11 +59,18 @@ export class EventHandler { }, }); + const supabaseClient = createClient(this._supabaseUrl, this._supabaseKey, { + auth: { persistSession: false }, + }); + + this.log = new Logs(supabaseClient, this._logRetryLimit, this._logLevel, null); + this.on = this.webhooks.on; this.onAny = this.webhooks.onAny; this.onError = this.webhooks.onError; this.onAny((event) => { + this.log.info(`Event ${event.name} received (id: ${event.id})`, { id: event.id, name: event.name }); console.log(`Event ${event.name} received (id: ${event.id})`); }); this.onError((error) => { diff --git a/src/types/database.ts b/src/types/database.ts new file mode 100644 index 0000000..f0476b1 --- /dev/null +++ b/src/types/database.ts @@ -0,0 +1,589 @@ +type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[]; + +export interface Database { + public: { + Tables: { + access: { + Row: { + created: string; + id: number; + labels: Json | null; + location_id: number | null; + multiplier: number; + multiplier_reason: string | null; + updated: string | null; + user_id: number; + }; + Insert: { + created?: string; + id?: number; + labels?: Json | null; + location_id?: number | null; + multiplier?: number; + multiplier_reason?: string | null; + updated?: string | null; + user_id: number; + }; + Update: { + created?: string; + id?: number; + labels?: Json | null; + location_id?: number | null; + multiplier?: number; + multiplier_reason?: string | null; + updated?: string | null; + user_id?: number; + }; + Relationships: [ + { + foreignKeyName: "access_user_id_fkey"; + columns: ["user_id"]; + referencedRelation: "users"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_access_location"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + credits: { + Row: { + amount: number; + created: string; + id: number; + location_id: number | null; + permit_id: number | null; + updated: string | null; + }; + Insert: { + amount: number; + created?: string; + id?: number; + location_id?: number | null; + permit_id?: number | null; + updated?: string | null; + }; + Update: { + amount?: number; + created?: string; + id?: number; + location_id?: number | null; + permit_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "credits_location_id_fkey"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "credits_permit_id_fkey"; + columns: ["permit_id"]; + referencedRelation: "permits"; + referencedColumns: ["id"]; + }, + ]; + }; + debits: { + Row: { + amount: number; + created: string; + id: number; + location_id: number | null; + token_id: number | null; + updated: string | null; + }; + Insert: { + amount: number; + created?: string; + id?: number; + location_id?: number | null; + token_id?: number | null; + updated?: string | null; + }; + Update: { + amount?: number; + created?: string; + id?: number; + location_id?: number | null; + token_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "debits_token_id_fkey"; + columns: ["token_id"]; + referencedRelation: "tokens"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "fk_debits_location"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + labels: { + Row: { + authorized: boolean | null; + created: string; + id: number; + label_from: string | null; + label_to: string | null; + location_id: number | null; + updated: string | null; + }; + Insert: { + authorized?: boolean | null; + created?: string; + id?: number; + label_from?: string | null; + label_to?: string | null; + location_id?: number | null; + updated?: string | null; + }; + Update: { + authorized?: boolean | null; + created?: string; + id?: number; + label_from?: string | null; + label_to?: string | null; + location_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "labels_location_id_fkey"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + locations: { + Row: { + comment_id: number | null; + created: string; + id: number; + issue_id: number | null; + node_id: string | null; + node_type: string | null; + node_url: string | null; + organization_id: number | null; + repository_id: number | null; + updated: string | null; + user_id: number | null; + }; + Insert: { + comment_id?: number | null; + created?: string; + id?: number; + issue_id?: number | null; + node_id?: string | null; + node_type?: string | null; + node_url?: string | null; + organization_id?: number | null; + repository_id?: number | null; + updated?: string | null; + user_id?: number | null; + }; + Update: { + comment_id?: number | null; + created?: string; + id?: number; + issue_id?: number | null; + node_id?: string | null; + node_type?: string | null; + node_url?: string | null; + organization_id?: number | null; + repository_id?: number | null; + updated?: string | null; + user_id?: number | null; + }; + Relationships: []; + }; + logs: { + Row: { + created: string; + id: number; + level: string | null; + location_id: number | null; + log: string; + metadata: Json | null; + updated: string | null; + }; + Insert: { + created?: string; + id?: number; + level?: string | null; + location_id?: number | null; + log: string; + metadata?: Json | null; + updated?: string | null; + }; + Update: { + created?: string; + id?: number; + level?: string | null; + location_id?: number | null; + log?: string; + metadata?: Json | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "fk_logs_location"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + partners: { + Row: { + created: string; + id: number; + location_id: number | null; + updated: string | null; + wallet_id: number | null; + }; + Insert: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Update: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Relationships: [ + { + foreignKeyName: "fk_partners_location"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "partners_wallet_id_fkey"; + columns: ["wallet_id"]; + referencedRelation: "wallets"; + referencedColumns: ["id"]; + }, + ]; + }; + permits: { + Row: { + amount: string; + beneficiary_id: number; + created: string; + deadline: string; + id: number; + location_id: number | null; + nonce: string; + partner_id: number | null; + signature: string; + token_id: number | null; + transaction: string | null; + updated: string | null; + }; + Insert: { + amount: string; + beneficiary_id: number; + created?: string; + deadline: string; + id?: number; + location_id?: number | null; + nonce: string; + partner_id?: number | null; + signature: string; + token_id?: number | null; + transaction?: string | null; + updated?: string | null; + }; + Update: { + amount?: string; + beneficiary_id?: number; + created?: string; + deadline?: string; + id?: number; + location_id?: number | null; + nonce?: string; + partner_id?: number | null; + signature?: string; + token_id?: number | null; + transaction?: string | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "fk_permits_location"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "permits_beneficiary_id_fkey"; + columns: ["beneficiary_id"]; + referencedRelation: "users"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "permits_partner_id_fkey"; + columns: ["partner_id"]; + referencedRelation: "partners"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "permits_token_fkey"; + columns: ["token_id"]; + referencedRelation: "tokens"; + referencedColumns: ["id"]; + }, + ]; + }; + settlements: { + Row: { + created: string; + credit_id: number | null; + debit_id: number | null; + id: number; + location_id: number | null; + updated: string | null; + user_id: number; + }; + Insert: { + created?: string; + credit_id?: number | null; + debit_id?: number | null; + id?: number; + location_id?: number | null; + updated?: string | null; + user_id: number; + }; + Update: { + created?: string; + credit_id?: number | null; + debit_id?: number | null; + id?: number; + location_id?: number | null; + updated?: string | null; + user_id?: number; + }; + Relationships: [ + { + foreignKeyName: "fk_settlements_location"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "settlements_credit_id_fkey"; + columns: ["credit_id"]; + referencedRelation: "credits"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "settlements_debit_id_fkey"; + columns: ["debit_id"]; + referencedRelation: "debits"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "settlements_user_id_fkey"; + columns: ["user_id"]; + referencedRelation: "users"; + referencedColumns: ["id"]; + }, + ]; + }; + tokens: { + Row: { + address: string; + created: string; + id: number; + location_id: number | null; + network: number; + updated: string | null; + }; + Insert: { + address: string; + created?: string; + id?: number; + location_id?: number | null; + network?: number; + updated?: string | null; + }; + Update: { + address?: string; + created?: string; + id?: number; + location_id?: number | null; + network?: number; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "tokens_location_id_fkey"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + users: { + Row: { + created: string; + id: number; + location_id: number | null; + updated: string | null; + wallet_id: number | null; + }; + Insert: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Update: { + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + wallet_id?: number | null; + }; + Relationships: [ + { + foreignKeyName: "users_location_id_fkey"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + { + foreignKeyName: "users_wallet_id_fkey"; + columns: ["wallet_id"]; + referencedRelation: "wallets"; + referencedColumns: ["id"]; + }, + ]; + }; + wallets: { + Row: { + address: string | null; + created: string; + id: number; + location_id: number | null; + updated: string | null; + }; + Insert: { + address?: string | null; + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + }; + Update: { + address?: string | null; + created?: string; + id?: number; + location_id?: number | null; + updated?: string | null; + }; + Relationships: [ + { + foreignKeyName: "wallets_location_id_fkey"; + columns: ["location_id"]; + referencedRelation: "locations"; + referencedColumns: ["id"]; + }, + ]; + }; + }; + Views: { + [_ in never]: never; + }; + Functions: { + [_ in never]: never; + }; + Enums: { + github_node_type: + | "App" + | "Bot" + | "CheckRun" + | "CheckSuite" + | "ClosedEvent" + | "CodeOfConduct" + | "Commit" + | "CommitComment" + | "CommitContributionsByRepository" + | "ContributingGuidelines" + | "ConvertToDraftEvent" + | "CreatedCommitContribution" + | "CreatedIssueContribution" + | "CreatedPullRequestContribution" + | "CreatedPullRequestReviewContribution" + | "CreatedRepositoryContribution" + | "CrossReferencedEvent" + | "Discussion" + | "DiscussionComment" + | "Enterprise" + | "EnterpriseUserAccount" + | "FundingLink" + | "Gist" + | "Issue" + | "IssueComment" + | "JoinedGitHubContribution" + | "Label" + | "License" + | "Mannequin" + | "MarketplaceCategory" + | "MarketplaceListing" + | "MergeQueue" + | "MergedEvent" + | "MigrationSource" + | "Milestone" + | "Organization" + | "PackageFile" + | "Project" + | "ProjectCard" + | "ProjectColumn" + | "ProjectV2" + | "PullRequest" + | "PullRequestCommit" + | "PullRequestReview" + | "PullRequestReviewComment" + | "ReadyForReviewEvent" + | "Release" + | "ReleaseAsset" + | "Repository" + | "RepositoryContactLink" + | "RepositoryTopic" + | "RestrictedContribution" + | "ReviewDismissedEvent" + | "SecurityAdvisoryReference" + | "SocialAccount" + | "SponsorsListing" + | "Team" + | "TeamDiscussion" + | "TeamDiscussionComment" + | "User" + | "Workflow" + | "WorkflowRun" + | "WorkflowRunFile"; + }; + CompositeTypes: { + [_ in never]: never; + }; + }; +} diff --git a/src/types/env.ts b/src/types/env.ts index 7548be2..bb8e1a7 100644 --- a/src/types/env.ts +++ b/src/types/env.ts @@ -1,4 +1,12 @@ import { Type as T, type Static } from "@sinclair/typebox"; -export const envSchema = T.Object({ WEBHOOK_SECRET: T.String(), APP_ID: T.String(), PRIVATE_KEY: T.String() }); +export const envSchema = T.Object({ + WEBHOOK_SECRET: T.String(), + APP_ID: T.String(), + PRIVATE_KEY: T.String(), + SUPABASE_URL: T.String(), + SUPABASE_KEY: T.String(), + LOG_LEVEL: T.String(), + LOG_RETRY_LIMIT: T.String(), +}); export type Env = Static; diff --git a/src/worker.ts b/src/worker.ts index 68d72f3..cb259e6 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -3,6 +3,7 @@ import { Value } from "@sinclair/typebox/value"; import { EventHandler } from "./event-handler"; import { bindHandlers } from "./handlers"; import { envSchema, Env } from "./types/env"; +import { LogLevel } from "ubiquibot-logger/pretty-logs"; export default { async fetch(request: Request, env: Env): Promise { @@ -70,7 +71,15 @@ export default { }); } - const eventHandler = new EventHandler({ webhookSecret: env.WEBHOOK_SECRET, appId: env.APP_ID, privateKey: env.PRIVATE_KEY }); + const eventHandler = new EventHandler({ + webhookSecret: env.WEBHOOK_SECRET, + appId: env.APP_ID, + privateKey: env.PRIVATE_KEY, + supabaseUrl: env.SUPABASE_URL, + supabaseKey: env.SUPABASE_KEY, + logLevel: LogLevel[env.LOG_LEVEL as keyof typeof LogLevel], + logRetryLimit: Number(env.LOG_RETRY_LIMIT), + }); bindHandlers(eventHandler); try { diff --git a/wrangler.toml b/wrangler.toml index b30dd2c..1c43f43 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,6 +1,7 @@ name = "ubiquibot-worker" main = "src/worker.ts" compatibility_date = "2023-12-06" +node_compat = true # Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) # Note: Use secrets to store sensitive data.