Skip to content

Commit

Permalink
fix: issue_comments linting added issue_comments:edited, created and …
Browse files Browse the repository at this point in the history
…deleted
  • Loading branch information
sshivaditya committed Aug 27, 2024
1 parent e50de1d commit 9c0de23
Show file tree
Hide file tree
Showing 20 changed files with 498 additions and 183 deletions.
2 changes: 2 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
}
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ts-template",
"description": "ts-template for Ubiquibot plugins.",
"ubiquity:listeners": ["issue_comment.created"],
"ubiquity:listeners": ["issue_comment.created", "issue_comment.edited", "issue_comment.deleted"],
"commands": {
"command1": {
"ubiquity:example": "/command1 argument",
Expand Down
11 changes: 7 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "plugin-template",
"name": "plugin-issue-comment",
"version": "1.0.0",
"description": "Ubiquibot plugin template repository with TypeScript support.",
"description": "Issue comment plugin for Ubiquibot.",
"author": "Ubiquity DAO",
"license": "MIT",
"main": "src/worker.ts",
Expand All @@ -17,7 +17,7 @@
"knip-ci": "knip --no-exit-code --reporter json --config .github/knip.ts",
"prepare": "husky install",
"test": "jest --setupFiles dotenv/config --coverage",
"worker": "wrangler dev --env dev --port 4000"
"worker": "wrangler dev --env dev --port 5000"
},
"keywords": [
"typescript",
Expand All @@ -32,8 +32,11 @@
"@octokit/rest": "20.1.1",
"@octokit/webhooks": "13.2.7",
"@sinclair/typebox": "0.32.33",
"@supabase/functions-js": "^2.4.3",
"@supabase/supabase-js": "^2.45.2",
"@ubiquity-dao/ubiquibot-logger": "^1.3.0",
"dotenv": "16.4.5",
"openai": "^4.56.0",
"typebox-validators": "0.3.5"
},
"devDependencies": {
Expand Down Expand Up @@ -65,7 +68,7 @@
"tsx": "4.15.6",
"typescript": "5.4.5",
"typescript-eslint": "7.13.1",
"wrangler": "3.60.3"
"wrangler": "3.62.0"
},
"lint-staged": {
"*.ts": [
Expand Down
20 changes: 20 additions & 0 deletions src/adapters/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { SupabaseClient } from "@supabase/supabase-js";
import { Context } from "../types";
import { Comment } from "./supabase/helpers/comment";
import { SuperSupabase } from "./supabase/helpers/supabase";
import { SuperOpenAi } from "./openai/helpers/openai";
import OpenAI from "openai";
import { Embedding } from "./openai/helpers/embedding";

export function createAdapters(supabaseClient: SupabaseClient, openai: OpenAI, context: Context) {
return {
supabase: {
comment: new Comment(supabaseClient, context),
super: new SuperSupabase(supabaseClient, context),
},
openai: {
embedding: new Embedding(openai, context),
super: new SuperOpenAi(openai, context),
},
};
}
25 changes: 25 additions & 0 deletions src/adapters/openai/helpers/embedding.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import OpenAI from "openai";
import { Context } from "../../../types";
import { SuperOpenAi } from "./openai";
const VECTOR_SIZE = 512;

export class Embedding extends SuperOpenAi {
protected context: Context;

constructor(client: OpenAI, context: Context) {
super(client, context);
this.context = context;
}

async createEmbedding(text: string): Promise<number[]> {
const params: OpenAI.EmbeddingCreateParams = {
model: "text-embedding-3-small",
input: text,
dimensions: VECTOR_SIZE,
};
const response = await this.client.embeddings.create({
...params,
});
return response.data[0]?.embedding;
}
}
12 changes: 12 additions & 0 deletions src/adapters/openai/helpers/openai.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { OpenAI } from "openai";
import { Context } from "../../../types/context";

export class SuperOpenAi {
protected client: OpenAI;
protected context: Context;

constructor(client: OpenAI, context: Context) {
this.client = client;
this.context = context;
}
}
47 changes: 47 additions & 0 deletions src/adapters/supabase/helpers/comment.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { SupabaseClient } from "@supabase/supabase-js";
import { SuperSupabase } from "./supabase";
import { Context } from "../../../types/context";

export class Comment extends SuperSupabase {
constructor(supabase: SupabaseClient, context: Context) {
super(supabase, context);
}

async createComment(commentBody: string, commentId: number) {
//First Check if the comment already exists
const { data, error } = await this.supabase.from("issue_comments").select("*").eq("id", commentId);
if (error) {
this.context.logger.error("Error creating comment", error);
return;
}
if (data && data.length > 0) {
this.context.logger.info("Comment already exists");
return;
} else {
//Create the embedding for this comment
const embedding = await this.context.adapters.openai.embedding.createEmbedding(commentBody);
const { error } = await this.supabase.from("issue_comments").insert([{ id: commentId, body: commentBody, embedding: embedding }]);
if (error) {
this.context.logger.error("Error creating comment", error);
return;
}
}
this.context.logger.info("Comment created successfully");
}

async updateComment(commentBody: string, commentId: number) {
//Create the embedding for this comment
const embedding = Array.from(await this.context.adapters.openai.embedding.createEmbedding(commentBody));
const { error } = await this.supabase.from("issue_comments").update({ body: commentBody, embedding: embedding }).eq("id", commentId);
if (error) {
this.context.logger.error("Error updating comment", error);
}
}

async deleteComment(commentId: number) {
const { error } = await this.supabase.from("issue_comments").delete().eq("id", commentId);
if (error) {
this.context.logger.error("Error deleting comment", error);
}
}
}
12 changes: 12 additions & 0 deletions src/adapters/supabase/helpers/supabase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { SupabaseClient } from "@supabase/supabase-js";
import { Context } from "../../../types/context";

export class SuperSupabase {
protected supabase: SupabaseClient;
protected context: Context;

constructor(supabase: SupabaseClient, context: Context) {
this.supabase = supabase;
this.context = context;
}
}
34 changes: 34 additions & 0 deletions src/handlers/add-comments.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Context } from "../types";

export async function addComments(context: Context) {
const {
logger,
payload,
adapters: { supabase },
} = context;

const sender = payload.comment.user?.login;
const repo = payload.repository.name;
const issueNumber = payload.issue.number;
const owner = payload.repository.owner.login;
const body = payload.comment.body;

// Log the payload
logger.info(`Executing addComments:`, { sender, repo, issueNumber, owner });

// Add the comment to the database
try {
await supabase.comment.createComment(body, payload.comment.id);
} catch (error) {
if (error instanceof Error) {
logger.error(`Error creating comment:`, { error: error, stack: error.stack });
throw error;
} else {
logger.error(`Error creating comment:`, { err: error, error: new Error() });
throw error;
}
}

logger.ok(`Successfully created comment!`);
logger.verbose(`Exiting addComments`);
}
33 changes: 33 additions & 0 deletions src/handlers/delete-comments.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { Context } from "../types";

export async function deleteComment(context: Context) {
const {
logger,
payload,
adapters: { supabase },
} = context;

const sender = payload.comment.user?.login;
const repo = payload.repository.name;
const issueNumber = payload.issue.number;
const owner = payload.repository.owner.login;

// Log the payload
logger.debug(`Executing deleteComment:`, { sender, repo, issueNumber, owner });

// Add the comment to the database
try {
await supabase.comment.deleteComment(payload.comment.id);
} catch (error) {
if (error instanceof Error) {
logger.error(`Error deleting comment:`, { error: error, stack: error.stack });
throw error;
} else {
logger.error(`Error deleting comment:`, { err: error, error: new Error() });
throw error;
}
}

logger.ok(`Successfully deleted comment!`);
logger.verbose(`Exiting deleteComments`);
}
59 changes: 0 additions & 59 deletions src/handlers/hello-world.ts

This file was deleted.

34 changes: 34 additions & 0 deletions src/handlers/update-comments.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Context } from "../types";

export async function updateComment(context: Context) {
const {
logger,
payload,
adapters: { supabase },
} = context;

const sender = payload.comment.user?.login;
const repo = payload.repository.name;
const issueNumber = payload.issue.number;
const owner = payload.repository.owner.login;
const body = payload.comment.body;

// Log the payload
logger.debug(`Executing updateComment:`, { sender, repo, issueNumber, owner });

// Fetch the previous comment and update it in the db
try {
await supabase.comment.updateComment(body, payload.comment.id);
} catch (error) {
if (error instanceof Error) {
logger.error(`Error updating comment:`, { error: error, stack: error.stack });
throw error;
} else {
logger.error(`Error updating comment:`, { err: error, error: new Error() });
throw error;
}
}

logger.ok(`Successfully updated comment!`);
logger.verbose(`Exiting updateComment`);
}
3 changes: 1 addition & 2 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@ import { plugin } from "./plugin";
*/
export async function run() {
const payload = github.context.payload.inputs;

const env = Value.Decode(envSchema, payload.env);
const settings = Value.Decode(pluginSettingsSchema, Value.Default(pluginSettingsSchema, JSON.parse(payload.settings)));

if (!pluginSettingsValidator.test(settings)) {
throw new Error("Invalid settings provided");
}

console.log("ENV", payload);
const inputs: PluginInputs = {
stateId: payload.stateId,
eventName: payload.eventName,
Expand Down
Loading

0 comments on commit 9c0de23

Please sign in to comment.