Compare commits

...

1 Commits

Author SHA1 Message Date
Jack 61742bc045 feat(console): restore referral rewards 2026-08-16 17:53:12 +00:00
2 changed files with 56 additions and 0 deletions
@@ -0,0 +1,24 @@
import type { APIEvent } from "@solidjs/start/server"
import { Referral } from "@opencode-ai/console-core/referral.js"
import { safeEqual } from "@opencode-ai/console-core/util/crypto.js"
import { Resource } from "@opencode-ai/console-resource"
import z from "zod"
const Body = z.object({
workspaceID: z.string().startsWith("wrk_"),
referralID: z.string().startsWith("ref_"),
})
export async function POST(event: APIEvent) {
if (!safeEqual(event.request.headers.get("authorization") ?? "", `Bearer ${Resource.SUPPORT_API_KEY.value}`)) {
return Response.json({ error: "Unauthorized" }, { status: 401 })
}
const body = Body.safeParse(await event.request.json().catch(() => undefined))
if (!body.success) {
return Response.json({ error: "Invalid request", issues: body.error.issues }, { status: 400 })
}
return Referral.restoreReward(body.data)
.then((result) => Response.json({ success: true, message: "Referral reward restored", result }))
.catch((error) => Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 }))
}
+32
View File
@@ -475,6 +475,38 @@ export namespace Referral {
})
}
export async function restoreReward(input: { workspaceID: string; referralID: string }) {
return Database.transaction(async (tx) => {
const reward = await tx
.select({ timeApplied: ReferralRewardTable.timeApplied })
.from(ReferralRewardTable)
.innerJoin(ReferralTable, eq(ReferralTable.id, ReferralRewardTable.referralID))
.where(
and(
eq(ReferralRewardTable.workspaceID, input.workspaceID),
eq(ReferralRewardTable.referralID, input.referralID),
isNull(ReferralRewardTable.timeDeleted),
isNull(ReferralTable.timeDeleted),
),
)
.then((rows) => rows[0])
if (!reward) throw new Error("Referral reward not found")
await tx
.update(ReferralRewardTable)
.set({ timeApplied: null })
.where(
and(
eq(ReferralRewardTable.workspaceID, input.workspaceID),
eq(ReferralRewardTable.referralID, input.referralID),
isNull(ReferralRewardTable.timeDeleted),
),
)
return { restored: reward.timeApplied !== null }
})
}
export async function completeFromLiteSubscription(input: { workspaceID: string; userID: string }) {
return Database.transaction(async (tx) => {
const invitee = await tx