Kartla ödeme uç noktası
API / backend · Zorluk 5/5 · TypeScript · 46 satırKöken: Kurgu
Görev
Yapay zekâdan istenen
POST /charges uç noktasının işleyicisini yaz: hesabın kayıtlı kartından amountCents tutarını çek. İstemci zaman aşımında aynı isteği aynı Idempotency-Key ile yeniden gönderir; aynı anahtarla gelen tekrar istek kartı yeniden çekmeden ilk cevabı alır. Anahtarı istemci seçer. accountId oturumdan gelir, anahtar yönlendiricide kontrol edildi (boş değil, en çok 255 karakter). Tutar pozitif bir tam sayı değilse 400, kart reddedilirse 402, başarıda 201 dön. Servis tek bir Node.js sürecinde çalışır; answers bütün isteklerce paylaşılır.
Teslim notu
Yapay zekâ kodu teslim ederken şunu yazdı:
“Tekrar istekler güvenli: her cevap Idempotency-Key ile saklanıyor ve aynı anahtar geldiğinde kart yeniden çekilmeden saklanan cevap dönüyor. Reddedilen ödemeler de saklanıyor, tutar doğrulanıyor.”
Yapay zekânın yazdığı kod
TypeScript46 satırHatalı bulduğun satırları işaretle; her işarete önem seç ve nedenini bir cümleyle yaz.
Satıra tıkla ya da dokun. Klavyede satıra gidip Enter'a bas.
Önem nasıl seçilir
- KritikVeri kaybı, güvenlik açığı ya da para kaybı
- ÖnemliGörevin istediği bir durumda kullanıcı yanlış sonuç alır
- KüçükGörevin dışında kalan nadir bir uç durum ya da okunurluk
Test konusunda önem, testin yakalamadığı hatalı uygulamanın etkisine göre belirlenir.
Gerekçe puanlanmaz; sonuçta örnek cevapla karşılaştırırsın.
export interface ChargeRequest { accountId: string; idempotencyKey: string; amountCents: number;}export interface ChargeAnswer { status: 201 | 400 | 402; body: { chargeId?: string; error?: string };}export type CardResult = { ok: true; chargeId: string } | { ok: false; reason: string };export interface Dependencies { /** Charges the account's saved card. Never throws. */ chargeCard(accountId: string, amountCents: number): Promise<CardResult>; /** Shared by all requests; keeps each answer for 24 hours. */ answers: { get(key: string): Promise<ChargeAnswer | undefined>; set(key: string, answer: ChargeAnswer): Promise<void>; };}export function createChargeHandler({ chargeCard, answers }: Dependencies) { return async function handleCharge( request: ChargeRequest, ): Promise<ChargeAnswer> { const { accountId, idempotencyKey, amountCents } = request; if (!Number.isInteger(amountCents) || amountCents <= 0) { return { status: 400, body: { error: "invalid_amount" } }; } const key = `charge:${idempotencyKey}`; const saved = await answers.get(key); if (saved !== undefined) { return saved; } const result = await chargeCard(accountId, amountCents); const answer: ChargeAnswer = result.ok ? { status: 201, body: { chargeId: result.chargeId } } : { status: 402, body: { error: result.reason } }; await answers.set(key, answer); return answer; };}Kanıtlayan test
Doğru seçenek, bu kodda başarısız olan, yani hatayı ortaya çıkaran testtir.
Gönderince sayaca yedi bilgi gider; gerekçe metnin cihazında kalır. Veriler