@robelest/convex-auth 0.0.4-preview.2 → 0.0.4-preview.21
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 +67 -26
- package/dist/authorization/index.d.ts +63 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +63 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/bin.js +6185 -0
- package/dist/client/core/types.d.ts +20 -0
- package/dist/client/core/types.d.ts.map +1 -0
- package/dist/client/index.d.ts +2 -299
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +407 -534
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +42 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +2546 -90
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/client/core/types.d.ts +2 -0
- package/dist/component/client/index.d.ts +2 -0
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/functions.d.ts +11 -9
- package/dist/component/functions.d.ts.map +1 -1
- package/dist/component/functions.js.map +1 -1
- package/dist/component/index.d.ts +7 -11
- package/dist/component/index.js +2 -3
- package/dist/component/model.d.ts +153 -0
- package/dist/component/model.d.ts.map +1 -0
- package/dist/component/model.js +349 -0
- package/dist/component/model.js.map +1 -0
- package/dist/component/providers/anonymous.d.ts +54 -0
- package/dist/component/providers/anonymous.d.ts.map +1 -0
- package/dist/component/providers/credentials.d.ts +5 -5
- package/dist/component/providers/credentials.d.ts.map +1 -1
- package/dist/component/providers/device.d.ts +67 -0
- package/dist/component/providers/device.d.ts.map +1 -0
- package/dist/component/providers/email.d.ts +62 -0
- package/dist/component/providers/email.d.ts.map +1 -0
- package/dist/component/providers/oauth.d.ts.map +1 -1
- package/dist/component/providers/oauth.js.map +1 -1
- package/dist/component/providers/passkey.d.ts +57 -0
- package/dist/component/providers/passkey.d.ts.map +1 -0
- package/dist/component/providers/password.d.ts +88 -0
- package/dist/component/providers/password.d.ts.map +1 -0
- package/dist/component/providers/phone.d.ts +48 -0
- package/dist/component/providers/phone.d.ts.map +1 -0
- package/dist/component/providers/sso.d.ts +50 -0
- package/dist/component/providers/sso.d.ts.map +1 -0
- package/dist/component/providers/totp.d.ts +45 -0
- package/dist/component/providers/totp.d.ts.map +1 -0
- package/dist/component/public/enterprise/audit.d.ts +73 -0
- package/dist/component/public/enterprise/audit.d.ts.map +1 -0
- package/dist/component/public/enterprise/audit.js +108 -0
- package/dist/component/public/enterprise/audit.js.map +1 -0
- package/dist/component/public/enterprise/core.d.ts +176 -0
- package/dist/component/public/enterprise/core.d.ts.map +1 -0
- package/dist/component/public/enterprise/core.js +292 -0
- package/dist/component/public/enterprise/core.js.map +1 -0
- package/dist/component/public/enterprise/domains.d.ts +174 -0
- package/dist/component/public/enterprise/domains.d.ts.map +1 -0
- package/dist/component/public/enterprise/domains.js +271 -0
- package/dist/component/public/enterprise/domains.js.map +1 -0
- package/dist/component/public/enterprise/scim.d.ts +245 -0
- package/dist/component/public/enterprise/scim.d.ts.map +1 -0
- package/dist/component/public/enterprise/scim.js +344 -0
- package/dist/component/public/enterprise/scim.js.map +1 -0
- package/dist/component/public/enterprise/secrets.d.ts +78 -0
- package/dist/component/public/enterprise/secrets.d.ts.map +1 -0
- package/dist/component/public/enterprise/secrets.js +118 -0
- package/dist/component/public/enterprise/secrets.js.map +1 -0
- package/dist/component/public/enterprise/webhooks.d.ts +211 -0
- package/dist/component/public/enterprise/webhooks.d.ts.map +1 -0
- package/dist/component/public/enterprise/webhooks.js +300 -0
- package/dist/component/public/enterprise/webhooks.js.map +1 -0
- package/dist/component/public/factors/devices.d.ts +157 -0
- package/dist/component/public/factors/devices.d.ts.map +1 -0
- package/dist/component/public/factors/devices.js +216 -0
- package/dist/component/public/factors/devices.js.map +1 -0
- package/dist/component/public/factors/passkeys.d.ts +175 -0
- package/dist/component/public/factors/passkeys.d.ts.map +1 -0
- package/dist/component/public/factors/passkeys.js +238 -0
- package/dist/component/public/factors/passkeys.js.map +1 -0
- package/dist/component/public/factors/totp.d.ts +189 -0
- package/dist/component/public/factors/totp.d.ts.map +1 -0
- package/dist/component/public/factors/totp.js +254 -0
- package/dist/component/public/factors/totp.js.map +1 -0
- package/dist/component/public/groups/core.d.ts +137 -0
- package/dist/component/public/groups/core.d.ts.map +1 -0
- package/dist/component/public/groups/core.js +321 -0
- package/dist/component/public/groups/core.js.map +1 -0
- package/dist/component/public/groups/invites.d.ts +217 -0
- package/dist/component/public/groups/invites.d.ts.map +1 -0
- package/dist/component/public/groups/invites.js +457 -0
- package/dist/component/public/groups/invites.js.map +1 -0
- package/dist/component/public/groups/members.d.ts +204 -0
- package/dist/component/public/groups/members.d.ts.map +1 -0
- package/dist/component/public/groups/members.js +355 -0
- package/dist/component/public/groups/members.js.map +1 -0
- package/dist/component/public/identity/accounts.d.ts +147 -0
- package/dist/component/public/identity/accounts.d.ts.map +1 -0
- package/dist/component/public/identity/accounts.js +200 -0
- package/dist/component/public/identity/accounts.js.map +1 -0
- package/dist/component/public/identity/codes.d.ts +104 -0
- package/dist/component/public/identity/codes.d.ts.map +1 -0
- package/dist/component/public/identity/codes.js +140 -0
- package/dist/component/public/identity/codes.js.map +1 -0
- package/dist/component/public/identity/sessions.d.ts +128 -0
- package/dist/component/public/identity/sessions.d.ts.map +1 -0
- package/dist/component/public/identity/sessions.js +192 -0
- package/dist/component/public/identity/sessions.js.map +1 -0
- package/dist/component/public/identity/tokens.d.ts +169 -0
- package/dist/component/public/identity/tokens.d.ts.map +1 -0
- package/dist/component/public/identity/tokens.js +227 -0
- package/dist/component/public/identity/tokens.js.map +1 -0
- package/dist/component/public/identity/users.d.ts +212 -0
- package/dist/component/public/identity/users.d.ts.map +1 -0
- package/dist/component/public/identity/users.js +311 -0
- package/dist/component/public/identity/users.js.map +1 -0
- package/dist/component/public/identity/verifiers.d.ts +116 -0
- package/dist/component/public/identity/verifiers.d.ts.map +1 -0
- package/dist/component/public/identity/verifiers.js +154 -0
- package/dist/component/public/identity/verifiers.js.map +1 -0
- package/dist/component/public/security/keys.d.ts +209 -0
- package/dist/component/public/security/keys.d.ts.map +1 -0
- package/dist/component/public/security/keys.js +319 -0
- package/dist/component/public/security/keys.js.map +1 -0
- package/dist/component/public/security/limits.d.ts +114 -0
- package/dist/component/public/security/limits.d.ts.map +1 -0
- package/dist/component/public/security/limits.js +169 -0
- package/dist/component/public/security/limits.js.map +1 -0
- package/dist/component/public.d.ts +24 -271
- package/dist/component/public.d.ts.map +1 -1
- package/dist/component/public.js +21 -1229
- package/dist/component/schema.d.ts +473 -110
- package/dist/component/schema.js +162 -73
- package/dist/component/schema.js.map +1 -1
- package/dist/component/server/auth.d.ts +318 -373
- package/dist/component/server/auth.d.ts.map +1 -1
- package/dist/component/server/auth.js +204 -123
- package/dist/component/server/auth.js.map +1 -1
- package/dist/component/server/authError.js +34 -0
- package/dist/component/server/authError.js.map +1 -0
- package/dist/component/server/{providers.js → config.js} +43 -12
- package/dist/component/server/config.js.map +1 -0
- package/dist/component/server/cookies.js +3 -0
- package/dist/component/server/cookies.js.map +1 -1
- package/dist/component/server/core.js +713 -0
- package/dist/component/server/core.js.map +1 -0
- package/dist/component/server/crypto.js +38 -0
- package/dist/component/server/crypto.js.map +1 -0
- package/dist/component/server/{implementation/db.js → db.js} +2 -1
- package/dist/component/server/db.js.map +1 -0
- package/dist/component/server/device.js +109 -0
- package/dist/component/server/device.js.map +1 -0
- package/dist/component/server/enterprise/config.js +46 -0
- package/dist/component/server/enterprise/config.js.map +1 -0
- package/dist/component/server/enterprise/domain.js +885 -0
- package/dist/component/server/enterprise/domain.js.map +1 -0
- package/dist/component/server/enterprise/http.js +766 -0
- package/dist/component/server/enterprise/http.js.map +1 -0
- package/dist/component/server/enterprise/oidc.js +248 -0
- package/dist/component/server/enterprise/oidc.js.map +1 -0
- package/dist/component/server/enterprise/policy.js +85 -0
- package/dist/component/server/enterprise/policy.js.map +1 -0
- package/dist/component/server/enterprise/saml.js +338 -0
- package/dist/component/server/enterprise/saml.js.map +1 -0
- package/dist/component/server/enterprise/scim.js +97 -0
- package/dist/component/server/enterprise/scim.js.map +1 -0
- package/dist/component/server/enterprise/shared.js +51 -0
- package/dist/component/server/enterprise/shared.js.map +1 -0
- package/dist/component/server/errors.d.ts +1 -0
- package/dist/component/server/errors.js +24 -16
- package/dist/component/server/errors.js.map +1 -1
- package/dist/component/server/http.js +288 -0
- package/dist/component/server/http.js.map +1 -0
- package/dist/component/server/identity.js +13 -0
- package/dist/component/server/identity.js.map +1 -0
- package/dist/{server/implementation → component/server}/keys.js +9 -31
- package/dist/component/server/keys.js.map +1 -0
- package/dist/component/server/limits.js +61 -0
- package/dist/component/server/limits.js.map +1 -0
- package/dist/component/server/mutations/account.js +44 -0
- package/dist/component/server/mutations/account.js.map +1 -0
- package/dist/component/server/{implementation/mutations → mutations}/code.js +7 -4
- package/dist/component/server/mutations/code.js.map +1 -0
- package/dist/component/server/mutations/invalidate.js +32 -0
- package/dist/component/server/mutations/invalidate.js.map +1 -0
- package/dist/component/server/mutations/oauth.js +110 -0
- package/dist/component/server/mutations/oauth.js.map +1 -0
- package/dist/component/server/mutations/refresh.js +119 -0
- package/dist/component/server/mutations/refresh.js.map +1 -0
- package/dist/component/server/mutations/register.js +83 -0
- package/dist/component/server/mutations/register.js.map +1 -0
- package/dist/component/server/mutations/retrieve.js +65 -0
- package/dist/component/server/mutations/retrieve.js.map +1 -0
- package/dist/component/server/mutations/signature.js +32 -0
- package/dist/component/server/mutations/signature.js.map +1 -0
- package/dist/component/server/{implementation/mutations → mutations}/signin.js +2 -2
- package/dist/component/server/mutations/signin.js.map +1 -0
- package/dist/component/server/mutations/signout.js +27 -0
- package/dist/component/server/mutations/signout.js.map +1 -0
- package/dist/component/server/mutations/store/refs.js +15 -0
- package/dist/component/server/mutations/store/refs.js.map +1 -0
- package/dist/component/server/mutations/store.js +85 -0
- package/dist/component/server/mutations/store.js.map +1 -0
- package/dist/component/server/mutations/verifier.js +18 -0
- package/dist/component/server/mutations/verifier.js.map +1 -0
- package/dist/component/server/mutations/verify.js +98 -0
- package/dist/component/server/mutations/verify.js.map +1 -0
- package/dist/component/server/oauth.js +106 -60
- package/dist/component/server/oauth.js.map +1 -1
- package/dist/component/server/passkey.js +328 -0
- package/dist/component/server/passkey.js.map +1 -0
- package/dist/{server/implementation → component/server}/redirects.js +13 -11
- package/dist/component/server/redirects.js.map +1 -0
- package/dist/component/server/refresh.js +96 -0
- package/dist/component/server/refresh.js.map +1 -0
- package/dist/component/server/runtime.d.ts +136 -0
- package/dist/component/server/runtime.d.ts.map +1 -0
- package/dist/component/server/runtime.js +413 -0
- package/dist/component/server/runtime.js.map +1 -0
- package/dist/{server/implementation → component/server}/sessions.js +14 -8
- package/dist/component/server/sessions.js.map +1 -0
- package/dist/component/server/signin.js +201 -0
- package/dist/component/server/signin.js.map +1 -0
- package/dist/component/server/tokens.js +17 -0
- package/dist/component/server/tokens.js.map +1 -0
- package/dist/component/server/totp.js +148 -0
- package/dist/component/server/totp.js.map +1 -0
- package/dist/component/server/types.d.ts +387 -298
- package/dist/component/server/types.d.ts.map +1 -1
- package/dist/component/server/{implementation/types.js → types.js} +1 -1
- package/dist/component/server/types.js.map +1 -0
- package/dist/component/server/{implementation/users.js → users.js} +54 -35
- package/dist/component/server/users.js.map +1 -0
- package/dist/component/server/utils.js +110 -4
- package/dist/component/server/utils.js.map +1 -1
- package/dist/core/types.d.ts +369 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/factors/device.js +105 -0
- package/dist/factors/device.js.map +1 -0
- package/dist/factors/passkey.js +181 -0
- package/dist/factors/passkey.js.map +1 -0
- package/dist/factors/totp.js +122 -0
- package/dist/factors/totp.js.map +1 -0
- package/dist/providers/anonymous.d.ts +3 -9
- package/dist/providers/anonymous.d.ts.map +1 -1
- package/dist/providers/anonymous.js +1 -18
- package/dist/providers/anonymous.js.map +1 -1
- package/dist/providers/credentials.d.ts +8 -10
- package/dist/providers/credentials.d.ts.map +1 -1
- package/dist/providers/credentials.js +3 -5
- package/dist/providers/credentials.js.map +1 -1
- package/dist/providers/device.d.ts +18 -10
- package/dist/providers/device.d.ts.map +1 -1
- package/dist/providers/device.js +4 -8
- package/dist/providers/device.js.map +1 -1
- package/dist/providers/email.d.ts +50 -23
- package/dist/providers/email.d.ts.map +1 -1
- package/dist/providers/email.js +58 -34
- package/dist/providers/email.js.map +1 -1
- package/dist/providers/index.d.ts +7 -3
- package/dist/providers/index.js +4 -1
- package/dist/providers/oauth.d.ts.map +1 -1
- package/dist/providers/oauth.js.map +1 -1
- package/dist/providers/passkey.d.ts +12 -9
- package/dist/providers/passkey.d.ts.map +1 -1
- package/dist/providers/passkey.js +1 -7
- package/dist/providers/passkey.js.map +1 -1
- package/dist/providers/password.d.ts +6 -12
- package/dist/providers/password.d.ts.map +1 -1
- package/dist/providers/password.js +189 -89
- package/dist/providers/password.js.map +1 -1
- package/dist/providers/phone.d.ts +40 -11
- package/dist/providers/phone.d.ts.map +1 -1
- package/dist/providers/phone.js +52 -21
- package/dist/providers/phone.js.map +1 -1
- package/dist/providers/sso.d.ts +50 -0
- package/dist/providers/sso.d.ts.map +1 -0
- package/dist/providers/sso.js +34 -0
- package/dist/providers/sso.js.map +1 -0
- package/dist/providers/totp.d.ts +12 -9
- package/dist/providers/totp.d.ts.map +1 -1
- package/dist/providers/totp.js +1 -7
- package/dist/providers/totp.js.map +1 -1
- package/dist/runtime/browser.js +68 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/invite.js +51 -0
- package/dist/runtime/invite.js.map +1 -0
- package/dist/runtime/proxy.js +70 -0
- package/dist/runtime/proxy.js.map +1 -0
- package/dist/runtime/storage.js +37 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/server/auth.d.ts +335 -370
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +204 -123
- package/dist/server/auth.js.map +1 -1
- package/dist/server/authError.d.ts +46 -0
- package/dist/server/authError.d.ts.map +1 -0
- package/dist/server/authError.js +34 -0
- package/dist/server/authError.js.map +1 -0
- package/dist/server/config.d.ts +1 -0
- package/dist/server/{providers.js → config.js} +43 -12
- package/dist/server/config.js.map +1 -0
- package/dist/server/cookies.d.ts +1 -38
- package/dist/server/cookies.js +3 -0
- package/dist/server/cookies.js.map +1 -1
- package/dist/server/core.d.ts +1436 -0
- package/dist/server/core.d.ts.map +1 -0
- package/dist/server/core.js +713 -0
- package/dist/server/core.js.map +1 -0
- package/dist/server/crypto.d.ts +8 -0
- package/dist/server/crypto.d.ts.map +1 -0
- package/dist/server/crypto.js +38 -0
- package/dist/server/crypto.js.map +1 -0
- package/dist/server/db.d.ts +1 -0
- package/dist/server/{implementation/db.js → db.js} +2 -1
- package/dist/server/db.js.map +1 -0
- package/dist/server/device.d.ts +1 -0
- package/dist/server/device.js +109 -0
- package/dist/server/device.js.map +1 -0
- package/dist/server/enterprise/config.d.ts +1 -0
- package/dist/server/enterprise/config.js +46 -0
- package/dist/server/enterprise/config.js.map +1 -0
- package/dist/server/enterprise/domain.d.ts +409 -0
- package/dist/server/enterprise/domain.d.ts.map +1 -0
- package/dist/server/enterprise/domain.js +885 -0
- package/dist/server/enterprise/domain.js.map +1 -0
- package/dist/server/enterprise/http.d.ts +26 -0
- package/dist/server/enterprise/http.d.ts.map +1 -0
- package/dist/server/enterprise/http.js +766 -0
- package/dist/server/enterprise/http.js.map +1 -0
- package/dist/server/enterprise/oidc.d.ts +1 -0
- package/dist/server/enterprise/oidc.js +248 -0
- package/dist/server/enterprise/oidc.js.map +1 -0
- package/dist/server/enterprise/policy.d.ts +1 -0
- package/dist/server/enterprise/policy.js +85 -0
- package/dist/server/enterprise/policy.js.map +1 -0
- package/dist/server/enterprise/saml.d.ts +1 -0
- package/dist/server/enterprise/saml.js +338 -0
- package/dist/server/enterprise/saml.js.map +1 -0
- package/dist/server/enterprise/scim.d.ts +1 -0
- package/dist/server/enterprise/scim.js +97 -0
- package/dist/server/enterprise/scim.js.map +1 -0
- package/dist/server/enterprise/shared.d.ts +5 -0
- package/dist/server/enterprise/shared.d.ts.map +1 -0
- package/dist/server/enterprise/shared.js +51 -0
- package/dist/server/enterprise/shared.js.map +1 -0
- package/dist/server/enterprise/validators.d.ts +1 -0
- package/dist/server/enterprise/validators.js +60 -0
- package/dist/server/enterprise/validators.js.map +1 -0
- package/dist/server/errors.d.ts +33 -1
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +44 -1
- package/dist/server/errors.js.map +1 -1
- package/dist/server/http.d.ts +59 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +288 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/identity.d.ts +1 -0
- package/dist/server/identity.js +13 -0
- package/dist/server/identity.js.map +1 -0
- package/dist/server/index.d.ts +4 -182
- package/dist/server/index.js +4 -376
- package/dist/server/keys.d.ts +1 -0
- package/dist/{component/server/implementation → server}/keys.js +9 -31
- package/dist/server/keys.js.map +1 -0
- package/dist/server/limits.d.ts +1 -0
- package/dist/server/limits.js +61 -0
- package/dist/server/limits.js.map +1 -0
- package/dist/server/mounts.d.ts +647 -0
- package/dist/server/mounts.d.ts.map +1 -0
- package/dist/server/mounts.js +643 -0
- package/dist/server/mounts.js.map +1 -0
- package/dist/server/mutations/account.d.ts +30 -0
- package/dist/server/mutations/account.d.ts.map +1 -0
- package/dist/server/mutations/account.js +44 -0
- package/dist/server/mutations/account.js.map +1 -0
- package/dist/server/mutations/code.d.ts +30 -0
- package/dist/server/mutations/code.d.ts.map +1 -0
- package/dist/server/{implementation/mutations → mutations}/code.js +7 -4
- package/dist/server/mutations/code.js.map +1 -0
- package/dist/server/mutations/index.d.ts +14 -0
- package/dist/server/mutations/index.js +15 -0
- package/dist/server/mutations/invalidate.d.ts +20 -0
- package/dist/server/mutations/invalidate.d.ts.map +1 -0
- package/dist/server/mutations/invalidate.js +32 -0
- package/dist/server/mutations/invalidate.js.map +1 -0
- package/dist/server/mutations/oauth.d.ts +28 -0
- package/dist/server/mutations/oauth.d.ts.map +1 -0
- package/dist/server/mutations/oauth.js +110 -0
- package/dist/server/mutations/oauth.js.map +1 -0
- package/dist/server/mutations/refresh.d.ts +21 -0
- package/dist/server/mutations/refresh.d.ts.map +1 -0
- package/dist/server/mutations/refresh.js +119 -0
- package/dist/server/mutations/refresh.js.map +1 -0
- package/dist/server/mutations/register.d.ts +38 -0
- package/dist/server/mutations/register.d.ts.map +1 -0
- package/dist/server/mutations/register.js +83 -0
- package/dist/server/mutations/register.js.map +1 -0
- package/dist/server/mutations/retrieve.d.ts +33 -0
- package/dist/server/mutations/retrieve.d.ts.map +1 -0
- package/dist/server/mutations/retrieve.js +65 -0
- package/dist/server/mutations/retrieve.js.map +1 -0
- package/dist/server/mutations/signature.d.ts +22 -0
- package/dist/server/mutations/signature.d.ts.map +1 -0
- package/dist/server/mutations/signature.js +32 -0
- package/dist/server/mutations/signature.js.map +1 -0
- package/dist/server/mutations/signin.d.ts +22 -0
- package/dist/server/mutations/signin.d.ts.map +1 -0
- package/dist/server/{implementation/mutations → mutations}/signin.js +2 -2
- package/dist/server/mutations/signin.js.map +1 -0
- package/dist/server/mutations/signout.d.ts +16 -0
- package/dist/server/mutations/signout.d.ts.map +1 -0
- package/dist/server/mutations/signout.js +27 -0
- package/dist/server/mutations/signout.js.map +1 -0
- package/dist/server/mutations/store/refs.d.ts +12 -0
- package/dist/server/mutations/store/refs.d.ts.map +1 -0
- package/dist/server/mutations/store/refs.js +15 -0
- package/dist/server/mutations/store/refs.js.map +1 -0
- package/dist/server/mutations/store.d.ts +306 -0
- package/dist/server/mutations/store.d.ts.map +1 -0
- package/dist/server/mutations/store.js +85 -0
- package/dist/server/mutations/store.js.map +1 -0
- package/dist/server/mutations/verifier.d.ts +13 -0
- package/dist/server/mutations/verifier.d.ts.map +1 -0
- package/dist/server/mutations/verifier.js +18 -0
- package/dist/server/mutations/verifier.js.map +1 -0
- package/dist/server/mutations/verify.d.ts +26 -0
- package/dist/server/mutations/verify.d.ts.map +1 -0
- package/dist/server/mutations/verify.js +98 -0
- package/dist/server/mutations/verify.js.map +1 -0
- package/dist/server/oauth.d.ts +1 -48
- package/dist/server/oauth.js +107 -64
- package/dist/server/oauth.js.map +1 -1
- package/dist/server/passkey.d.ts +27 -0
- package/dist/server/passkey.d.ts.map +1 -0
- package/dist/server/passkey.js +328 -0
- package/dist/server/passkey.js.map +1 -0
- package/dist/server/redirects.d.ts +1 -0
- package/dist/{component/server/implementation → server}/redirects.js +13 -11
- package/dist/server/redirects.js.map +1 -0
- package/dist/server/refresh.d.ts +1 -0
- package/dist/server/refresh.js +96 -0
- package/dist/server/refresh.js.map +1 -0
- package/dist/server/runtime.d.ts +136 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +413 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/sessions.d.ts +1 -0
- package/dist/{component/server/implementation → server}/sessions.js +14 -8
- package/dist/server/sessions.js.map +1 -0
- package/dist/server/signin.d.ts +1 -0
- package/dist/server/signin.js +201 -0
- package/dist/server/signin.js.map +1 -0
- package/dist/server/ssr.d.ts +226 -0
- package/dist/server/ssr.d.ts.map +1 -0
- package/dist/server/ssr.js +786 -0
- package/dist/server/ssr.js.map +1 -0
- package/dist/server/templates.d.ts +1 -21
- package/dist/server/templates.js +2 -1
- package/dist/server/templates.js.map +1 -1
- package/dist/server/tokens.d.ts +1 -0
- package/dist/server/tokens.js +17 -0
- package/dist/server/tokens.js.map +1 -0
- package/dist/server/totp.d.ts +1 -0
- package/dist/server/totp.js +148 -0
- package/dist/server/totp.js.map +1 -0
- package/dist/server/types.d.ts +498 -306
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +108 -1
- package/dist/server/types.js.map +1 -0
- package/dist/server/users.d.ts +1 -0
- package/dist/server/{implementation/users.js → users.js} +54 -35
- package/dist/server/users.js.map +1 -0
- package/dist/server/utils.d.ts +1 -6
- package/dist/server/utils.js +110 -4
- package/dist/server/utils.js.map +1 -1
- package/package.json +49 -46
- package/src/authorization/index.ts +83 -0
- package/src/cli/bin.ts +5 -0
- package/src/cli/command.ts +6 -5
- package/src/cli/index.ts +456 -248
- package/src/cli/keys.ts +3 -0
- package/src/client/core/types.ts +437 -0
- package/src/client/factors/device.ts +160 -0
- package/src/client/factors/passkey.ts +282 -0
- package/src/client/factors/totp.ts +150 -0
- package/src/client/index.ts +745 -989
- package/src/client/runtime/browser.ts +112 -0
- package/src/client/runtime/invite.ts +65 -0
- package/src/client/runtime/proxy.ts +111 -0
- package/src/client/runtime/storage.ts +79 -0
- package/src/component/_generated/api.ts +42 -0
- package/src/component/_generated/component.ts +3123 -102
- package/src/component/functions.ts +38 -22
- package/src/component/index.ts +10 -20
- package/src/component/model.ts +449 -0
- package/src/component/public/enterprise/audit.ts +120 -0
- package/src/component/public/enterprise/core.ts +354 -0
- package/src/component/public/enterprise/domains.ts +323 -0
- package/src/component/public/enterprise/scim.ts +396 -0
- package/src/component/public/enterprise/secrets.ts +132 -0
- package/src/component/public/enterprise/webhooks.ts +306 -0
- package/src/component/public/factors/devices.ts +223 -0
- package/src/component/public/factors/passkeys.ts +242 -0
- package/src/component/public/factors/totp.ts +258 -0
- package/src/component/public/groups/core.ts +481 -0
- package/src/component/public/groups/invites.ts +602 -0
- package/src/component/public/groups/members.ts +409 -0
- package/src/component/public/identity/accounts.ts +206 -0
- package/src/component/public/identity/codes.ts +148 -0
- package/src/component/public/identity/sessions.ts +209 -0
- package/src/component/public/identity/tokens.ts +250 -0
- package/src/component/public/identity/users.ts +354 -0
- package/src/component/public/identity/verifiers.ts +157 -0
- package/src/component/public/security/keys.ts +365 -0
- package/src/component/public/security/limits.ts +173 -0
- package/src/component/public.ts +26 -1766
- package/src/component/schema.ts +273 -100
- package/src/providers/anonymous.ts +10 -20
- package/src/providers/credentials.ts +14 -22
- package/src/providers/device.ts +3 -14
- package/src/providers/email.ts +83 -47
- package/src/providers/index.ts +7 -0
- package/src/providers/oauth.ts +5 -3
- package/src/providers/passkey.ts +0 -13
- package/src/providers/password.ts +307 -130
- package/src/providers/phone.ts +81 -37
- package/src/providers/sso.ts +54 -0
- package/src/providers/totp.ts +0 -13
- package/src/samlify.d.ts +53 -0
- package/src/server/auth.ts +701 -247
- package/src/server/authError.ts +44 -0
- package/src/server/{providers.ts → config.ts} +84 -15
- package/src/server/cookies.ts +8 -1
- package/src/server/core.ts +2095 -0
- package/src/server/crypto.ts +88 -0
- package/src/server/{implementation/db.ts → db.ts} +90 -15
- package/src/server/device.ts +221 -0
- package/src/server/enterprise/config.ts +51 -0
- package/src/server/enterprise/domain.ts +1751 -0
- package/src/server/enterprise/http.ts +1324 -0
- package/src/server/enterprise/oidc.ts +500 -0
- package/src/server/enterprise/policy.ts +128 -0
- package/src/server/enterprise/saml.ts +578 -0
- package/src/server/enterprise/scim.ts +135 -0
- package/src/server/enterprise/shared.ts +134 -0
- package/src/server/enterprise/validators.ts +93 -0
- package/src/server/errors.ts +130 -119
- package/src/server/http.ts +531 -0
- package/src/server/identity.ts +18 -0
- package/src/server/index.ts +32 -650
- package/src/server/{implementation/keys.ts → keys.ts} +16 -44
- package/src/server/limits.ts +134 -0
- package/src/server/mounts.ts +948 -0
- package/src/server/mutations/account.ts +76 -0
- package/src/server/{implementation/mutations → mutations}/code.ts +22 -11
- package/src/server/mutations/index.ts +13 -0
- package/src/server/mutations/invalidate.ts +50 -0
- package/src/server/mutations/oauth.ts +237 -0
- package/src/server/mutations/refresh.ts +298 -0
- package/src/server/mutations/register.ts +200 -0
- package/src/server/mutations/retrieve.ts +109 -0
- package/src/server/mutations/signature.ts +50 -0
- package/src/server/{implementation/mutations → mutations}/signin.ts +9 -7
- package/src/server/mutations/signout.ts +43 -0
- package/src/server/mutations/store/refs.ts +10 -0
- package/src/server/mutations/store.ts +138 -0
- package/src/server/mutations/verifier.ts +34 -0
- package/src/server/mutations/verify.ts +202 -0
- package/src/server/oauth.ts +243 -131
- package/src/server/passkey.ts +784 -0
- package/src/server/{implementation/redirects.ts → redirects.ts} +21 -16
- package/src/server/refresh.ts +222 -0
- package/src/server/runtime.ts +880 -0
- package/src/server/{implementation/sessions.ts → sessions.ts} +33 -25
- package/src/server/signin.ts +438 -0
- package/src/server/ssr.ts +1764 -0
- package/src/server/templates.ts +8 -3
- package/src/server/{implementation/tokens.ts → tokens.ts} +11 -5
- package/src/server/totp.ts +349 -0
- package/src/server/types.ts +972 -207
- package/src/server/{implementation/users.ts → users.ts} +129 -75
- package/src/server/utils.ts +192 -5
- package/src/test.ts +28 -4
- package/dist/bin.cjs +0 -27757
- package/dist/component/providers/email.js +0 -47
- package/dist/component/providers/email.js.map +0 -1
- package/dist/component/public.js.map +0 -1
- package/dist/component/server/implementation/db.js.map +0 -1
- package/dist/component/server/implementation/device.js +0 -135
- package/dist/component/server/implementation/device.js.map +0 -1
- package/dist/component/server/implementation/index.d.ts +0 -870
- package/dist/component/server/implementation/index.d.ts.map +0 -1
- package/dist/component/server/implementation/index.js +0 -610
- package/dist/component/server/implementation/index.js.map +0 -1
- package/dist/component/server/implementation/keys.js.map +0 -1
- package/dist/component/server/implementation/mutations/account.js +0 -39
- package/dist/component/server/implementation/mutations/account.js.map +0 -1
- package/dist/component/server/implementation/mutations/code.js.map +0 -1
- package/dist/component/server/implementation/mutations/index.js +0 -70
- package/dist/component/server/implementation/mutations/index.js.map +0 -1
- package/dist/component/server/implementation/mutations/invalidate.js +0 -29
- package/dist/component/server/implementation/mutations/invalidate.js.map +0 -1
- package/dist/component/server/implementation/mutations/oauth.js +0 -51
- package/dist/component/server/implementation/mutations/oauth.js.map +0 -1
- package/dist/component/server/implementation/mutations/refresh.js +0 -85
- package/dist/component/server/implementation/mutations/refresh.js.map +0 -1
- package/dist/component/server/implementation/mutations/register.js +0 -65
- package/dist/component/server/implementation/mutations/register.js.map +0 -1
- package/dist/component/server/implementation/mutations/retrieve.js +0 -50
- package/dist/component/server/implementation/mutations/retrieve.js.map +0 -1
- package/dist/component/server/implementation/mutations/signature.js +0 -27
- package/dist/component/server/implementation/mutations/signature.js.map +0 -1
- package/dist/component/server/implementation/mutations/signin.js.map +0 -1
- package/dist/component/server/implementation/mutations/signout.js +0 -27
- package/dist/component/server/implementation/mutations/signout.js.map +0 -1
- package/dist/component/server/implementation/mutations/store.js +0 -12
- package/dist/component/server/implementation/mutations/store.js.map +0 -1
- package/dist/component/server/implementation/mutations/verifier.js +0 -16
- package/dist/component/server/implementation/mutations/verifier.js.map +0 -1
- package/dist/component/server/implementation/mutations/verify.js +0 -105
- package/dist/component/server/implementation/mutations/verify.js.map +0 -1
- package/dist/component/server/implementation/passkey.js +0 -307
- package/dist/component/server/implementation/passkey.js.map +0 -1
- package/dist/component/server/implementation/provider.js +0 -19
- package/dist/component/server/implementation/provider.js.map +0 -1
- package/dist/component/server/implementation/ratelimit.js +0 -48
- package/dist/component/server/implementation/ratelimit.js.map +0 -1
- package/dist/component/server/implementation/redirects.js.map +0 -1
- package/dist/component/server/implementation/refresh.js +0 -109
- package/dist/component/server/implementation/refresh.js.map +0 -1
- package/dist/component/server/implementation/sessions.js.map +0 -1
- package/dist/component/server/implementation/signin.js +0 -148
- package/dist/component/server/implementation/signin.js.map +0 -1
- package/dist/component/server/implementation/tokens.js +0 -15
- package/dist/component/server/implementation/tokens.js.map +0 -1
- package/dist/component/server/implementation/totp.js +0 -142
- package/dist/component/server/implementation/totp.js.map +0 -1
- package/dist/component/server/implementation/types.d.ts +0 -42
- package/dist/component/server/implementation/types.d.ts.map +0 -1
- package/dist/component/server/implementation/types.js.map +0 -1
- package/dist/component/server/implementation/users.js.map +0 -1
- package/dist/component/server/implementation/utils.js +0 -56
- package/dist/component/server/implementation/utils.js.map +0 -1
- package/dist/component/server/providers.js.map +0 -1
- package/dist/component/server/templates.js +0 -84
- package/dist/component/server/templates.js.map +0 -1
- package/dist/server/cookies.d.ts.map +0 -1
- package/dist/server/implementation/db.d.ts +0 -86
- package/dist/server/implementation/db.d.ts.map +0 -1
- package/dist/server/implementation/db.js.map +0 -1
- package/dist/server/implementation/device.d.ts +0 -30
- package/dist/server/implementation/device.d.ts.map +0 -1
- package/dist/server/implementation/device.js +0 -135
- package/dist/server/implementation/device.js.map +0 -1
- package/dist/server/implementation/index.d.ts +0 -870
- package/dist/server/implementation/index.d.ts.map +0 -1
- package/dist/server/implementation/index.js +0 -610
- package/dist/server/implementation/index.js.map +0 -1
- package/dist/server/implementation/keys.d.ts +0 -66
- package/dist/server/implementation/keys.d.ts.map +0 -1
- package/dist/server/implementation/keys.js.map +0 -1
- package/dist/server/implementation/mutations/account.d.ts +0 -27
- package/dist/server/implementation/mutations/account.d.ts.map +0 -1
- package/dist/server/implementation/mutations/account.js +0 -39
- package/dist/server/implementation/mutations/account.js.map +0 -1
- package/dist/server/implementation/mutations/code.d.ts +0 -29
- package/dist/server/implementation/mutations/code.d.ts.map +0 -1
- package/dist/server/implementation/mutations/code.js.map +0 -1
- package/dist/server/implementation/mutations/index.d.ts +0 -310
- package/dist/server/implementation/mutations/index.d.ts.map +0 -1
- package/dist/server/implementation/mutations/index.js +0 -70
- package/dist/server/implementation/mutations/index.js.map +0 -1
- package/dist/server/implementation/mutations/invalidate.d.ts +0 -18
- package/dist/server/implementation/mutations/invalidate.d.ts.map +0 -1
- package/dist/server/implementation/mutations/invalidate.js +0 -29
- package/dist/server/implementation/mutations/invalidate.js.map +0 -1
- package/dist/server/implementation/mutations/oauth.d.ts +0 -23
- package/dist/server/implementation/mutations/oauth.d.ts.map +0 -1
- package/dist/server/implementation/mutations/oauth.js +0 -51
- package/dist/server/implementation/mutations/oauth.js.map +0 -1
- package/dist/server/implementation/mutations/refresh.d.ts +0 -20
- package/dist/server/implementation/mutations/refresh.d.ts.map +0 -1
- package/dist/server/implementation/mutations/refresh.js +0 -85
- package/dist/server/implementation/mutations/refresh.js.map +0 -1
- package/dist/server/implementation/mutations/register.d.ts +0 -37
- package/dist/server/implementation/mutations/register.d.ts.map +0 -1
- package/dist/server/implementation/mutations/register.js +0 -65
- package/dist/server/implementation/mutations/register.js.map +0 -1
- package/dist/server/implementation/mutations/retrieve.d.ts +0 -31
- package/dist/server/implementation/mutations/retrieve.d.ts.map +0 -1
- package/dist/server/implementation/mutations/retrieve.js +0 -50
- package/dist/server/implementation/mutations/retrieve.js.map +0 -1
- package/dist/server/implementation/mutations/signature.d.ts +0 -19
- package/dist/server/implementation/mutations/signature.d.ts.map +0 -1
- package/dist/server/implementation/mutations/signature.js +0 -27
- package/dist/server/implementation/mutations/signature.js.map +0 -1
- package/dist/server/implementation/mutations/signin.d.ts +0 -21
- package/dist/server/implementation/mutations/signin.d.ts.map +0 -1
- package/dist/server/implementation/mutations/signin.js.map +0 -1
- package/dist/server/implementation/mutations/signout.d.ts +0 -14
- package/dist/server/implementation/mutations/signout.d.ts.map +0 -1
- package/dist/server/implementation/mutations/signout.js +0 -27
- package/dist/server/implementation/mutations/signout.js.map +0 -1
- package/dist/server/implementation/mutations/store.d.ts +0 -11
- package/dist/server/implementation/mutations/store.d.ts.map +0 -1
- package/dist/server/implementation/mutations/store.js +0 -12
- package/dist/server/implementation/mutations/store.js.map +0 -1
- package/dist/server/implementation/mutations/verifier.d.ts +0 -11
- package/dist/server/implementation/mutations/verifier.d.ts.map +0 -1
- package/dist/server/implementation/mutations/verifier.js +0 -16
- package/dist/server/implementation/mutations/verifier.js.map +0 -1
- package/dist/server/implementation/mutations/verify.d.ts +0 -25
- package/dist/server/implementation/mutations/verify.d.ts.map +0 -1
- package/dist/server/implementation/mutations/verify.js +0 -105
- package/dist/server/implementation/mutations/verify.js.map +0 -1
- package/dist/server/implementation/passkey.d.ts +0 -24
- package/dist/server/implementation/passkey.d.ts.map +0 -1
- package/dist/server/implementation/passkey.js +0 -307
- package/dist/server/implementation/passkey.js.map +0 -1
- package/dist/server/implementation/provider.d.ts +0 -10
- package/dist/server/implementation/provider.d.ts.map +0 -1
- package/dist/server/implementation/provider.js +0 -19
- package/dist/server/implementation/provider.js.map +0 -1
- package/dist/server/implementation/ratelimit.d.ts +0 -10
- package/dist/server/implementation/ratelimit.d.ts.map +0 -1
- package/dist/server/implementation/ratelimit.js +0 -48
- package/dist/server/implementation/ratelimit.js.map +0 -1
- package/dist/server/implementation/redirects.d.ts +0 -10
- package/dist/server/implementation/redirects.d.ts.map +0 -1
- package/dist/server/implementation/redirects.js.map +0 -1
- package/dist/server/implementation/refresh.d.ts +0 -37
- package/dist/server/implementation/refresh.d.ts.map +0 -1
- package/dist/server/implementation/refresh.js +0 -109
- package/dist/server/implementation/refresh.js.map +0 -1
- package/dist/server/implementation/sessions.d.ts +0 -29
- package/dist/server/implementation/sessions.d.ts.map +0 -1
- package/dist/server/implementation/sessions.js.map +0 -1
- package/dist/server/implementation/signin.d.ts +0 -55
- package/dist/server/implementation/signin.d.ts.map +0 -1
- package/dist/server/implementation/signin.js +0 -148
- package/dist/server/implementation/signin.js.map +0 -1
- package/dist/server/implementation/tokens.d.ts +0 -11
- package/dist/server/implementation/tokens.d.ts.map +0 -1
- package/dist/server/implementation/tokens.js +0 -15
- package/dist/server/implementation/tokens.js.map +0 -1
- package/dist/server/implementation/totp.d.ts +0 -31
- package/dist/server/implementation/totp.d.ts.map +0 -1
- package/dist/server/implementation/totp.js +0 -142
- package/dist/server/implementation/totp.js.map +0 -1
- package/dist/server/implementation/types.d.ts +0 -189
- package/dist/server/implementation/types.d.ts.map +0 -1
- package/dist/server/implementation/types.js +0 -97
- package/dist/server/implementation/types.js.map +0 -1
- package/dist/server/implementation/users.d.ts +0 -30
- package/dist/server/implementation/users.d.ts.map +0 -1
- package/dist/server/implementation/users.js.map +0 -1
- package/dist/server/implementation/utils.d.ts +0 -19
- package/dist/server/implementation/utils.d.ts.map +0 -1
- package/dist/server/implementation/utils.js +0 -56
- package/dist/server/implementation/utils.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/oauth.d.ts.map +0 -1
- package/dist/server/providers.d.ts +0 -72
- package/dist/server/providers.d.ts.map +0 -1
- package/dist/server/providers.js.map +0 -1
- package/dist/server/templates.d.ts.map +0 -1
- package/dist/server/utils.d.ts.map +0 -1
- package/dist/server/version.d.ts +0 -5
- package/dist/server/version.d.ts.map +0 -1
- package/dist/server/version.js +0 -6
- package/dist/server/version.js.map +0 -1
- package/src/cli/utils.ts +0 -248
- package/src/server/implementation/device.ts +0 -307
- package/src/server/implementation/index.ts +0 -1583
- package/src/server/implementation/mutations/account.ts +0 -50
- package/src/server/implementation/mutations/index.ts +0 -157
- package/src/server/implementation/mutations/invalidate.ts +0 -42
- package/src/server/implementation/mutations/oauth.ts +0 -73
- package/src/server/implementation/mutations/refresh.ts +0 -175
- package/src/server/implementation/mutations/register.ts +0 -100
- package/src/server/implementation/mutations/retrieve.ts +0 -79
- package/src/server/implementation/mutations/signature.ts +0 -39
- package/src/server/implementation/mutations/signout.ts +0 -35
- package/src/server/implementation/mutations/store.ts +0 -7
- package/src/server/implementation/mutations/verifier.ts +0 -24
- package/src/server/implementation/mutations/verify.ts +0 -194
- package/src/server/implementation/passkey.ts +0 -620
- package/src/server/implementation/provider.ts +0 -36
- package/src/server/implementation/ratelimit.ts +0 -79
- package/src/server/implementation/refresh.ts +0 -172
- package/src/server/implementation/signin.ts +0 -296
- package/src/server/implementation/totp.ts +0 -342
- package/src/server/implementation/types.ts +0 -444
- package/src/server/implementation/utils.ts +0 -91
- package/src/server/version.ts +0 -2
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { ConvexError, v } from "convex/values";
|
|
2
|
+
import type { Id } from "../../_generated/dataModel";
|
|
3
|
+
import { mutation, query } from "../../functions";
|
|
4
|
+
import { vGroupMemberDoc, vPaginated } from "../../model";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Add a user as a member of a group.
|
|
8
|
+
*
|
|
9
|
+
* The `roleIds` field stores application-defined role identifiers. The auth
|
|
10
|
+
* component stores assignments but does not enforce access control — your
|
|
11
|
+
* application defines what each role means.
|
|
12
|
+
*
|
|
13
|
+
* Throws `ConvexError` with code `DUPLICATE_MEMBERSHIP` when the user is
|
|
14
|
+
* already a member of the target group. The duplicate check uses the
|
|
15
|
+
* `group_id_user_id` compound index for an exact match.
|
|
16
|
+
*
|
|
17
|
+
* @param args.groupId - The `Id<"Group">` of the group to add the user to.
|
|
18
|
+
* @param args.userId - The `Id<"User">` of the user to add as a member.
|
|
19
|
+
* @param args.roleIds - Optional array of application-defined role identifiers (e.g. `["admin", "editor"]`).
|
|
20
|
+
* @param args.status - Optional membership status string (e.g. `"active"`, `"suspended"`). Defaults to whatever your application convention is.
|
|
21
|
+
* @param args.extend - Optional arbitrary payload for application-specific metadata on the membership.
|
|
22
|
+
* @returns The `Id<"GroupMember">` of the newly created member document.
|
|
23
|
+
* @throws `ConvexError` with code `DUPLICATE_MEMBERSHIP` if the user is already a member of this group.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const memberId = await ctx.runMutation(
|
|
28
|
+
* components.auth.groups.memberAdd,
|
|
29
|
+
* {
|
|
30
|
+
* groupId: teamGroupId,
|
|
31
|
+
* userId: newUserId,
|
|
32
|
+
* roleIds: ["viewer"],
|
|
33
|
+
* status: "active",
|
|
34
|
+
* },
|
|
35
|
+
* );
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export const memberAdd = mutation({
|
|
39
|
+
args: {
|
|
40
|
+
groupId: v.id("Group"),
|
|
41
|
+
userId: v.id("User"),
|
|
42
|
+
roleIds: v.optional(v.array(v.string())),
|
|
43
|
+
status: v.optional(v.string()),
|
|
44
|
+
extend: v.optional(v.any()),
|
|
45
|
+
},
|
|
46
|
+
returns: v.id("GroupMember"),
|
|
47
|
+
handler: async (ctx, args) => {
|
|
48
|
+
const existingMembership = await ctx.db
|
|
49
|
+
.query("GroupMember")
|
|
50
|
+
.withIndex("group_id_user_id", (q) =>
|
|
51
|
+
q.eq("groupId", args.groupId).eq("userId", args.userId),
|
|
52
|
+
)
|
|
53
|
+
.unique();
|
|
54
|
+
if (existingMembership !== null) {
|
|
55
|
+
throw new ConvexError({
|
|
56
|
+
code: "DUPLICATE_MEMBERSHIP",
|
|
57
|
+
message: "User is already a member of this group",
|
|
58
|
+
groupId: args.groupId,
|
|
59
|
+
userId: args.userId,
|
|
60
|
+
existingMemberId: existingMembership._id,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return await ctx.db.insert("GroupMember", args);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Retrieve a member record by its document ID.
|
|
69
|
+
*
|
|
70
|
+
* Performs a direct lookup in the `GroupMember` table and returns the full
|
|
71
|
+
* member document, or `null` if no member exists with the given ID.
|
|
72
|
+
*
|
|
73
|
+
* @param args.memberId - The `Id<"GroupMember">` of the member record to retrieve.
|
|
74
|
+
* @returns The member document (including `groupId`, `userId`, `roleIds`, `status`, etc.) or `null` if not found.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const member = await ctx.runQuery(components.auth.groups.memberGet, {
|
|
79
|
+
* memberId: existingMemberId,
|
|
80
|
+
* });
|
|
81
|
+
* if (member !== null) {
|
|
82
|
+
* console.log(member.userId, member.roleIds);
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export const memberGet = query({
|
|
87
|
+
args: { memberId: v.id("GroupMember") },
|
|
88
|
+
returns: v.union(vGroupMemberDoc, v.null()),
|
|
89
|
+
handler: async (ctx, { memberId }) => {
|
|
90
|
+
return await ctx.db.get("GroupMember", memberId);
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* List members with optional filtering, sorting, and pagination.
|
|
96
|
+
*
|
|
97
|
+
* Returns `{ items, nextCursor }`. Supports filtering by `groupId`,
|
|
98
|
+
* `userId`, `roleId`, and `status`. The query engine automatically selects
|
|
99
|
+
* the best compound index based on the combination of filter fields
|
|
100
|
+
* provided. The `roleId` filter is applied in-memory after the index scan
|
|
101
|
+
* because role IDs are stored as an array.
|
|
102
|
+
*
|
|
103
|
+
* @param args.where - Optional filter criteria for narrowing results.
|
|
104
|
+
* @param args.where.groupId - Match members belonging to this group.
|
|
105
|
+
* @param args.where.userId - Match members for this specific user.
|
|
106
|
+
* @param args.where.roleId - Match members whose `roleIds` array includes this role identifier.
|
|
107
|
+
* @param args.where.status - Match members with this exact status string (e.g. `"active"`).
|
|
108
|
+
* @param args.limit - Maximum number of items per page (clamped to 1..100, defaults to 50).
|
|
109
|
+
* @param args.cursor - An opaque cursor string from a previous response's `nextCursor` to fetch the next page, or `null` to start from the beginning.
|
|
110
|
+
* @param args.orderBy - The field to sort by: `"_creationTime"` or `"status"`.
|
|
111
|
+
* @param args.order - Sort direction: `"asc"` or `"desc"` (defaults to `"desc"`).
|
|
112
|
+
* @returns An object `{ items, nextCursor }` where `items` is an array of member documents and `nextCursor` is `null` when there are no more pages.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* const { items, nextCursor } = await ctx.runQuery(
|
|
117
|
+
* components.auth.groups.memberList,
|
|
118
|
+
* {
|
|
119
|
+
* where: { groupId: teamGroupId, status: "active" },
|
|
120
|
+
* limit: 30,
|
|
121
|
+
* order: "asc",
|
|
122
|
+
* },
|
|
123
|
+
* );
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export const memberList = query({
|
|
127
|
+
args: {
|
|
128
|
+
where: v.optional(
|
|
129
|
+
v.object({
|
|
130
|
+
groupId: v.optional(v.id("Group")),
|
|
131
|
+
userId: v.optional(v.id("User")),
|
|
132
|
+
roleId: v.optional(v.string()),
|
|
133
|
+
status: v.optional(v.string()),
|
|
134
|
+
}),
|
|
135
|
+
),
|
|
136
|
+
limit: v.optional(v.number()),
|
|
137
|
+
cursor: v.optional(v.union(v.string(), v.null())),
|
|
138
|
+
orderBy: v.optional(
|
|
139
|
+
v.union(v.literal("_creationTime"), v.literal("status")),
|
|
140
|
+
),
|
|
141
|
+
order: v.optional(v.union(v.literal("asc"), v.literal("desc"))),
|
|
142
|
+
},
|
|
143
|
+
returns: vPaginated(vGroupMemberDoc),
|
|
144
|
+
handler: async (ctx, args) => {
|
|
145
|
+
const where = args.where ?? {};
|
|
146
|
+
const limit = Math.min(Math.max(args.limit ?? 50, 1), 100);
|
|
147
|
+
const order = args.order ?? "desc";
|
|
148
|
+
|
|
149
|
+
let q;
|
|
150
|
+
if (where.groupId !== undefined && where.userId !== undefined) {
|
|
151
|
+
q = ctx.db
|
|
152
|
+
.query("GroupMember")
|
|
153
|
+
.withIndex("group_id_user_id", (idx) =>
|
|
154
|
+
idx.eq("groupId", where.groupId!).eq("userId", where.userId!),
|
|
155
|
+
);
|
|
156
|
+
if (where.status !== undefined) {
|
|
157
|
+
q = q.filter((f) => f.eq(f.field("status"), where.status!));
|
|
158
|
+
}
|
|
159
|
+
} else if (where.groupId !== undefined && where.status !== undefined) {
|
|
160
|
+
q = ctx.db
|
|
161
|
+
.query("GroupMember")
|
|
162
|
+
.withIndex("group_id_status", (idx) =>
|
|
163
|
+
idx.eq("groupId", where.groupId!).eq("status", where.status!),
|
|
164
|
+
);
|
|
165
|
+
} else if (where.groupId !== undefined) {
|
|
166
|
+
q = ctx.db
|
|
167
|
+
.query("GroupMember")
|
|
168
|
+
.withIndex("group_id", (idx) => idx.eq("groupId", where.groupId!));
|
|
169
|
+
} else if (where.userId !== undefined) {
|
|
170
|
+
q = ctx.db
|
|
171
|
+
.query("GroupMember")
|
|
172
|
+
.withIndex("user_id", (idx) => idx.eq("userId", where.userId!));
|
|
173
|
+
if (where.status !== undefined) {
|
|
174
|
+
q = q.filter((f) => f.eq(f.field("status"), where.status!));
|
|
175
|
+
}
|
|
176
|
+
} else {
|
|
177
|
+
q = ctx.db.query("GroupMember");
|
|
178
|
+
if (where.status !== undefined) {
|
|
179
|
+
q = q.filter((f) => f.eq(f.field("status"), where.status!));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
q = q.order(order);
|
|
184
|
+
|
|
185
|
+
let all = await q.collect();
|
|
186
|
+
if (where.roleId !== undefined) {
|
|
187
|
+
all = all.filter((doc) => (doc.roleIds ?? []).includes(where.roleId!));
|
|
188
|
+
}
|
|
189
|
+
let startIdx = 0;
|
|
190
|
+
if (args.cursor) {
|
|
191
|
+
const cursorIdx = all.findIndex((doc) => doc._id === args.cursor);
|
|
192
|
+
if (cursorIdx !== -1) {
|
|
193
|
+
startIdx = cursorIdx + 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const page = all.slice(startIdx, startIdx + limit + 1);
|
|
197
|
+
const hasMore = page.length > limit;
|
|
198
|
+
const items = hasMore ? page.slice(0, limit) : page;
|
|
199
|
+
const nextCursor = hasMore ? items[items.length - 1]._id : null;
|
|
200
|
+
return { items, nextCursor };
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Look up a specific user's membership in a specific group.
|
|
206
|
+
*
|
|
207
|
+
* Uses the `group_id_user_id` compound index for an efficient exact-match
|
|
208
|
+
* lookup. Returns `null` if the user is not a member of the group. Unlike
|
|
209
|
+
* {@link memberResolve}, this does **not** walk the group hierarchy — it
|
|
210
|
+
* checks only the specified group.
|
|
211
|
+
*
|
|
212
|
+
* @param args.groupId - The `Id<"Group">` of the group to check.
|
|
213
|
+
* @param args.userId - The `Id<"User">` of the user whose membership to look up.
|
|
214
|
+
* @returns The member document or `null` if the user is not a direct member of the group.
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```ts
|
|
218
|
+
* const member = await ctx.runQuery(
|
|
219
|
+
* components.auth.groups.memberGetByGroupAndUser,
|
|
220
|
+
* { groupId: teamGroupId, userId: currentUserId },
|
|
221
|
+
* );
|
|
222
|
+
* if (member !== null) {
|
|
223
|
+
* console.log("User has roles:", member.roleIds);
|
|
224
|
+
* }
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export const memberGetByGroupAndUser = query({
|
|
228
|
+
args: { groupId: v.id("Group"), userId: v.id("User") },
|
|
229
|
+
returns: v.union(vGroupMemberDoc, v.null()),
|
|
230
|
+
handler: async (ctx, { groupId, userId }) => {
|
|
231
|
+
return await ctx.db
|
|
232
|
+
.query("GroupMember")
|
|
233
|
+
.withIndex("group_id_user_id", (q) =>
|
|
234
|
+
q.eq("groupId", groupId).eq("userId", userId),
|
|
235
|
+
)
|
|
236
|
+
.unique();
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Resolve a user's membership by walking the group hierarchy from the
|
|
242
|
+
* requested group up to the root. Returns the first matching membership
|
|
243
|
+
* found, enabling inherited (ancestor-level) access checks.
|
|
244
|
+
*
|
|
245
|
+
* The traversal walks from `groupId` to its `parentGroupId`, then to the
|
|
246
|
+
* parent's parent, and so on, up to `maxDepth` levels (default 32). It
|
|
247
|
+
* stops at the first group where the user has a membership record. Cycle
|
|
248
|
+
* detection prevents infinite loops if the hierarchy is malformed.
|
|
249
|
+
*
|
|
250
|
+
* When `ancestry` is `true`, the response includes a `traversedGroupIds`
|
|
251
|
+
* array showing the full path that was walked (useful for debugging or
|
|
252
|
+
* audit trails).
|
|
253
|
+
*
|
|
254
|
+
* This runs entirely inside the component (no cross-component RPCs per level).
|
|
255
|
+
*
|
|
256
|
+
* @param args.userId - The `Id<"User">` of the user whose membership to resolve.
|
|
257
|
+
* @param args.groupId - The `Id<"Group">` to start the upward traversal from.
|
|
258
|
+
* @param args.maxDepth - Optional maximum number of parent levels to traverse (defaults to 32). Set to `0` to check only the exact group.
|
|
259
|
+
* @param args.ancestry - When `true`, the response includes the `traversedGroupIds` array showing all group IDs visited during the walk.
|
|
260
|
+
* @returns An object with:
|
|
261
|
+
* - `membership` — the member document at the matched group, or `null` if none was found.
|
|
262
|
+
* - `matchedGroupId` — the ID of the group where membership was found, or `null`.
|
|
263
|
+
* - `depth` — how many levels above `groupId` the match was found (0 = direct), or `null` if not found.
|
|
264
|
+
* - `isDirect` — `true` when `depth === 0`.
|
|
265
|
+
* - `isInherited` — `true` when `depth > 0`.
|
|
266
|
+
* - `traversedGroupIds` — (only when `ancestry` is `true`) array of group IDs visited.
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```ts
|
|
270
|
+
* const result = await ctx.runQuery(
|
|
271
|
+
* components.auth.groups.memberResolve,
|
|
272
|
+
* {
|
|
273
|
+
* userId: currentUserId,
|
|
274
|
+
* groupId: subTeamGroupId,
|
|
275
|
+
* maxDepth: 5,
|
|
276
|
+
* ancestry: true,
|
|
277
|
+
* },
|
|
278
|
+
* );
|
|
279
|
+
* if (result.membership !== null) {
|
|
280
|
+
* console.log(
|
|
281
|
+
* result.isDirect ? "Direct member" : `Inherited from depth ${result.depth}`,
|
|
282
|
+
* );
|
|
283
|
+
* }
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
export const memberResolve = query({
|
|
287
|
+
args: {
|
|
288
|
+
userId: v.id("User"),
|
|
289
|
+
groupId: v.id("Group"),
|
|
290
|
+
maxDepth: v.optional(v.number()),
|
|
291
|
+
ancestry: v.optional(v.boolean()),
|
|
292
|
+
},
|
|
293
|
+
returns: v.object({
|
|
294
|
+
membership: v.union(vGroupMemberDoc, v.null()),
|
|
295
|
+
matchedGroupId: v.union(v.id("Group"), v.null()),
|
|
296
|
+
depth: v.union(v.number(), v.null()),
|
|
297
|
+
isDirect: v.boolean(),
|
|
298
|
+
isInherited: v.boolean(),
|
|
299
|
+
traversedGroupIds: v.optional(v.array(v.id("Group"))),
|
|
300
|
+
}),
|
|
301
|
+
handler: async (ctx, args) => {
|
|
302
|
+
const maxDepth = Math.max(0, Math.floor(args.maxDepth ?? 32));
|
|
303
|
+
const includeAncestry = args.ancestry ?? false;
|
|
304
|
+
const visited = new Set<string>();
|
|
305
|
+
const traversedGroupIds: Id<"Group">[] = [];
|
|
306
|
+
let currentGroupId: Id<"Group"> | undefined = args.groupId;
|
|
307
|
+
let depth = 0;
|
|
308
|
+
|
|
309
|
+
while (currentGroupId !== undefined && depth <= maxDepth) {
|
|
310
|
+
if (visited.has(currentGroupId)) break;
|
|
311
|
+
visited.add(currentGroupId);
|
|
312
|
+
if (includeAncestry) traversedGroupIds.push(currentGroupId);
|
|
313
|
+
|
|
314
|
+
const membership = await ctx.db
|
|
315
|
+
.query("GroupMember")
|
|
316
|
+
.withIndex("group_id_user_id", (q) =>
|
|
317
|
+
q.eq("groupId", currentGroupId!).eq("userId", args.userId),
|
|
318
|
+
)
|
|
319
|
+
.unique();
|
|
320
|
+
|
|
321
|
+
if (membership !== null) {
|
|
322
|
+
return {
|
|
323
|
+
membership,
|
|
324
|
+
matchedGroupId: currentGroupId,
|
|
325
|
+
depth,
|
|
326
|
+
isDirect: depth === 0,
|
|
327
|
+
isInherited: depth > 0,
|
|
328
|
+
...(includeAncestry ? { traversedGroupIds } : {}),
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const groupDoc: { parentGroupId?: Id<"Group"> } | null =
|
|
333
|
+
await ctx.db.get(currentGroupId);
|
|
334
|
+
if (!groupDoc?.parentGroupId) break;
|
|
335
|
+
currentGroupId = groupDoc.parentGroupId;
|
|
336
|
+
depth++;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return {
|
|
340
|
+
membership: null,
|
|
341
|
+
matchedGroupId: null,
|
|
342
|
+
depth: null,
|
|
343
|
+
isDirect: false,
|
|
344
|
+
isInherited: false,
|
|
345
|
+
...(includeAncestry ? { traversedGroupIds } : {}),
|
|
346
|
+
};
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Remove a member from a group by permanently deleting the member record.
|
|
352
|
+
*
|
|
353
|
+
* This is a hard delete — the `GroupMember` document is removed from the
|
|
354
|
+
* database entirely. If you need soft-delete semantics, use
|
|
355
|
+
* {@link memberUpdate} to set the `status` field instead.
|
|
356
|
+
*
|
|
357
|
+
* @param args.memberId - The `Id<"GroupMember">` of the member record to delete.
|
|
358
|
+
* @returns `null` on success.
|
|
359
|
+
*
|
|
360
|
+
* @example
|
|
361
|
+
* ```ts
|
|
362
|
+
* await ctx.runMutation(components.auth.groups.memberRemove, {
|
|
363
|
+
* memberId: memberToRemoveId,
|
|
364
|
+
* });
|
|
365
|
+
* ```
|
|
366
|
+
*/
|
|
367
|
+
export const memberRemove = mutation({
|
|
368
|
+
args: { memberId: v.id("GroupMember") },
|
|
369
|
+
returns: v.null(),
|
|
370
|
+
handler: async (ctx, { memberId }) => {
|
|
371
|
+
await ctx.db.delete("GroupMember", memberId);
|
|
372
|
+
return null;
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Update a member record's mutable fields such as `roleIds`, `status`, and
|
|
378
|
+
* `extend`.
|
|
379
|
+
*
|
|
380
|
+
* Uses `db.patch` under the hood, so only the fields present in `data` are
|
|
381
|
+
* modified — all other fields on the member document are left unchanged.
|
|
382
|
+
*
|
|
383
|
+
* @param args.memberId - The `Id<"GroupMember">` of the member record to update.
|
|
384
|
+
* @param args.data - A partial object of fields to patch. Supported keys include `roleIds`, `status`, and `extend`.
|
|
385
|
+
* @returns `null` on success.
|
|
386
|
+
*
|
|
387
|
+
* @example
|
|
388
|
+
* ```ts
|
|
389
|
+
* await ctx.runMutation(components.auth.groups.memberUpdate, {
|
|
390
|
+
* memberId: existingMemberId,
|
|
391
|
+
* data: {
|
|
392
|
+
* roleIds: ["admin", "editor"],
|
|
393
|
+
* status: "active",
|
|
394
|
+
* },
|
|
395
|
+
* });
|
|
396
|
+
* ```
|
|
397
|
+
*/
|
|
398
|
+
export const memberUpdate = mutation({
|
|
399
|
+
args: { memberId: v.id("GroupMember"), data: v.any() },
|
|
400
|
+
returns: v.null(),
|
|
401
|
+
handler: async (ctx, { memberId, data }) => {
|
|
402
|
+
await ctx.db.patch("GroupMember", memberId, data);
|
|
403
|
+
return null;
|
|
404
|
+
},
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// ============================================================================
|
|
408
|
+
// Invites
|
|
409
|
+
// ============================================================================
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
import { mutation, query } from "../../functions";
|
|
3
|
+
import { vAccountDoc } from "../../model";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* List all accounts linked to a specific user.
|
|
7
|
+
*
|
|
8
|
+
* Queries the `Account` table using the `user_id_provider` index to efficiently
|
|
9
|
+
* retrieve every authentication account (e.g. OAuth, credentials, email) that
|
|
10
|
+
* belongs to the given user.
|
|
11
|
+
*
|
|
12
|
+
* @param args.userId - The document ID of the user whose accounts should be retrieved.
|
|
13
|
+
* @returns An array of account documents associated with the user. Each document
|
|
14
|
+
* includes fields such as `provider`, `providerAccountId`, `secret`, and `extend`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const accounts = await ctx.runQuery(
|
|
19
|
+
* component.identity.accounts.accountListByUser,
|
|
20
|
+
* { userId: user._id },
|
|
21
|
+
* );
|
|
22
|
+
* for (const account of accounts) {
|
|
23
|
+
* console.log(`Provider: ${account.provider}, ID: ${account.providerAccountId}`);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const accountListByUser = query({
|
|
28
|
+
args: { userId: v.id("User") },
|
|
29
|
+
returns: v.array(vAccountDoc),
|
|
30
|
+
handler: async (ctx, { userId }) => {
|
|
31
|
+
return await ctx.db
|
|
32
|
+
.query("Account")
|
|
33
|
+
.withIndex("user_id_provider", (q) => q.eq("userId", userId as any))
|
|
34
|
+
.collect();
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Look up an account by its provider name and provider-specific account ID.
|
|
40
|
+
*
|
|
41
|
+
* Uses the `provider_account_id` index to find the unique account that matches
|
|
42
|
+
* the given provider and external account identifier. This is the primary way
|
|
43
|
+
* to resolve an incoming authentication event (e.g. an OAuth callback) to an
|
|
44
|
+
* existing account in the system.
|
|
45
|
+
*
|
|
46
|
+
* @param args.provider - The name of the authentication provider (e.g. `"google"`, `"github"`, `"credentials"`).
|
|
47
|
+
* @param args.providerAccountId - The unique identifier assigned to the user by the external provider.
|
|
48
|
+
* @returns The matching account document, or `null` if no account exists for the
|
|
49
|
+
* given provider and provider account ID combination.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const account = await ctx.runQuery(
|
|
54
|
+
* component.identity.accounts.accountGet,
|
|
55
|
+
* { provider: "google", providerAccountId: "1184210396400123" },
|
|
56
|
+
* );
|
|
57
|
+
* if (account !== null) {
|
|
58
|
+
* console.log(`Found account for user: ${account.userId}`);
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export const accountGet = query({
|
|
63
|
+
args: { provider: v.string(), providerAccountId: v.string() },
|
|
64
|
+
returns: v.union(vAccountDoc, v.null()),
|
|
65
|
+
handler: async (ctx, { provider, providerAccountId }) => {
|
|
66
|
+
return await ctx.db
|
|
67
|
+
.query("Account")
|
|
68
|
+
.withIndex("provider_account_id", (q) =>
|
|
69
|
+
q.eq("provider", provider).eq("providerAccountId", providerAccountId),
|
|
70
|
+
)
|
|
71
|
+
.unique();
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Retrieve a single account by its Convex document ID.
|
|
77
|
+
*
|
|
78
|
+
* Performs a direct point lookup on the `Account` table. Returns `null` if the
|
|
79
|
+
* document has been deleted or never existed.
|
|
80
|
+
*
|
|
81
|
+
* @param args.accountId - The Convex document ID (`Id<"Account">`) of the account to retrieve.
|
|
82
|
+
* @returns The account document if it exists, or `null` otherwise.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* const account = await ctx.runQuery(
|
|
87
|
+
* component.identity.accounts.accountGetById,
|
|
88
|
+
* { accountId: existingAccountId },
|
|
89
|
+
* );
|
|
90
|
+
* if (account !== null) {
|
|
91
|
+
* console.log(`Provider: ${account.provider}`);
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export const accountGetById = query({
|
|
96
|
+
args: { accountId: v.id("Account") },
|
|
97
|
+
returns: v.union(vAccountDoc, v.null()),
|
|
98
|
+
handler: async (ctx, { accountId }) => {
|
|
99
|
+
return await ctx.db.get("Account", accountId);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Create a new account that links a user to an authentication provider.
|
|
105
|
+
*
|
|
106
|
+
* Inserts a row into the `Account` table, establishing the relationship between
|
|
107
|
+
* a user document and an external authentication provider (OAuth, credentials,
|
|
108
|
+
* email/phone OTP, etc.). A single user may have multiple accounts for different
|
|
109
|
+
* providers.
|
|
110
|
+
*
|
|
111
|
+
* @param args.userId - The document ID of the user to link this account to.
|
|
112
|
+
* @param args.provider - The name of the authentication provider (e.g. `"google"`, `"credentials"`).
|
|
113
|
+
* @param args.providerAccountId - The unique identifier for this user within the external provider.
|
|
114
|
+
* @param args.secret - An optional hashed secret (e.g. password hash) stored for credential-based providers.
|
|
115
|
+
* @param args.extend - Optional arbitrary data to store alongside the account for application-specific needs.
|
|
116
|
+
* @returns The document ID of the newly created account.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* const accountId = await ctx.runMutation(
|
|
121
|
+
* component.identity.accounts.accountInsert,
|
|
122
|
+
* {
|
|
123
|
+
* userId: user._id,
|
|
124
|
+
* provider: "credentials",
|
|
125
|
+
* providerAccountId: "user@example.com",
|
|
126
|
+
* secret: hashedPassword,
|
|
127
|
+
* },
|
|
128
|
+
* );
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export const accountInsert = mutation({
|
|
132
|
+
args: {
|
|
133
|
+
userId: v.id("User"),
|
|
134
|
+
provider: v.string(),
|
|
135
|
+
providerAccountId: v.string(),
|
|
136
|
+
secret: v.optional(v.string()),
|
|
137
|
+
extend: v.optional(v.any()),
|
|
138
|
+
},
|
|
139
|
+
returns: v.id("Account"),
|
|
140
|
+
handler: async (ctx, args) => {
|
|
141
|
+
return await ctx.db.insert("Account", args as any);
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Patch an existing account document with partial data.
|
|
147
|
+
*
|
|
148
|
+
* Merges the provided fields into the existing account document. Fields not
|
|
149
|
+
* included in `data` are left unchanged. This is useful for updating a stored
|
|
150
|
+
* secret (e.g. after a password change) or modifying extended metadata.
|
|
151
|
+
*
|
|
152
|
+
* @param args.accountId - The document ID of the account to update.
|
|
153
|
+
* @param args.data - A partial object containing the fields to merge into the account document.
|
|
154
|
+
* @returns `null` on success.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```ts
|
|
158
|
+
* await ctx.runMutation(
|
|
159
|
+
* component.identity.accounts.accountPatch,
|
|
160
|
+
* {
|
|
161
|
+
* accountId: account._id,
|
|
162
|
+
* data: { secret: newHashedPassword },
|
|
163
|
+
* },
|
|
164
|
+
* );
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export const accountPatch = mutation({
|
|
168
|
+
args: { accountId: v.id("Account"), data: v.any() },
|
|
169
|
+
returns: v.null(),
|
|
170
|
+
handler: async (ctx, { accountId, data }) => {
|
|
171
|
+
await ctx.db.patch("Account", accountId, data);
|
|
172
|
+
return null;
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Delete an account document permanently.
|
|
178
|
+
*
|
|
179
|
+
* Removes the account from the `Account` table. This effectively unlinks the
|
|
180
|
+
* user from the corresponding authentication provider. Callers should ensure
|
|
181
|
+
* that related resources (verification codes, sessions, etc.) are cleaned up
|
|
182
|
+
* separately if needed.
|
|
183
|
+
*
|
|
184
|
+
* @param args.accountId - The document ID of the account to delete.
|
|
185
|
+
* @returns `null` on success.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```ts
|
|
189
|
+
* await ctx.runMutation(
|
|
190
|
+
* component.identity.accounts.accountDelete,
|
|
191
|
+
* { accountId: account._id },
|
|
192
|
+
* );
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export const accountDelete = mutation({
|
|
196
|
+
args: { accountId: v.id("Account") },
|
|
197
|
+
returns: v.null(),
|
|
198
|
+
handler: async (ctx, { accountId }) => {
|
|
199
|
+
await ctx.db.delete("Account", accountId);
|
|
200
|
+
return null;
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Sessions
|
|
206
|
+
// ============================================================================
|