mirror of
https://github.com/fosrl/pangolin.git
synced 2025-07-25 13:15:02 +02:00
Domain picker support wildcard
This commit is contained in:
parent
69d253fba3
commit
7f227932da
4 changed files with 52 additions and 7 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue