fosrl.pangolin/server/setup/copyInConfig.ts

119 lines
3.9 KiB
TypeScript
Raw Permalink Normal View History

2024-12-22 12:23:19 -05:00
import { db } from "@server/db";
2025-06-04 12:02:07 -04:00
import { domains, exitNodes, orgDomains, orgs, resources } from "@server/db";
2025-01-01 21:41:31 -05:00
import config from "@server/lib/config";
2025-01-01 23:03:15 -05:00
import { eq, ne } from "drizzle-orm";
2024-12-22 12:23:19 -05:00
import logger from "@server/logger";
export async function copyInConfig() {
const endpoint = config.getRawConfig().gerbil.base_endpoint;
const listenPort = config.getRawConfig().gerbil.start_port;
2024-12-25 15:54:32 -05:00
2025-02-15 22:41:39 -05:00
await db.transaction(async (trx) => {
const rawDomains = config.getRawConfig().domains;
2025-01-01 23:03:15 -05:00
2025-02-15 22:41:39 -05:00
const configDomains = Object.entries(rawDomains).map(
([key, value]) => ({
domainId: key,
baseDomain: value.base_domain.toLowerCase()
})
);
2025-02-15 22:41:39 -05:00
const existingDomains = await trx
.select()
.from(domains)
.where(eq(domains.configManaged, true));
const existingDomainKeys = new Set(
existingDomains.map((d) => d.domainId)
);
const configDomainKeys = new Set(configDomains.map((d) => d.domainId));
for (const existingDomain of existingDomains) {
if (!configDomainKeys.has(existingDomain.domainId)) {
await trx
.delete(domains)
.where(eq(domains.domainId, existingDomain.domainId))
.execute();
}
}
for (const { domainId, baseDomain } of configDomains) {
if (existingDomainKeys.has(domainId)) {
await trx
.update(domains)
.set({ baseDomain })
.where(eq(domains.domainId, domainId))
.execute();
} else {
await trx
.insert(domains)
.values({ domainId, baseDomain, configManaged: true })
.execute();
}
}
2025-02-25 22:58:52 -05:00
const allOrgs = await trx.select().from(orgs);
const existingOrgDomains = await trx.select().from(orgDomains);
const existingOrgDomainSet = new Set(
existingOrgDomains.map((od) => `${od.orgId}-${od.domainId}`)
);
const newOrgDomains = [];
for (const org of allOrgs) {
for (const domain of configDomains) {
const key = `${org.orgId}-${domain.domainId}`;
if (!existingOrgDomainSet.has(key)) {
newOrgDomains.push({
orgId: org.orgId,
domainId: domain.domainId
});
}
}
}
if (newOrgDomains.length > 0) {
await trx.insert(orgDomains).values(newOrgDomains).execute();
}
});
await db.transaction(async (trx) => {
2025-02-15 22:41:39 -05:00
const allResources = await trx
.select()
.from(resources)
.leftJoin(domains, eq(domains.domainId, resources.domainId));
for (const { resources: resource, domains: domain } of allResources) {
if (!resource || !domain) {
continue;
}
if (!domain.configManaged) {
continue;
}
2025-01-01 23:03:15 -05:00
let fullDomain = "";
if (resource.isBaseDomain) {
2025-02-15 22:41:39 -05:00
fullDomain = domain.baseDomain;
} else {
2025-02-18 22:56:46 -05:00
fullDomain = `${resource.subdomain}.${domain.baseDomain}`;
}
2025-02-15 22:41:39 -05:00
2025-01-01 23:03:15 -05:00
await trx
.update(resources)
.set({ fullDomain })
.where(eq(resources.resourceId, resource.resourceId));
}
});
2025-02-15 22:41:39 -05:00
// TODO: eventually each exit node could have a different endpoint
await db
.update(exitNodes)
.set({ endpoint })
.where(ne(exitNodes.endpoint, endpoint));
// TODO: eventually each exit node could have a different port
await db
.update(exitNodes)
.set({ listenPort })
.where(ne(exitNodes.listenPort, listenPort));
2024-12-25 15:54:32 -05:00
}