@robelest/convex-auth 0.0.3-preview → 0.0.3-preview.3
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/dist/bin.cjs +15 -15
- package/dist/client/index.d.ts +40 -12
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +73 -12
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +2 -2
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/component.d.ts +1 -1
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/{portalBridge.d.ts → bridge.d.ts} +2 -2
- package/dist/component/bridge.d.ts.map +1 -0
- package/dist/component/{portalBridge.js → bridge.js} +2 -2
- package/dist/component/bridge.js.map +1 -0
- package/dist/component/index.d.ts +11 -4
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/index.js +8 -2
- package/dist/component/index.js.map +1 -1
- package/dist/component/public.d.ts +24 -17
- package/dist/component/public.d.ts.map +1 -1
- package/dist/component/public.js +23 -4
- package/dist/component/public.js.map +1 -1
- package/dist/component/schema.d.ts +11 -7
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +4 -1
- package/dist/component/schema.js.map +1 -1
- package/dist/providers/anonymous.d.ts +3 -0
- package/dist/providers/anonymous.d.ts.map +1 -1
- package/dist/providers/anonymous.js +3 -0
- package/dist/providers/anonymous.js.map +1 -1
- package/dist/providers/credentials.d.ts +3 -0
- package/dist/providers/credentials.d.ts.map +1 -1
- package/dist/providers/credentials.js +3 -0
- package/dist/providers/credentials.js.map +1 -1
- package/dist/providers/email.d.ts +3 -0
- package/dist/providers/email.d.ts.map +1 -1
- package/dist/providers/email.js +3 -0
- package/dist/providers/email.js.map +1 -1
- package/dist/providers/passkey.d.ts +7 -1
- package/dist/providers/passkey.d.ts.map +1 -1
- package/dist/providers/passkey.js +7 -1
- package/dist/providers/passkey.js.map +1 -1
- package/dist/providers/password.d.ts +3 -0
- package/dist/providers/password.d.ts.map +1 -1
- package/dist/providers/password.js +3 -0
- package/dist/providers/password.js.map +1 -1
- package/dist/providers/phone.d.ts +3 -0
- package/dist/providers/phone.d.ts.map +1 -1
- package/dist/providers/phone.js +3 -0
- package/dist/providers/phone.js.map +1 -1
- package/dist/providers/totp.d.ts +8 -0
- package/dist/providers/totp.d.ts.map +1 -1
- package/dist/providers/totp.js +8 -0
- package/dist/providers/totp.js.map +1 -1
- package/dist/server/{convex-auth.d.ts → auth.d.ts} +226 -36
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/{convex-auth.js → auth.js} +287 -111
- package/dist/server/auth.js.map +1 -0
- package/dist/server/errors.d.ts +148 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +179 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/implementation/index.d.ts +170 -48
- package/dist/server/implementation/index.d.ts.map +1 -1
- package/dist/server/implementation/index.js +383 -167
- package/dist/server/implementation/index.js.map +1 -1
- package/dist/server/implementation/{apiKey.d.ts → keys.d.ts} +1 -1
- package/dist/server/implementation/keys.d.ts.map +1 -0
- package/dist/server/implementation/{apiKey.js → keys.js} +4 -5
- package/dist/server/implementation/keys.js.map +1 -0
- package/dist/server/implementation/mutations/{modifyAccount.d.ts → account.d.ts} +3 -3
- package/dist/server/implementation/mutations/account.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{modifyAccount.js → account.js} +4 -3
- package/dist/server/implementation/mutations/account.js.map +1 -0
- package/dist/server/implementation/mutations/{createVerificationCode.d.ts → code.d.ts} +1 -1
- package/dist/server/implementation/mutations/code.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{createVerificationCode.js → code.js} +2 -2
- package/dist/server/implementation/mutations/code.js.map +1 -0
- package/dist/server/implementation/mutations/index.d.ts +33 -33
- package/dist/server/implementation/mutations/index.d.ts.map +1 -1
- package/dist/server/implementation/mutations/index.js +22 -22
- package/dist/server/implementation/mutations/index.js.map +1 -1
- package/dist/server/implementation/mutations/{invalidateSessions.d.ts → invalidate.d.ts} +1 -1
- package/dist/server/implementation/mutations/invalidate.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{invalidateSessions.js → invalidate.js} +2 -2
- package/dist/server/implementation/mutations/invalidate.js.map +1 -0
- package/dist/server/implementation/mutations/{userOAuth.d.ts → oauth.d.ts} +3 -3
- package/dist/server/implementation/mutations/oauth.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{userOAuth.js → oauth.js} +4 -3
- package/dist/server/implementation/mutations/oauth.js.map +1 -0
- package/dist/server/implementation/mutations/{refreshSession.d.ts → refresh.d.ts} +1 -1
- package/dist/server/implementation/mutations/refresh.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{refreshSession.js → refresh.js} +3 -3
- package/dist/server/implementation/mutations/refresh.js.map +1 -0
- package/dist/server/implementation/mutations/{createAccountFromCredentials.d.ts → register.d.ts} +4 -4
- package/dist/server/implementation/mutations/register.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{createAccountFromCredentials.js → register.js} +4 -3
- package/dist/server/implementation/mutations/register.js.map +1 -0
- package/dist/server/implementation/mutations/{retrieveAccountWithCredentials.d.ts → retrieve.d.ts} +3 -3
- package/dist/server/implementation/mutations/retrieve.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{retrieveAccountWithCredentials.js → retrieve.js} +3 -3
- package/dist/server/implementation/mutations/retrieve.js.map +1 -0
- package/dist/server/implementation/mutations/{verifierSignature.d.ts → signature.d.ts} +1 -1
- package/dist/server/implementation/mutations/signature.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{verifierSignature.js → signature.js} +4 -3
- package/dist/server/implementation/mutations/signature.js.map +1 -0
- package/dist/server/implementation/mutations/{signIn.d.ts → signin.d.ts} +1 -1
- package/dist/server/implementation/mutations/{signIn.d.ts.map → signin.d.ts.map} +1 -1
- package/dist/server/implementation/mutations/{signIn.js → signin.js} +2 -2
- package/dist/server/implementation/mutations/{signIn.js.map → signin.js.map} +1 -1
- package/dist/server/implementation/mutations/{signOut.d.ts → signout.d.ts} +1 -1
- package/dist/server/implementation/mutations/{signOut.d.ts.map → signout.d.ts.map} +1 -1
- package/dist/server/implementation/mutations/{signOut.js → signout.js} +2 -2
- package/dist/server/implementation/mutations/{signOut.js.map → signout.js.map} +1 -1
- package/dist/server/implementation/mutations/{storeRef.d.ts → store.d.ts} +1 -1
- package/dist/server/implementation/mutations/store.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{storeRef.js → store.js} +1 -1
- package/dist/server/implementation/mutations/store.js.map +1 -0
- package/dist/server/implementation/mutations/verifier.js +1 -1
- package/dist/server/implementation/mutations/verifier.js.map +1 -1
- package/dist/server/implementation/mutations/{verifyCodeAndSignIn.d.ts → verify.d.ts} +1 -1
- package/dist/server/implementation/mutations/verify.d.ts.map +1 -0
- package/dist/server/implementation/mutations/{verifyCodeAndSignIn.js → verify.js} +3 -3
- package/dist/server/implementation/mutations/verify.js.map +1 -0
- package/dist/server/implementation/passkey.d.ts.map +1 -1
- package/dist/server/implementation/passkey.js +47 -55
- package/dist/server/implementation/passkey.js.map +1 -1
- package/dist/server/implementation/provider.d.ts.map +1 -1
- package/dist/server/implementation/provider.js +5 -4
- package/dist/server/implementation/provider.js.map +1 -1
- package/dist/server/implementation/{rateLimit.d.ts → ratelimit.d.ts} +1 -1
- package/dist/server/implementation/{rateLimit.d.ts.map → ratelimit.d.ts.map} +1 -1
- package/dist/server/implementation/{rateLimit.js → ratelimit.js} +1 -1
- package/dist/server/implementation/{rateLimit.js.map → ratelimit.js.map} +1 -1
- package/dist/server/implementation/redirects.d.ts.map +1 -1
- package/dist/server/implementation/redirects.js +2 -1
- package/dist/server/implementation/redirects.js.map +1 -1
- package/dist/server/implementation/{refreshTokens.d.ts → refresh.d.ts} +1 -1
- package/dist/server/implementation/refresh.d.ts.map +1 -0
- package/dist/server/implementation/{refreshTokens.js → refresh.js} +3 -2
- package/dist/server/implementation/refresh.js.map +1 -0
- package/dist/server/implementation/sessions.js +1 -1
- package/dist/server/implementation/sessions.js.map +1 -1
- package/dist/server/implementation/{signIn.d.ts → signin.d.ts} +1 -1
- package/dist/server/implementation/{signIn.d.ts.map → signin.d.ts.map} +1 -1
- package/dist/server/implementation/{signIn.js → signin.js} +12 -8
- package/dist/server/implementation/signin.js.map +1 -0
- package/dist/server/implementation/totp.d.ts.map +1 -1
- package/dist/server/implementation/totp.js +29 -29
- package/dist/server/implementation/totp.js.map +1 -1
- package/dist/server/implementation/types.d.ts +131 -1
- package/dist/server/implementation/types.d.ts.map +1 -1
- package/dist/server/implementation/types.js +65 -1
- package/dist/server/implementation/types.js.map +1 -1
- package/dist/server/implementation/users.d.ts.map +1 -1
- package/dist/server/implementation/users.js +3 -2
- package/dist/server/implementation/users.js.map +1 -1
- package/dist/server/index.d.ts +131 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +117 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/oauth/{authorizationUrl.d.ts → authorization.d.ts} +1 -1
- package/dist/server/oauth/authorization.d.ts.map +1 -0
- package/dist/server/oauth/{authorizationUrl.js → authorization.js} +4 -3
- package/dist/server/oauth/authorization.js.map +1 -0
- package/dist/server/oauth/callback.d.ts.map +1 -1
- package/dist/server/oauth/callback.js +7 -6
- package/dist/server/oauth/callback.js.map +1 -1
- package/dist/server/oauth/checks.d.ts.map +1 -1
- package/dist/server/oauth/checks.js +2 -1
- package/dist/server/oauth/checks.js.map +1 -1
- package/dist/server/oauth/{convexAuth.d.ts → helpers.d.ts} +1 -1
- package/dist/server/oauth/helpers.d.ts.map +1 -0
- package/dist/server/oauth/{convexAuth.js → helpers.js} +6 -5
- package/dist/server/oauth/helpers.js.map +1 -0
- package/dist/server/oauth/lib/utils/{customFetch.d.ts → fetch.d.ts} +1 -1
- package/dist/server/oauth/lib/utils/fetch.d.ts.map +1 -0
- package/dist/server/oauth/lib/utils/{customFetch.js → fetch.js} +1 -1
- package/dist/server/oauth/lib/utils/fetch.js.map +1 -0
- package/dist/server/{provider_utils.d.ts → providers.d.ts} +1 -1
- package/dist/server/providers.d.ts.map +1 -0
- package/dist/server/{provider_utils.js → providers.js} +1 -1
- package/dist/server/providers.js.map +1 -0
- package/dist/server/{email-templates.d.ts → templates.d.ts} +8 -1
- package/dist/server/templates.d.ts.map +1 -0
- package/dist/server/{portal-email.js → templates.js} +74 -3
- package/dist/server/templates.js.map +1 -0
- package/dist/server/types.d.ts +88 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils.d.ts.map +1 -1
- package/dist/server/utils.js +2 -1
- package/dist/server/utils.js.map +1 -1
- package/dist/server/version.d.ts +1 -1
- package/dist/server/version.d.ts.map +1 -1
- package/dist/server/version.js +1 -1
- package/dist/server/version.js.map +1 -1
- package/package.json +5 -1
- package/src/cli/index.ts +5 -5
- package/src/cli/{portal-link.ts → link.ts} +1 -1
- package/src/cli/utils.ts +1 -1
- package/src/client/index.ts +102 -17
- package/src/component/_generated/api.ts +2 -2
- package/src/component/_generated/component.ts +1 -1
- package/src/component/{portalBridge.ts → bridge.ts} +2 -2
- package/src/component/index.ts +10 -2
- package/src/component/public.ts +25 -4
- package/src/component/schema.ts +4 -1
- package/src/providers/anonymous.ts +3 -0
- package/src/providers/credentials.ts +3 -0
- package/src/providers/email.ts +3 -0
- package/src/providers/passkey.ts +8 -1
- package/src/providers/password.ts +3 -0
- package/src/providers/phone.ts +3 -0
- package/src/providers/totp.ts +9 -0
- package/src/server/auth.ts +969 -0
- package/src/server/errors.ts +275 -0
- package/src/server/implementation/index.ts +370 -88
- package/src/server/implementation/{apiKey.ts → keys.ts} +7 -6
- package/src/server/implementation/mutations/{modifyAccount.ts → account.ts} +3 -4
- package/src/server/implementation/mutations/{createVerificationCode.ts → code.ts} +1 -1
- package/src/server/implementation/mutations/index.ts +22 -22
- package/src/server/implementation/mutations/{invalidateSessions.ts → invalidate.ts} +1 -1
- package/src/server/implementation/mutations/{userOAuth.ts → oauth.ts} +3 -2
- package/src/server/implementation/mutations/{refreshSession.ts → refresh.ts} +2 -2
- package/src/server/implementation/mutations/{createAccountFromCredentials.ts → register.ts} +3 -2
- package/src/server/implementation/mutations/{retrieveAccountWithCredentials.ts → retrieve.ts} +2 -2
- package/src/server/implementation/mutations/{verifierSignature.ts → signature.ts} +3 -2
- package/src/server/implementation/mutations/{signIn.ts → signin.ts} +1 -1
- package/src/server/implementation/mutations/{signOut.ts → signout.ts} +1 -1
- package/src/server/implementation/mutations/verifier.ts +1 -1
- package/src/server/implementation/mutations/{verifyCodeAndSignIn.ts → verify.ts} +2 -2
- package/src/server/implementation/passkey.ts +86 -116
- package/src/server/implementation/provider.ts +5 -8
- package/src/server/implementation/redirects.ts +2 -3
- package/src/server/implementation/{refreshTokens.ts → refresh.ts} +2 -1
- package/src/server/implementation/sessions.ts +1 -1
- package/src/server/implementation/{signIn.ts → signin.ts} +13 -11
- package/src/server/implementation/totp.ts +60 -84
- package/src/server/implementation/types.ts +316 -1
- package/src/server/implementation/users.ts +4 -7
- package/src/server/index.ts +142 -3
- package/src/server/oauth/{authorizationUrl.ts → authorization.ts} +3 -2
- package/src/server/oauth/callback.ts +7 -6
- package/src/server/oauth/checks.ts +3 -1
- package/src/server/oauth/{convexAuth.ts → helpers.ts} +8 -5
- package/src/server/{portal-email.ts → templates.ts} +78 -2
- package/src/server/types.ts +133 -4
- package/src/server/utils.ts +3 -1
- package/src/server/version.ts +1 -1
- package/dist/component/portalBridge.d.ts.map +0 -1
- package/dist/component/portalBridge.js.map +0 -1
- package/dist/server/convex-auth.d.ts.map +0 -1
- package/dist/server/convex-auth.js.map +0 -1
- package/dist/server/convex_types.d.ts +0 -17
- package/dist/server/convex_types.d.ts.map +0 -1
- package/dist/server/convex_types.js +0 -2
- package/dist/server/convex_types.js.map +0 -1
- package/dist/server/email-templates.d.ts.map +0 -1
- package/dist/server/email-templates.js +0 -74
- package/dist/server/email-templates.js.map +0 -1
- package/dist/server/implementation/apiKey.d.ts.map +0 -1
- package/dist/server/implementation/apiKey.js.map +0 -1
- package/dist/server/implementation/mutations/createAccountFromCredentials.d.ts.map +0 -1
- package/dist/server/implementation/mutations/createAccountFromCredentials.js.map +0 -1
- package/dist/server/implementation/mutations/createVerificationCode.d.ts.map +0 -1
- package/dist/server/implementation/mutations/createVerificationCode.js.map +0 -1
- package/dist/server/implementation/mutations/invalidateSessions.d.ts.map +0 -1
- package/dist/server/implementation/mutations/invalidateSessions.js.map +0 -1
- package/dist/server/implementation/mutations/modifyAccount.d.ts.map +0 -1
- package/dist/server/implementation/mutations/modifyAccount.js.map +0 -1
- package/dist/server/implementation/mutations/refreshSession.d.ts.map +0 -1
- package/dist/server/implementation/mutations/refreshSession.js.map +0 -1
- package/dist/server/implementation/mutations/retrieveAccountWithCredentials.d.ts.map +0 -1
- package/dist/server/implementation/mutations/retrieveAccountWithCredentials.js.map +0 -1
- package/dist/server/implementation/mutations/storeRef.d.ts.map +0 -1
- package/dist/server/implementation/mutations/storeRef.js.map +0 -1
- package/dist/server/implementation/mutations/userOAuth.d.ts.map +0 -1
- package/dist/server/implementation/mutations/userOAuth.js.map +0 -1
- package/dist/server/implementation/mutations/verifierSignature.d.ts.map +0 -1
- package/dist/server/implementation/mutations/verifierSignature.js.map +0 -1
- package/dist/server/implementation/mutations/verifyCodeAndSignIn.d.ts.map +0 -1
- package/dist/server/implementation/mutations/verifyCodeAndSignIn.js.map +0 -1
- package/dist/server/implementation/refreshTokens.d.ts.map +0 -1
- package/dist/server/implementation/refreshTokens.js.map +0 -1
- package/dist/server/implementation/signIn.js.map +0 -1
- package/dist/server/oauth/authorizationUrl.d.ts.map +0 -1
- package/dist/server/oauth/authorizationUrl.js.map +0 -1
- package/dist/server/oauth/convexAuth.d.ts.map +0 -1
- package/dist/server/oauth/convexAuth.js.map +0 -1
- package/dist/server/oauth/lib/utils/customFetch.d.ts.map +0 -1
- package/dist/server/oauth/lib/utils/customFetch.js.map +0 -1
- package/dist/server/portal-email.d.ts +0 -19
- package/dist/server/portal-email.d.ts.map +0 -1
- package/dist/server/portal-email.js.map +0 -1
- package/dist/server/provider_utils.d.ts.map +0 -1
- package/dist/server/provider_utils.js.map +0 -1
- package/src/server/convex-auth.ts +0 -602
- package/src/server/convex_types.ts +0 -55
- package/src/server/email-templates.ts +0 -77
- /package/src/cli/{generateKeys.ts → keys.ts} +0 -0
- /package/src/cli/{portal-upload.ts → upload.ts} +0 -0
- /package/src/server/implementation/mutations/{storeRef.ts → store.ts} +0 -0
- /package/src/server/implementation/{rateLimit.ts → ratelimit.ts} +0 -0
- /package/src/server/oauth/lib/utils/{customFetch.ts → fetch.ts} +0 -0
- /package/src/server/{provider_utils.ts → providers.ts} +0 -0
|
@@ -35,10 +35,11 @@ import { queryGeneric, mutationGeneric, internalMutationGeneric, httpActionGener
|
|
|
35
35
|
import { v } from "convex/values";
|
|
36
36
|
import { Auth as AuthFactory } from "./implementation/index.js";
|
|
37
37
|
import { registerStaticRoutes } from "@convex-dev/self-hosting";
|
|
38
|
-
import { portalMagicLinkEmail } from "./
|
|
39
|
-
import { defaultMagicLinkEmail } from "./
|
|
38
|
+
import { portalMagicLinkEmail } from "./templates.js";
|
|
39
|
+
import { defaultMagicLinkEmail } from "./templates.js";
|
|
40
40
|
import emailProvider from "../providers/email.js";
|
|
41
41
|
import { AUTH_VERSION } from "./version.js";
|
|
42
|
+
import { throwAuthError } from "./errors.js";
|
|
42
43
|
// ============================================================================
|
|
43
44
|
// Helpers
|
|
44
45
|
// ============================================================================
|
|
@@ -54,7 +55,7 @@ async function requirePortalAdmin(ctx, authComponent, userId) {
|
|
|
54
55
|
});
|
|
55
56
|
const isAdmin = invites.some((invite) => invite.role === "portalAdmin" && invite.acceptedByUserId === userId);
|
|
56
57
|
if (!isAdmin) {
|
|
57
|
-
|
|
58
|
+
throwAuthError("PORTAL_NOT_AUTHORIZED");
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
61
|
// ============================================================================
|
|
@@ -90,24 +91,28 @@ export class Auth {
|
|
|
90
91
|
/** @internal */
|
|
91
92
|
portalUrl;
|
|
92
93
|
// ---- Proxied auth helper sub-objects ----
|
|
93
|
-
/** User helpers: `.current(ctx)`, `.require(ctx)`, `.get(ctx, userId)`, `.viewer(ctx)` */
|
|
94
|
+
/** User helpers: `.current(ctx)`, `.require(ctx)`, `.get(ctx, userId)`, `.patch(ctx, userId, data)`, `.viewer(ctx)`, `.group.list(ctx, ...)`, `.group.get(ctx, ...)` */
|
|
94
95
|
get user() { return this._auth.user; }
|
|
95
|
-
/** Session helpers */
|
|
96
|
+
/** Session helpers: `.current(ctx)`, `.invalidate(ctx, { userId, except? })` */
|
|
96
97
|
get session() { return this._auth.session; }
|
|
97
|
-
/** Provider helpers */
|
|
98
|
+
/** Provider helpers: `.signIn(ctx, provider, args)` */
|
|
98
99
|
get provider() { return this._auth.provider; }
|
|
99
|
-
/** Account helpers */
|
|
100
|
+
/** Account helpers: `.create(ctx, args)`, `.get(ctx, args)`, `.updateCredentials(ctx, args)` */
|
|
100
101
|
get account() { return this._auth.account; }
|
|
101
|
-
/** Group helpers */
|
|
102
|
+
/** Group helpers: `.create(ctx, ...)`, `.get(ctx, id)`, `.list(ctx, ...)`, `.update(ctx, ...)`, `.delete(ctx, id)`, `.member.*` */
|
|
102
103
|
get group() { return this._auth.group; }
|
|
103
|
-
/** Invite helpers */
|
|
104
|
+
/** Invite helpers: `.create(ctx, ...)`, `.get(ctx, id)`, `.getByTokenHash(ctx, hash)`, `.list(ctx, ...)`, `.accept(ctx, ...)`, `.revoke(ctx, id)` */
|
|
104
105
|
get invite() { return this._auth.invite; }
|
|
105
|
-
/** Passkey helpers */
|
|
106
|
+
/** Passkey helpers: `.list(ctx, { userId })`, `.rename(ctx, id, name)`, `.remove(ctx, id)` */
|
|
106
107
|
get passkey() { return this._auth.passkey; }
|
|
107
|
-
/** TOTP helpers */
|
|
108
|
+
/** TOTP helpers: `.list(ctx, { userId })`, `.remove(ctx, id)` */
|
|
108
109
|
get totp() { return this._auth.totp; }
|
|
109
|
-
/** API key helpers: `.create(ctx, ...)`, `.verify(ctx,
|
|
110
|
+
/** API key helpers: `.create(ctx, ...)`, `.verify(ctx, rawKey)`, `.list(ctx, ...)`, `.get(ctx, id)`, `.update(ctx, ...)`, `.revoke(ctx, id)`, `.remove(ctx, id)` */
|
|
110
111
|
get key() { return this._auth.key; }
|
|
112
|
+
/**
|
|
113
|
+
* @param component - The auth component reference from `components.auth`.
|
|
114
|
+
* @param config - Auth configuration (providers, email transport, session, JWT, callbacks).
|
|
115
|
+
*/
|
|
111
116
|
constructor(component, config) {
|
|
112
117
|
this.component = component;
|
|
113
118
|
// Derive portal URL from CONVEX_SITE_URL
|
|
@@ -126,7 +131,7 @@ export class Auth {
|
|
|
126
131
|
authorize: undefined, // Magic link — no OTP email check needed
|
|
127
132
|
async sendVerificationRequest({ identifier, url }, ctx) {
|
|
128
133
|
if (!ctx) {
|
|
129
|
-
|
|
134
|
+
throwAuthError("MISSING_ACTION_CONTEXT");
|
|
130
135
|
}
|
|
131
136
|
const { host } = new URL(url);
|
|
132
137
|
await emailTransport.send(ctx, {
|
|
@@ -146,19 +151,31 @@ export class Auth {
|
|
|
146
151
|
authorize: undefined, // Magic link — no OTP email check needed
|
|
147
152
|
async sendVerificationRequest({ identifier, url, expires }, ctx) {
|
|
148
153
|
if (!emailTransport) {
|
|
149
|
-
|
|
150
|
-
"Configure email: { from, send } in your Auth constructor.");
|
|
154
|
+
throwAuthError("EMAIL_CONFIG_REQUIRED");
|
|
151
155
|
}
|
|
152
156
|
if (!ctx) {
|
|
153
|
-
|
|
157
|
+
throwAuthError("MISSING_ACTION_CONTEXT");
|
|
154
158
|
}
|
|
155
|
-
|
|
156
|
-
await
|
|
157
|
-
|
|
158
|
-
to: identifier,
|
|
159
|
-
subject: "Sign in to Auth Portal",
|
|
160
|
-
html: portalMagicLinkEmail(url, hours),
|
|
159
|
+
// Check authorization BEFORE sending — only portal-authorized emails
|
|
160
|
+
const invites = await ctx.runQuery(component.public.inviteList, {
|
|
161
|
+
status: "accepted",
|
|
161
162
|
});
|
|
163
|
+
const hasAccess = invites.some((invite) => invite.role === "portalAdmin" && invite.email === identifier);
|
|
164
|
+
if (!hasAccess) {
|
|
165
|
+
throwAuthError("PORTAL_NOT_AUTHORIZED");
|
|
166
|
+
}
|
|
167
|
+
const hours = Math.max(1, Math.floor((+expires - Date.now()) / (60 * 60 * 1000)));
|
|
168
|
+
try {
|
|
169
|
+
await emailTransport.send(ctx, {
|
|
170
|
+
from: emailTransport.from,
|
|
171
|
+
to: identifier,
|
|
172
|
+
subject: "Sign in to Auth Portal",
|
|
173
|
+
html: portalMagicLinkEmail(url, hours),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
throwAuthError("EMAIL_SEND_FAILED", "Failed to send portal sign-in email.", { detail: e instanceof Error ? e.message : String(e) });
|
|
178
|
+
}
|
|
162
179
|
},
|
|
163
180
|
}));
|
|
164
181
|
// Initialize the core AuthFactory()
|
|
@@ -173,8 +190,8 @@ export class Auth {
|
|
|
173
190
|
this.store = authResult.store;
|
|
174
191
|
}
|
|
175
192
|
/**
|
|
176
|
-
*
|
|
177
|
-
* static file serving.
|
|
193
|
+
* HTTP namespace — route registration, Bearer-authenticated endpoints,
|
|
194
|
+
* and portal static file serving.
|
|
178
195
|
*
|
|
179
196
|
* ```ts
|
|
180
197
|
* // convex/http.ts
|
|
@@ -182,70 +199,88 @@ export class Auth {
|
|
|
182
199
|
* import { auth } from "./auth";
|
|
183
200
|
*
|
|
184
201
|
* const http = httpRouter();
|
|
185
|
-
* auth.
|
|
202
|
+
* auth.http.add(http);
|
|
186
203
|
* export default http;
|
|
187
204
|
* ```
|
|
188
205
|
*/
|
|
189
|
-
|
|
190
|
-
//
|
|
191
|
-
this._auth.
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
206
|
+
get http() {
|
|
207
|
+
// Cache the object so repeated access returns the same reference
|
|
208
|
+
const inner = this._auth.http;
|
|
209
|
+
const component = this.component;
|
|
210
|
+
return {
|
|
211
|
+
...inner,
|
|
212
|
+
/**
|
|
213
|
+
* Register core HTTP routes (OAuth, JWKS) **and** portal static file
|
|
214
|
+
* serving in one call.
|
|
215
|
+
*
|
|
216
|
+
* @param http - The Convex HTTP router to register routes on.
|
|
217
|
+
* @param opts.pathPrefix - URL prefix for portal static files. Defaults to `"/auth"`.
|
|
218
|
+
* @param opts.spaFallback - Serve `index.html` for unmatched sub-paths. Defaults to `true`.
|
|
219
|
+
*/
|
|
220
|
+
add(http, opts) {
|
|
221
|
+
// Core auth routes (OAuth, JWKS, etc.)
|
|
222
|
+
inner.add(http);
|
|
223
|
+
const prefix = opts?.pathPrefix ?? "/auth";
|
|
224
|
+
// Portal configuration endpoint — serves Convex URLs + version info.
|
|
225
|
+
// The portal SPA fetches this at startup to discover its Convex backend,
|
|
226
|
+
// which is critical for custom domain deployments where the hostname
|
|
227
|
+
// alone doesn't reveal the Convex cloud URL.
|
|
228
|
+
// Registered as an exact path match before the static file prefix catch-all.
|
|
229
|
+
http.route({
|
|
230
|
+
path: `${prefix}/.well-known/portal-config`,
|
|
231
|
+
method: "GET",
|
|
232
|
+
handler: httpActionGeneric(async () => {
|
|
233
|
+
return new Response(JSON.stringify({
|
|
234
|
+
convexUrl: process.env.CONVEX_CLOUD_URL,
|
|
235
|
+
siteUrl: process.env.CONVEX_SITE_URL,
|
|
236
|
+
version: AUTH_VERSION,
|
|
237
|
+
}), {
|
|
238
|
+
status: 200,
|
|
239
|
+
headers: {
|
|
240
|
+
"Content-Type": "application/json",
|
|
241
|
+
"Cache-Control": "public, max-age=60, stale-while-revalidate=60",
|
|
242
|
+
"Access-Control-Allow-Origin": "*",
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
}),
|
|
246
|
+
});
|
|
247
|
+
// Create a shim that maps the self-hosting ComponentApi shape
|
|
248
|
+
// to the auth component's bridge functions
|
|
249
|
+
const selfHostingShim = {
|
|
250
|
+
lib: {
|
|
251
|
+
getByPath: component.bridge.getByPath,
|
|
252
|
+
getCurrentDeployment: component.bridge.getCurrentDeployment,
|
|
253
|
+
listAssets: component.bridge.listAssets,
|
|
254
|
+
recordAsset: component.bridge.recordAsset,
|
|
255
|
+
gcOldAssets: component.bridge.gcOldAssets,
|
|
256
|
+
setCurrentDeployment: component.bridge.setCurrentDeployment,
|
|
257
|
+
// generateUploadUrl is not needed — we use app storage directly
|
|
258
|
+
generateUploadUrl: undefined,
|
|
212
259
|
},
|
|
260
|
+
};
|
|
261
|
+
registerStaticRoutes(http, selfHostingShim, {
|
|
262
|
+
pathPrefix: prefix,
|
|
263
|
+
spaFallback: opts?.spaFallback ?? true,
|
|
213
264
|
});
|
|
214
|
-
}),
|
|
215
|
-
});
|
|
216
|
-
// Create a shim that maps the self-hosting ComponentApi shape
|
|
217
|
-
// to the auth component's portalBridge functions
|
|
218
|
-
const selfHostingShim = {
|
|
219
|
-
lib: {
|
|
220
|
-
getByPath: this.component.portalBridge.getByPath,
|
|
221
|
-
getCurrentDeployment: this.component.portalBridge.getCurrentDeployment,
|
|
222
|
-
listAssets: this.component.portalBridge.listAssets,
|
|
223
|
-
recordAsset: this.component.portalBridge.recordAsset,
|
|
224
|
-
gcOldAssets: this.component.portalBridge.gcOldAssets,
|
|
225
|
-
setCurrentDeployment: this.component.portalBridge.setCurrentDeployment,
|
|
226
|
-
// generateUploadUrl is not needed — we use app storage directly
|
|
227
|
-
generateUploadUrl: undefined,
|
|
228
265
|
},
|
|
229
266
|
};
|
|
230
|
-
registerStaticRoutes(http, selfHostingShim, {
|
|
231
|
-
pathPrefix: prefix,
|
|
232
|
-
spaFallback: opts?.spaFallback ?? true,
|
|
233
|
-
});
|
|
234
267
|
}
|
|
235
268
|
}
|
|
236
269
|
// ============================================================================
|
|
237
270
|
// Portal exports (standalone function)
|
|
238
271
|
// ============================================================================
|
|
239
272
|
/**
|
|
240
|
-
* Create portal function definitions from
|
|
273
|
+
* Create portal function definitions from an `Auth` instance.
|
|
241
274
|
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
* cannot trace through `instance.method()`.
|
|
275
|
+
* Standalone function (not a class method) because Convex's bundler
|
|
276
|
+
* can trace `export const { x } = fn(instance)` but not `instance.method()`.
|
|
245
277
|
*
|
|
246
278
|
* ```ts
|
|
247
279
|
* export const { portalQuery, portalMutation, portalInternal } = Portal(auth);
|
|
248
280
|
* ```
|
|
281
|
+
*
|
|
282
|
+
* @param auth - The `Auth` class instance from your `convex/auth.ts`.
|
|
283
|
+
* @returns `{ portalQuery, portalMutation, portalInternal }` — export all three.
|
|
249
284
|
*/
|
|
250
285
|
export function Portal(auth) {
|
|
251
286
|
const authComponent = auth.component;
|
|
@@ -255,8 +290,13 @@ export function Portal(auth) {
|
|
|
255
290
|
args: {
|
|
256
291
|
action: v.string(),
|
|
257
292
|
userId: v.optional(v.string()),
|
|
293
|
+
// Group query params
|
|
294
|
+
groupId: v.optional(v.string()),
|
|
295
|
+
groupType: v.optional(v.string()),
|
|
296
|
+
groupParentId: v.optional(v.string()),
|
|
258
297
|
},
|
|
259
|
-
handler: async (ctx,
|
|
298
|
+
handler: async (ctx, args) => {
|
|
299
|
+
const { action, userId } = args;
|
|
260
300
|
const currentUserId = await authHelper.user.require(ctx);
|
|
261
301
|
// Allow isAdmin check without admin requirement
|
|
262
302
|
if (action === "isAdmin") {
|
|
@@ -270,14 +310,18 @@ export function Portal(auth) {
|
|
|
270
310
|
}
|
|
271
311
|
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
272
312
|
switch (action) {
|
|
313
|
+
// ---- Admin-only bulk listing (no public API) ----
|
|
273
314
|
case "listUsers":
|
|
274
315
|
return await ctx.runQuery(authComponent.public.userList);
|
|
275
316
|
case "listSessions":
|
|
276
317
|
return await ctx.runQuery(authComponent.public.sessionList);
|
|
318
|
+
case "listKeys":
|
|
319
|
+
return await ctx.runQuery(authComponent.public.keyList);
|
|
320
|
+
case "getCurrentDeployment":
|
|
321
|
+
return await ctx.runQuery(authComponent.bridge.getCurrentDeployment);
|
|
322
|
+
// ---- User queries (public auth API) ----
|
|
277
323
|
case "getUser":
|
|
278
|
-
return await
|
|
279
|
-
userId: userId,
|
|
280
|
-
});
|
|
324
|
+
return await authHelper.user.get(ctx, userId);
|
|
281
325
|
case "getUserSessions":
|
|
282
326
|
return await ctx.runQuery(authComponent.public.sessionListByUser, {
|
|
283
327
|
userId: userId,
|
|
@@ -287,13 +331,39 @@ export function Portal(auth) {
|
|
|
287
331
|
// Strip secrets — never send password hashes to the frontend
|
|
288
332
|
return accounts.map(({ secret: _, ...rest }) => rest);
|
|
289
333
|
}
|
|
290
|
-
|
|
334
|
+
case "getUserKeys":
|
|
335
|
+
return await authHelper.key.list(ctx, { userId: userId });
|
|
336
|
+
case "getUserGroups": {
|
|
337
|
+
const memberships = await authHelper.user.group.list(ctx, { userId: userId });
|
|
338
|
+
// Resolve group details for each membership
|
|
339
|
+
const groups = await Promise.all(memberships.map(async (m) => {
|
|
340
|
+
const group = await authHelper.group.get(ctx, m.groupId);
|
|
341
|
+
return { ...m, group: group ?? null };
|
|
342
|
+
}));
|
|
343
|
+
return groups;
|
|
344
|
+
}
|
|
345
|
+
// ---- Key queries (public auth API) ----
|
|
346
|
+
case "getKey":
|
|
347
|
+
return await authHelper.key.get(ctx, userId); // userId param repurposed as keyId
|
|
348
|
+
// ---- Group queries (public auth API) ----
|
|
349
|
+
case "listGroups":
|
|
350
|
+
return await authHelper.group.list(ctx, {
|
|
351
|
+
type: args.groupType,
|
|
352
|
+
parentGroupId: args.groupParentId,
|
|
353
|
+
});
|
|
354
|
+
case "getGroup":
|
|
355
|
+
return await authHelper.group.get(ctx, args.groupId);
|
|
356
|
+
case "getGroupMembers":
|
|
357
|
+
return await authHelper.group.member.list(ctx, { groupId: args.groupId });
|
|
358
|
+
case "getGroupInvites":
|
|
359
|
+
return await authHelper.invite.list(ctx, { groupId: args.groupId });
|
|
360
|
+
// ---- Invite validation (portal context) ----
|
|
291
361
|
case "validateInvite": {
|
|
292
362
|
// userId param repurposed as tokenHash for this action
|
|
293
363
|
const tokenHash = userId;
|
|
294
364
|
if (!tokenHash)
|
|
295
|
-
|
|
296
|
-
const invite = await
|
|
365
|
+
throwAuthError("INVITE_TOKEN_REQUIRED");
|
|
366
|
+
const invite = await authHelper.invite.getByTokenHash(ctx, tokenHash);
|
|
297
367
|
if (!invite || invite.status !== "pending") {
|
|
298
368
|
return null;
|
|
299
369
|
}
|
|
@@ -302,21 +372,8 @@ export function Portal(auth) {
|
|
|
302
372
|
}
|
|
303
373
|
return { _id: invite._id, role: invite.role };
|
|
304
374
|
}
|
|
305
|
-
case "getCurrentDeployment":
|
|
306
|
-
return await ctx.runQuery(authComponent.portalBridge.getCurrentDeployment);
|
|
307
|
-
// ---- API Keys (portal admin) ----
|
|
308
|
-
case "listKeys":
|
|
309
|
-
return await ctx.runQuery(authComponent.public.keyList);
|
|
310
|
-
case "getUserKeys":
|
|
311
|
-
return await ctx.runQuery(authComponent.public.keyListByUserId, {
|
|
312
|
-
userId: userId,
|
|
313
|
-
});
|
|
314
|
-
case "getKey":
|
|
315
|
-
return await ctx.runQuery(authComponent.public.keyGetById, {
|
|
316
|
-
keyId: userId, // userId param repurposed as keyId
|
|
317
|
-
});
|
|
318
375
|
default:
|
|
319
|
-
|
|
376
|
+
throwAuthError("PORTAL_UNKNOWN_ACTION", `Unknown portal query action: ${action}`);
|
|
320
377
|
}
|
|
321
378
|
},
|
|
322
379
|
});
|
|
@@ -338,28 +395,37 @@ export function Portal(auth) {
|
|
|
338
395
|
windowMs: v.number(),
|
|
339
396
|
})),
|
|
340
397
|
keyExpiresAt: v.optional(v.number()),
|
|
398
|
+
// Group mutation fields
|
|
399
|
+
groupId: v.optional(v.string()),
|
|
400
|
+
groupName: v.optional(v.string()),
|
|
401
|
+
groupSlug: v.optional(v.string()),
|
|
402
|
+
groupType: v.optional(v.string()),
|
|
403
|
+
groupParentId: v.optional(v.string()),
|
|
404
|
+
groupExtend: v.optional(v.any()),
|
|
405
|
+
memberId: v.optional(v.string()),
|
|
406
|
+
memberUserId: v.optional(v.string()),
|
|
407
|
+
memberRole: v.optional(v.string()),
|
|
408
|
+
memberStatus: v.optional(v.string()),
|
|
341
409
|
},
|
|
342
410
|
handler: async (ctx, args) => {
|
|
343
411
|
const currentUserId = await authHelper.user.require(ctx);
|
|
344
412
|
switch (args.action) {
|
|
345
413
|
case "acceptInvite": {
|
|
346
414
|
if (!args.tokenHash)
|
|
347
|
-
|
|
348
|
-
const invite = await
|
|
415
|
+
throwAuthError("INVITE_TOKEN_REQUIRED");
|
|
416
|
+
const invite = await authHelper.invite.getByTokenHash(ctx, args.tokenHash);
|
|
349
417
|
if (!invite)
|
|
350
|
-
|
|
418
|
+
throwAuthError("INVALID_INVITE");
|
|
351
419
|
if (invite.status !== "pending") {
|
|
352
|
-
|
|
420
|
+
throwAuthError("INVITE_ALREADY_USED", `Invite already ${invite.status}`);
|
|
353
421
|
}
|
|
354
422
|
if (invite.expiresTime && invite.expiresTime < Date.now()) {
|
|
355
|
-
|
|
423
|
+
throwAuthError("INVITE_EXPIRED");
|
|
356
424
|
}
|
|
357
|
-
await
|
|
358
|
-
inviteId: invite._id,
|
|
359
|
-
acceptedByUserId: currentUserId,
|
|
360
|
-
});
|
|
425
|
+
await authHelper.invite.accept(ctx, invite._id, currentUserId);
|
|
361
426
|
return;
|
|
362
427
|
}
|
|
428
|
+
// ---- Admin-only (no public API for session delete) ----
|
|
363
429
|
case "revokeSession": {
|
|
364
430
|
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
365
431
|
await ctx.runMutation(authComponent.public.sessionDelete, {
|
|
@@ -367,18 +433,16 @@ export function Portal(auth) {
|
|
|
367
433
|
});
|
|
368
434
|
return;
|
|
369
435
|
}
|
|
370
|
-
// ---- API Keys (
|
|
436
|
+
// ---- API Keys (public auth API) ----
|
|
371
437
|
case "createKey": {
|
|
372
438
|
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
373
|
-
|
|
439
|
+
return await authHelper.key.create(ctx, {
|
|
374
440
|
userId: args.keyUserId,
|
|
375
441
|
name: args.keyName,
|
|
376
442
|
scopes: args.keyScopes ?? [],
|
|
377
443
|
rateLimit: args.keyRateLimit,
|
|
378
444
|
expiresAt: args.keyExpiresAt,
|
|
379
445
|
});
|
|
380
|
-
// Return the raw key — portal will show it once
|
|
381
|
-
return result;
|
|
382
446
|
}
|
|
383
447
|
case "revokeKey": {
|
|
384
448
|
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
@@ -402,8 +466,63 @@ export function Portal(auth) {
|
|
|
402
466
|
await authHelper.key.update(ctx, args.keyId, data);
|
|
403
467
|
return;
|
|
404
468
|
}
|
|
469
|
+
// ---- Groups (public auth API) ----
|
|
470
|
+
case "createGroup": {
|
|
471
|
+
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
472
|
+
const groupData = { name: args.groupName };
|
|
473
|
+
if (args.groupSlug)
|
|
474
|
+
groupData.slug = args.groupSlug;
|
|
475
|
+
if (args.groupType)
|
|
476
|
+
groupData.type = args.groupType;
|
|
477
|
+
if (args.groupParentId)
|
|
478
|
+
groupData.parentGroupId = args.groupParentId;
|
|
479
|
+
if (args.groupExtend)
|
|
480
|
+
groupData.extend = args.groupExtend;
|
|
481
|
+
return await authHelper.group.create(ctx, groupData);
|
|
482
|
+
}
|
|
483
|
+
case "updateGroup": {
|
|
484
|
+
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
485
|
+
const updateData = {};
|
|
486
|
+
if (args.groupName)
|
|
487
|
+
updateData.name = args.groupName;
|
|
488
|
+
if (args.groupSlug !== undefined)
|
|
489
|
+
updateData.slug = args.groupSlug;
|
|
490
|
+
if (args.groupType !== undefined)
|
|
491
|
+
updateData.type = args.groupType;
|
|
492
|
+
await authHelper.group.update(ctx, args.groupId, updateData);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
case "deleteGroup": {
|
|
496
|
+
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
497
|
+
await authHelper.group.delete(ctx, args.groupId);
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
case "addGroupMember": {
|
|
501
|
+
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
502
|
+
return await authHelper.group.member.add(ctx, {
|
|
503
|
+
groupId: args.groupId,
|
|
504
|
+
userId: args.memberUserId,
|
|
505
|
+
role: args.memberRole,
|
|
506
|
+
status: args.memberStatus,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
case "removeGroupMember": {
|
|
510
|
+
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
511
|
+
await authHelper.group.member.remove(ctx, args.memberId);
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
case "updateGroupMember": {
|
|
515
|
+
await requirePortalAdmin(ctx, authComponent, currentUserId);
|
|
516
|
+
const memberData = {};
|
|
517
|
+
if (args.memberRole !== undefined)
|
|
518
|
+
memberData.role = args.memberRole;
|
|
519
|
+
if (args.memberStatus !== undefined)
|
|
520
|
+
memberData.status = args.memberStatus;
|
|
521
|
+
await authHelper.group.member.update(ctx, args.memberId, memberData);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
405
524
|
default:
|
|
406
|
-
|
|
525
|
+
throwAuthError("PORTAL_UNKNOWN_ACTION", `Unknown portal mutation action: ${args.action}`);
|
|
407
526
|
}
|
|
408
527
|
},
|
|
409
528
|
});
|
|
@@ -435,7 +554,7 @@ export function Portal(auth) {
|
|
|
435
554
|
return await ctx.storage.generateUploadUrl();
|
|
436
555
|
}
|
|
437
556
|
case "recordAsset": {
|
|
438
|
-
const { oldStorageId, oldBlobId } = await ctx.runMutation(authComponent.
|
|
557
|
+
const { oldStorageId, oldBlobId } = await ctx.runMutation(authComponent.bridge.recordAsset, {
|
|
439
558
|
path: args.path,
|
|
440
559
|
...(args.storageId ? { storageId: args.storageId } : {}),
|
|
441
560
|
...(args.blobId ? { blobId: args.blobId } : {}),
|
|
@@ -453,7 +572,7 @@ export function Portal(auth) {
|
|
|
453
572
|
return oldBlobId ?? null;
|
|
454
573
|
}
|
|
455
574
|
case "gcOldAssets": {
|
|
456
|
-
const { storageIds, blobIds } = await ctx.runMutation(authComponent.
|
|
575
|
+
const { storageIds, blobIds } = await ctx.runMutation(authComponent.bridge.gcOldAssets, { currentDeploymentId: args.currentDeploymentId });
|
|
457
576
|
for (const storageId of storageIds) {
|
|
458
577
|
try {
|
|
459
578
|
await ctx.storage.delete(storageId);
|
|
@@ -462,19 +581,76 @@ export function Portal(auth) {
|
|
|
462
581
|
// Ignore
|
|
463
582
|
}
|
|
464
583
|
}
|
|
465
|
-
await ctx.runMutation(authComponent.
|
|
584
|
+
await ctx.runMutation(authComponent.bridge.setCurrentDeployment, { deploymentId: args.currentDeploymentId });
|
|
466
585
|
return { deleted: storageIds.length, blobIds };
|
|
467
586
|
}
|
|
468
587
|
case "listAssets": {
|
|
469
|
-
return await ctx.runQuery(authComponent.
|
|
588
|
+
return await ctx.runQuery(authComponent.bridge.listAssets, {
|
|
470
589
|
limit: args.limit,
|
|
471
590
|
});
|
|
472
591
|
}
|
|
473
592
|
default:
|
|
474
|
-
|
|
593
|
+
throwAuthError("PORTAL_UNKNOWN_ACTION", `Unknown portalInternal action: ${args.action}`);
|
|
475
594
|
}
|
|
476
595
|
},
|
|
477
596
|
});
|
|
478
597
|
return { portalQuery, portalMutation, portalInternal };
|
|
479
598
|
}
|
|
480
|
-
|
|
599
|
+
// Implementation
|
|
600
|
+
export function AuthCtx(auth, config) {
|
|
601
|
+
const authHelper = auth._auth;
|
|
602
|
+
return {
|
|
603
|
+
args: {},
|
|
604
|
+
input: async (ctx, _args, _extra) => {
|
|
605
|
+
const nativeAuth = ctx.auth;
|
|
606
|
+
if (config?.optional) {
|
|
607
|
+
const userId = await authHelper.user.current(ctx);
|
|
608
|
+
if (!userId) {
|
|
609
|
+
return {
|
|
610
|
+
ctx: {
|
|
611
|
+
auth: {
|
|
612
|
+
getUserIdentity: nativeAuth.getUserIdentity.bind(nativeAuth),
|
|
613
|
+
userId: null,
|
|
614
|
+
user: null,
|
|
615
|
+
},
|
|
616
|
+
},
|
|
617
|
+
args: {},
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
const user = await authHelper.user.get(ctx, userId);
|
|
621
|
+
const extra = config.resolve
|
|
622
|
+
? await config.resolve(ctx, user)
|
|
623
|
+
: {};
|
|
624
|
+
return {
|
|
625
|
+
ctx: {
|
|
626
|
+
auth: {
|
|
627
|
+
getUserIdentity: nativeAuth.getUserIdentity.bind(nativeAuth),
|
|
628
|
+
userId,
|
|
629
|
+
user,
|
|
630
|
+
...extra,
|
|
631
|
+
},
|
|
632
|
+
},
|
|
633
|
+
args: {},
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
// Required mode (default): throws NOT_SIGNED_IN
|
|
637
|
+
const userId = await authHelper.user.require(ctx);
|
|
638
|
+
const user = await authHelper.user.get(ctx, userId);
|
|
639
|
+
const extra = config?.resolve
|
|
640
|
+
? await config.resolve(ctx, user)
|
|
641
|
+
: {};
|
|
642
|
+
return {
|
|
643
|
+
ctx: {
|
|
644
|
+
auth: {
|
|
645
|
+
getUserIdentity: nativeAuth.getUserIdentity.bind(nativeAuth),
|
|
646
|
+
userId,
|
|
647
|
+
user,
|
|
648
|
+
...extra,
|
|
649
|
+
},
|
|
650
|
+
},
|
|
651
|
+
args: {},
|
|
652
|
+
};
|
|
653
|
+
},
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"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"}
|