mirror of
https://github.com/codeflash-ai/codeflash-internal.git
synced 2026-05-04 18:25:18 +00:00
Reverts the following commits from main: -d7a8b8f2perf: fix CI build + lazy-load heavy libs + parallelize DB queries (#2601) -48b5e2b4fix: make tree-sitter WASM build failure non-fatal when cache exists (#2602) -c372b6bcMerge pull request #2603 from codeflash-ai/fix/deploy-build-common -b656bb1dfix: cf-api deploy broken by pnpm workspace migration -c1b0076cfix: align TypeScript versions to deduplicate @prisma/client in pnpm -09ed4d4bfix: use redirect instead of throw for auth failures during prerender -71127055fix: redirect remaining auth throws that crash prerendering PR #2601 introduced 18 bugs including 5 authorization bypass vulnerabilities: - Cross-org data access via forged currentOrganizationId cookie - Cross-repo/cross-org member role escalation and deletion (unscoped lookups) - Missing replayTests/concolicTests in approval flow - repository_id filter silently broken for personal accounts - Tests mocking wrong Prisma method ($queryRawUnsafe vs $queryRaw) The subsequent PRs (#2602, #2603, and follow-up commits) were dependent fixes for issues caused by #2601 and are reverted together. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
118 lines
3.4 KiB
TypeScript
118 lines
3.4 KiB
TypeScript
import { WebClient, ChatPostMessageArguments } from "@slack/web-api"
|
|
|
|
// Dependencies interface for easier testing
|
|
export interface SendSlackMessageDependencies {
|
|
WebClient: typeof WebClient
|
|
getSlackToken: () => string | undefined
|
|
getSlackChannelId: () => string | undefined
|
|
console: typeof console
|
|
}
|
|
|
|
// Default dependencies
|
|
let dependencies: SendSlackMessageDependencies = {
|
|
WebClient,
|
|
getSlackToken: () => process.env.SLACK_TOKEN,
|
|
getSlackChannelId: () => process.env.SLACK_CHANNEL_ID,
|
|
console,
|
|
}
|
|
|
|
// For testing - allow dependency injection
|
|
export function setSendSlackMessageDependencies(deps: Partial<SendSlackMessageDependencies>) {
|
|
dependencies = { ...dependencies, ...deps }
|
|
}
|
|
|
|
export function resetSendSlackMessageDependencies() {
|
|
dependencies = {
|
|
WebClient,
|
|
getSlackToken: () => process.env.SLACK_TOKEN,
|
|
getSlackChannelId: () => process.env.SLACK_CHANNEL_ID,
|
|
console,
|
|
}
|
|
}
|
|
|
|
// Initialize web client
|
|
let web: WebClient | null = null
|
|
|
|
export function initializeWebClient() {
|
|
const SLACK_TOKEN = dependencies.getSlackToken()
|
|
const SLACK_CHANNEL_ID = dependencies.getSlackChannelId()
|
|
|
|
if (!SLACK_TOKEN) {
|
|
throw new Error("Missing SLACK_TOKEN")
|
|
}
|
|
|
|
if (!SLACK_CHANNEL_ID) {
|
|
throw new Error("Missing SLACK_CHANNEL_ID")
|
|
}
|
|
|
|
if (!web) {
|
|
web = new dependencies.WebClient(SLACK_TOKEN, {})
|
|
}
|
|
|
|
return web
|
|
}
|
|
|
|
// For testing - allow resetting the web client
|
|
export function resetWebClient() {
|
|
web = null
|
|
}
|
|
|
|
/**
|
|
* Send a message to Slack
|
|
*
|
|
* @param {string|object} message - Text message or Block Kit message object
|
|
* @param {string|null} channel - Channel ID, defaults to SLACK_CHANNEL_ID
|
|
* @param {boolean} returnData - Whether to return the full Slack API response
|
|
* @returns {Promise<boolean|object>} - True or API response
|
|
*/
|
|
export const sendSlackMessage = async (
|
|
message: any,
|
|
channel: string | null = null,
|
|
returnData: boolean = false,
|
|
): Promise<boolean | object> => {
|
|
return new Promise(async (resolve, reject) => {
|
|
try {
|
|
const webClient = initializeWebClient()
|
|
const SLACK_CHANNEL_ID = dependencies.getSlackChannelId()
|
|
const channelId = channel || SLACK_CHANNEL_ID
|
|
|
|
// Configure the message payload depending on the input type
|
|
let payload: ChatPostMessageArguments
|
|
|
|
if (typeof message === "string") {
|
|
payload = {
|
|
channel: channelId,
|
|
text: message,
|
|
}
|
|
} else if (message && typeof message === "object") {
|
|
if (message.blocks) {
|
|
payload = {
|
|
channel: channelId,
|
|
text: message.text || "Notification from CodeFlash",
|
|
blocks: message.blocks,
|
|
}
|
|
} else {
|
|
dependencies.console.warn("Object passed to sendSlackMessage without blocks property")
|
|
payload = {
|
|
channel: channelId,
|
|
text: JSON.stringify(message),
|
|
}
|
|
}
|
|
} else {
|
|
dependencies.console.error("Invalid message type", typeof message)
|
|
payload = {
|
|
channel: channelId,
|
|
text: "Invalid message",
|
|
}
|
|
}
|
|
|
|
// console.log("Sending payload to Slack:", JSON.stringify(payload, null, 2));
|
|
|
|
const resp = await webClient.chat.postMessage(payload)
|
|
return resolve(returnData ? resp : true)
|
|
} catch (error) {
|
|
dependencies.console.error("Error sending Slack message:", error)
|
|
return resolve(returnData ? { error } : true)
|
|
}
|
|
})
|
|
}
|