BelgelerGeliştirici KılavuzuMedusaJS 2.0 ile Derinlemesine Entegrasyon

Medusa 2.0 Ticaret Motoru Entegrasyonu ve İş Akışları

Medusa 2.0, sepet, stok, siparişler ve çoklu ödeme yöntemlerini yöneten gelişmiş ticaret çekirdeğidir.

Medusa 2.0 Sürümü Hakkında Önemli Not
Platform, güçlü Workflows sistemi ve iki kat daha yüksek performans sunan Medusa v2 sürümünü temel alır.

1. Medusa v2 Modüler Mimarisi ve Anlık Senkronizasyon

Next.js ön yüzü, kurulum sırasında otomatik oluşturulan Publishable API Key ile resmi SDK üzerinden Medusa ile haberleşir.

product-strapi.tsÜrünler, varyantlar, renk ve beden seçeneklerinin kusursuz yönetimi.
review-product.tsAlışveriş sepeti işleme ve anlık promosyon kuponu uygulama.
wishlist-customer.tsTeslimat adresleri, vergi ve kargo maliyetlerinin doğru hesaplanması.
question-product.tsÖdeme tamamlandığında sipariş durumunun güncellenmesi ve stok düşümü.
store-admin/src/links/review-product.ts
typescript
import { defineLink } from "@medusajs/framework/modules-sdk"
import ProductModule from "@medusajs/medusa/product"
import ProductReviewModule from "../modules/product-review"
export default defineLink(
ProductModule.linkable.product,
ProductReviewModule.linkable.productReview
)

2. Mağaza Ortam Değişkenleri (.env) Yapılandırması

Mağaza ön yüzünü Medusa çekirdeğine bağlamak için zorunlu ortam değişkenleri:

.env Dosyasındaki Medusa Bağlantı Değişkenleri
bash
npm run seed
Medusa JS İstemcisini Başlatma
bash
npx medusa exec ./src/scripts/seed-30-products.ts
Ürün Listesini Getirme Sorgusu Örneği
bash
npx medusa exec ./src/scripts/sync-meilisearch.ts
Sepete Ürün Ekleme İşlemi Örneği
bash
npx medusa exec ./src/scripts/delete-all-products.ts

3. Sipariş Süreçleri ve Dahili Workflows Mimarisi

src/lib/data/products.ts
typescript
import { sdk } from "@lib/config"
import { HttpTypes } from "@medusajs/types"
import { getAuthHeaders, getCacheOptions } from "./cookies"
import { getLocaleHeader } from "@lib/util/get-locale-header"
import { getRegion, retrieveRegion } from "./regions"
import { isNetworkFetchError, warnMedusaUnreachable } from "@lib/util/medusa-fetch"
export const listProducts = async ({
pageParam = 1,
queryParams,
countryCode,
regionId,
disableAuth = false,
}: {
pageParam?: number
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductListParams
countryCode?: string
regionId?: string
disableAuth?: boolean
}): Promise<{
response: { products: HttpTypes.StoreProduct[]; count: number }
nextPage: number | null
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductListParams
}> => {
if (!countryCode && !regionId) {
throw new Error("Country code or region ID is required")
}
const limit = queryParams?.limit || 12
const _pageParam = Math.max(pageParam, 1)
const offset = _pageParam === 1 ? 0 : (_pageParam - 1) * limit
let region: HttpTypes.StoreRegion | undefined | null
if (countryCode) {
region = await getRegion(countryCode, disableAuth)
} else {
region = await retrieveRegion(regionId!, disableAuth)
}
if (!region) {
return { response: { products: [], count: 0 }, nextPage: null }
}
const headers = {
...(disableAuth ? {} : await getAuthHeaders()),
...(await getLocaleHeader(disableAuth)),
} as Record<string, string>
const next = {
...(disableAuth
? { tags: ["store-products"] }
: await getCacheOptions("store-products")),
revalidate: 3600,
}
try {
return await sdk.client
.fetch<{ products: HttpTypes.StoreProduct[]; count: number }>(
`/store/products`,
{
method: "GET",
query: {
limit,
offset,
region_id: region?.id,
fields:
"*variants.calculated_price,+variants.inventory_quantity,*variants.images,*options,*options.values,*variants.options,+metadata,+tags",
...queryParams,
},
headers,
next,
cache: "force-cache",
}
)
.then(({ products, count }) => {
const nextPage = count > offset + limit ? pageParam + 1 : null
return {
response: { products, count },
nextPage,
queryParams,
}
})
} catch (error) {
if (isNetworkFetchError(error)) {
warnMedusaUnreachable("listProducts")
return {
response: { products: [], count: 0 },
nextPage: null,
queryParams,
}
}
throw error
}
}

4. Ürün Yönetimi ve Fiyat Önbellekleme İpuçları

Katalog verileri Next.js'de belirli etiketlerle (örn: medusa-products) önbelleğe alınır ve fiyat değiştiğinde otomatik yenilenir.

Medusa Ürünleri Önbellek Yenileme
env
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
SMTP_FROM_ADDRESS=noreply@yourdomain.com
CONTACT_FORM_RECIPIENT=info@yourdomain.com
SENDPULSE_API_ID=your_sendpulse_id
SENDPULSE_API_SECRET=your_sendpulse_secret