Skip to content

Commit

Permalink
Merge pull request capsule-corp-ternoa#173 from capsule-corp-ternoa/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
Leouarz authored Feb 24, 2022
2 parents 435903b + c257dc7 commit b2057fd
Show file tree
Hide file tree
Showing 21 changed files with 840 additions and 185 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "nft-marketplace-api",
"version": "1.3.0",
"version": "1.4.0",
"description": "ternoa nft marketplace server",
"main": "dist/index.js",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


"SecretNFT API" is the server used by the "SecretNFT" application.
This API's purpose is to get data related to NFTs (from blockahin to offchain Data), users, follows, likes, ...
This API's purpose is to get data related to NFTs (from blockahin to offchain Data), users ...

Visit [SecretNFT](https://www.secret-nft.com/)

Expand Down
104 changes: 103 additions & 1 deletion src/api/controllers/nfts/controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import NFTService from "../../services/nft";
import { NextFunction, Request, Response } from "express";
import { validationGetNFTs, validationGetNFT, validationGetStatNFTsUser, validationNFTsBySeries, validationGetSeries, validationCanAddToSeries, validationGetHistory, validationAddCategoriesNFTs, validationGetTotalOnSale } from "../../validators/nftValidators";
import { validationGetNFTs, validationGetNFT, validationGetStatNFTsUser, validationNFTsBySeries, validationGetSeries, validationCanAddToSeries, validationGetHistory, validationAddCategoriesNFTs, validationGetTotalOnSale, validationGetTotalFilteredNFTs, validationLikeUnlike, validationGetFilters } from "../../validators/nftValidators";
import { decryptCookie } from "../../../utils";

export class Controller {
async getNFTs(
Expand Down Expand Up @@ -115,6 +116,107 @@ export class Controller {
next(err);
}
}

async getTotalFiltered(
req: Request,
res: Response,
next: NextFunction
): Promise<void>{
try {
const queryValues = validationGetTotalFilteredNFTs(req.query)
res.json(await NFTService.getTotalFilteredNFTs(queryValues));
} catch (err) {
next(err);
}
}

async likeNft(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const { cookie } = JSON.parse(req.body)
const queryValues = validationLikeUnlike({cookie, ...req.query})
if(decryptCookie(queryValues.cookie) === queryValues.walletId){
res.json(await NFTService.likeNft(queryValues));
}else{
throw new Error('Unvalid authentication')
}
} catch (err) {
next(err)
}
}

async unlikeNft(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const { cookie } = JSON.parse(req.body)
const queryValues = validationLikeUnlike({cookie, ...req.query})
if(decryptCookie(queryValues.cookie) === queryValues.walletId){
res.json(await NFTService.unlikeNft(queryValues));
}else{
throw new Error('Unvalid authentication')
}
} catch (err) {
next(err)
}
}

async getMostLiked(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const queryValues = validationGetFilters(req.query)
res.json(await NFTService.getMostLiked(queryValues));
} catch (err) {
next(err)
}
}

async getMostViewed(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const queryValues = validationGetFilters(req.query)
res.json(await NFTService.getMostViewed(queryValues));
} catch (err) {
next(err)
}
}

async getMostSold(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const queryValues = validationGetFilters(req.query)
res.json(await NFTService.getMostSold(queryValues));
} catch (err) {
next(err)
}
}

async getMostSoldSeries(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const queryValues = validationGetFilters(req.query)
res.json(await NFTService.getMostSoldSeries(queryValues));
} catch (err) {
next(err)
}
}
}

export default new Controller();
7 changes: 7 additions & 0 deletions src/api/controllers/nfts/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,18 @@ import controller from "./controller";
export default express
.Router()
.get("/", controller.getNFTs)
.get("/most-liked", controller.getMostLiked)
.get("/most-viewed", controller.getMostViewed)
.get("/most-sold", controller.getMostSold)
.get("/most-sold-series", controller.getMostSoldSeries)
.get("/history", controller.getHistory)
.get("/total-on-sale", controller.getTotalOnSale)
.get("/total-filtered", controller.getTotalFiltered)
.get("/:id", controller.getNFT)
.get("/stat/:id", controller.getStatNFTsUser)
.get("/series/data", controller.getNFTsBySeries)
.get("/series/status/:seriesId", controller.getSeriesStatus)
.get("/series/can-add", controller.canAddToSeries)
.post("/like", controller.likeNft)
.post("/unlike", controller.unlikeNft)
.post("/add-nfts-categories", controller.addCategoriesNFTs)
46 changes: 18 additions & 28 deletions src/api/controllers/users/controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import UserService from "../../services/user";
import { NextFunction, Request, Response } from "express";
import { TERNOA_API_URL, decryptCookie } from "../../../utils";
import { validationGetAccountBalance, validationGetUser, validationLikeUnlike, validationReviewRequested } from "../../validators/userValidators";
import { validationGetAccountBalance, validationGetUser, validationReviewRequested, validationGetUsers, validationGetFilters } from "../../validators/userValidators";

export class Controller {
async getUsers(
Expand All @@ -10,7 +10,9 @@ export class Controller {
next: NextFunction
): Promise<void> {
try {
res.redirect(`${TERNOA_API_URL}${req.originalUrl}`)
const queryValues = validationGetUsers({...req.params, ...req.query})
const users = await UserService.findUsers(queryValues, req.originalUrl);
res.json(users);
} catch (err) {
next(err);
}
Expand Down Expand Up @@ -86,52 +88,40 @@ export class Controller {
}
}

async likeNft(
async verifyTwitter(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const { walletId } = req.query
const { cookie } = JSON.parse(req.body)
const queryValues = validationLikeUnlike({walletId, cookie})
if(decryptCookie(queryValues.cookie) === queryValues.walletId){
res.redirect(307, `${TERNOA_API_URL}${req.originalUrl}`)
}else{
throw new Error('Unvalid authentication')
}
} catch (err) {
): Promise<void>{
try{
res.redirect(`${TERNOA_API_URL}${req.originalUrl}`)
}catch(err){
next(err)
}
}

async unlikeNft(
async getTopSellers(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const { walletId } = req.query
const { cookie } = JSON.parse(req.body)
const queryValues = validationLikeUnlike({walletId, cookie})
if(decryptCookie(queryValues.cookie) === queryValues.walletId){
res.redirect(307, `${TERNOA_API_URL}${req.originalUrl}`)
}else{
throw new Error('Unvalid authentication')
}
const queryValues = validationGetFilters(req.query)
res.json(await UserService.getTopSellers(queryValues));
} catch (err) {
next(err)
}
}

async verifyTwitter(
async getMostFollowed(
req: Request,
res: Response,
next: NextFunction
): Promise<void>{
try{
res.redirect(`${TERNOA_API_URL}${req.originalUrl}`)
}catch(err){
): Promise<void> {
try {
const queryValues = validationGetFilters(req.query)
res.json(await UserService.getMostFollowed(queryValues));
} catch (err) {
next(err)
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/api/controllers/users/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import controller from "./controller";
export default express
.Router()
.patch("/reviewRequested/:id", controller.reviewRequested) // ternoa-api
.get("/top-sellers", controller.getTopSellers) // ternoa-api
.get("/most-followed", controller.getMostFollowed) // ternoa-api
.get("/", controller.getUsers) // ternoa-api
.get("/verifyTwitter/:id", controller.verifyTwitter) // ternoa-api
.get("/:id", controller.getUser) // ternoa-api
.get("/:id/caps", controller.getAccountBalance)
.post("/create", controller.newUser) // ternoa-api
.post("/like", controller.likeNft) // ternoa-api
.post("/unlike", controller.unlikeNft) // ternoa-api
.post("/:walletId", controller.updateUser); // ternoa-api
13 changes: 6 additions & 7 deletions src/api/helpers/nftHelpers.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { CustomResponse, ICompleteNFT, INFT } from "../../interfaces/graphQL";
import { ICompleteNFT, INFT } from "../../interfaces/graphQL";
import UserService from "../services/user";
import L from "../../common/logger";
import NFTService from "../services/nft";
import { ICategory } from "../../interfaces/ICategory";
import { fetchTimeout, isURL, removeURLSlash } from "../../utils";
import { IUser } from "src/interfaces/IUser";
import { IUser } from "../../interfaces/IUser";
import { NFTsQuery } from "../validators/nftValidators";

const ipfsGateways = {
Expand Down Expand Up @@ -44,15 +44,14 @@ export async function populateStat(
): Promise<{
totalNft: number,
totalListedNft: number,
totalFiltered: number | null,
totalListedInMarketplace: number,
totalOwnedByRequestingUser: number,
totalOwnedListedByRequestingUser: number,
smallestPrice: string
}> {
try {
const marketplaceId = query.filter?.marketplaceId;
const owner = query.filter?.owner;
const stat = await NFTService.getStatNFT(NFT.serieId, marketplaceId, owner)
const stat = await NFTService.getStatNFT(NFT.serieId, query)
return stat
} catch (err) {
L.error({ err }, "NFTs stats could not have been fetched");
Expand Down Expand Up @@ -105,9 +104,9 @@ export async function populateNFTIpfs(NFT: INFT): Promise<any> {
const response = await fetchTimeout(
fetchUrl,
null,
Number(process.env.IPFS_REQUEST_TIMEOUT) || 8000
Number(process.env.IPFS_REQUEST_TIMEOUT) || 2000
).catch((_e) => {
L.error("fetch error:" + _e);
L.error("Fetch error:" + _e);
throw new Error("Could not retrieve NFT data from " + NFT.nftIpfs);
});
if (response) {
Expand Down
Loading

0 comments on commit b2057fd

Please sign in to comment.