File size: 1,130 Bytes
7540aea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import type { CreateExpressContextOptions } from "@trpc/server/adapters/express";
import type { User } from "../../drizzle/schema";
import * as db from "../db";

export type TrpcContext = {
  req: CreateExpressContextOptions["req"];
  res: CreateExpressContextOptions["res"];
  user: User | null;
};

export async function createContext(
  opts: CreateExpressContextOptions
): Promise<TrpcContext> {
  let user: User | null = null;

  // Dev mode: auto-authenticate as dev user (no OAuth needed)
  if (process.env.DEV_MODE === "true" || !process.env.OAUTH_SERVER_URL) {
    user = (await db.getUserByOpenId("dev-user")) || null;
    if (!user) {
      await db.upsertUser({
        openId: "dev-user",
        name: "Developer",
        email: "dev@claw.local",
        role: "admin",
      });
      user = (await db.getUserByOpenId("dev-user")) || null;
    }
  } else {
    // Production mode: use OAuth SDK
    try {
      const { sdk } = await import("./sdk");
      user = await sdk.authenticateRequest(opts.req);
    } catch {
      user = null;
    }
  }

  return {
    req: opts.req,
    res: opts.res,
    user,
  };
}