pushizo 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +158 -170
- data/lib/pushizo/base_resource.rb +14 -14
- data/lib/pushizo/client.rb +264 -264
- data/lib/pushizo/errors.rb +96 -96
- data/lib/pushizo/file_upload.rb +30 -30
- data/lib/pushizo/generated/models.rb +2681 -159
- data/lib/pushizo/generated/resources.rb +1629 -52
- data/lib/pushizo/identity_token.rb +40 -40
- data/lib/pushizo/model.rb +117 -117
- data/lib/pushizo/transport.rb +26 -26
- data/lib/pushizo/version.rb +5 -5
- data/lib/pushizo/webhook.rb +92 -92
- data/lib/pushizo.rb +27 -27
- metadata +3 -7
data/lib/pushizo/errors.rb
CHANGED
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pushizo
|
|
4
|
-
# API hata zarfındaki error.code değerleri (HS_ önekli katalog).
|
|
5
|
-
module ErrorCode
|
|
6
|
-
VALIDATION_ERROR = "HS_VALIDATION_ERROR"
|
|
7
|
-
BAD_REQUEST = "HS_BAD_REQUEST"
|
|
8
|
-
UNAUTHENTICATED = "HS_UNAUTHENTICATED"
|
|
9
|
-
FORBIDDEN = "HS_FORBIDDEN"
|
|
10
|
-
TENANT_MISMATCH = "HS_TENANT_MISMATCH"
|
|
11
|
-
NOT_FOUND = "HS_NOT_FOUND"
|
|
12
|
-
CONFLICT = "HS_CONFLICT"
|
|
13
|
-
IDEMPOTENCY_CONFLICT = "HS_IDEMPOTENCY_CONFLICT"
|
|
14
|
-
IDEMPOTENCY_IN_PROGRESS = "HS_IDEMPOTENCY_IN_PROGRESS"
|
|
15
|
-
NO_RECIPIENTS = "HS_NO_RECIPIENTS"
|
|
16
|
-
CHANNEL_NOT_CONFIGURED = "HS_CHANNEL_NOT_CONFIGURED"
|
|
17
|
-
CONTENT_INVALID = "HS_CONTENT_INVALID"
|
|
18
|
-
SUBSCRIPTION_INVALID = "HS_SUBSCRIPTION_INVALID"
|
|
19
|
-
UNPROCESSABLE = "HS_UNPROCESSABLE"
|
|
20
|
-
RATE_LIMITED = "HS_RATE_LIMITED"
|
|
21
|
-
QUOTA_EXCEEDED = "HS_QUOTA_EXCEEDED"
|
|
22
|
-
INTERNAL = "HS_INTERNAL"
|
|
23
|
-
NOT_IMPLEMENTED = "HS_NOT_IMPLEMENTED"
|
|
24
|
-
PROVIDER_UNAVAILABLE = "HS_PROVIDER_UNAVAILABLE"
|
|
25
|
-
SERVICE_UNAVAILABLE = "HS_SERVICE_UNAVAILABLE"
|
|
26
|
-
# İstemci tarafı: bağlantı kurulamadı veya zaman aşımı (status 0).
|
|
27
|
-
NETWORK = "NETWORK"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# API hata zarfından ({"error": {"code", "message", "request_id", "details"}}) türetilen istisna.
|
|
31
|
-
# HTTP durumuna göre alt sınıflar fırlatılır (NotFoundError, RateLimitError …).
|
|
32
|
-
class Error < StandardError
|
|
33
|
-
attr_reader :status, :code, :request_id, :details, :retry_after
|
|
34
|
-
|
|
35
|
-
def initialize(status, code, message, request_id: nil, details: nil, retry_after: nil)
|
|
36
|
-
super(message)
|
|
37
|
-
@status = status
|
|
38
|
-
@code = code
|
|
39
|
-
@request_id = request_id
|
|
40
|
-
@details = details
|
|
41
|
-
@retry_after = retry_after
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# 429, 5xx veya ağ hatası: yeniden denenebilir.
|
|
45
|
-
def retryable?
|
|
46
|
-
status.zero? || status == 429 || status >= 500
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def to_s
|
|
50
|
-
suffix = request_id ? " (request_id=#{request_id})" : ""
|
|
51
|
-
"[#{status} #{code}] #{super}#{suffix}"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# HTTP durumuna karşılık gelen sınıf.
|
|
55
|
-
def self.class_for(status)
|
|
56
|
-
case status
|
|
57
|
-
when 0 then NetworkError
|
|
58
|
-
when 400, 422 then InvalidRequestError
|
|
59
|
-
when 401 then AuthenticationError
|
|
60
|
-
when 403 then PermissionDeniedError
|
|
61
|
-
when 404 then NotFoundError
|
|
62
|
-
when 409 then ConflictError
|
|
63
|
-
when 429 then RateLimitError
|
|
64
|
-
else status >= 500 ? ServerError : Error
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Bağlantı kurulamadı veya zaman aşımı (status 0).
|
|
70
|
-
class NetworkError < Error; end
|
|
71
|
-
# 400 / 422: istek doğrulanamadı veya işlenemedi (details alan hatalarını içerir).
|
|
72
|
-
class InvalidRequestError < Error; end
|
|
73
|
-
# 401: API anahtarı eksik veya geçersiz.
|
|
74
|
-
class AuthenticationError < Error; end
|
|
75
|
-
# 403: anahtarın kapsamı yetersiz, IP izin listesi dışı veya kaynak başka kiracıya ait.
|
|
76
|
-
class PermissionDeniedError < Error; end
|
|
77
|
-
# 404: kaynak bulunamadı.
|
|
78
|
-
class NotFoundError < Error; end
|
|
79
|
-
# 409: kaynak çakışması veya idempotency anahtarı çakışması.
|
|
80
|
-
class ConflictError < Error; end
|
|
81
|
-
# 429: hız sınırı veya plan kotası aşıldı.
|
|
82
|
-
class RateLimitError < Error; end
|
|
83
|
-
# 5xx: sunucu veya sağlayıcı geçici olarak kullanılamıyor.
|
|
84
|
-
class ServerError < Error; end
|
|
85
|
-
|
|
86
|
-
# Webhook imzası geçersiz. reason: missing_header, malformed_header, timestamp_out_of_tolerance,
|
|
87
|
-
# signature_mismatch veya malformed_body.
|
|
88
|
-
class WebhookSignatureError < StandardError
|
|
89
|
-
attr_reader :reason
|
|
90
|
-
|
|
91
|
-
def initialize(reason)
|
|
92
|
-
super("Pushizo webhook imzası geçersiz: #{reason}")
|
|
93
|
-
@reason = reason
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pushizo
|
|
4
|
+
# API hata zarfındaki error.code değerleri (HS_ önekli katalog).
|
|
5
|
+
module ErrorCode
|
|
6
|
+
VALIDATION_ERROR = "HS_VALIDATION_ERROR"
|
|
7
|
+
BAD_REQUEST = "HS_BAD_REQUEST"
|
|
8
|
+
UNAUTHENTICATED = "HS_UNAUTHENTICATED"
|
|
9
|
+
FORBIDDEN = "HS_FORBIDDEN"
|
|
10
|
+
TENANT_MISMATCH = "HS_TENANT_MISMATCH"
|
|
11
|
+
NOT_FOUND = "HS_NOT_FOUND"
|
|
12
|
+
CONFLICT = "HS_CONFLICT"
|
|
13
|
+
IDEMPOTENCY_CONFLICT = "HS_IDEMPOTENCY_CONFLICT"
|
|
14
|
+
IDEMPOTENCY_IN_PROGRESS = "HS_IDEMPOTENCY_IN_PROGRESS"
|
|
15
|
+
NO_RECIPIENTS = "HS_NO_RECIPIENTS"
|
|
16
|
+
CHANNEL_NOT_CONFIGURED = "HS_CHANNEL_NOT_CONFIGURED"
|
|
17
|
+
CONTENT_INVALID = "HS_CONTENT_INVALID"
|
|
18
|
+
SUBSCRIPTION_INVALID = "HS_SUBSCRIPTION_INVALID"
|
|
19
|
+
UNPROCESSABLE = "HS_UNPROCESSABLE"
|
|
20
|
+
RATE_LIMITED = "HS_RATE_LIMITED"
|
|
21
|
+
QUOTA_EXCEEDED = "HS_QUOTA_EXCEEDED"
|
|
22
|
+
INTERNAL = "HS_INTERNAL"
|
|
23
|
+
NOT_IMPLEMENTED = "HS_NOT_IMPLEMENTED"
|
|
24
|
+
PROVIDER_UNAVAILABLE = "HS_PROVIDER_UNAVAILABLE"
|
|
25
|
+
SERVICE_UNAVAILABLE = "HS_SERVICE_UNAVAILABLE"
|
|
26
|
+
# İstemci tarafı: bağlantı kurulamadı veya zaman aşımı (status 0).
|
|
27
|
+
NETWORK = "NETWORK"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# API hata zarfından ({"error": {"code", "message", "request_id", "details"}}) türetilen istisna.
|
|
31
|
+
# HTTP durumuna göre alt sınıflar fırlatılır (NotFoundError, RateLimitError …).
|
|
32
|
+
class Error < StandardError
|
|
33
|
+
attr_reader :status, :code, :request_id, :details, :retry_after
|
|
34
|
+
|
|
35
|
+
def initialize(status, code, message, request_id: nil, details: nil, retry_after: nil)
|
|
36
|
+
super(message)
|
|
37
|
+
@status = status
|
|
38
|
+
@code = code
|
|
39
|
+
@request_id = request_id
|
|
40
|
+
@details = details
|
|
41
|
+
@retry_after = retry_after
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# 429, 5xx veya ağ hatası: yeniden denenebilir.
|
|
45
|
+
def retryable?
|
|
46
|
+
status.zero? || status == 429 || status >= 500
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def to_s
|
|
50
|
+
suffix = request_id ? " (request_id=#{request_id})" : ""
|
|
51
|
+
"[#{status} #{code}] #{super}#{suffix}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# HTTP durumuna karşılık gelen sınıf.
|
|
55
|
+
def self.class_for(status)
|
|
56
|
+
case status
|
|
57
|
+
when 0 then NetworkError
|
|
58
|
+
when 400, 422 then InvalidRequestError
|
|
59
|
+
when 401 then AuthenticationError
|
|
60
|
+
when 403 then PermissionDeniedError
|
|
61
|
+
when 404 then NotFoundError
|
|
62
|
+
when 409 then ConflictError
|
|
63
|
+
when 429 then RateLimitError
|
|
64
|
+
else status >= 500 ? ServerError : Error
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Bağlantı kurulamadı veya zaman aşımı (status 0).
|
|
70
|
+
class NetworkError < Error; end
|
|
71
|
+
# 400 / 422: istek doğrulanamadı veya işlenemedi (details alan hatalarını içerir).
|
|
72
|
+
class InvalidRequestError < Error; end
|
|
73
|
+
# 401: API anahtarı eksik veya geçersiz.
|
|
74
|
+
class AuthenticationError < Error; end
|
|
75
|
+
# 403: anahtarın kapsamı yetersiz, IP izin listesi dışı veya kaynak başka kiracıya ait.
|
|
76
|
+
class PermissionDeniedError < Error; end
|
|
77
|
+
# 404: kaynak bulunamadı.
|
|
78
|
+
class NotFoundError < Error; end
|
|
79
|
+
# 409: kaynak çakışması veya idempotency anahtarı çakışması.
|
|
80
|
+
class ConflictError < Error; end
|
|
81
|
+
# 429: hız sınırı veya plan kotası aşıldı.
|
|
82
|
+
class RateLimitError < Error; end
|
|
83
|
+
# 5xx: sunucu veya sağlayıcı geçici olarak kullanılamıyor.
|
|
84
|
+
class ServerError < Error; end
|
|
85
|
+
|
|
86
|
+
# Webhook imzası geçersiz. reason: missing_header, malformed_header, timestamp_out_of_tolerance,
|
|
87
|
+
# signature_mismatch veya malformed_body.
|
|
88
|
+
class WebhookSignatureError < StandardError
|
|
89
|
+
attr_reader :reason
|
|
90
|
+
|
|
91
|
+
def initialize(reason)
|
|
92
|
+
super("Pushizo webhook imzası geçersiz: #{reason}")
|
|
93
|
+
@reason = reason
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
data/lib/pushizo/file_upload.rb
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Pushizo
|
|
4
|
-
# Multipart dosya alanı. İçerik bellekte tutulur ki yeniden denemeler aynı gövdeyi göndersin.
|
|
5
|
-
class FileUpload
|
|
6
|
-
attr_reader :filename, :content, :content_type
|
|
7
|
-
|
|
8
|
-
def initialize(content, filename: "upload", content_type: nil)
|
|
9
|
-
@content = content.to_s.b
|
|
10
|
-
@filename = filename.to_s.empty? ? "upload" : filename.to_s
|
|
11
|
-
@content_type = content_type || (@filename.end_with?(".csv") ? "text/csv" : "application/octet-stream")
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Diskteki dosyayı okur.
|
|
15
|
-
def self.from_path(path, content_type: nil)
|
|
16
|
-
new(File.binread(path), filename: File.basename(path), content_type: content_type)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# FileUpload, IO (ör. File.open(path, "rb")) veya String içeriği FileUpload'a çevirir.
|
|
20
|
-
def self.wrap(value)
|
|
21
|
-
case value
|
|
22
|
-
when FileUpload then value
|
|
23
|
-
when String then new(value)
|
|
24
|
-
else
|
|
25
|
-
name = value.respond_to?(:path) && value.path ? File.basename(value.path) : "upload"
|
|
26
|
-
new(value.read, filename: name)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pushizo
|
|
4
|
+
# Multipart dosya alanı. İçerik bellekte tutulur ki yeniden denemeler aynı gövdeyi göndersin.
|
|
5
|
+
class FileUpload
|
|
6
|
+
attr_reader :filename, :content, :content_type
|
|
7
|
+
|
|
8
|
+
def initialize(content, filename: "upload", content_type: nil)
|
|
9
|
+
@content = content.to_s.b
|
|
10
|
+
@filename = filename.to_s.empty? ? "upload" : filename.to_s
|
|
11
|
+
@content_type = content_type || (@filename.end_with?(".csv") ? "text/csv" : "application/octet-stream")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Diskteki dosyayı okur.
|
|
15
|
+
def self.from_path(path, content_type: nil)
|
|
16
|
+
new(File.binread(path), filename: File.basename(path), content_type: content_type)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# FileUpload, IO (ör. File.open(path, "rb")) veya String içeriği FileUpload'a çevirir.
|
|
20
|
+
def self.wrap(value)
|
|
21
|
+
case value
|
|
22
|
+
when FileUpload then value
|
|
23
|
+
when String then new(value)
|
|
24
|
+
else
|
|
25
|
+
name = value.respond_to?(:path) && value.path ? File.basename(value.path) : "upload"
|
|
26
|
+
new(value.read, filename: name)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|