From b2c3f704c69f2e83d181fc52e46bd4b552bcdd5b Mon Sep 17 00:00:00 2001 From: Matej Holicky <10matejholicky@gmail.com> Date: Wed, 24 May 2023 12:38:42 +0200 Subject: [PATCH] feat: Add lewd tag to collection and nft --- db/migrations/1684773436602-Data.js | 15 +++++++++++++++ schema.graphql | 2 ++ src/mappings/shared/metadata.ts | 10 +++++++++- src/mappings/v1/create.ts | 4 +++- src/mappings/v1/mint.ts | 7 ++++++- src/mappings/v2/create.ts | 4 +++- src/mappings/v2/mint.ts | 7 ++++++- src/model/generated/collectionEntity.model.ts | 3 +++ src/model/generated/nftEntity.model.ts | 3 +++ 9 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 db/migrations/1684773436602-Data.js diff --git a/db/migrations/1684773436602-Data.js b/db/migrations/1684773436602-Data.js new file mode 100644 index 00000000..c316e951 --- /dev/null +++ b/db/migrations/1684773436602-Data.js @@ -0,0 +1,15 @@ +module.exports = class Data1684773436602 { + name = 'Data1684773436602' + + async up(db) { + await db.query(`ALTER TABLE "nft_entity" ADD "lewd" boolean NOT NULL DEFAULT false`) + await db.query(`ALTER TABLE "nft_entity" ALTER COLUMN "lewd" DROP DEFAULT`) + await db.query(`ALTER TABLE "collection_entity" ADD "lewd" boolean NOT NULL DEFAULT false`) + await db.query(`ALTER TABLE "collection_entity" ALTER COLUMN "lewd" DROP DEFAULT`) + } + + async down(db) { + await db.query(`ALTER TABLE "nft_entity" DROP COLUMN "lewd"`) + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "lewd"`) + } +} diff --git a/schema.graphql b/schema.graphql index fe939476..e51392de 100644 --- a/schema.graphql +++ b/schema.graphql @@ -11,6 +11,7 @@ type CollectionEntity @entity { id: ID! image: String issuer: String + lewd: Boolean! max: Int! media: String meta: MetadataEntity @@ -41,6 +42,7 @@ type NFTEntity @entity { instance: String image: String issuer: String + lewd: Boolean! media: String meta: MetadataEntity metadata: String diff --git a/src/mappings/shared/metadata.ts b/src/mappings/shared/metadata.ts index 3e39d76c..19c8a932 100644 --- a/src/mappings/shared/metadata.ts +++ b/src/mappings/shared/metadata.ts @@ -3,7 +3,7 @@ import { Optional, TokenMetadata } from '@kodadot1/metasquid/types' import { isEmpty } from '@kodadot1/minimark/utils' import { logger } from '@kodadot1/metasquid/logger' -import { MetadataEntity as Metadata } from '../../model/generated' +import { Attribute, MetadataEntity as Metadata, MetadataEntity } from '../../model/generated' import { fetchMetadata } from '../utils/metadata' import { attributeFrom, Store } from '../utils/types' @@ -42,3 +42,11 @@ export async function handleMetadata(id: string, name: string, store: Store): Pr } return final } + +export const isLewd = (metadata: MetadataEntity) => { + return Boolean( + metadata.attributes?.find((item) => { + return item.trait === 'NSFW' + }) + ) +} diff --git a/src/mappings/v1/create.ts b/src/mappings/v1/create.ts index 23ac9c8b..b06d1bdf 100644 --- a/src/mappings/v1/create.ts +++ b/src/mappings/v1/create.ts @@ -8,7 +8,7 @@ import { unwrap } from '../utils/extract' import { getCreateCollection } from '../utils/getters' import { error, success } from '../utils/logger' import { Action, Collection, Context } from '../utils/types' -import { handleMetadata } from '../shared/metadata' +import { handleMetadata, isLewd } from '../shared/metadata' const OPERATION = Action.CREATE @@ -33,6 +33,7 @@ export async function createCollection(context: Context): Promise { final.hash = md5(collection.id) final.highestSale = BigInt(0) final.issuer = caller + final.lewd = false final.max = Number(collection.max) || 0 final.metadata = collection.metadata final.name = (collection.name || '').trim() @@ -49,6 +50,7 @@ export async function createCollection(context: Context): Promise { final.meta = metadata final.image = metadata?.image final.media = metadata?.animationUrl + final.lewd = metadata ? isLewd(metadata) : false } await context.store.save(final) diff --git a/src/mappings/v1/mint.ts b/src/mappings/v1/mint.ts index 35de7628..4b6dc895 100644 --- a/src/mappings/v1/mint.ts +++ b/src/mappings/v1/mint.ts @@ -9,7 +9,7 @@ import { getCreateToken } from '../utils/getters' import { error, success } from '../utils/logger' import { Action, Context, getNftId, NFT, Optional } from '../utils/types' import { createEvent } from '../shared/event' -import { handleMetadata } from '../shared/metadata' +import { handleMetadata, isLewd } from '../shared/metadata' import { calculateCollectionOwnerCountAndDistribution } from '../utils/helper' const OPERATION = Action.MINT @@ -34,6 +34,7 @@ export async function mintItem(context: Context): Promise { final.blockNumber = BigInt(blockNumber) final.name = nft.name final.instance = nft.instance + final.lewd = false final.transferable = nft.transferable final.collection = collection final.sn = nft.sn @@ -62,6 +63,10 @@ export async function mintItem(context: Context): Promise { final.meta = metadata final.image = metadata?.image final.media = metadata?.animationUrl + if (metadata && isLewd(metadata)) { + final.lewd = true + collection.lewd = true + } } await context.store.save(final) diff --git a/src/mappings/v2/create.ts b/src/mappings/v2/create.ts index 09aed18e..cfa6db47 100644 --- a/src/mappings/v2/create.ts +++ b/src/mappings/v2/create.ts @@ -4,7 +4,7 @@ import { Optional } from '@kodadot1/metasquid/types' import md5 from 'md5' import { CollectionEntity } from '../../model' -import { handleMetadata } from '../shared' +import { handleMetadata, isLewd } from '../shared' import { unwrap } from '../utils/extract' import { error, success } from '../utils/logger' import { Action, Collection, Context } from '../utils/types' @@ -33,6 +33,7 @@ export async function createCollection(context: Context): Promise { final.hash = md5(collection.id) final.highestSale = BigInt(0) final.issuer = caller + final.lewd = false final.max = Number(collection.max) || 0 final.metadata = collection.metadata final.name = (collection.name || '').trim() @@ -49,6 +50,7 @@ export async function createCollection(context: Context): Promise { final.meta = metadata final.image = metadata?.image final.media = metadata?.animationUrl + final.lewd = metadata ? isLewd(metadata) : false if (metadata?.name && !final.name) { final.name = metadata.name } diff --git a/src/mappings/v2/mint.ts b/src/mappings/v2/mint.ts index f8fac69b..ff9070c9 100644 --- a/src/mappings/v2/mint.ts +++ b/src/mappings/v2/mint.ts @@ -7,7 +7,7 @@ import { isOwnerOrElseError } from '../utils/consolidator' import { CollectionEntity, NFTEntity, Property } from '../../model/generated' import { createEvent } from '../shared/event' -import { handleMetadata } from '../shared/metadata' +import { handleMetadata, isLewd } from '../shared/metadata' import { findRootItemById } from '../utils/entity' import { calculateCollectionOwnerCountAndDistribution, isDummyAddress } from '../utils/helper' import logger, { error, success } from '../utils/logger' @@ -34,6 +34,7 @@ export async function mintItem(context: Context): Promise { final.blockNumber = BigInt(blockNumber) final.name = nft.name final.instance = nft.symbol + final.lewd = false final.transferable = nft.transferable final.collection = collection final.sn = nft.sn @@ -55,6 +56,10 @@ export async function mintItem(context: Context): Promise { final.meta = metadata final.image = metadata?.image final.media = metadata?.animationUrl + if (metadata && isLewd(metadata)) { + final.lewd = true + collection.lewd = true + } if (metadata?.name && !final.name) { final.name = metadata.name } diff --git a/src/model/generated/collectionEntity.model.ts b/src/model/generated/collectionEntity.model.ts index cf44deea..78db348a 100644 --- a/src/model/generated/collectionEntity.model.ts +++ b/src/model/generated/collectionEntity.model.ts @@ -47,6 +47,9 @@ export class CollectionEntity { @Column_("text", {nullable: true}) issuer!: string | undefined | null + @Column_("bool", {nullable: false}) + lewd!: boolean + @Column_("int4", {nullable: false}) max!: number diff --git a/src/model/generated/nftEntity.model.ts b/src/model/generated/nftEntity.model.ts index b847db43..afc0ce73 100644 --- a/src/model/generated/nftEntity.model.ts +++ b/src/model/generated/nftEntity.model.ts @@ -60,6 +60,9 @@ export class NFTEntity { @Column_("text", {nullable: true}) issuer!: string | undefined | null + @Column_("bool", {nullable: false}) + lewd!: boolean + @Column_("text", {nullable: true}) media!: string | undefined | null