diff --git a/common/contract.ts b/common/contract.ts index 5e344f09..f3405c4e 100644 --- a/common/contract.ts +++ b/common/contract.ts @@ -9,6 +9,7 @@ export type Contract = { question: string description: string // More info about what the contract is about + tags: string[] outcomeType: 'BINARY' // | 'MULTI' | 'interval' | 'date' // outcomes: ['YES', 'NO'] visibility: 'public' | 'unlisted' diff --git a/common/new-contract.ts b/common/new-contract.ts index 85f5dedc..c84f6f6e 100644 --- a/common/new-contract.ts +++ b/common/new-contract.ts @@ -2,6 +2,7 @@ import { calcStartPool } from './antes' import { Contract } from './contract' import { User } from './user' +import { parseTags } from './util/parse' export function getNewContract( id: string, @@ -28,6 +29,7 @@ export function getNewContract( question: question.trim(), description: description.trim(), + tags: parseTags(`${question} ${description}`), visibility: 'public', mechanism: 'dpm-2', diff --git a/web/lib/util/parse.ts b/common/util/parse.ts similarity index 57% rename from web/lib/util/parse.ts rename to common/util/parse.ts index 4b20778f..79419ae1 100644 --- a/web/lib/util/parse.ts +++ b/common/util/parse.ts @@ -1,9 +1,10 @@ -import _ from 'lodash' - export function parseTags(text: string) { const regex = /(?:^|\s)(?:[#][a-z0-9_]+)/gi const matches = (text.match(regex) || []).map((match) => match.trim().substring(1) ) - return _.uniqBy(matches, (tag) => tag.toLowerCase()) + const tagSet = new Set(matches) + const uniqueTags: string[] = [] + tagSet.forEach((tag) => uniqueTags.push(tag)) + return uniqueTags } diff --git a/functions/src/scripts/update-contract-tags.ts b/functions/src/scripts/update-contract-tags.ts new file mode 100644 index 00000000..933eee56 --- /dev/null +++ b/functions/src/scripts/update-contract-tags.ts @@ -0,0 +1,49 @@ +import * as admin from 'firebase-admin' +import * as _ from 'lodash' + +// Generate your own private key, and set the path below: +// https://console.firebase.google.com/u/0/project/mantic-markets/settings/serviceaccounts/adminsdk +// James: +const serviceAccount = require('/Users/jahooma/mantic-markets-firebase-adminsdk-1ep46-820891bb87.json') +// Stephen: +// const serviceAccount = require('../../../../Downloads/dev-mantic-markets-firebase-adminsdk-sir5m-b2d27f8970.json') +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), +}) +const firestore = admin.firestore() + +import { Contract } from '../../../common/contract' +import { parseTags } from '../../../common/util/parse' +import { getValues } from '../utils' + +async function updateContractTags() { + console.log('Updating contracts tags') + + const contracts = await getValues(firestore.collection('contracts')) + + console.log('Loaded', contracts.length, 'contracts') + + for (const contract of contracts) { + const contractRef = firestore.doc(`contracts/${contract.id}`) + + const tags = _.uniq([ + ...parseTags(contract.question + contract.description), + ...(contract.tags ?? []), + ]) + + console.log( + 'Updating tags', + contract.slug, + 'from', + contract.tags, + 'to', + tags + ) + + await contractRef.update({ + tags, + } as Partial) + } +} + +if (require.main === module) updateContractTags().then(() => process.exit()) diff --git a/functions/tsconfig.json b/functions/tsconfig.json index 6a0ed692..c836df11 100644 --- a/functions/tsconfig.json +++ b/functions/tsconfig.json @@ -2,7 +2,6 @@ "compilerOptions": { "module": "commonjs", "noImplicitReturns": true, - "noUnusedLocals": true, "outDir": "lib", "sourceMap": true, "strict": true, diff --git a/web/components/contract-card.tsx b/web/components/contract-card.tsx index a452fec1..5b07119f 100644 --- a/web/components/contract-card.tsx +++ b/web/components/contract-card.tsx @@ -10,7 +10,7 @@ import { contractPath, } from '../lib/firebase/contracts' import { Col } from './layout/col' -import { parseTags } from '../lib/util/parse' +import { parseTags } from '../../common/util/parse' import dayjs from 'dayjs' import { TrendingUpIcon, ClockIcon } from '@heroicons/react/solid' import { DateTimeTooltip } from './datetime-tooltip' diff --git a/web/components/contracts-list.tsx b/web/components/contracts-list.tsx index d19c0212..c71a5c9c 100644 --- a/web/components/contracts-list.tsx +++ b/web/components/contracts-list.tsx @@ -11,7 +11,7 @@ import { import { User } from '../lib/firebase/users' import { Col } from './layout/col' import { SiteLink } from './site-link' -import { parseTags } from '../lib/util/parse' +import { parseTags } from '../../common/util/parse' import { ContractCard } from './contract-card' import { Sort, useQueryAndSortParams } from '../hooks/use-sort-and-query-params' diff --git a/web/tsconfig.json b/web/tsconfig.json index ee270434..1ea03bef 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -13,8 +13,7 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true, - "noUnusedLocals": false + "incremental": true }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../common/**/*.ts"], "exclude": ["node_modules"]