Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/questions discord notification #4116

Merged
merged 3 commits into from
Feb 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ jobs:
--build-secret VITE_HIDE_MEMBER_PINS_BY_DEFAULT="$VITE_HIDE_MEMBER_PINS_BY_DEFAULT"
- run:
name: Set Supabase Secrets
command: flyctl -a << parameters.FLY_APP_NAME >> secrets set SUPABASE_API_URL=$SUPABASE_API_URL SUPABASE_KEY=$SUPABASE_KEY FIREBASE_PROJECT_ID=$FIREBASE_PROJECT_ID FIREBASE_PRIVATE_KEY="$FIREBASE_PRIVATE_KEY" FIREBASE_CLIENT_EMAIL=$FIREBASE_CLIENT_EMAIL
command: flyctl -a << parameters.FLY_APP_NAME >> secrets set SUPABASE_API_URL=$SUPABASE_API_URL SUPABASE_KEY=$SUPABASE_KEY DISCORD_WEBHOOK_URL=$DISCORD_WEBHOOK_URL FIREBASE_PROJECT_ID=$FIREBASE_PROJECT_ID FIREBASE_PRIVATE_KEY="$FIREBASE_PRIVATE_KEY" FIREBASE_CLIENT_EMAIL=$FIREBASE_CLIENT_EMAIL
deploy-supabase:
docker:
- image: cimg/node:20.7.0
Expand Down
23 changes: 0 additions & 23 deletions functions/src/Integrations/firebase-discord.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,29 +126,6 @@ function sendDiscordMessage(content: string) {
})
}

export const notifyQuestionPublished = functions
.runWith({ memory: '512MB' })
.firestore.document('questions_rev20230926/{id}')
// currently, questions are immediately posted with no review.
// if that changes, this code will need to be updated.
.onCreate(async (snapshot) => {
const info = snapshot.data()
console.log(info)

const username = info._createdBy
const title = info.title
const slug = info.slug

try {
const response = await axios.post(DISCORD_WEBHOOK_URL, {
content: `❓ ${username} has a new question: ${title}\nHelp them out and answer here: <${SITE_URL}/questions/${slug}>`,
})
handleResponse(response)
} catch (error) {
handleErr(error)
}
})

const handleResponse = (res: AxiosResponse) => {
console.log('post success')
return res
Expand Down
1 change: 0 additions & 1 deletion functions/src/Integrations/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ exports.notifyHowtoAwaitingModeration = Slack.notifyHowtoAwaitingModeration

exports.notifyPinPublished = Discord.notifyPinPublished
exports.notifyLibraryItemPublished = Discord.notifyLibraryItemPublished
exports.notifyQuestionPublished = Discord.notifyQuestionPublished
exports.notifyResearchUpdatePublished = Discord.notifyResearchUpdatePublished

exports.patreonAuth = Patreon.patreonAuth
27 changes: 22 additions & 5 deletions src/routes/api.questions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import { verifyFirebaseToken } from 'src/firestore/firestoreAdmin.server'
import { Question } from 'src/models/question.model'
import { ITEMS_PER_PAGE } from 'src/pages/Question/constants'
import { createSupabaseServerClient } from 'src/repository/supabase.server'
import { discordServiceServer } from 'src/services/discordService.server'
import { convertToSlug } from 'src/utils/slug'
import { SUPPORTED_IMAGE_EXTENSIONS } from 'src/utils/storage'

import type { LoaderFunctionArgs } from '@remix-run/node'
import type { SupabaseClient } from '@supabase/supabase-js'
import type { DBProfile } from 'src/models/profile.model'
import type { DBQuestion } from 'src/models/question.model'
import type { QuestionSortOption } from 'src/pages/Question/QuestionSortOptions'

Expand Down Expand Up @@ -141,23 +143,23 @@ export const action = async ({ request }: LoaderFunctionArgs) => {
},
)
}
const userRequest = await client
const profileRequest = await client
.from('profiles')
.select()
.eq('firebase_auth_id', tokenValidation.user_id)
.limit(1)

if (userRequest.error || !userRequest.data?.at(0)) {
console.log(userRequest.error)
if (profileRequest.error || !profileRequest.data?.at(0)) {
console.log(profileRequest.error)
return Response.json({}, { status: 400, statusText: 'User not found' })
}

const user = userRequest.data[0]
const profile = profileRequest.data[0] as DBProfile

const questionResult = await client
.from('questions')
.insert({
created_by: user.id,
created_by: profile.id,
title: data.title,
description: data.description,
moderation: IModerationStatus.ACCEPTED,
Expand Down Expand Up @@ -192,6 +194,8 @@ export const action = async ({ request }: LoaderFunctionArgs) => {
}
}

notifyDiscord(question, profile, new URL(request.url).origin)

return Response.json({ question }, { headers, status: 201 })
} catch (error) {
console.log(error)
Expand All @@ -202,6 +206,19 @@ export const action = async ({ request }: LoaderFunctionArgs) => {
}
}

function notifyDiscord(
question: Question,
profile: DBProfile,
siteUrl: string,
) {
const title = question.title
const slug = question.slug

discordServiceServer.postWebhookRequest(
`❓ ${profile.username} has a new question: ${title}\nHelp them out and answer here: <${siteUrl}/questions/${slug}>`,
)
}

async function isDuplicateSlug(slug: string, client: SupabaseClient) {
const { data } = await client
.from('questions')
Expand Down
25 changes: 25 additions & 0 deletions src/services/discordService.server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const postWebhookRequest = async (message: string) => {
try {
const discordWebhookUrl = process.env.DISCORD_WEBHOOK_URL as string

if (!discordWebhookUrl) {
return
}

await fetch(discordWebhookUrl as string, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: message,
}),
})
} catch (error) {
console.error(error)
}
}

export const discordServiceServer = {
postWebhookRequest,
}
Loading