Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/builder/app/builder/features/topbar/domains.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import {
ExternalLinkIcon,
CopyIcon,
} from "@webstudio-is/icons";
import type { DomainStatus } from "@webstudio-is/prisma-client";
import { CollapsibleDomainSection } from "./collapsible-domain-section";
import {
startTransition,
Expand All @@ -39,6 +38,7 @@ import DomainCheckbox from "./domain-checkbox";
import { CopyToClipboard } from "~/builder/shared/copy-to-clipboard";

export type Domain = Project["domainsVirtual"][number];
type DomainStatus = Project["domainsVirtual"][number]["status"];

const InputEllipsis = styled(InputField, {
"&>input": {
Expand Down
1 change: 1 addition & 0 deletions apps/builder/app/dashboard/dashboard.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const user = {
image: null,
username: "Taylor",
teamId: null,
provider: "github",
};

const createRouter = (element: JSX.Element) =>
Expand Down
2 changes: 1 addition & 1 deletion apps/builder/app/routes/rest.build.$buildId.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export const loader = async ({
const user =
project === null || project.userId === null
? undefined
: await getUserById(project.userId);
: await getUserById(context, project.userId);

return {
...pagesCanvasData,
Expand Down
71 changes: 0 additions & 71 deletions apps/builder/app/routes/rest.current.products.ts

This file was deleted.

16 changes: 12 additions & 4 deletions apps/builder/app/services/auth.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import env from "~/env/env.server";
import { builderAuthenticator } from "./builder-auth.server";
import { staticEnv } from "~/env/env.static.server";
import type { SessionData } from "./auth.server.utils";
import { createContext } from "~/shared/context.server";

const transformRefToAlias = (input: string) => {
const rawAlias = input.endsWith(".staging") ? input.slice(0, -8) : input;
Expand All @@ -32,11 +33,15 @@ export const callbackOrigin =

const strategyCallback = async ({
profile,
request,
}: {
profile: GitHubProfile | GoogleProfile;
request: Request;
}) => {
const context = await createContext(request);

try {
const user = await db.user.createOrLoginWithOAuth(profile);
const user = await db.user.createOrLoginWithOAuth(context, profile);
return { userId: user.id, createdAt: Date.now() };
} catch (error) {
if (error instanceof Error) {
Expand Down Expand Up @@ -83,7 +88,7 @@ if (env.GOOGLE_CLIENT_ID && env.GOOGLE_CLIENT_SECRET) {

if (env.DEV_LOGIN === "true") {
authenticator.use(
new FormStrategy(async ({ form }) => {
new FormStrategy(async ({ form, request }) => {
const secretValue = form.get("secret");

if (secretValue == null) {
Expand All @@ -96,7 +101,9 @@ if (env.DEV_LOGIN === "true") {

if (secret === env.AUTH_SECRET?.slice(0, 4)) {
try {
const user = await db.user.createOrLoginWithDev(email);
const context = await createContext(request);

const user = await db.user.createOrLoginWithDev(context, email);
return {
userId: user.id,
createdAt: Date.now(),
Expand Down Expand Up @@ -128,9 +135,10 @@ export const findAuthenticatedUser = async (request: Request) => {
if (user == null) {
return null;
}
const context = await createContext(request);

try {
return await getUserById(user.userId);
return await getUserById(context, user.userId);
} catch (error) {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions apps/builder/app/shared/$resources/sitemap.xml.server.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { json } from "@remix-run/server-runtime";
import { prisma } from "@webstudio-is/prisma-client";
import { parsePages } from "@webstudio-is/project-build/index.server";
import { getStaticSiteMapXml } from "@webstudio-is/sdk";
import { parseBuilderUrl } from "@webstudio-is/http-client";
import { isBuilder } from "../router-utils";
import { createContext } from "../context.server";

/**
* This should be a route in SvelteKit, as it can be fetched server-side without an actual HTTP request.
Expand All @@ -22,25 +22,24 @@ export const loader = async ({ request }: { request: Request }) => {
throw new Error("projectId is required");
}

// get pages from the database
const build = await prisma.build.findFirst({
where: {
projectId,
deployment: null,
},
select: {
pages: true,
updatedAt: true,
},
});

if (build === null) {
throw json({ message: "Build not found" }, { status: 404 });
const context = await createContext(request);

const buildResult = await context.postgrest.client
.from("Build")
.select("pages, updatedAt")
.eq("projectId", projectId)
.is("deployment", null)
.single();

if (buildResult.error) {
throw json({ message: buildResult.error.message }, { status: 404 });
}

const build = buildResult.data;

const pages = parsePages(build.pages);

const siteMap = getStaticSiteMapXml(pages, build.updatedAt.toISOString());
const siteMap = getStaticSiteMapXml(pages, build.updatedAt);

return json(siteMap);
};
61 changes: 34 additions & 27 deletions apps/builder/app/shared/context.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { entryApi } from "./entri/entri-api.server";
import { getUserPlanFeatures } from "./db/user-plan-features.server";
import { staticEnv } from "~/env/env.static.server";
import { createClient } from "@webstudio-is/postrest/index.server";
import { prisma } from "@webstudio-is/prisma-client";
import { builderAuthenticator } from "~/services/builder-auth.server";
import { readLoginSessionBloomFilter } from "~/services/session.server";
import type { BloomFilter } from "~/services/bloom-filter.server";
Expand Down Expand Up @@ -40,29 +39,24 @@ export const extractAuthFromRequest = async (request: Request) => {
};
};

const createTokenAuthorizationContext = async (authToken: string) => {
const projectOwnerIdByToken = await prisma.authorizationToken.findUnique({
where: {
token: authToken,
},
select: {
project: {
select: {
id: true,
userId: true,
},
},
},
});
const createTokenAuthorizationContext = async (
authToken: string,
postgrest: AppContext["postgrest"]
) => {
const projectOwnerIdByToken = await postgrest.client
.from("AuthorizationToken")
.select("project:Project(id, userId)")
.eq("token", authToken)
.single();

if (projectOwnerIdByToken === null) {
if (projectOwnerIdByToken.error) {
throw new Error(`Project owner can't be found for token ${authToken}`);
}

const ownerId = projectOwnerIdByToken.project.userId;
const ownerId = projectOwnerIdByToken.data.project?.userId ?? null;
if (ownerId === null) {
throw new Error(
`Project ${projectOwnerIdByToken.project.id} has null userId`
`Project ${projectOwnerIdByToken.data.project?.id} has null userId`
);
}

Expand All @@ -74,7 +68,8 @@ const createTokenAuthorizationContext = async (authToken: string) => {
};

const createAuthorizationContext = async (
request: Request
request: Request,
postgrest: AppContext["postgrest"]
): Promise<AppContext["authorization"]> => {
const { authToken, isServiceCall, sessionData } =
await extractAuthFromRequest(request);
Expand All @@ -87,7 +82,7 @@ const createAuthorizationContext = async (
}

if (authToken != null) {
return await createTokenAuthorizationContext(authToken);
return await createTokenAuthorizationContext(authToken, postgrest);
}

if (sessionData?.userId != null) {
Expand Down Expand Up @@ -155,7 +150,8 @@ const createEntriContext = () => {
};

const createUserPlanContext = async (
authorization: AppContext["authorization"]
authorization: AppContext["authorization"],
postgrest: AppContext["postgrest"]
) => {
const ownerId =
authorization.type === "token"
Expand All @@ -164,7 +160,9 @@ const createUserPlanContext = async (
? authorization.userId
: undefined;

const planFeatures = ownerId ? await getUserPlanFeatures(ownerId) : undefined;
const planFeatures = ownerId
? await getUserPlanFeatures(ownerId, postgrest)
: undefined;
return planFeatures;
};

Expand Down Expand Up @@ -193,18 +191,27 @@ export const createPostrestContext = () => {
* argument buildEnv==="prod" only if we are loading project with production build
*/
export const createContext = async (request: Request): Promise<AppContext> => {
const authorization = await createAuthorizationContext(request);
const postgrest = createPostrestContext();
const authorization = await createAuthorizationContext(request, postgrest);

const domain = createDomainContext();
const deployment = createDeploymentContext(getRequestOrigin(request.url));
const entri = createEntriContext();
const userPlanFeatures = await createUserPlanContext(authorization);
const userPlanFeatures = await createUserPlanContext(
authorization,
postgrest
);
const trpcCache = createTrpcCache();
const postgrest = createPostrestContext();

const createTokenContext = async (authToken: string) => {
const authorization = await createTokenAuthorizationContext(authToken);
const userPlanFeatures = await createUserPlanContext(authorization);
const authorization = await createTokenAuthorizationContext(
authToken,
postgrest
);
const userPlanFeatures = await createUserPlanContext(
authorization,
postgrest
);

return {
authorization,
Expand Down
3 changes: 1 addition & 2 deletions apps/builder/app/shared/db/canvas.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { loadBuildById } from "@webstudio-is/project-build/index.server";
import { loadAssetsByProject } from "@webstudio-is/asset-uploader/index.server";
import type { AppContext } from "@webstudio-is/trpc-interface/index.server";
import { findPageByIdOrPath, getStyleDeclKey } from "@webstudio-is/sdk";
import type { Build } from "@webstudio-is/prisma-client";
import { db as projectDb } from "@webstudio-is/project/index.server";

const getPair = <Item extends { id: string }>(item: Item): [string, Item] => [
Expand All @@ -12,7 +11,7 @@ const getPair = <Item extends { id: string }>(item: Item): [string, Item] => [
];

export const loadProductionCanvasData = async (
buildId: Build["id"],
buildId: string,
context: AppContext
): Promise<Data> => {
const build = await loadBuildById(context, buildId);
Expand Down
Loading