From ef21d71f4466dc9ffbf4b85752e802237402f6e7 Mon Sep 17 00:00:00 2001 From: Juan Miguel Sanchez Mola Date: Tue, 9 Jul 2024 10:53:53 -0400 Subject: [PATCH 1/7] Remove user query on collection page --- .../NftList/NftItemForCollectionView.tsx | 53 ++++++------------- rair-node/bin/api/nft/nft.Service.js | 34 +++++++----- 2 files changed, 36 insertions(+), 51 deletions(-) diff --git a/rair-front/src/components/MockUpPage/NftList/NftItemForCollectionView.tsx b/rair-front/src/components/MockUpPage/NftList/NftItemForCollectionView.tsx index 619a6484f..3f1ab5c06 100644 --- a/rair-front/src/components/MockUpPage/NftList/NftItemForCollectionView.tsx +++ b/rair-front/src/components/MockUpPage/NftList/NftItemForCollectionView.tsx @@ -3,17 +3,13 @@ import ReactPlayer from 'react-player'; import { Provider, useSelector, useStore } from 'react-redux'; import { useNavigate, useParams } from 'react-router-dom'; import axios, { AxiosError } from 'axios'; -import { BigNumber, constants, utils } from 'ethers'; +import { BigNumber } from 'ethers'; import { formatEther } from 'ethers/lib/utils'; -import { - IOffersResponseType, - TUserResponse -} from '../../../axios.responseTypes'; +import { IOffersResponseType } from '../../../axios.responseTypes'; import { RootState } from '../../../ducks'; import { ColorStoreType } from '../../../ducks/colors/colorStore.types'; import { ContractsInitialType } from '../../../ducks/contracts/contracts.types'; -import { UserType } from '../../../ducks/users/users.types'; import useIPFSImageLink from '../../../hooks/useIPFSImageLink'; import useSwal from '../../../hooks/useSwal'; import useWindowDimensions from '../../../hooks/useWindowDimensions'; @@ -61,7 +57,6 @@ const NftItemForCollectionViewComponent: React.FC< const navigate = useNavigate(); const store = useStore(); - const [userInfoMinted, setUserInfoMinted] = useState(null); const [isFileUrl, setIsFileUrl] = useState(); const ipfsLink = useIPFSImageLink(metadata?.image); const [tokenInfo, setTokenInfo] = useState(null); @@ -199,20 +194,6 @@ const NftItemForCollectionViewComponent: React.FC< } }, [navigate, tokenInfo, contract, blockchain, product, index, item]); - const getInfoFromUser = useCallback(async () => { - // find user - if ( - item && - utils.isAddress(item.ownerAddress) && - item.ownerAddress !== constants.AddressZero - ) { - const result = await axios - .get(`/api/users/${item.ownerAddress}`) - .then((res) => res.data); - setUserInfoMinted(result.user); - } - }, [item]); - const initialTokenData = useCallback(() => { if (item && resaleFlag) { if (item.contract?.diamond) { @@ -313,10 +294,6 @@ const NftItemForCollectionViewComponent: React.FC< getParticularOffer(); }, [getParticularOffer]); - useEffect(() => { - getInfoFromUser(); - }, [getInfoFromUser]); - useEffect(() => { checkUrl(); }, [checkUrl]); @@ -517,25 +494,25 @@ const NftItemForCollectionViewComponent: React.FC< maxHeight: '40px' }}>
- {item?.isMinted && userInfoMinted ? ( + {item?.isMinted && item.ownerData ? (
User Avatar
- {userInfoMinted.nickName - ? userInfoMinted.nickName.length > 16 - ? userInfoMinted.nickName.slice(0, 5) + + {item.ownerData?.nickName + ? item.ownerData?.nickName.length > 16 + ? item.ownerData?.nickName.slice(0, 5) + '...' + - userInfoMinted.nickName.slice( - userInfoMinted.nickName.length - 4 + item.ownerData?.nickName.slice( + item.ownerData?.nickName.length - 4 ) - : userInfoMinted.nickName + : item.ownerData?.nickName : userName?.slice(0, 5) + '....' + userName?.slice(userName.length - 4)} @@ -578,10 +555,10 @@ const NftItemForCollectionViewComponent: React.FC< )}
{item && !resaleFlag && item.isMinted && !resalePrice && ( -
-
Sold out
-
- )} +
+
Sold out
+
+ )}
diff --git a/rair-node/bin/api/nft/nft.Service.js b/rair-node/bin/api/nft/nft.Service.js index d2488340d..56c074b3f 100644 --- a/rair-node/bin/api/nft/nft.Service.js +++ b/rair-node/bin/api/nft/nft.Service.js @@ -499,20 +499,28 @@ module.exports = { }, }, { - $lookup: { - from: 'Offer', - let: populateOptions.let, - pipeline: [ - { - $match: { - $expr: { - $and: populateOptions.and, - }, - }, - }, - ], - as: 'offer', + $lookup: { + from: 'Offer', + let: populateOptions.let, + pipeline: [ + { + $match: { + $expr: { + $and: populateOptions.and, + }, + }, + }, + ], + as: 'offer', + }, }, + { + $lookup: { + from: 'User', + localField: 'ownerAddress', + foreignField: 'publicAddress', + as: 'ownerData', + }, }, { $unwind: '$offer' }, { $match: filterOptions }, From e1b9cd0b458f7f5aa65fe2033c7e33fca1b7f64b Mon Sep 17 00:00:00 2001 From: Juan Miguel Sanchez Mola Date: Wed, 10 Jul 2024 11:03:16 -0400 Subject: [PATCH 2/7] Allow no array --- .../notifications/notifications.Controller.js | 7 +++++- .../notifications/notifications.Service.js | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/rair-node/bin/api/notifications/notifications.Controller.js b/rair-node/bin/api/notifications/notifications.Controller.js index d730fa4c7..85a387c08 100644 --- a/rair-node/bin/api/notifications/notifications.Controller.js +++ b/rair-node/bin/api/notifications/notifications.Controller.js @@ -1,6 +1,11 @@ const express = require('express'); const { requireUserSession, validation } = require('../../middleware'); -const { markNotificationAsRead, getSingleNotification, listNotifications, deleteNotification } = require('./notifications.Service'); +const { + markNotificationAsRead, + getSingleNotification, + listNotifications, + deleteNotification, +} = require('./notifications.Service'); const router = express.Router(); diff --git a/rair-node/bin/api/notifications/notifications.Service.js b/rair-node/bin/api/notifications/notifications.Service.js index 28933f336..1b81ebfee 100644 --- a/rair-node/bin/api/notifications/notifications.Service.js +++ b/rair-node/bin/api/notifications/notifications.Service.js @@ -93,10 +93,18 @@ module.exports = { }, markNotificationAsRead: async (req, res, next) => { try { + const { publicAddress } = req.user; const { ids } = req.body; - const result = await Notification.updateMany({ - _id: { $in: ids }, - }, { $set: { read: true } }); + const filter = { + user: publicAddress, + }; + if (ids.length) { + filter._id = { $in: ids }; + } + const result = await Notification.updateMany( + filter, + { $set: { read: true } }, + ); return res.json({ success: true, updated: result.modifiedCount, @@ -108,8 +116,15 @@ module.exports = { }, deleteNotification: async (req, res, next) => { try { + const { publicAddress } = req.user; const { ids } = req.body; - const result = await Notification.deleteMany({ _id: { $in: ids } }); + const filter = { + user: publicAddress, + }; + if (ids.length) { + filter._id = { $in: ids }; + } + const result = await Notification.deleteMany(filter); return res.json({ success: true, deleted: result.deletedCount, From 5e86cf9f43e45de107e46cd676a7c626a3fe93d3 Mon Sep 17 00:00:00 2001 From: Juan Miguel Sanchez Mola Date: Wed, 10 Jul 2024 11:24:57 -0400 Subject: [PATCH 3/7] Fix --- rair-node/bin/api/nft/nft.Service.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rair-node/bin/api/nft/nft.Service.js b/rair-node/bin/api/nft/nft.Service.js index 645ccddb0..05e19bb02 100644 --- a/rair-node/bin/api/nft/nft.Service.js +++ b/rair-node/bin/api/nft/nft.Service.js @@ -591,6 +591,12 @@ module.exports = { as: 'ownerData', }, }, + { + $unwind: { + path: '$ownerData', + preserveNullAndEmptyArrays: true, + }, + }, { $unwind: '$offer' }, { $match: filterOptions }, ]; From bb4856a58c2f5cedfbdf52a966b664277c8cb21b Mon Sep 17 00:00:00 2001 From: Juan Miguel Sanchez Mola Date: Wed, 10 Jul 2024 12:04:54 -0400 Subject: [PATCH 4/7] fromToken and toToken --- rair-node/bin/api/nft/nft.Controller.js | 3 ++- rair-node/bin/api/nft/nft.Service.js | 25 ++++++++++++++++++- rair-node/bin/schemas/commonApiSchemas.js | 4 +++ .../bin/schemas/getTokensByContractProduct.js | 2 -- rair-node/bin/schemas/index.js | 2 ++ 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/rair-node/bin/api/nft/nft.Controller.js b/rair-node/bin/api/nft/nft.Controller.js index 36797cc9e..97a3e6ed1 100644 --- a/rair-node/bin/api/nft/nft.Controller.js +++ b/rair-node/bin/api/nft/nft.Controller.js @@ -56,12 +56,13 @@ router.get( '/network/:networkId/:contract/:product', validation(['nftContract', 'nftProduct'], 'params'), findContractAndProductMiddleware, - validation(['getTokensByContractProduct', 'resaleFlag', 'metadataSearch'], 'query'), + validation(['getTokensByContractProduct', 'resaleFlag', 'metadataSearch', 'tokenLimits'], 'query'), getTokensForProduct, ); router.get( '/network/:networkId/:contract/:product/numbers', validation(['nftContract', 'nftProduct'], 'params'), + validation(['tokenLimits'], 'query'), findContractAndProductMiddleware, getTokenNumbers, ); diff --git a/rair-node/bin/api/nft/nft.Service.js b/rair-node/bin/api/nft/nft.Service.js index fa4afbf4f..222dd7208 100644 --- a/rair-node/bin/api/nft/nft.Service.js +++ b/rair-node/bin/api/nft/nft.Service.js @@ -376,6 +376,22 @@ module.exports = { getTokenNumbers: async (req, res, next) => { try { const { contract, product } = req; + const { fromToken, toToken } = req.query; + const tokenLimitFilter = []; + if (fromToken) { + tokenLimitFilter.push( + { + $gte: ['$token', fromToken], + }, + ); + } + if (toToken) { + tokenLimitFilter.push( + { + $lte: ['$token', toToken], + }, + ); + } const offerData = await Offer.aggregate([ { $match: { @@ -392,7 +408,14 @@ module.exports = { as: 'tokens', pipeline: [{ $match: { - $expr: { $eq: ['$offer', '$$offerIndex'] }, + $expr: { + $and: [ + { + $eq: ['$offer', '$$offerIndex'], + }, + ...tokenLimitFilter, + ], + }, contract: contract._id, }, }, diff --git a/rair-node/bin/schemas/commonApiSchemas.js b/rair-node/bin/schemas/commonApiSchemas.js index 35ee41b53..eef2b6ab1 100644 --- a/rair-node/bin/schemas/commonApiSchemas.js +++ b/rair-node/bin/schemas/commonApiSchemas.js @@ -27,4 +27,8 @@ module.exports = { metadataSearch: () => ({ metadataFilters: Joi.string(), }), + tokenLimits: () => ({ + fromToken: Joi.string(), + toToken: Joi.string(), + }), }; diff --git a/rair-node/bin/schemas/getTokensByContractProduct.js b/rair-node/bin/schemas/getTokensByContractProduct.js index ad6bf6f2f..1e49afabc 100644 --- a/rair-node/bin/schemas/getTokensByContractProduct.js +++ b/rair-node/bin/schemas/getTokensByContractProduct.js @@ -1,8 +1,6 @@ const Joi = require('joi'); module.exports = () => ({ - fromToken: Joi.string(), - toToken: Joi.string(), limit: Joi.number(), forSale: Joi.any() .valid('true', 'false'), diff --git a/rair-node/bin/schemas/index.js b/rair-node/bin/schemas/index.js index b6d5631d6..25dc4a8d7 100644 --- a/rair-node/bin/schemas/index.js +++ b/rair-node/bin/schemas/index.js @@ -56,6 +56,7 @@ const { userAddress, resaleFlag, metadataSearch, + tokenLimits, } = require('./commonApiSchemas'); const { fullContracts, @@ -139,6 +140,7 @@ module.exports = { userAddress, resaleFlag, metadataSearch, + tokenLimits, // Contract schemas fullContracts, From f54b80136c15bfbe146d8b697e7d84937eebb5e9 Mon Sep 17 00:00:00 2001 From: Juan Miguel Sanchez Mola Date: Wed, 10 Jul 2024 14:08:38 -0400 Subject: [PATCH 5/7] Fix --- rair-node/bin/api/notifications/notifications.Service.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rair-node/bin/api/notifications/notifications.Service.js b/rair-node/bin/api/notifications/notifications.Service.js index 1b81ebfee..f3e2e8042 100644 --- a/rair-node/bin/api/notifications/notifications.Service.js +++ b/rair-node/bin/api/notifications/notifications.Service.js @@ -94,11 +94,11 @@ module.exports = { markNotificationAsRead: async (req, res, next) => { try { const { publicAddress } = req.user; - const { ids } = req.body; + const { ids = [] } = req.body; const filter = { user: publicAddress, }; - if (ids.length) { + if (ids?.length) { filter._id = { $in: ids }; } const result = await Notification.updateMany( @@ -117,11 +117,11 @@ module.exports = { deleteNotification: async (req, res, next) => { try { const { publicAddress } = req.user; - const { ids } = req.body; + const { ids = [] } = req.body; const filter = { user: publicAddress, }; - if (ids.length) { + if (ids?.length) { filter._id = { $in: ids }; } const result = await Notification.deleteMany(filter); From 8568f7d4d82af248253fe10f7ef80ab4209578b2 Mon Sep 17 00:00:00 2001 From: Suresh Arora Date: Fri, 12 Jul 2024 15:30:45 +0530 Subject: [PATCH 6/7] Create MoveToNextIteration.yml Automatically move issues and pull requests to the next iteration of your Project --- .github/workflows/MoveToNextIteration.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/MoveToNextIteration.yml diff --git a/.github/workflows/MoveToNextIteration.yml b/.github/workflows/MoveToNextIteration.yml new file mode 100644 index 000000000..2e92353d8 --- /dev/null +++ b/.github/workflows/MoveToNextIteration.yml @@ -0,0 +1,20 @@ +on: + schedule: + # Runs "at 05:00, only on Monday" (see https://crontab.guru) + - cron: '0 5 * * 1' + +jobs: + move-to-next-iteration: + name: Move to next iteration + runs-on: ubuntu-latest + + steps: + - uses: blombard/move-to-next-iteration@master + with: + owner: rairprotocol + number: 1 + token: ${{ secrets.PROJECT_PAT }} + iteration-field: Iteration + iteration: last + new-iteration: current + excluded-statuses: "Done,Won't Fix" From f3f2e4fa9929db8feafc94d48db349ad57f97036 Mon Sep 17 00:00:00 2001 From: Suresh Arora Date: Fri, 12 Jul 2024 18:31:27 +0530 Subject: [PATCH 7/7] Update MoveToNextIteration.yml Changed cron job --- .github/workflows/MoveToNextIteration.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/MoveToNextIteration.yml b/.github/workflows/MoveToNextIteration.yml index 2e92353d8..2d79e5f59 100644 --- a/.github/workflows/MoveToNextIteration.yml +++ b/.github/workflows/MoveToNextIteration.yml @@ -1,7 +1,7 @@ on: schedule: - # Runs "at 05:00, only on Monday" (see https://crontab.guru) - - cron: '0 5 * * 1' + # Runs "at 05:00, only on Tuesday" (see https://crontab.guru) + - cron: '0 5 * * 2' jobs: move-to-next-iteration: