1 module iyzipay.requests;
2 
3 import std.json: JSONValue, parseJSON;
4 import std.net.curl: HTTP;
5 import std.conv: to;
6 
7 public import iyzipay.iyzipayresource;
8 public import iyzipay.pkibuilder;
9 
10 alias GET = HTTP.Method.get;
11 alias POST = HTTP.Method.post;
12 alias DELETE = HTTP.Method.del;
13 
14 class ApiTest : IyzipayResource
15 {
16     public string retrieve(Options options)
17     {
18         return connectHTTP(GET, options.baseUrl ~ "/payment/test", options);
19     }
20 }
21 
22 class BinNumber : IyzipayResource
23 {
24     public string retrieve(string request, Options options)
25     {
26         string pki = toPkiString(request);
27         return connectHTTP(POST, options.baseUrl ~ "/payment/bin/check", options, request, pki);
28     }
29 
30     private string toPkiString(string request)
31     {
32         JSONValue json = parseJSON(request);
33 
34         PkiBuilder pki = new PkiBuilder();
35         pki.append("locale", json["locale"].str);
36         pki.append("conversationId", json["conversationId"].str);
37         pki.append("binNumber", json["binNumber"].str);
38         return pki.getPkiString;
39     }
40 }
41 
42 class InstallmentInfo : IyzipayResource
43 {
44     public string retrieve(string request, Options options)
45     {
46         string pki = toPkiString(request);
47         return connectHTTP(POST, options.baseUrl ~ "/payment/iyzipos/installment", options, request, pki);
48     }
49 
50     private string toPkiString(string request)
51     {
52         JSONValue json = parseJSON(request);
53 
54         PkiBuilder pki = new PkiBuilder();
55         pki.append("locale", json["locale"].str);
56         pki.append("conversationId", json["conversationId"].str);
57         pki.append("binNumber", json["binNumber"].str);
58         pki.append("price", json["price"].str);
59         return pki.getPkiString;
60     }
61 }
62 
63 class Payment : IyzipayResource
64 {
65     public string create(string request, Options options)
66     {
67         string pki = toPkiStringCreate(request);
68         return connectHTTP(POST, options.baseUrl ~ "/payment/auth", options, request, pki);
69     }
70 
71     public string retrieve(string request, Options options)
72     {
73         string pki = toPkiStringRetrieve(request);
74         return connectHTTP(POST, options.baseUrl ~ "/payment/detail", options, request, pki);
75     }
76 
77     private string toPkiStringCreate(string request)
78     {
79         JSONValue json = parseJSON(request);
80 
81         PkiBuilder pki = new PkiBuilder();
82         pki.append("locale", json["locale"].str);
83         pki.append("conversationId", json["conversationId"].str);
84         pki.appendPrice("price", json["price"].str);
85         pki.appendPrice("paidPrice", json["paidPrice"].str);
86         pki.append("installment", json["installment"].str);
87         pki.append("paymentChannel", json["paymentChannel"].str);
88         pki.append("basketId", json["basketId"].str);
89         pki.append("paymentGroup", json["paymentGroup"].str);
90         pki.append("paymentCard", pkiPaymentCard(json["paymentCard"]));
91         pki.append("buyer", pkiBuyer(json["buyer"]));
92         pki.append("shippingAddress", pkiAddress(json["shippingAddress"]));
93         pki.append("billingAddress", pkiAddress(json["billingAddress"]));
94         pki.append("basketItems", pkiBasketItems(json["basketItems"].array()));
95         pki.append("currency", json["currency"].str);
96         return pki.getPkiString;
97     }
98 
99     private string toPkiStringRetrieve(string request)
100     {
101         JSONValue json = parseJSON(request);
102 
103         PkiBuilder pki = new PkiBuilder();
104         pki.append("locale", json["locale"].str);
105         pki.append("conversationId", json["conversationId"].str);
106         pki.append("paymentId", json["paymentId"].str);
107         pki.append("paymentConversationId", json["paymentConversationId"].str);
108         return pki.getPkiString;
109     }
110 
111     private string pkiBasketItems(JSONValue[] jsonArray)
112     {
113         string bastketItems;
114         foreach (JSONValue item; jsonArray)
115         {
116             PkiBuilder pki = new PkiBuilder();
117             pki.append("id", item["id"].str);
118             pki.appendPrice("price", item["price"].str);
119             pki.append("name", item["name"].str);
120             pki.append("category1", item["category1"].str);
121             pki.append("category2", item["category2"].str);
122             pki.append("itemType", item["itemType"].str);
123             bastketItems ~= pki.getPkiString ~ ", ";
124         }
125         return "[" ~ bastketItems[0..$-2] ~ "]";
126     }
127 
128     private string pkiAddress(JSONValue json)
129     {
130         PkiBuilder pki = new PkiBuilder();
131         pki.append("address", json["address"].str);
132         pki.append("zipCode", json["zipCode"].str);
133         pki.append("contactName", json["contactName"].str);
134         pki.append("city", json["city"].str);
135         pki.append("country", json["country"].str);
136         return pki.getPkiString;
137     }
138 
139     private string pkiBuyer(JSONValue json)
140     {
141         PkiBuilder pki = new PkiBuilder();
142         pki.append("id", json["id"].str);
143         pki.append("name", json["name"].str);
144         pki.append("surname", json["surname"].str);
145         pki.append("identityNumber", json["identityNumber"].str);
146         pki.append("email", json["email"].str);
147         pki.append("gsmNumber", json["gsmNumber"].str);
148         pki.append("registrationDate", json["registrationDate"].str);
149         pki.append("lastLoginDate", json["lastLoginDate"].str);
150         pki.append("registrationAddress", json["registrationAddress"].str);
151         pki.append("city", json["city"].str);
152         pki.append("country", json["country"].str);
153         pki.append("zipCode", json["zipCode"].str);
154         pki.append("ip", json["ip"].str);
155         return pki.getPkiString;
156     }
157 
158     private string pkiPaymentCard(JSONValue json)
159     {
160         PkiBuilder pki = new PkiBuilder();
161         pki.append("cardHolderName", json["cardHolderName"].str);
162         pki.append("cardNumber", json["cardNumber"].str);
163         pki.append("expireYear", json["expireYear"].str);
164         pki.append("expireMonth", json["expireMonth"].str);
165         pki.append("cvc", json["cvc"].str);
166         pki.append("registerCard", to!string(json["registerCard"].integer));
167         return pki.getPkiString;
168     }
169 }
170 
171 class ThreedsInitialize: IyzipayResource
172 {
173     public string create(string request, Options options)
174     {
175         string pki = toPkiString(request);
176         return connectHTTP(POST, options.baseUrl ~ "/payment/3dsecure/initialize", options, request, pki);
177     }
178 
179     private string toPkiString(string request)
180     {
181         JSONValue json = parseJSON(request);
182 
183         PkiBuilder pki = new PkiBuilder();
184         pki.append("locale", json["locale"].str);
185         pki.append("conversationId", json["conversationId"].str);
186         pki.appendPrice("price", json["price"].str);
187         pki.appendPrice("paidPrice", json["paidPrice"].str);
188         pki.append("installment", json["installment"].str);
189         pki.append("paymentChannel", json["paymentChannel"].str);
190         pki.append("basketId", json["basketId"].str);
191         pki.append("paymentGroup", json["paymentGroup"].str);
192         pki.append("paymentCard", pkiPaymentCard(json["paymentCard"]));
193         pki.append("buyer", pkiBuyer(json["buyer"]));
194         pki.append("shippingAddress", pkiAddress(json["shippingAddress"]));
195         pki.append("billingAddress", pkiAddress(json["billingAddress"]));
196         pki.append("basketItems", pkiBasketItems(json["basketItems"].array()));
197         pki.append("currency", json["currency"].str);
198         pki.append("callbackUrl", json["callbackUrl"].str);
199         return pki.getPkiString;
200     }
201 
202     private string pkiBasketItems(JSONValue[] jsonArray)
203     {
204         string bastketItems;
205         foreach (JSONValue item; jsonArray)
206         {
207             PkiBuilder pki = new PkiBuilder();
208             pki.append("id", item["id"].str);
209             pki.appendPrice("price", item["price"].str);
210             pki.append("name", item["name"].str);
211             pki.append("category1", item["category1"].str);
212             pki.append("category2", item["category2"].str);
213             pki.append("itemType", item["itemType"].str);
214             bastketItems ~= pki.getPkiString ~ ", ";
215         }
216         return "[" ~ bastketItems[0..$-2] ~ "]";
217     }
218 
219     private string pkiAddress(JSONValue json)
220     {
221         PkiBuilder pki = new PkiBuilder();
222         pki.append("address", json["address"].str);
223         pki.append("zipCode", json["zipCode"].str);
224         pki.append("contactName", json["contactName"].str);
225         pki.append("city", json["city"].str);
226         pki.append("country", json["country"].str);
227         return pki.getPkiString;
228     }
229 
230     private string pkiBuyer(JSONValue json)
231     {
232         PkiBuilder pki = new PkiBuilder();
233         pki.append("id", json["id"].str);
234         pki.append("name", json["name"].str);
235         pki.append("surname", json["surname"].str);
236         pki.append("identityNumber", json["identityNumber"].str);
237         pki.append("email", json["email"].str);
238         pki.append("gsmNumber", json["gsmNumber"].str);
239         pki.append("registrationDate", json["registrationDate"].str);
240         pki.append("lastLoginDate", json["lastLoginDate"].str);
241         pki.append("registrationAddress", json["registrationAddress"].str);
242         pki.append("city", json["city"].str);
243         pki.append("country", json["country"].str);
244         pki.append("zipCode", json["zipCode"].str);
245         pki.append("ip", json["ip"].str);
246         return pki.getPkiString;
247     }
248 
249     private string pkiPaymentCard(JSONValue json)
250     {
251         PkiBuilder pki = new PkiBuilder();
252         pki.append("cardHolderName", json["cardHolderName"].str);
253         pki.append("cardNumber", json["cardNumber"].str);
254         pki.append("expireYear", json["expireYear"].str);
255         pki.append("expireMonth", json["expireMonth"].str);
256         pki.append("cvc", json["cvc"].str);
257         pki.append("registerCard", to!string(json["registerCard"].integer));
258         return pki.getPkiString;
259     }
260 }
261 
262 class ThreedsPayment: IyzipayResource
263 {
264     public string create(string request, Options options)
265     {
266         string pki = toPkiStringCreate(request);
267         return connectHTTP(POST, options.baseUrl ~ "/payment/3dsecure/auth", options, request, pki);
268     }
269 
270     public string retrieve(string request, Options options)
271     {
272         string pki = toPkiStringRetrieve(request);
273         return connectHTTP(POST, options.baseUrl ~ "/payment/detail", options, request, pki);
274     }
275 
276     private string toPkiStringCreate(string request)
277     {
278         JSONValue json = parseJSON(request);
279 
280         PkiBuilder pki = new PkiBuilder();
281         pki.append("locale", json["locale"].str);
282         pki.append("conversationId", json["conversationId"].str);
283         pki.append("paymentId", json["paymentId"].str);
284         pki.append("conversationData", json["conversationData"].str);
285         return pki.getPkiString;
286     }
287 
288     private string toPkiStringRetrieve(string request)
289     {
290         JSONValue json = parseJSON(request);
291 
292         PkiBuilder pki = new PkiBuilder();
293         pki.append("locale", json["locale"].str);
294         pki.append("conversationId", json["conversationId"].str);
295         pki.append("paymentId", json["paymentId"].str);
296         pki.append("paymentConversationId", json["paymentConversationId"].str);
297         return pki.getPkiString;
298     }
299 }
300 
301 class Cancel: IyzipayResource
302 {
303     public string create(string request, Options options)
304     {
305         string pki = toPkiString(request);
306         return connectHTTP(POST, options.baseUrl ~ "/payment/cancel", options, request, pki);
307     }
308 
309     private string toPkiString(string request)
310     {
311         JSONValue json = parseJSON(request);
312 
313         PkiBuilder pki = new PkiBuilder();
314         pki.append("locale", json["locale"].str);
315         pki.append("conversationId", json["conversationId"].str);
316         pki.append("paymentId", json["paymentId"].str);
317         pki.append("ip", json["ip"].str);
318         return pki.getPkiString;
319     }
320 }
321 
322 class Refund: IyzipayResource
323 {
324     public string create(string request, Options options)
325     {
326         string pki = toPkiString(request);
327         import std.stdio;
328         writeln("-> " ~ pki);
329         return connectHTTP(POST, options.baseUrl ~ "/payment/refund", options, request, pki);
330     }
331 
332     private string toPkiString(string request)
333     {
334         JSONValue json = parseJSON(request);
335 
336         PkiBuilder pki = new PkiBuilder();
337         pki.append("locale", json["locale"].str);
338         pki.append("conversationId", json["conversationId"].str);
339         pki.append("paymentTransactionId", json["paymentTransactionId"].str);
340         pki.appendPrice("price", json["price"].str);
341         pki.append("ip", json["ip"].str);
342         pki.append("currency", json["currency"].str);
343         return pki.getPkiString;
344     }
345 }
346 
347 class Card: IyzipayResource
348 {
349     public string create(string request, Options options)
350     {
351         string pki = toPkiStringCreate(request);
352         return connectHTTP(POST, options.baseUrl ~ "/cardstorage/card", options, request, pki);
353     }
354 
355     public string delete_(string request, Options options)
356     {
357         string pki = toPkiStringDelete(request);
358         return connectHTTP(DELETE, options.baseUrl ~ "/cardstorage/card", options, request, pki);
359     }
360 
361     private string toPkiStringCreate(string request)
362     {
363         JSONValue json = parseJSON(request);
364 
365         PkiBuilder pki = new PkiBuilder();
366         pki.append("locale", json["locale"].str);
367         pki.append("conversationId", json["conversationId"].str);
368         pki.append("externalId", json["externalId"].str);
369         pki.append("email", json["email"].str);
370         pki.append("cardUserKey", json["cardUserKey"].str);
371         pki.append("card", pkiCard(json["card"]));
372         return pki.getPkiString;
373     }
374 
375     private string toPkiStringDelete(string request)
376     {
377         JSONValue json = parseJSON(request);
378 
379         PkiBuilder pki = new PkiBuilder();
380         pki.append("locale", json["locale"].str);
381         pki.append("conversationId", json["conversationId"].str);
382         pki.append("cardUserKey", json["cardUserKey"].str);
383         pki.append("cardToken", json["cardToken"].str);
384         return pki.getPkiString;
385     }
386 
387     private string pkiCard(JSONValue json)
388     {
389         PkiBuilder pki = new PkiBuilder();
390         pki.append("cardAlias", json["cardAlias"].str);
391         pki.append("cardNumber", json["cardNumber"].str);
392         pki.append("expireYear", json["expireYear"].str);
393         pki.append("expireMonth", json["expireMonth"].str);
394         pki.append("cardHolderName", json["cardHolderName"].str);
395         return pki.getPkiString;
396     }
397 }
398 
399 class CardList: IyzipayResource
400 {
401     public string retrieve(string request, Options options)
402     {
403         string pki = toPkiString(request);
404         return connectHTTP(POST, options.baseUrl ~ "/cardstorage/cards", options, request, pki);
405     }
406 
407     private string toPkiString(string request)
408     {
409         JSONValue json = parseJSON(request);
410 
411         PkiBuilder pki = new PkiBuilder();
412         pki.append("locale", json["locale"].str);
413         pki.append("conversationId", json["conversationId"].str);
414         pki.append("cardUserKey", json["cardUserKey"].str);
415         return pki.getPkiString;
416     }
417 }