|
1 | 1 | import { Router } from "express"; |
2 | | -import { eq } from "drizzle-orm"; |
| 2 | +import { eq, sql as drizzleSql } from "drizzle-orm"; |
3 | 3 | import { privateKeyToAccount } from "viem/accounts"; |
4 | 4 | import { uploadProfileToIPFS, uploadParentAppToIPFS, uploadArtMetadataFolder } from "../lib/ipfs"; |
5 | 5 | import { setParentContenthash, fixContenthash, registerSubdomainOnChain, setNameForWallet, setContenthashForWallet } from "../lib/ens"; |
@@ -248,31 +248,31 @@ adminRouter.post("/admin/import-subdomain", async (req, res) => { |
248 | 248 | return; |
249 | 249 | } |
250 | 250 | try { |
251 | | - const str = (v: unknown) => (typeof v === "string" && v ? v : null); |
252 | | - const validTokenStatus = ["none","deploying","deployed","failed"] as const; |
253 | | - const validStatus = ["pending","active","linked"] as const; |
254 | | - await db.insert(subdomainsTable).values({ |
255 | | - name: d.name as string, |
256 | | - walletAddress: d.walletAddress as string, |
257 | | - ensFullName: str(d.ensFullName), |
258 | | - ipfsCid: str(d.ipfsCid), |
259 | | - avatarUrl: str(d.avatarUrl), |
260 | | - bio: str(d.bio), |
261 | | - status: validStatus.includes(d.status as never) ? d.status as "pending"|"active"|"linked" : "linked", |
262 | | - ensTx1Hash: str(d.ensTx1Hash), |
263 | | - ensTx2Hash: str(d.ensTx2Hash), |
264 | | - ensTx3Hash: str(d.ensTx3Hash), |
265 | | - ensTx4Hash: str(d.ensTx4Hash), |
266 | | - tokenStatus: validTokenStatus.includes(d.tokenStatus as never) ? d.tokenStatus as "none"|"deploying"|"deployed"|"failed" : "none", |
267 | | - tokenAddress: str(d.tokenAddress), |
268 | | - tokenSymbol: str(d.tokenSymbol), |
269 | | - tokenName: str(d.tokenName), |
270 | | - tokenDeployTxHash: str(d.tokenDeployTxHash), |
271 | | - uniswapPairAddress: str(d.uniswapPairAddress), |
272 | | - uniswapLiquidityTxHash: str(d.uniswapLiquidityTxHash), |
273 | | - artTokenId: str(d.artTokenId), |
274 | | - artBaseUri: str(d.artBaseUri), |
275 | | - }).onConflictDoNothing(); |
| 251 | + const s = (v: unknown) => (typeof v === "string" && v ? v : null); |
| 252 | + const validTokenStatus = ["none","deploying","deployed","failed"]; |
| 253 | + const validStatus = ["pending","active","linked"]; |
| 254 | + const ensFullName = (d.ensFullName as string) || `${d.name}.subframe.eth`; |
| 255 | + const status = validStatus.includes(d.status as string) ? d.status as string : "linked"; |
| 256 | + const tokenStatus = validTokenStatus.includes(d.tokenStatus as string) ? d.tokenStatus as string : "none"; |
| 257 | + // Use raw SQL to avoid Drizzle strict-null type issues with nullable columns |
| 258 | + await db.execute(drizzleSql` |
| 259 | + INSERT INTO subdomains ( |
| 260 | + name, wallet_address, ens_full_name, ipfs_cid, avatar_url, bio, |
| 261 | + status, ens_tx1_hash, ens_tx2_hash, ens_tx3_hash, ens_tx4_hash, |
| 262 | + token_status, token_address, token_symbol, token_name, |
| 263 | + token_deploy_tx_hash, uniswap_pair_address, uniswap_liquidity_tx_hash, |
| 264 | + art_token_id, art_base_uri |
| 265 | + ) VALUES ( |
| 266 | + ${d.name as string}, ${d.walletAddress as string}, ${ensFullName}, |
| 267 | + ${s(d.ipfsCid)}, ${s(d.avatarUrl)}, ${s(d.bio)}, |
| 268 | + ${status}::subdomain_status, |
| 269 | + ${s(d.ensTx1Hash)}, ${s(d.ensTx2Hash)}, ${s(d.ensTx3Hash)}, ${s(d.ensTx4Hash)}, |
| 270 | + ${tokenStatus}::token_status, |
| 271 | + ${s(d.tokenAddress)}, ${s(d.tokenSymbol)}, ${s(d.tokenName)}, |
| 272 | + ${s(d.tokenDeployTxHash)}, ${s(d.uniswapPairAddress)}, ${s(d.uniswapLiquidityTxHash)}, |
| 273 | + ${s(d.artTokenId)}, ${s(d.artBaseUri)} |
| 274 | + ) ON CONFLICT DO NOTHING |
| 275 | + `); |
276 | 276 | res.json({ ok: true, name: d.name }); |
277 | 277 | } catch (err) { |
278 | 278 | logger.error({ err }, "[ADMIN] import-subdomain failed"); |
|
0 commit comments