diff --git a/src/app/api/tiktok-shop/import/route.ts b/src/app/api/tiktok-shop/import/route.ts index 68ee5a8..66be8b8 100644 --- a/src/app/api/tiktok-shop/import/route.ts +++ b/src/app/api/tiktok-shop/import/route.ts @@ -6,7 +6,7 @@ import { planFromUser } from "@/lib/plans"; import { checkAndConsumeQuota, refundQuota } from "@/lib/quota"; import { hizSiniriAsimi } from "@/lib/rate-limit"; -const schema = z.object({ query: z.string().trim().min(2).max(100), region: z.enum(["US", "GB", "DE", "FR", "TR"]).default("US"), maxResults: z.coerce.number().int().refine((v) => [10, 25, 50].includes(v)) }); +const schema = z.object({ query: z.string().trim().min(2).max(100), region: z.enum(["US", "GB", "SG", "MY", "PH", "TH", "VN", "ID"]).default("US"), maxResults: z.coerce.number().int().refine((v) => [10, 25, 50].includes(v)) }); export async function POST(request: Request) { const limited = hizSiniriAsimi(request, "arama"); diff --git a/src/components/tiktok-shop-import.tsx b/src/components/tiktok-shop-import.tsx index f771175..7058c14 100644 --- a/src/components/tiktok-shop-import.tsx +++ b/src/components/tiktok-shop-import.tsx @@ -21,7 +21,7 @@ export function TikTokShopImport({ planLimit }: { planLimit: number }) { } return
setQuery(e.target.value)} placeholder="TikTok Shop ürününü canlı ara" className="rounded-2xl border border-slate-200 px-4 py-3" /> - + {message &&

{message}

} diff --git a/src/lib/apify-tiktok.ts b/src/lib/apify-tiktok.ts index 0c7d000..7cb1974 100644 --- a/src/lib/apify-tiktok.ts +++ b/src/lib/apify-tiktok.ts @@ -47,7 +47,7 @@ export async function runTikTokShopActor(input: { query: string; region: string; const response = await fetch(`${API_BASE}/actors/${actor}/run-sync-get-dataset-items?${params}`, { method: "POST", headers: { authorization: `Bearer ${token}`, "content-type": "application/json", accept: "application/json" }, - body: JSON.stringify({ search_word: input.query, region: input.region, maxItems: input.maxResults, enrichProductDetails: false }), + body: JSON.stringify(tikTokActorInput(input)), signal: controller.signal, cache: "no-store" }); @@ -61,6 +61,10 @@ export async function runTikTokShopActor(input: { query: string; region: string; } finally { clearTimeout(timer); } } +export function tikTokActorInput(input: { query: string; region: string; maxResults: number }) { + return { keyword: input.query, region: input.region, maxItems: input.maxResults, addonProductDetails: false }; +} + export async function importTikTokProducts(rows: Row[], region: string) { let imported = 0; let failed = 0; diff --git a/tests/core.test.ts b/tests/core.test.ts index d051b16..cb338cb 100644 --- a/tests/core.test.ts +++ b/tests/core.test.ts @@ -5,6 +5,7 @@ import { normalizeApifyAd } from "../src/lib/apify"; import { getFeatureLimit } from "../src/lib/plans"; import { istemciIp, hizSiniriAsimi } from "../src/lib/rate-limit"; import { stripePriceFor } from "../src/lib/stripe"; +import { tikTokActorInput } from "../src/lib/apify-tiktok"; test("Apify reklamı metin, medya ve ülke alanlarıyla normalize edilir", () => { const ad = normalizeApifyAd({ @@ -49,3 +50,9 @@ test("Stripe fiyat kimliği env allowlist'inden okunur", () => { if (previous === undefined) delete process.env.STRIPE_PRICE_BASIC_MONTHLY; else process.env.STRIPE_PRICE_BASIC_MONTHLY = previous; }); + +test("TikTok aktör girdisi resmi şemadaki alanları kullanır", () => { + assert.deepEqual(tikTokActorInput({ query: "phone case", region: "US", maxResults: 10 }), { + keyword: "phone case", region: "US", maxItems: 10, addonProductDetails: false + }); +});