Skip to content

Commit

Permalink
Added Donation Save Backup Adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
mohammadranjbarz authored and aminlatifi committed Jan 18, 2024
1 parent 86084a7 commit 40a51df
Show file tree
Hide file tree
Showing 4 changed files with 225 additions and 1 deletion.
6 changes: 5 additions & 1 deletion config/test.env
Original file line number Diff line number Diff line change
Expand Up @@ -208,4 +208,8 @@ LOST_DONATIONS_TX_HASHES=0x4012421fbc2cecc85804f3b98bdd31bef04589dbac8292deca33e
LOST_DONATIONS_QF_ROUND=
LOST_DONATIONS_NETWORK_ID=10

DISABLE_NOTIFICATION_CENTER=false
DISABLE_NOTIFICATION_CENTER=false


DONATION_SAVE_BACKUP_API_URL=https://eu-central-1.aws.data.mongodb-api.com/app/data-jyoly/endpoint/data/v1/action
DONATION_SAVE_BACKUP_API_SECRET=
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@
"test:poignArt": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/services/poignArt/api.test.ts",
"test:bootstrap": "NODE_ENV=test mocha ./test/pre-test-scripts.ts ./src/server/bootstrap.test.ts",
"test:utils": "NODE_ENV=test mocha ./src/utils/utils.test.ts",
"test:donationSaveBackup": "NODE_ENV=test mocha -b -t 30000 src/adapters/donationSaveBackup/*.test.ts",
"start": "NODE_ENV=development ts-node-dev --project ./tsconfig.json --respawn ./src/index.ts",
"serve": "pm2 startOrRestart ecosystem.config.js --node-args='--max-old-space-size=8192'",
"db:migrate:run:test": "NODE_ENV=test npx typeorm-ts-node-esm migration:run -d ./src/ormconfig.ts",
Expand Down
50 changes: 50 additions & 0 deletions src/adapters/donationSaveBackup/donationSaveBackupAdapter.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// test calling the donationSaveBackupAdapter get getDonationsFromBackup method

import { assert } from 'chai';
import {
getNotImportedDonationsFromBackup,
getSingleDonationFromBackupById,
getSingleDonationFromBackupByTxHash,
markDonationAsImported,
unmarkDonationAsImported,
} from './donationSaveBackupAdapter';

describe('Donation Save Backup Adapter Test Cases', () => {
it('should return a list of donations', async () => {
const result = await getNotImportedDonationsFromBackup(2);
assert.lengthOf(result, 2);
});

it('get a single donation by id', async () => {
const result = await getNotImportedDonationsFromBackup(1);
const singleResult = await getSingleDonationFromBackupById(result[0]._id);
assert.ok(singleResult);
assert.equal(singleResult._id, result[0]._id);
});

it('get single donation by txHash', async () => {
const result = await getNotImportedDonationsFromBackup(1);
const singleResult = await getSingleDonationFromBackupByTxHash(
result[0].txHash,
);
assert.ok(singleResult);
assert.equal(singleResult._id, result[0]._id);
});

it('should mark a donation as imported', async function () {
const result = await getNotImportedDonationsFromBackup(1);

if (result.length === 0) {
// tslint:disable-next-line:no-console
console.log('no donations to test');
this.skip();
}

await markDonationAsImported(result[0]._id);
let newObject = await getSingleDonationFromBackupById(result[0]._id);
assert.isTrue(newObject.imported);
await unmarkDonationAsImported(result[0]._id);
newObject = await getSingleDonationFromBackupById(result[0]._id);
assert.isNotTrue(newObject.imported);
});
});
169 changes: 169 additions & 0 deletions src/adapters/donationSaveBackup/donationSaveBackupAdapter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
// a method the get objects from mongodb api read from config DONATION_SAVE_BACKUP_API_URL with sercret read from DONATION_SAVE_BACKUP_API_SECRET,
// it must filter objects by those doesn't have `imported` field with true value
// also must support pagination

import { logger } from '../../utils/logger';
import config from '../../config';
import axios from 'axios';

const DONATION_SAVE_BACKUP_API_URL = config.get(
'DONATION_SAVE_BACKUP_API_URL',
) as string;
const DONATION_SAVE_BACKUP_API_SECRET = config.get(
'DONATION_SAVE_BACKUP_API_SECRET',
) as string;

// add '/' if doesn't exist at the
const baseUrl = DONATION_SAVE_BACKUP_API_URL.endsWith('/')
? DONATION_SAVE_BACKUP_API_URL
: `${DONATION_SAVE_BACKUP_API_URL}/`;

export const getNotImportedDonationsFromBackup = async (
limit = 10,
skip = 0,
) => {
const result = await axios.post(
new URL('find', baseUrl).href,
{
collection: 'failed_donation',
database: 'failed_donation',
dataSource: 'staging-giveth-donation-backupservice',
limit,
skip,
filter: {
imported: { $ne: true },
},
sort: { _id: 1 },
},
{
headers: {
'api-key': DONATION_SAVE_BACKUP_API_SECRET,
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
},
},
);

if (result.status !== 200) {
logger.error('getDonationsFromBackup error', result.data);
throw new Error('getDonationsFromBackup error');
}
return result.data.documents;
};

export const getSingleDonationFromBackupByTxHash = async (txHash: string) => {
const result = await axios.post(
new URL('findOne', baseUrl).href,
{
collection: 'failed_donation',
database: 'failed_donation',
dataSource: 'staging-giveth-donation-backupservice',
filter: {
txHash,
},
},
{
headers: {
'api-key': DONATION_SAVE_BACKUP_API_SECRET,
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
},
},
);

if (result.status !== 200) {
logger.error('getDonationsFromBackup error', result.data);
throw new Error('getDonationsFromBackup error');
}
return result.data.document;
};
export const getSingleDonationFromBackupById = async (id: string) => {
const result = await axios.post(
new URL('findOne', baseUrl).href,
{
collection: 'failed_donation',
database: 'failed_donation',
dataSource: 'staging-giveth-donation-backupservice',
filter: {
_id: { $oid: id },
},
},
{
headers: {
'api-key': DONATION_SAVE_BACKUP_API_SECRET,
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
},
},
);

if (result.status !== 200) {
logger.error('getDonationsFromBackup error', result.data);
throw new Error('getDonationsFromBackup error');
}
return result.data.document;
};

export const markDonationAsImported = async (id: string) => {
const result = await axios.post(
new URL('updateOne', baseUrl).href,
{
collection: 'failed_donation',
database: 'failed_donation',
dataSource: 'staging-giveth-donation-backupservice',
filter: {
_id: { $oid: id },
},
update: {
$set: {
imported: true,
},
},
},
{
headers: {
'api-key': DONATION_SAVE_BACKUP_API_SECRET,
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
},
},
);

if (result.status !== 200) {
logger.error('getDonationsFromBackup error', result.data);
throw new Error('getDonationsFromBackup error');
}
return result;
};

export const unmarkDonationAsImported = async (id: string) => {
const result = await axios.post(
new URL('updateOne', baseUrl).href,
{
collection: 'failed_donation',
database: 'failed_donation',
dataSource: 'staging-giveth-donation-backupservice',
filter: {
_id: { $oid: id },
},
update: {
$unset: {
imported: '',
},
},
},
{
headers: {
'api-key': DONATION_SAVE_BACKUP_API_SECRET,
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
},
},
);

if (result.status !== 200) {
logger.error('getDonationsFromBackup error', result.data);
throw new Error('getDonationsFromBackup error');
}
return result;
};

0 comments on commit 40a51df

Please sign in to comment.