import { AxiosInstance } from 'axios' import queryString from 'query-string' import { HealthStatus, IdParam, ListInfo } from '../common/types' import { NewNftOrder, Nft, NftBatchCreate, NftCollection, NftCollectionCreate, NftCollectionQuery, NftCollectionUpdate, NftCreate, NftMint, NftOrder, NftOrderCreate, NftQuery, NftUpdate, OrderQuery, SingleNftCollectionQuery, SingleNftQuery, } from './types' import { buildQuery } from '../common/query' /** * Service class for NFT API calls. */ export class NftService { constructor(readonly client: AxiosInstance, readonly version: string) {} /** * Returns true if the service is reachable * * @returns Services' online status */ async health(): Promise { try { const res = await this.client.get(`nft/health`) if (res.data.status === 'ok') { return { online: true } } } catch (e) { // Do nothing } return { online: false } } /** * Returns all nfts for the logged in user */ async getMyNfts(): Promise { const res = await this.client.get(`nft/${this.version}/my_nfts`) return res.data.data.nfts } /** * Returns all nfts with the given query */ async listNfts(req: NftQuery): Promise> { // Only fetch nft attributes if the with parameter is not defined const relationsFetched = req.with ?? { attribute: true } const query = queryString.stringify( { ...req, with: buildQuery(relationsFetched), }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get(`nft/${this.version}/nft?${query}`) return res.data } /** * Returns a specific NFT with the given relations */ async getNft(req: SingleNftQuery): Promise { // Only fetch nft attributes if the with parameter is not defined const relationsFetched = req.with ?? { attribute: true } const query = queryString.stringify( { with: buildQuery(relationsFetched) }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `nft/${this.version}/nft/${req.id}?${query}` ) return res.data.data } async createNft(nft: NftCreate): Promise { const res = await this.client.post(`nft/${this.version}/nft`, nft) return res.data.data } async updateNft(nft: NftUpdate): Promise { const res = await this.client.patch( `nft/${this.version}/nft/${nft.id}`, nft ) return res.data.data } async deleteNft(id: IdParam) { await this.client.delete(`nft/${this.version}/nft/${id.id}`) } async mintNft(req: NftMint): Promise { await this.client.post( `nft/${this.version}/chaincode/${req.chaincodeId}/nft/${req.nftId}/mint`, { account: req.account } ) } /** * Returns all collections with the given query */ async listCollections( req: NftCollectionQuery ): Promise> { const query = queryString.stringify( { ...req, with: req.with ? buildQuery(req.with) : undefined, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get(`nft/${this.version}/collection?${query}`) return res.data } /** * Returns a specific NFT collection with the given relations */ async getCollection(req: SingleNftCollectionQuery): Promise { const query = queryString.stringify( { with: req.with ? buildQuery(req.with) : undefined }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `nft/${this.version}/collection/${req.id}?${query}` ) return res.data.data } async createCollection( collection: NftCollectionCreate ): Promise { const res = await this.client.post( `nft/${this.version}/collection`, collection ) return res.data.data } async updateCollection( collection: NftCollectionUpdate ): Promise { const res = await this.client.patch( `nft/${this.version}/collection/${collection.id}`, collection ) return res.data.data } async deleteCollection(id: IdParam) { await this.client.delete(`nft/${this.version}/collection/${id.id}`) } async createOrder(order: NftOrderCreate): Promise { const res = await this.client.post(`nft/${this.version}/order`, order) return res.data.data } async getOrder(req: IdParam): Promise { const res = await this.client.get(`nft/${this.version}/order/${req.id}`) return res.data.data } async getOrders(req: OrderQuery): Promise> { const query = queryString.stringify( { with: req.with ? buildQuery(req.with) : undefined }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get(`nft/${this.version}/order?${query}`) return res.data } async createBatchNfts(req: NftBatchCreate) { const res = await this.client.post( `nft/${this.version}/collection/${req.collectionId}/nft/batch`, { nft: req.nft, quantity: req.quantity, } ) return res.data.data } }