diff --git a/.env.sample b/.env.sample index 07c7fad..e911307 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,5 @@ PUBLIC_KEY= -SECRET_KEY= +PRIVATE_KEY= ACCOUNT_NUMBER= ACCOUNT_BANK= ACCOUNT_NAME= diff --git a/README.md b/README.md index 9782d08..48abb64 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,12 @@ ```bash const CoinForBarter = require('coinforbarter -node-v3'); -const c4b = new CoinForBarter(PUBLIC_KEY, SECRET_KEY, SECRET_HASH); +const c4b = new CoinForBarter(PUBLIC_KEY, PRIVATE_KEY, SECRET_HASH); const customers = c4b.Customers.findAll(); ``` -For staging, Use TEST API Keys. For production, use LIVE API KEYS. You can get your PUBLIC_KEY and SECRET_KEY from the CoinForBarter dashboard. +For staging, Use TEST API Keys. For production, use LIVE API KEYS. You can get your PUBLIC_KEY and PRIVATE_KEY from the CoinForBarter dashboard. Go [here](https://dashboard.coinforbarter.com/settings/api) to get your API Keys. diff --git a/package.json b/package.json index 952f301..23afd07 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix" }, "engines": { - "node": "<=14.17.1" + "node": ">=14.1" }, "keywords": [ "bitcoin", diff --git a/src/index.ts b/src/index.ts index 89421b3..f63a16e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,10 +28,10 @@ export default class CoinForBarter { private readonly Request: CoinForBarterRequest; constructor( private readonly publicKey: string, - private readonly secretKey: string, + private readonly privateKey: string, private readonly secretHash: string = '', ) { - this.Request = new CoinForBarterRequest(this.publicKey, this.secretKey); + this.Request = new CoinForBarterRequest(this.publicKey, this.privateKey); this.Payment = new Payment(this.Request, this.publicKey); this.Payout = new Payout(this.Request); this.Transfer = new Transfer(this.Request); @@ -41,6 +41,7 @@ export default class CoinForBarter { this.BankAccount = new BankAccount(this.Request); this.Customer = new Customer(this.Request); this.Misc = new Misc(this.Request); + this.Transaction = new Transaction(this.Request); this.Webhook = new Webhook(this.secretHash); } } diff --git a/src/lib/BankAccount.ts b/src/lib/BankAccount.ts index dcd2baf..06822d3 100644 --- a/src/lib/BankAccount.ts +++ b/src/lib/BankAccount.ts @@ -107,4 +107,19 @@ export class BankAccount { statusCode, }; } + + async remove(bankAccountId: string) { + const { data, status, message, statusCode } = await this.request.call( + `${this.path}/account/archive/${bankAccountId}`, + 'get', + {}, + true, + ); + return { + data, + status, + message, + statusCode, + }; + } } diff --git a/src/lib/Misc.ts b/src/lib/Misc.ts index 88259a0..fb2b441 100644 --- a/src/lib/Misc.ts +++ b/src/lib/Misc.ts @@ -18,7 +18,7 @@ export class Misc { return { status, message, statusCode, data }; } - async getBalance(): Promise> { + async getBalances(): Promise> { const { status, message, statusCode, data } = await this.request.call( '/balances', 'get', diff --git a/src/lib/Wallet.ts b/src/lib/Wallet.ts new file mode 100644 index 0000000..d218693 --- /dev/null +++ b/src/lib/Wallet.ts @@ -0,0 +1,79 @@ +import { CoinForBarterRequest } from 'src/services'; +import { + CoinForBarterResponse, + CreateWalletBody, + CreateWalletResponse, + WalletQuery, +} from 'src/types'; + +export class Wallet { + path = '/wallets'; + constructor(private readonly request: CoinForBarterRequest) {} + + async create( + body: CreateWalletBody, + ): Promise> { + const { status, message, statusCode, data } = await this.request.call( + this.path, + 'post', + body, + true, + ); + return { + status, + message, + statusCode, + data, + }; + } + + async findAll( + query: WalletQuery = {}, + ): Promise> { + const queryString = this.request.makeQueryString(query); + const { status, message, statusCode, data } = await this.request.call( + `${this.path}${queryString}`, + 'get', + {}, + true, + ); + return { + status, + message, + statusCode, + data, + }; + } + + async findOne( + id: string, + ): Promise> { + const { status, message, statusCode, data } = await this.request.call( + `${this.path}/${id}`, + 'get', + {}, + true, + ); + return { + status, + message, + statusCode, + data, + }; + } + + async remove(id: string): Promise> { + const { status, message, statusCode, data } = await this.request.call( + `${this.path}/${id}`, + 'patch', + undefined, + true, + ); + return { + status, + message, + statusCode, + data, + }; + } +} diff --git a/src/services/Request.ts b/src/services/Request.ts index 31de43b..a651ee3 100644 --- a/src/services/Request.ts +++ b/src/services/Request.ts @@ -3,10 +3,10 @@ import { CoinForBarterStatus } from '../types'; import { RequestResponseSchema } from '../types/request'; export class CoinForBarterRequest { - private url = 'https://api.coinforbarter.com/v1'; + private url = 'https://coinforbarter-api.herokuapp.com/v1'; constructor( private readonly publicKey: string, - private readonly secretKey: string, + private readonly privateKey: string, ) {} async call( @@ -22,7 +22,7 @@ export class CoinForBarterRequest { if (method === 'get' || method === 'delete') { if (useToken) { const headers = { - Authorization: `Bearer ${this.secretKey}`, + Authorization: `Bearer ${this.privateKey}`, 'Content-Type': contentType, }; request = await axios[method](url, { headers }); @@ -37,7 +37,7 @@ export class CoinForBarterRequest { if (method !== 'get' && method !== 'delete') { if (useToken) { const headers = { - Authorization: `Bearer ${this.secretKey}`, + Authorization: `Bearer ${this.privateKey}`, 'Content-Type': contentType, }; request = await axios[method](url, body, { headers }); diff --git a/src/test/bank-account.spec.ts b/src/test/bank-account.spec.ts index 69f8fc1..dae3443 100644 --- a/src/test/bank-account.spec.ts +++ b/src/test/bank-account.spec.ts @@ -9,12 +9,14 @@ import { describe('BankAccount', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const bankAccount = new BankAccount(request); + let bankAccountId = ''; + it('should be defined', () => { expect(bankAccount).toBeDefined(); }); @@ -85,6 +87,7 @@ describe('BankAccount', () => { const respWithParam = await bankAccount.findAll(param); const resp = await bankAccount.findAll(); if (resp.status === CoinForBarterStatus.Success) { + bankAccountId = resp.data[0].id; expect(resp.data.length).toBeGreaterThan(0); } else { expect(resp.statusCode).toEqual(404); @@ -103,10 +106,9 @@ describe('BankAccount', () => { }); it('should find one bank account from id', async () => { - const id = process.env.BANK_ACCOUNT_ID; - const resp = await bankAccount.findOne(id); + const resp = await bankAccount.findOne(bankAccountId); if (resp.status === CoinForBarterStatus.Success) { - return expect(resp.data.id).toBe(id); + return expect(resp.data.id).toBe(bankAccountId); } else { expect(resp.statusCode).not.toEqual(200); } @@ -145,4 +147,19 @@ describe('BankAccount', () => { } }); }); + + describe('remove', () => { + it('should be defined', () => { + expect(bankAccount.remove).toBeDefined(); + }); + + it('should make an account primary', async () => { + const resp = await bankAccount.remove(bankAccountId); + if (resp.status === CoinForBarterStatus.Success) { + return expect(resp.statusCode).toEqual(204); + } else { + return expect(resp.statusCode).not.toEqual(200); + } + }); + }); }); diff --git a/src/test/customer.spec.ts b/src/test/customer.spec.ts index 3f826a7..a124c9e 100644 --- a/src/test/customer.spec.ts +++ b/src/test/customer.spec.ts @@ -5,12 +5,12 @@ import { CoinForBarterRequest } from '../services'; describe('customer', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; const email = process.env.EMAIL; const phoneNumber = process.env.PHONE_NUMBER; const fullName = process.env.EMAIL; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const customer = new Customer(request); diff --git a/src/test/misc.spec.ts b/src/test/misc.spec.ts index 2492b56..f1d42f3 100644 --- a/src/test/misc.spec.ts +++ b/src/test/misc.spec.ts @@ -4,9 +4,9 @@ import { CoinForBarterRequest } from '../services/Request'; describe('misc', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const misc = new Misc(request); @@ -30,22 +30,6 @@ describe('misc', () => { }); }); - describe('getBalance', () => { - it('should be defined', () => { - expect(misc.getBalance).toBeDefined(); - }); - - it('should find all countries', async () => { - const resp = await misc.getBalance(); - - if (resp.status === CoinForBarterStatus.Success) { - expect(resp.data.length).toBeGreaterThan(0); - } else { - expect(resp.statusCode).toEqual(404); - } - }); - }); - describe('getCurrencies', () => { it('should be defined', () => { expect(misc.getCurrencies).toBeDefined(); diff --git a/src/test/payment-plan-subscribers.spec.ts b/src/test/payment-plan-subscribers.spec.ts index eda13fb..649e795 100644 --- a/src/test/payment-plan-subscribers.spec.ts +++ b/src/test/payment-plan-subscribers.spec.ts @@ -8,13 +8,13 @@ import { CoinForBarterRequest } from '../services/Request'; describe('paymentPlanSubscriber', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; const email = process.env.EMAIL; const phoneNumber = process.env.PHONE_NUMBER; const fullName = process.env.EMAIL; const paymentPlanId = process.env.PAYMENT_PLAN_ID; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const paymentPlanSubscriber = new PaymentPlanSubscriber(request); diff --git a/src/test/payment-plan.spec.ts b/src/test/payment-plan.spec.ts index 5cb9e95..61ca344 100644 --- a/src/test/payment-plan.spec.ts +++ b/src/test/payment-plan.spec.ts @@ -10,9 +10,9 @@ import { CoinForBarterStatus } from '../types/response.types'; describe('paymentPlan', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const paymentPlan = new PaymentPlan(request); diff --git a/src/test/payment.spec.ts b/src/test/payment.spec.ts index c6ec7d0..e314d48 100644 --- a/src/test/payment.spec.ts +++ b/src/test/payment.spec.ts @@ -5,9 +5,9 @@ import { CoinForBarterStatus } from '../types/response.types'; describe('Payment', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const id = process.env.PAYMENT_ID; const currency = 'DOGE'; diff --git a/src/test/payout.spec.ts b/src/test/payout.spec.ts index 361a18d..365193b 100644 --- a/src/test/payout.spec.ts +++ b/src/test/payout.spec.ts @@ -5,9 +5,9 @@ import { CoinForBarterStatus } from '../types/response.types'; describe('payout', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const payout = new Payout(request); diff --git a/src/test/transaction.spec.ts b/src/test/transaction.spec.ts index ce4970b..1998382 100644 --- a/src/test/transaction.spec.ts +++ b/src/test/transaction.spec.ts @@ -4,9 +4,9 @@ import { TransactionQuery } from '../types/transaction.type'; import { CoinForBarterStatus } from '../types/response.types'; describe('Transaction', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const transaction = new Transaction(request); diff --git a/src/test/transfer.spec.ts b/src/test/transfer.spec.ts index 30b50bf..d2a7491 100644 --- a/src/test/transfer.spec.ts +++ b/src/test/transfer.spec.ts @@ -8,12 +8,12 @@ import { CoinForBarterStatus } from '../types/response.types'; describe('Transfer', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; const accountNumber = process.env.ACCOUNT_NUMBER; const walletAddress = process.env.WALLET_ADDRESS; const walletNetwork = process.env.WALLET_NETWORK; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const transfer = new Transfer(request); diff --git a/src/test/wallet-address.spec.ts b/src/test/wallet-address.spec.ts index aa2ee49..8eff633 100644 --- a/src/test/wallet-address.spec.ts +++ b/src/test/wallet-address.spec.ts @@ -8,9 +8,9 @@ import { CoinForBarterStatus } from '../types/response.types'; describe('WalletAddress', () => { const publicKey = process.env.PUBLIC_KEY; - const secretKey = process.env.SECRET_KEY; + const privateKey = process.env.PRIVATE_KEY; - const request = new CoinForBarterRequest(publicKey, secretKey); + const request = new CoinForBarterRequest(publicKey, privateKey); const walletAddress = new WalletAddress(request); diff --git a/src/test/wallet.spec.ts b/src/test/wallet.spec.ts new file mode 100644 index 0000000..81bc767 --- /dev/null +++ b/src/test/wallet.spec.ts @@ -0,0 +1,93 @@ +import { Wallet } from '../lib/Wallet'; +import { CoinForBarterStatus, CreateWalletBody, WalletQuery } from '../types'; +import { CoinForBarterRequest } from '../services'; + +describe('wallet', () => { + const publicKey = process.env.PUBLIC_KEY; + const privateKey = process.env.PRIVATE_KEY; + + const currency = 'DOGE'; + let walletId = ''; + const label = 'trust-wallet'; + const request = new CoinForBarterRequest(publicKey, privateKey); + + const wallet = new Wallet(request); + + it('should be defined', () => { + expect(wallet).toBeDefined(); + }); + + describe('create', () => { + it('should be defined', () => { + expect(wallet.create).toBeDefined(); + }); + + it('should create a new wallet', async () => { + const payload: CreateWalletBody = { + label, + currency, + }; + const resp = await wallet.create(payload); + if (resp.status === CoinForBarterStatus.Success) { + return expect(resp.data.label).toBe(label); + } + return expect(resp.statusCode).not.toEqual(201); + }); + }); + + describe('findAll', () => { + it('should be defined', () => { + expect(wallet.findAll).toBeDefined(); + }); + + it('should find all wallets from param', async () => { + const param: WalletQuery = {}; + // param is optional + const respWithParam = await wallet.findAll(param); + const resp = await wallet.findAll(); + + if (resp.status === CoinForBarterStatus.Success) { + expect(resp.data.length).toBeGreaterThan(0); + } else { + expect(resp.statusCode).toEqual(404); + } + if (respWithParam.status === CoinForBarterStatus.Success) { + walletId = respWithParam.data[0].id; + return expect(respWithParam.data.length).toBeGreaterThan(0); + } else { + return expect(respWithParam.statusCode).toEqual(404); + } + }); + }); + + describe('findOne', () => { + it('should be defined', () => { + expect(wallet.findOne).toBeDefined(); + }); + + it('should find one wallet from id', async () => { + const resp = await wallet.findOne(walletId); + + if (resp.status === CoinForBarterStatus.Success) { + return expect(resp.data.id).toBe(walletId); + } else { + expect(resp.statusCode).not.toEqual(200); + } + }); + }); + + describe('remove', () => { + it('should be defined', () => { + expect(wallet.remove).toBeDefined(); + }); + + it('should make an account primary', async () => { + const resp = await wallet.remove(walletId); + if (resp.status === CoinForBarterStatus.Success) { + return expect(resp.statusCode).toEqual(204); + } else { + return expect(resp.statusCode).not.toEqual(200); + } + }); + }); +}); diff --git a/src/types/index.ts b/src/types/index.ts index b5d2b03..583f61a 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -59,3 +59,9 @@ export { } from './transaction.type'; export { PaymentDto, CreatePaymentBody } from './payments.type'; + +export { + WalletQuery, + CreateWalletBody, + CreateWalletResponse, +} from './wallet.type'; diff --git a/src/types/wallet.type.ts b/src/types/wallet.type.ts new file mode 100644 index 0000000..e25fb1a --- /dev/null +++ b/src/types/wallet.type.ts @@ -0,0 +1,25 @@ +export type CreateWalletBody = { + label: string; + currency: string; +}; + +export type CreateWalletResponse = { + id: string; + currency: string; + label: string; + addresses: string; + createdAt: string; +}; + +export type WalletQuery = { + from?: string; + to?: string; + page?: number; + network?: string; + currency?: string; + address?: string; + label?: string; + skip?: number; + sort?: string; + isAscending?: boolean; +};