Skip to content

Commit

Permalink
feat(data): Add contractAttributes method in data layer (#295)
Browse files Browse the repository at this point in the history
  • Loading branch information
sainthiago committed Feb 7, 2023
1 parent 064ee8a commit 2873879
Show file tree
Hide file tree
Showing 8 changed files with 171 additions and 1 deletion.
1 change: 1 addition & 0 deletions packages/data/README.md
Expand Up @@ -27,6 +27,7 @@ read about config global variables on: [Config SDK method](https://docs.mintbase
| [storeData](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/storeData/README.md) | `contractAddress: string | string[]` |get store data by certain contract or contracts|
| [storeNfts](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/storeNfts/README.md) | `contractAddress: string | string[], showOnlyListed?: boolean, pagination?: {limit: number, offset:number}` |get store nfts by certain contract|
| [metadataByMetadataId](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/metadataByMetadataId/README.md) | `metadataId: string` |get metadata by metadataId|
| [contractAttributes](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/contractAttributes/README.md) | `contractAddress: string` |get contract attributes by certain contract|

While we will continue to provide public and our new mb_views schema objects, we will also begin to introduce helper methods here that can be used to query data **without having to write any graphql**.

Expand Down
3 changes: 2 additions & 1 deletion packages/data/src/api/README.md
Expand Up @@ -20,4 +20,5 @@ Currently, these wrappers are methods for the [GraphQL API](https://docs.mintbas
| [nearPrice](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/nearPrice/README.md) | - |get near price in usd|
| [storeData](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/storeData/README.md) | `contractAddress: string | string[]` |get store data by certain contract or contracts|
| [storeNfts](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/storeNfts/README.md) | `contractAddress: string | string[], showOnlyListed?: boolean, pagination?: {limit: number, offset:number}` |get store nfts by certain contract|
| [metadataByMetadataId](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/metadataByMetadataId/README.md) | `metadataId: string` |get metadata by metadataId|
| [metadataByMetadataId](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/metadataByMetadataId/README.md) | `metadataId: string` |get metadata by metadataId|
| [contractAttributes](https://github.com/Mintbase/mintbase-js/tree/alpha/packages/data/src/api/contractAttributes/README.md) | `contractAddress: string` |get contract attributes by certain contract|
55 changes: 55 additions & 0 deletions packages/data/src/api/contractAttributes/README.md
@@ -0,0 +1,55 @@
[//]: # `{ "title": "contractAttributes", "order": "1.0.15" }`
# contractAttributes



{% hint style="warning" %}



This is a work in progress, please reach out to us on [Telegram](https://t.me/mintdev) for support.

For the most reliable data, reference our [existing graphql docs](https://docs.mintbase.io/dev/read-data/mintbase-graph).



{% endhint %}




Returns contract attributes by `contractAddress`.



### contractAttributes( contractAddress: string)



This is an example of a data api method.




Example:



{% code title="queryContractAttributes.ts" overflow="wrap" lineNumbers="true" %}

```typescript

import { contractAttributes } from '@mintbase-js/data'



const { data, error } = await contractAttributes('teammintbase.mintbase1.near');

if (error) {console.log('error', error)}


console.log(data) // => contract attributes data

```

{% endcode %}
@@ -0,0 +1,19 @@
import { ContractAttributesDataResults } from './contractAttributes.types';

export const contractAttributesMock: ContractAttributesDataResults = {
nft_attributes: [
{
attribute_type: 'eyes',
},
{
attribute_type: 'head',
},
{
attribute_type: 'mouth',
}],
nft_attributes_aggregate: {
aggregate: {
count: 6,
},
},
};
@@ -0,0 +1,19 @@
import { gql } from 'graphql-request';
import { QUERY_OPS_PREFIX } from '../../constants';

export const contractAttributesQuery = gql`
query ${QUERY_OPS_PREFIX}_getContractAttributes($contractAddress: String!) {
nft_attributes(
where: {nft_contract_id: {_eq: $nft_metadata_id}}
distinct_on: attribute_type
) {
attribute_type
}
nft_attributes_aggregate(where: {nft_contract_id: {_eq: $nft_metadata_id}}
distinct_on: attribute_type) {
aggregate {
count
}
}
}
`;
@@ -0,0 +1,40 @@
import { contractAttributes } from './contractAttributes';
import { ContractAttributesDataResults } from './contractAttributes.types';

import { GraphQLClient } from 'graphql-request';
import { contractAttributesMock } from './contractAttributes.mock';

describe('contractAttributes', () => {
afterAll(() => {
jest.resetAllMocks();
jest.restoreAllMocks();
});

afterEach(() => {
jest.clearAllMocks();
});

it('should return contract attributes', async () => {
(GraphQLClient as jest.Mock).mockImplementationOnce(() => ({
request: (): Promise<ContractAttributesDataResults> => Promise.resolve(contractAttributesMock),
}));

const result = await contractAttributes('test.mintbase1.near');

expect(result?.data).toBe(
contractAttributesMock,
);
});

it('should handle errors', async () => {
const errMessage = 'exploded';
(GraphQLClient as jest.Mock).mockImplementationOnce(() => ({
request: (): Promise<ContractAttributesDataResults> => Promise.reject(new Error(errMessage)),
}));

const call = await contractAttributes('test.mintbase1.near');

expect(call).toStrictEqual({ error: errMessage });

});
});
24 changes: 24 additions & 0 deletions packages/data/src/api/contractAttributes/contractAttributes.ts
@@ -0,0 +1,24 @@
import { Network } from '@mintbase-js/sdk';
import { fetchGraphQl } from '../../graphql/fetch';
import { ParsedDataReturn } from '../../types';
import { parseData } from '../../utils';
import { contractAttributesQuery } from './contractAttributes.query';
import { ContractAttributesDataResults } from './contractAttributes.types';


export const contractAttributes = async (
contractAddress: string,
network?: Network,
): Promise<ParsedDataReturn<ContractAttributesDataResults>> => {
const { data, error } = await fetchGraphQl<ContractAttributesDataResults>({
query: contractAttributesQuery,
variables: {
contractAddress,
},
...(network && { network:network }),
});

const errorMsg = error ? `Error fetching contract attributes, ${error}` : '';

return parseData(data, error, errorMsg);
};
@@ -0,0 +1,11 @@
export interface ContractAttributesDataResults {
nft_attributes:
{
attribute_type: string;
}[];
nft_attributes_aggregate: {
aggregate: {
count: number;
};
};
}

0 comments on commit 2873879

Please sign in to comment.