Domain picker support wildcard

This commit is contained in:
Owen 2025-07-14 12:24:38 -07:00
parent 69d253fba3
commit 7f227932da
No known key found for this signature in database
GPG key ID: 8271FDFFD9E0CCBD
4 changed files with 52 additions and 7 deletions

View file

@ -13,7 +13,7 @@ export const domains = pgTable("domains", {
domainId: varchar("domainId").primaryKey(),
baseDomain: varchar("baseDomain").notNull(),
configManaged: boolean("configManaged").notNull().default(false),
type: varchar("type"), // "ns", "cname", "a"
type: varchar("type"), // "ns", "cname", "wildcard"
verified: boolean("verified").notNull().default(false),
failed: boolean("failed").notNull().default(false),
tries: integer("tries").notNull().default(0)

View file

@ -7,7 +7,7 @@ export const domains = sqliteTable("domains", {
configManaged: integer("configManaged", { mode: "boolean" })
.notNull()
.default(false),
type: text("type"), // "ns", "cname", "a"
type: text("type"), // "ns", "cname", "wildcard"
verified: integer("verified", { mode: "boolean" }).notNull().default(false),
failed: integer("failed", { mode: "boolean" }).notNull().default(false),
tries: integer("tries").notNull().default(0)

View file

@ -69,7 +69,7 @@ async function copyInDomains() {
} else {
await trx
.insert(domains)
.values({ domainId, baseDomain, configManaged: true, type: "a" })
.values({ domainId, baseDomain, configManaged: true, type: "wildcard" })
.execute();
}
}

View file

@ -26,7 +26,7 @@ type OrganizationDomain = {
domainId: string;
baseDomain: string;
verified: boolean;
type: "ns" | "cname";
type: "ns" | "cname" | "wildcard";
};
type AvailableOption = {
@ -40,7 +40,7 @@ type DomainOption = {
domain: string;
type: "organization" | "provided";
verified?: boolean;
domainType?: "ns" | "cname";
domainType?: "ns" | "cname" | "wildcard";
domainId?: string;
domainNamespaceId?: string;
subdomain?: string;
@ -95,11 +95,11 @@ export default function DomainPicker({
const domains = response.data.data.domains
.filter(
(domain) =>
domain.type === "ns" || domain.type === "cname"
domain.type === "ns" || domain.type === "cname" || domain.type === "wildcard"
)
.map((domain) => ({
...domain,
type: domain.type as "ns" | "cname"
type: domain.type as "ns" | "cname" | "wildcard"
}));
setOrganizationDomains(domains);
}
@ -175,6 +175,41 @@ export default function DomainPicker({
domainId: orgDomain.domainId
});
}
} else if (orgDomain.type === "wildcard") {
// For wildcard domains, allow the base domain or one level up
const userInputLower = userInput.toLowerCase();
const baseDomainLower = orgDomain.baseDomain.toLowerCase();
// Check if user input is exactly the base domain
if (userInputLower === baseDomainLower) {
options.push({
id: `org-${orgDomain.domainId}`,
domain: orgDomain.baseDomain,
type: "organization",
verified: orgDomain.verified,
domainType: "wildcard",
domainId: orgDomain.domainId
});
}
// Check if user input is one level up (subdomain.baseDomain)
else if (userInputLower.endsWith(`.${baseDomainLower}`)) {
const subdomain = userInputLower.slice(
0,
-(baseDomainLower.length + 1)
);
// Only allow one level up (no dots in subdomain)
if (!subdomain.includes('.')) {
options.push({
id: `org-${orgDomain.domainId}`,
domain: userInput,
type: "organization",
verified: orgDomain.verified,
domainType: "wildcard",
domainId: orgDomain.domainId,
subdomain: subdomain
});
}
}
}
});
@ -236,6 +271,16 @@ export default function DomainPicker({
fullDomain: option.domain,
baseDomain: option.domain
});
} else if (option.domainType === "wildcard") {
onDomainChange?.({
domainId: option.domainId!,
type: "organization",
subdomain: option.subdomain || undefined,
fullDomain: option.domain,
baseDomain: option.subdomain
? option.domain.split('.').slice(1).join('.')
: option.domain
});
}
} else if (option.type === "provided") {
// Extract subdomain from full domain