@sanoma-ai/connector-better-auth 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/db/staff.d.ts +695 -0
- package/dist/db/staff.js +4 -0
- package/dist/db/staff.js.map +1 -0
- package/dist/db/tables.d.ts +702 -0
- package/dist/db/tables.js +69 -0
- package/dist/db/tables.js.map +1 -0
- package/dist/db/visitors.d.ts +695 -0
- package/dist/db/visitors.js +4 -0
- package/dist/db/visitors.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/instance.d.ts +137 -78
- package/dist/instance.js +133 -59
- package/dist/instance.js.map +1 -1
- package/dist/login.d.ts +5 -5
- package/dist/login.js +19 -21
- package/dist/login.js.map +1 -1
- package/dist/staff.d.ts +3 -2
- package/dist/staff.js +56 -32
- package/dist/staff.js.map +1 -1
- package/drizzle/staff/0000_closed_toro.sql +64 -0
- package/drizzle/staff/meta/0000_snapshot.json +431 -0
- package/drizzle/staff/meta/_journal.json +13 -0
- package/drizzle/visitors/0000_natural_dexter_bennett.sql +64 -0
- package/drizzle/visitors/meta/0000_snapshot.json +431 -0
- package/drizzle/visitors/meta/_journal.json +13 -0
- package/package.json +11 -8
package/dist/login.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getHostFromSource, matchesHostPattern } from "better-auth";
|
|
2
|
-
import { emailCode,
|
|
3
|
-
/** The schema Better Auth's tables (`user`, `session`, `account`, `verification`) live in, on the company's database. */
|
|
4
|
-
const SCHEMA =
|
|
2
|
+
import { emailCode, identityOf, localRedirects, openBetterAuth, SCHEMAS, withSignOutBody, } from "./instance.js";
|
|
3
|
+
/** The schema Better Auth's tables (`user`, `session`, `account`, `verification`, `rateLimit`) live in, on the company's database. */
|
|
4
|
+
const SCHEMA = SCHEMAS.visitors;
|
|
5
5
|
/** Where its routes are: a site's pages POST to `<BASE_PATH>/sign-up/email`, `/sign-in/email`, `/sign-in/email-otp`… */
|
|
6
6
|
const BASE_PATH = "/auth/better-auth";
|
|
7
7
|
const SIGN_OUT = `${BASE_PATH}/sign-out`;
|
|
@@ -11,19 +11,19 @@ const SIGN_OUT = `${BASE_PATH}/sign-out`;
|
|
|
11
11
|
* (`context.social.github`), a visitor also signs up and in with GitHub (`/sign-in/social`, which
|
|
12
12
|
* joins the account of GitHub's verified email), or links it once signed in (`/link-social`), and
|
|
13
13
|
* is then said to be that GitHub login (`verify`'s `github`). Its tables are in schema
|
|
14
|
-
* `better_auth` on the company's database,
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* origin's is.
|
|
14
|
+
* `better_auth` on the company's database, which the worker makes (`prepareBetterAuth`), reached
|
|
15
|
+
* through the pool the app gives each request (`context.database`), its cookies signed with the
|
|
16
|
+
* app's key for it (`context.key`). The site's origins are its allowed hosts (a request for
|
|
17
|
+
* another host is refused) and set the cookie's `Secure` flag: an `https` origin's is.
|
|
18
18
|
*/
|
|
19
|
-
export
|
|
19
|
+
export function betterAuthLogin({ database, key, origins, sendCode, social }) {
|
|
20
20
|
const github = social?.github;
|
|
21
21
|
const sites = sitesOf(origins);
|
|
22
22
|
const hosts = new Map();
|
|
23
23
|
for (const { protocol, host } of sites)
|
|
24
24
|
hosts.set(protocol, [...(hosts.get(protocol) ?? []), host]);
|
|
25
|
-
const
|
|
26
|
-
|
|
25
|
+
const auth = openBetterAuth({
|
|
26
|
+
database,
|
|
27
27
|
key,
|
|
28
28
|
schema: SCHEMA,
|
|
29
29
|
basePath: BASE_PATH,
|
|
@@ -31,7 +31,6 @@ export async function betterAuthLogin({ databaseUrl, key, origins, sendCode, soc
|
|
|
31
31
|
options: {
|
|
32
32
|
emailAndPassword: { enabled: true },
|
|
33
33
|
plugins: sendCode ? [emailCode(sendCode)] : [],
|
|
34
|
-
user: { additionalFields: GITHUB_FIELD },
|
|
35
34
|
...(github && {
|
|
36
35
|
socialProviders: { github: { clientId: github.clientId, clientSecret: github.clientSecret } },
|
|
37
36
|
// GitHub stays untrusted, and the account's own email must be verified (Better Auth's
|
|
@@ -52,7 +51,7 @@ export async function betterAuthLogin({ databaseUrl, key, origins, sendCode, soc
|
|
|
52
51
|
const authFor = (request) => {
|
|
53
52
|
const host = getHostFromSource(request, false) ?? "";
|
|
54
53
|
const site = sites.find((s) => matchesHostPattern(host, s.host));
|
|
55
|
-
return site &&
|
|
54
|
+
return site && auth(site.protocol);
|
|
56
55
|
};
|
|
57
56
|
const methods = [
|
|
58
57
|
"password",
|
|
@@ -61,11 +60,11 @@ export async function betterAuthLogin({ databaseUrl, key, origins, sendCode, soc
|
|
|
61
60
|
];
|
|
62
61
|
return {
|
|
63
62
|
async verify(request) {
|
|
64
|
-
const
|
|
65
|
-
if (!
|
|
63
|
+
const own = authFor(request);
|
|
64
|
+
if (!own)
|
|
66
65
|
throw new Error(`better-auth: ${request.headers.get("host")} is not one of the site's hosts`);
|
|
67
66
|
// Null for a missing, bad or signed-out cookie.
|
|
68
|
-
const session = await
|
|
67
|
+
const session = await (await own).api.getSession({ headers: request.headers });
|
|
69
68
|
if (!session)
|
|
70
69
|
return null;
|
|
71
70
|
return { subject: session.user.id, ...identityOf(session.user) };
|
|
@@ -74,18 +73,17 @@ export async function betterAuthLogin({ databaseUrl, key, origins, sendCode, soc
|
|
|
74
73
|
const { pathname } = new URL(request.url);
|
|
75
74
|
if (pathname !== BASE_PATH && !pathname.startsWith(`${BASE_PATH}/`))
|
|
76
75
|
return undefined;
|
|
77
|
-
// Better Auth throws for a host it does not allow, which would be a 500.
|
|
78
|
-
const auth = authFor(request);
|
|
79
|
-
if (!auth)
|
|
80
|
-
return new Response("Misdirected Request", { status: 421 });
|
|
81
76
|
// Better Auth checks a redirect in a body against the site's hosts; one in the query must be a path here.
|
|
82
77
|
if (!localRedirects(new URL(request.url)))
|
|
83
78
|
return new Response("Bad Request", { status: 400 });
|
|
84
|
-
|
|
79
|
+
// Better Auth throws for a host it does not allow, which would be a 500.
|
|
80
|
+
const own = authFor(request);
|
|
81
|
+
if (!own)
|
|
82
|
+
return new Response("Misdirected Request", { status: 421 });
|
|
83
|
+
return (await own).handler(withSignOutBody(request, SIGN_OUT));
|
|
85
84
|
},
|
|
86
85
|
signOut: SIGN_OUT,
|
|
87
86
|
methods,
|
|
88
|
-
close,
|
|
89
87
|
};
|
|
90
88
|
}
|
|
91
89
|
/** A visitor has one GitHub account at most: another is refused (Better Auth's `unable_to_link_account`). */
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/staff.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { type LoginContext, type LoginHalf } from "@sanoma-ai/workflows";
|
|
|
6
6
|
* cookie, `sanoma.session_token`, for the host, seven days. A code is sent, and a user made, only
|
|
7
7
|
* for a person `staff.admits`: an undeclared email gets the same answer and leaves nothing.
|
|
8
8
|
* Each sign-in is told to `staff.record`. It answers on any host the app does, so a change
|
|
9
|
-
* (any POST) to its routes must come from the page's own origin.
|
|
9
|
+
* (any POST) to its routes must come from the page's own origin. It runs on the pool the app
|
|
10
|
+
* gives each request (`database`), and keeps nothing between requests.
|
|
10
11
|
*/
|
|
11
|
-
export declare function betterAuthStaffLogin({
|
|
12
|
+
export declare function betterAuthStaffLogin({ database, key, sendCode, staff }: LoginContext): LoginHalf;
|
package/dist/staff.js
CHANGED
|
@@ -2,14 +2,16 @@ import { INVITE_SECONDS, sameOrigin, } from "@sanoma-ai/workflows";
|
|
|
2
2
|
import { createAuthMiddleware } from "better-auth/api";
|
|
3
3
|
import { magicLink } from "better-auth/plugins/magic-link";
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
|
-
import { emailCode,
|
|
5
|
+
import { emailCode, identityOf, localRedirects, openBetterAuth, protocolOf, SCHEMAS, withSignOutBody, } from "./instance.js";
|
|
6
|
+
/** Says nothing: a listener for a checked-out client's `error`, whose query fails on its own. */
|
|
7
|
+
const quiet = () => undefined;
|
|
6
8
|
// The staff login: Better Auth again, as a second instance in a schema of its own, signing in only
|
|
7
9
|
// the people the files declare. An email code to a declared email, GitHub through the company's
|
|
8
10
|
// own client, and invites (one-use magic links the app mints for a declared email); no password.
|
|
9
11
|
// A code or a user row is never made for anyone else: the declared-email check is in Better Auth's
|
|
10
12
|
// hooks, not its `disableSignUp`, which would send no code until a user row exists.
|
|
11
13
|
/** The schema the staff login's tables are in, beside the visitors' `better_auth`. */
|
|
12
|
-
const SCHEMA =
|
|
14
|
+
const SCHEMA = SCHEMAS.staff;
|
|
13
15
|
const BASE_PATH = "/auth/better-auth";
|
|
14
16
|
const SIGN_OUT = `${BASE_PATH}/sign-out`;
|
|
15
17
|
const SEND_CODE = "/email-otp/send-verification-otp";
|
|
@@ -47,9 +49,10 @@ const METHOD_OF = {
|
|
|
47
49
|
* cookie, `sanoma.session_token`, for the host, seven days. A code is sent, and a user made, only
|
|
48
50
|
* for a person `staff.admits`: an undeclared email gets the same answer and leaves nothing.
|
|
49
51
|
* Each sign-in is told to `staff.record`. It answers on any host the app does, so a change
|
|
50
|
-
* (any POST) to its routes must come from the page's own origin.
|
|
52
|
+
* (any POST) to its routes must come from the page's own origin. It runs on the pool the app
|
|
53
|
+
* gives each request (`database`), and keeps nothing between requests.
|
|
51
54
|
*/
|
|
52
|
-
export
|
|
55
|
+
export function betterAuthStaffLogin({ database, key, sendCode, staff }) {
|
|
53
56
|
if (!staff)
|
|
54
57
|
throw new Error("better-auth: the staff login needs the app's staff context");
|
|
55
58
|
const github = staff.social.github;
|
|
@@ -63,8 +66,8 @@ export async function betterAuthStaffLogin({ databaseUrl, key, sendCode, staff }
|
|
|
63
66
|
if (login)
|
|
64
67
|
await ctx.context.internalAdapter.updateUser(account.userId, { github: login });
|
|
65
68
|
};
|
|
66
|
-
const
|
|
67
|
-
|
|
69
|
+
const auth = openBetterAuth({
|
|
70
|
+
database,
|
|
68
71
|
key,
|
|
69
72
|
schema: SCHEMA,
|
|
70
73
|
basePath: BASE_PATH,
|
|
@@ -76,7 +79,6 @@ export async function betterAuthStaffLogin({ databaseUrl, key, sendCode, staff }
|
|
|
76
79
|
options: {
|
|
77
80
|
session: { expiresIn: SESSION_SECONDS },
|
|
78
81
|
user: {
|
|
79
|
-
additionalFields: GITHUB_FIELD,
|
|
80
82
|
// Nobody the files do not declare gets a row, whatever the route: by the verified email
|
|
81
83
|
// the route proved, or by the login GitHub's own profile names (Better Auth sets no field
|
|
82
84
|
// from a profile that a person may not set, so the login is kept by `keepLogin`), before
|
|
@@ -157,34 +159,63 @@ export async function betterAuthStaffLogin({ databaseUrl, key, sendCode, staff }
|
|
|
157
159
|
},
|
|
158
160
|
},
|
|
159
161
|
});
|
|
160
|
-
const authFor = (request) =>
|
|
162
|
+
const authFor = (request) => auth(protocolOf(request));
|
|
161
163
|
const methods = [
|
|
162
164
|
...(sendCode ? ["code"] : []),
|
|
163
165
|
...(github ? ["github"] : []),
|
|
164
166
|
"invite",
|
|
165
167
|
];
|
|
166
|
-
/**
|
|
167
|
-
|
|
168
|
-
|
|
168
|
+
/** The mints of this process, one after another. */
|
|
169
|
+
let mints = Promise.resolve();
|
|
170
|
+
/**
|
|
171
|
+
* Mints `email`'s invite, server-side, its token from `minted`; a new one replaces the last. One
|
|
172
|
+
* at a time per email, whichever process asks: a transaction of its own holds Postgres's lock
|
|
173
|
+
* for the email while the old row goes and the new one is written on the pool's other
|
|
174
|
+
* connections (a transaction's lock is one connection's for the transaction, safe through a
|
|
175
|
+
* pooler), so two mints at once leave one invite, and `minted` hands over the right token. One
|
|
176
|
+
* at a time in the process as well (`mints`): the lock's connection is one of the pool's, and
|
|
177
|
+
* many held at once, each waiting for another of the pool's, would leave none for Better Auth.
|
|
178
|
+
*/
|
|
179
|
+
function mint(email, request) {
|
|
180
|
+
const minting = mints.then(() => mintNow(email, request));
|
|
181
|
+
mints = minting.catch(() => undefined);
|
|
182
|
+
return minting;
|
|
183
|
+
}
|
|
184
|
+
async function mintNow(email, request) {
|
|
185
|
+
const own = await authFor(request);
|
|
169
186
|
const normalized = email.toLowerCase();
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
187
|
+
const lock = await (await database()).connect();
|
|
188
|
+
// A checked-out client with no listener would throw its connection's error as uncaught; the query fails instead.
|
|
189
|
+
lock.on("error", quiet);
|
|
190
|
+
try {
|
|
191
|
+
await lock.query("BEGIN");
|
|
192
|
+
await lock.query("SELECT pg_advisory_xact_lock(hashtext($1))", [`sanoma.login.invite.${normalized}`]);
|
|
193
|
+
// A new invite replaces the last: the old one's row goes.
|
|
194
|
+
const { adapter } = await own.$context;
|
|
195
|
+
await adapter.deleteMany({
|
|
196
|
+
model: "verification",
|
|
197
|
+
where: [{ field: "value", value: JSON.stringify({ type: "magic-link", email: normalized }) }],
|
|
198
|
+
});
|
|
199
|
+
await own.api.signInMagicLink({ body: { email: normalized, callbackURL: "/" }, headers: request.headers });
|
|
200
|
+
await lock.query("COMMIT");
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
await lock.query("ROLLBACK").catch(() => undefined);
|
|
204
|
+
throw err;
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
lock.off("error", quiet);
|
|
208
|
+
lock.release();
|
|
209
|
+
}
|
|
177
210
|
const token = minted.get(normalized);
|
|
178
211
|
minted.delete(normalized);
|
|
179
212
|
if (!token)
|
|
180
213
|
throw new Error("better-auth: the invite was not minted");
|
|
181
214
|
return token;
|
|
182
215
|
}
|
|
183
|
-
/** The invite being minted, which the next waits for. */
|
|
184
|
-
let invites = Promise.resolve();
|
|
185
216
|
return {
|
|
186
217
|
async verify(request) {
|
|
187
|
-
const session = await authFor(request).api.getSession({ headers: request.headers });
|
|
218
|
+
const session = await (await authFor(request)).api.getSession({ headers: request.headers });
|
|
188
219
|
return session ? { subject: session.user.id, ...identityOf(session.user) } : null;
|
|
189
220
|
},
|
|
190
221
|
async handle(request) {
|
|
@@ -199,20 +230,14 @@ export async function betterAuthStaffLogin({ databaseUrl, key, sendCode, staff }
|
|
|
199
230
|
// Any host is allowed, so Better Auth trusts any redirect: only a path on this host is taken.
|
|
200
231
|
if (!localRedirects(new URL(request.url)))
|
|
201
232
|
return new Response("Bad Request", { status: 400 });
|
|
202
|
-
return authFor(request).handler(withSignOutBody(request, SIGN_OUT));
|
|
233
|
+
return (await authFor(request)).handler(withSignOutBody(request, SIGN_OUT));
|
|
203
234
|
},
|
|
204
235
|
signOut: SIGN_OUT,
|
|
205
236
|
methods,
|
|
206
|
-
invite
|
|
207
|
-
// One at a time: each takes its token from `minted` and replaces the last invite's row.
|
|
208
|
-
const next = invites.then(() => mint(email, request));
|
|
209
|
-
invites = next.catch(() => undefined);
|
|
210
|
-
return next;
|
|
211
|
-
},
|
|
237
|
+
invite: mint,
|
|
212
238
|
async invitation(token) {
|
|
213
|
-
//
|
|
214
|
-
const
|
|
215
|
-
const { internalAdapter } = await auth.$context;
|
|
239
|
+
// Either protocol's instance: they share the tables.
|
|
240
|
+
const { internalAdapter } = await (await auth("https")).$context;
|
|
216
241
|
const found = await internalAdapter.findVerificationValue(`magic-link:${hashed(token)}`);
|
|
217
242
|
if (!found || found.expiresAt < new Date())
|
|
218
243
|
return undefined;
|
|
@@ -222,7 +247,6 @@ export async function betterAuthStaffLogin({ databaseUrl, key, sendCode, staff }
|
|
|
222
247
|
const query = new URLSearchParams({ token, callbackURL: "/" });
|
|
223
248
|
return { email, path: `${BASE_PATH}/magic-link/verify?${query}` };
|
|
224
249
|
},
|
|
225
|
-
close,
|
|
226
250
|
};
|
|
227
251
|
}
|
|
228
252
|
/** A token as the magic link plugin stores it (`storeToken: "hashed"`): SHA-256, base64url without padding. */
|
package/dist/staff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staff.js","sourceRoot":"","sources":["../src/staff.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAId,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"staff.js","sourceRoot":"","sources":["../src/staff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
CREATE SCHEMA "better_auth_staff";
|
|
2
|
+
--> statement-breakpoint
|
|
3
|
+
CREATE TABLE "better_auth_staff"."account" (
|
|
4
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
5
|
+
"account_id" text NOT NULL,
|
|
6
|
+
"provider_id" text NOT NULL,
|
|
7
|
+
"user_id" text NOT NULL,
|
|
8
|
+
"access_token" text,
|
|
9
|
+
"refresh_token" text,
|
|
10
|
+
"id_token" text,
|
|
11
|
+
"access_token_expires_at" timestamp with time zone,
|
|
12
|
+
"refresh_token_expires_at" timestamp with time zone,
|
|
13
|
+
"scope" text,
|
|
14
|
+
"password" text,
|
|
15
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
16
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
17
|
+
);
|
|
18
|
+
--> statement-breakpoint
|
|
19
|
+
CREATE TABLE "better_auth_staff"."rate_limit" (
|
|
20
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
21
|
+
"key" text NOT NULL,
|
|
22
|
+
"count" integer NOT NULL,
|
|
23
|
+
"last_request" bigint NOT NULL,
|
|
24
|
+
CONSTRAINT "rate_limit_key_unique" UNIQUE("key")
|
|
25
|
+
);
|
|
26
|
+
--> statement-breakpoint
|
|
27
|
+
CREATE TABLE "better_auth_staff"."session" (
|
|
28
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
29
|
+
"expires_at" timestamp with time zone NOT NULL,
|
|
30
|
+
"token" text NOT NULL,
|
|
31
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
32
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
33
|
+
"ip_address" text,
|
|
34
|
+
"user_agent" text,
|
|
35
|
+
"user_id" text NOT NULL,
|
|
36
|
+
CONSTRAINT "session_token_unique" UNIQUE("token")
|
|
37
|
+
);
|
|
38
|
+
--> statement-breakpoint
|
|
39
|
+
CREATE TABLE "better_auth_staff"."user" (
|
|
40
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
41
|
+
"name" text NOT NULL,
|
|
42
|
+
"email" text NOT NULL,
|
|
43
|
+
"email_verified" boolean DEFAULT false NOT NULL,
|
|
44
|
+
"image" text,
|
|
45
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
46
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
47
|
+
"github" text,
|
|
48
|
+
CONSTRAINT "user_email_unique" UNIQUE("email")
|
|
49
|
+
);
|
|
50
|
+
--> statement-breakpoint
|
|
51
|
+
CREATE TABLE "better_auth_staff"."verification" (
|
|
52
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
53
|
+
"identifier" text NOT NULL,
|
|
54
|
+
"value" text NOT NULL,
|
|
55
|
+
"expires_at" timestamp with time zone NOT NULL,
|
|
56
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
57
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
58
|
+
);
|
|
59
|
+
--> statement-breakpoint
|
|
60
|
+
ALTER TABLE "better_auth_staff"."account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "better_auth_staff"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
61
|
+
ALTER TABLE "better_auth_staff"."session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "better_auth_staff"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
62
|
+
CREATE INDEX "account_user_id_index" ON "better_auth_staff"."account" USING btree ("user_id");--> statement-breakpoint
|
|
63
|
+
CREATE INDEX "session_user_id_index" ON "better_auth_staff"."session" USING btree ("user_id");--> statement-breakpoint
|
|
64
|
+
CREATE INDEX "verification_identifier_index" ON "better_auth_staff"."verification" USING btree ("identifier");
|