mirror of
https://github.com/fosrl/pangolin.git
synced 2025-07-28 06:34:50 +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(),
|
domainId: varchar("domainId").primaryKey(),
|
||||||
baseDomain: varchar("baseDomain").notNull(),
|
baseDomain: varchar("baseDomain").notNull(),
|
||||||
configManaged: boolean("configManaged").notNull().default(false),
|
configManaged: boolean("configManaged").notNull().default(false),
|
||||||
type: varchar("type"), // "ns", "cname", "a"
|
type: varchar("type"), // "ns", "cname", "wildcard"
|
||||||
verified: boolean("verified").notNull().default(false),
|
verified: boolean("verified").notNull().default(false),
|
||||||
failed: boolean("failed").notNull().default(false),
|
failed: boolean("failed").notNull().default(false),
|
||||||
tries: integer("tries").notNull().default(0)
|
tries: integer("tries").notNull().default(0)
|
||||||
|
|
|
@ -7,7 +7,7 @@ export const domains = sqliteTable("domains", {
|
||||||
configManaged: integer("configManaged", { mode: "boolean" })
|
configManaged: integer("configManaged", { mode: "boolean" })
|
||||||
.notNull()
|
.notNull()
|
||||||
.default(false),
|
.default(false),
|
||||||
type: text("type"), // "ns", "cname", "a"
|
type: text("type"), // "ns", "cname", "wildcard"
|
||||||
verified: integer("verified", { mode: "boolean" }).notNull().default(false),
|
verified: integer("verified", { mode: "boolean" }).notNull().default(false),
|
||||||
failed: integer("failed", { mode: "boolean" }).notNull().default(false),
|
failed: integer("failed", { mode: "boolean" }).notNull().default(false),
|
||||||
tries: integer("tries").notNull().default(0)
|
tries: integer("tries").notNull().default(0)
|
||||||
|
|
|
@ -69,7 +69,7 @@ async function copyInDomains() {
|
||||||
} else {
|
} else {
|
||||||
await trx
|
await trx
|
||||||
.insert(domains)
|
.insert(domains)
|
||||||
.values({ domainId, baseDomain, configManaged: true, type: "a" })
|
.values({ domainId, baseDomain, configManaged: true, type: "wildcard" })
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ type OrganizationDomain = {
|
||||||
domainId: string;
|
domainId: string;
|
||||||
baseDomain: string;
|
baseDomain: string;
|
||||||
verified: boolean;
|
verified: boolean;
|
||||||
type: "ns" | "cname";
|
type: "ns" | "cname" | "wildcard";
|
||||||
};
|
};
|
||||||
|
|
||||||
type AvailableOption = {
|
type AvailableOption = {
|
||||||
|
@ -40,7 +40,7 @@ type DomainOption = {
|
||||||
domain: string;
|
domain: string;
|
||||||
type: "organization" | "provided";
|
type: "organization" | "provided";
|
||||||
verified?: boolean;
|
verified?: boolean;
|
||||||
domainType?: "ns" | "cname";
|
domainType?: "ns" | "cname" | "wildcard";
|
||||||
domainId?: string;
|
domainId?: string;
|
||||||
domainNamespaceId?: string;
|
domainNamespaceId?: string;
|
||||||
subdomain?: string;
|
subdomain?: string;
|
||||||
|
@ -95,11 +95,11 @@ export default function DomainPicker({
|
||||||
const domains = response.data.data.domains
|
const domains = response.data.data.domains
|
||||||
.filter(
|
.filter(
|
||||||
(domain) =>
|
(domain) =>
|
||||||
domain.type === "ns" || domain.type === "cname"
|
domain.type === "ns" || domain.type === "cname" || domain.type === "wildcard"
|
||||||
)
|
)
|
||||||
.map((domain) => ({
|
.map((domain) => ({
|
||||||
...domain,
|
...domain,
|
||||||
type: domain.type as "ns" | "cname"
|
type: domain.type as "ns" | "cname" | "wildcard"
|
||||||
}));
|
}));
|
||||||
setOrganizationDomains(domains);
|
setOrganizationDomains(domains);
|
||||||
}
|
}
|
||||||
|
@ -175,6 +175,41 @@ export default function DomainPicker({
|
||||||
domainId: orgDomain.domainId
|
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,
|
fullDomain: option.domain,
|
||||||
baseDomain: 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") {
|
} else if (option.type === "provided") {
|
||||||
// Extract subdomain from full domain
|
// Extract subdomain from full domain
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue