Go SDK
github.com/exec0de/pushizo/sdk/go — Go 1.23+, yalnızca standart kütüphane; üretilen modeller ve servisler, yeniden deneme, idempotency, range-over-func sayfalama, webhook imza doğrulaması.
Kaynak: sdk/go. Modeller (models_gen.go) ve servisler (resources_gen.go) api/openapi.yaml'dan üretilir; kimlik doğrulama, yeniden deneme, idempotency, sayfalama ve webhook imza doğrulaması el yazımıdır.
Kurulum
go get github.com/exec0de/pushizo/sdk/goKullanım
import (
"context"
"log"
"os"
pushizo "github.com/exec0de/pushizo/sdk/go"
)
func main() {
ctx := context.Background()
hs, err := pushizo.NewClient(os.Getenv("HS_API_KEY"),
pushizo.WithAppID("app_…"),
// pushizo.WithBaseURL("http://localhost:4000"),
)
if err != nil {
log.Fatal(err)
}
// Bildirim gönder: Idempotency-Key verilmezse otomatik UUID
res, err := hs.Notifications.Create(ctx, &pushizo.CreateNotificationDto{
Target: pushizo.CreateNotificationDtoTarget{IncludeAliases: map[string][]string{"external_id": {"user-42"}}},
Contents: map[string]string{"en": "Your order shipped", "tr": "Siparişiniz kargoya verildi"},
ThreadID: pushizo.String("orders"),
}, pushizo.WithIdempotencyKey("order-1001"))
if err != nil {
log.Fatal(err)
}
log.Println(res.ID, res.Status)
// Kullanıcı oluştur/güncelle
_, err = hs.Users.Upsert(ctx, &pushizo.UpsertUserDto{
ExternalID: pushizo.String("user-42"),
Tags: map[string]string{"plan": "pro"},
})
// Cursor sayfalama (Go 1.23 range-over-func)
for segment, err := range hs.Segments.ListAll(ctx, &pushizo.SegmentsListParams{Limit: pushizo.Int64(100)}) {
if err != nil {
log.Fatal(err)
}
log.Println(segment.Name)
}
// Başka bir app için tek çağrı
_, _ = hs.Apps.Get(ctx, pushizo.ForApp("app_diger"))
// SDK identity verification
_ = pushizo.IdentityHash(os.Getenv("HS_SDK_SECRET"), "user-42")
}İsteğe bağlı alanlar işaretçidir: pushizo.String, pushizo.Int64, pushizo.Bool, pushizo.Float64 ya da genel pushizo.Ptr(v). Servisler OpenAPI etiketleriyle adlandırılır (hs.Notifications, hs.Users, hs.Aliases, hs.Subscriptions, hs.Events, hs.Channels, hs.Segments, hs.Templates, hs.Campaigns, hs.Journeys, hs.InAppMessages, hs.Inbox, hs.Categories, hs.Preferences, hs.Suppressions, hs.Webhooks, hs.Analytics, hs.Exports, hs.Imports, hs.APIKeys, hs.Apps, hs.Organization). A/B kazananı: hs.Campaigns.SelectWinner, hs.InAppMessages.SelectWinner (InAppMessages.Winner eski addır, kullanımdan kaldırılmıştır). SDK'da metodu olmayan uçlar ve JSON dışı yanıtlar için:
var csv string
err := hs.Request(ctx, "GET", "/v1/apps/{appId}/analytics/messages", url.Values{"format": {"csv"}}, nil, &csv)Ayarlar
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
WithAppID | — | Çağrıda ForApp verilmezse kullanılan app |
WithBaseURL | https://api.pushizo.com | API adresi |
WithTimeout | 30 sn | Deneme başına zaman aşımı |
WithMaxRetries | 3 | En fazla yeniden deneme (politika) |
WithAutoIdempotencyKey | true | Idempotency-Key destekleyen çağrılarda otomatik UUID |
WithHTTPClient | http.DefaultClient | Özel *http.Client |
Çağrı başına: ForApp, WithIdempotencyKey, WithHeader, WithRequestTimeout, WithRequestMaxRetries.
Hatalar
API hataları *pushizo.Error tipindedir (StatusCode, Code, Message, RequestID, Details); kategoriler ErrNetwork, ErrInvalidRequest (400/422), ErrAuthentication, ErrPermissionDenied, ErrNotFound, ErrConflict, ErrRateLimited, ErrServer.
_, err := hs.Notifications.Get(ctx, "msg_yok")
var apiErr *pushizo.Error
switch {
case errors.Is(err, pushizo.ErrNotFound):
// 404
case errors.Is(err, pushizo.ErrRateLimited):
// 429 (yeniden denemeler tükendi)
case errors.As(err, &apiErr) && apiErr.Code == pushizo.CodeNoRecipients:
// 422 HS_NO_RECIPIENTS
}Yeniden deneme politikası
Yeniden denemeler üstel geri çekilmeyle (0,3 / 1 / 3 sn; Retry-After başlığı varsa ona uyulur) en fazla WithMaxRetries kez yapılır. Sunucuda tekrarlanması güvenli olmayan isteklerin çift işlenmemesi için kural HTTP metoduna göre değişir:
| Durum | GET, HEAD, OPTIONS, PUT, DELETE | POST, PATCH |
|---|---|---|
429 | Yeniden denenir | Yeniden denenir (istek işlenmeden reddedilmiştir) |
5xx, zaman aşımı, gönderim sonrası bağlantı kopması | Yeniden denenir | Yalnızca Idempotency-Key varsa |
İstek hiç gönderilemedi (*net.DNSError, dial/proxyconnect aşamasındaki *net.OpError: bağlantı reddi, bağlantı zaman aşımı) | Yeniden denenir | Yeniden denenir |
Diğer 4xx | Denenmez | Denenmez |
5xx ya da gönderim sonrası ağ hatasında sunucu isteği işlemiş olabilir; anahtarsız bir POST/PATCH tekrarı çift bildirim veya kayıt üretebilir. Notifications.Create ve Users.Upsert anahtar verilmezse otomatik UUID üretir (otomatik anahtar kapatılmadıysa), bu yüzden bu iki çağrı güvenle yeniden denenir. Başka bir POST/PATCH çağrısının da yeniden denenmesini istiyorsanız anahtarı kendiniz verin: hs.Events.Send(ctx, body, pushizo.WithIdempotencyKey("evt-"+id)). Yeniden denemelerde aynı anahtar gönderilir; API aynı anahtarla 24 saat içinde gelen tekrarı ilk yanıtla karşılar.
Webhook imza doğrulaması
http.HandleFunc("/hooks/pushizo", func(w http.ResponseWriter, r *http.Request) {
payload, _ := io.ReadAll(r.Body) // ham gövde
events, err := pushizo.ConstructWebhookEvents(payload,
r.Header.Get(pushizo.WebhookSignatureHeader),
[]string{os.Getenv("HS_WEBHOOK_SECRET")}, // rotasyonda eski ve yeni secret birlikte
nil) // varsayılan tolerans 5 dk
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
for _, ev := range events { // tekil veya batch gövde
_ = ev.Type // Pushizo-Event-Id ile tekrarları ayıklayın
}
w.WriteHeader(http.StatusNoContent)
})Yalnızca doğrulama için pushizo.VerifyWebhookSignature(...) WebhookVerifyResult{OK, Timestamp, Reason} döner. Olay türleri: Webhook'lar.
Geliştirme
go vet ./... && go test ./... # sdk/go içinde
node sdk/scripts/generate-server-sdks.mjs --lang go # depo kökünde; *_gen.go dosyaları yeniden üretilirPython SDK
pushizo (PyPI) — Python 3.9+, httpx; OpenAPI'den üretilen modeller ve kaynak metotları, yeniden deneme, idempotency, sayfalama, webhook imza doğrulaması.
Java SDK
io.pushizo:pushizo-java — Java 17+, java.net.http ve Jackson; üretilen modeller, parametre sınıfları ve kaynaklar; yeniden deneme, idempotency, sayfalama, webhook imza doğrulaması.