diff --git a/src/controllers/nft.controller.ts b/src/controllers/nft.controller.ts index cdc994e..d8bc736 100644 --- a/src/controllers/nft.controller.ts +++ b/src/controllers/nft.controller.ts @@ -21,6 +21,24 @@ const nftList = sourceList.map(o => { } }) if (process.env.NODE_ENV !== 'production') { + nftList.unshift({ + projectName: 'Test', + link: 'https://x.com/sparky-chain', + contract: '0x50a8e60041a206acaa5f844a1104896224be6f38', + collection: 'Test Group01', + guild: '1222509817411665920', + role: '1230421511735738409', + tier: 2, + }) + nftList.unshift({ + projectName: 'Test', + link: 'https://x.com/sparky-chain', + contract: '0x50a8e60041a206acaa5f844a1104896224be6f38', + collection: 'Test Group02', + guild: '1222509817411665920', + role: '1230421511735738409', + tier: 2, + }) nftList.unshift({ projectName: 'Test', link: 'https://x.com/sparky-chain', @@ -61,8 +79,9 @@ class NftController extends BaseController { if (user) { let records = await NFTHolderRecord.find({ user: user.id }) let recordSet = new Set(records.map(o => o.contract.toLowerCase())) + let groupSet = new Set(records.map(o => o.group)) for (let sub of list) { - list.status = recordSet.has(sub.contract.toLowerCase()) + list.status = recordSet.has(sub.contract.toLowerCase()) || groupSet.has(sub.group) ? 1 : 0 } } return list @@ -130,6 +149,12 @@ class NftController extends BaseController { throw new ZError(13, 'already claimed') } const cfg = nftMap.get(contract) + if (cfg.group) { + let groupRecord = await NFTHolderRecord.findOne({ user: user.id, group: cfg.group }) + if (groupRecord) { + throw new ZError(16, 'already claimed') + } + } const guild = cfg.guild || DEFAULT_GUILD let rpcRes = await checkDiscordRole(user.address.toLowerCase(), guild, cfg.role) console.log('check result:', rpcRes) diff --git a/src/models/NFTHodlerRecord.ts b/src/models/NFTHodlerRecord.ts index 798176b..d52027e 100644 --- a/src/models/NFTHodlerRecord.ts +++ b/src/models/NFTHodlerRecord.ts @@ -20,6 +20,8 @@ class NFTHolderRecordClass extends BaseModule { public chain: number @prop({ required: true }) public contract: string + @prop() + public group?: string @prop({ type: () => [String], default: [] }) public tokenId?: string[] @prop()