1 |
|
2 |
|
3 |
|
4 | 'use strict';
|
5 |
|
6 | const fetch = require('node-fetch');
|
7 | const FormData = require('form-data');
|
8 | let fs = require('fs');
|
9 | const qs = require('qs');
|
10 |
|
11 | class Hasoffers {
|
12 | constructor ({networkId = "", networkToken = "", fetcher = fetch, config = {} } = {}) {
|
13 | this.networkId = networkId;
|
14 | this.networkToken = networkToken;
|
15 | this.config = Object.assign({}, {
|
16 | method: 'GET',
|
17 | headers: {
|
18 | Accept: 'application/json',
|
19 | 'Accept-Charset': 'utf-8'
|
20 | }
|
21 | }, config);
|
22 |
|
23 | this.fetcher = fetcher;
|
24 | this.url = `https://${this.networkId}.api.hasoffers.com`;
|
25 | }
|
26 | getOffer (id) {
|
27 | return createRequest({
|
28 | fetcher: this.fetcher,
|
29 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Offer&Method=findById&id=${id}`,
|
30 | config: this.config
|
31 | })
|
32 | }
|
33 | getAllCountries () {
|
34 | return createRequest({
|
35 | fetcher: this.fetcher,
|
36 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Application&Method=findAllCountries`,
|
37 | config: this.config
|
38 | })
|
39 | }
|
40 | createOffer (data) {
|
41 | let queryString = Object.keys(data).map(key => `data[${key}]` + '=' + encodeURIComponent(data[key])).join('&');
|
42 | return createRequest({
|
43 | fetcher: this.fetcher,
|
44 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Offer&Method=create&${queryString}`,
|
45 | config: this.config
|
46 | })
|
47 | }
|
48 | updateOfferField (id, field, value) {
|
49 | let queryValue = encodeURIComponent(value);
|
50 | return createRequest({
|
51 | fetcher: this.fetcher,
|
52 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Offer&Method=updateField&id=${id}&field=${field}&value=${queryValue}`,
|
53 | config: this.config
|
54 | })
|
55 | }
|
56 | updateOffer (id, data) {
|
57 | let queryString = Object.keys(data).map(key => `data[${key}]` + '=' + encodeURIComponent(data[key])).join('&');
|
58 | return createRequest({
|
59 | fetcher: this.fetcher,
|
60 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Offer&Method=update&id=${id}&${queryString}`,
|
61 | config: this.config
|
62 | })
|
63 | }
|
64 | createOfferTag (offer_id, tag_id) {
|
65 | return createRequest({
|
66 | fetcher: this.fetcher,
|
67 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Tag&Method=addToOffer&&offer_id=${offer_id}&tag_id=${tag_id}`,
|
68 | config: this.config
|
69 | })
|
70 | }
|
71 | createGeoCountries (id, data) {
|
72 | let queryString = Object.keys(data).map(key => `location_ids[Countries][]` + '=' + encodeURIComponent(data[key])).join('&');
|
73 |
|
74 | return createRequest({
|
75 | fetcher: this.fetcher,
|
76 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Offer&Method=setGeoTargeting&id=${id}&${queryString}`,
|
77 | config: this.config
|
78 | })
|
79 | }
|
80 | createGeoCities (id, data) {
|
81 | let queryString = Object.keys(data).map(key => `location_ids[Cities][]` + '=' + encodeURIComponent(data[key])).join('&');
|
82 |
|
83 | return createRequest({
|
84 | fetcher: this.fetcher,
|
85 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=Offer&Method=setGeoTargeting&id=${id}&${queryString}`,
|
86 | config: this.config
|
87 | })
|
88 | }
|
89 | createOfferFile (offer_id, filename, display, type, file) {
|
90 |
|
91 | const stats = fs.statSync("ww.jpeg");
|
92 | const fileSizeInBytes = stats.size;
|
93 | let readStream = fs.createReadStream('ww.jpeg');
|
94 |
|
95 | let new_data = {
|
96 | type: encodeURIComponent(type),
|
97 | display: encodeURIComponent(display),
|
98 | filename: encodeURIComponent(filename),
|
99 | offer_id: encodeURIComponent(offer_id),
|
100 | };
|
101 | const form = new FormData();
|
102 | return createRequest({
|
103 | fetcher: this.fetcher,
|
104 | url: `${this.url}/Apiv3/json?NetworkToken=${this.networkToken}&Target=OfferFile&Method=create&data[type]=${new_data.type}&data[display]=${new_data.display}&data[filename]=${new_data.filename}&data[offer_id]=${new_data.offer_id}&return_object=1`,
|
105 | config: {
|
106 | method: 'POST',
|
107 | headers: {
|
108 | "Content-length": fileSizeInBytes
|
109 | },
|
110 | body: readStream
|
111 | }
|
112 | })
|
113 | }
|
114 | }
|
115 | const createRequest = (args = {}) => {
|
116 | const { url, config, query, fetcher } = args;
|
117 | return fetch(`${url}${query ? `?${qs.stringify(query)}` : ''}`, config).then(res =>
|
118 | res.json()
|
119 | )
|
120 | };
|
121 |
|
122 | module.exports = Hasoffers; |
\ | No newline at end of file |