Pushizo Docs
SDK rehberleri

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/go

Kullanı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çenekVarsayılanAçıklama
WithAppID—Çağrıda ForApp verilmezse kullanılan app
WithBaseURLhttps://api.pushizo.comAPI adresi
WithTimeout30 snDeneme başına zaman aşımı
WithMaxRetries3En fazla yeniden deneme (politika)
WithAutoIdempotencyKeytrueIdempotency-Key destekleyen çağrılarda otomatik UUID
WithHTTPClienthttp.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:

DurumGET, HEAD, OPTIONS, PUT, DELETEPOST, PATCH
429Yeniden denenirYeniden denenir (istek işlenmeden reddedilmiştir)
5xx, zaman aşımı, gönderim sonrası bağlantı kopmasıYeniden denenirYalnı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 denenirYeniden denenir
Diğer 4xxDenenmezDenenmez

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 üretilir

Bu sayfada