Skip to content

Commit 1524074

Browse files
willhayesethauto-subframe[bot]
authored andcommitted
feat: improve subdomain data portability across networks
1 parent e7f591b commit 1524074

1 file changed

Lines changed: 26 additions & 26 deletions

File tree

backend/src/routes/admin.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Router } from "express";
2-
import { eq } from "drizzle-orm";
2+
import { eq, sql as drizzleSql } from "drizzle-orm";
33
import { privateKeyToAccount } from "viem/accounts";
44
import { uploadProfileToIPFS, uploadParentAppToIPFS, uploadArtMetadataFolder } from "../lib/ipfs";
55
import { setParentContenthash, fixContenthash, registerSubdomainOnChain, setNameForWallet, setContenthashForWallet } from "../lib/ens";
@@ -248,31 +248,31 @@ adminRouter.post("/admin/import-subdomain", async (req, res) => {
248248
return;
249249
}
250250
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+
`);
276276
res.json({ ok: true, name: d.name });
277277
} catch (err) {
278278
logger.error({ err }, "[ADMIN] import-subdomain failed");

0 commit comments

Comments
 (0)