@convex-dev/better-auth
Version:
A Better Auth component for Convex.
438 lines (413 loc) • 12.4 kB
text/typescript
// This file is auto-generated from auth.ts by generate-schema.ts. Do not edit this file manually.
// To regenerate the schema, run:
// npx tsx generate-schema.ts
import { defineSchema, defineTable } from "convex/server";
import { v } from "convex/values";
const schema = defineSchema({
user: defineTable({
name: v.string(),
email: v.string(),
emailVerified: v.boolean(),
image: v.optional(v.union(v.null(), v.string())),
createdAt: v.number(),
updatedAt: v.number(),
twoFactorEnabled: v.optional(v.union(v.null(), v.boolean())),
isAnonymous: v.optional(v.union(v.null(), v.boolean())),
username: v.optional(v.union(v.null(), v.string())),
displayUsername: v.optional(v.union(v.null(), v.string())),
phoneNumber: v.optional(v.union(v.null(), v.string())),
phoneNumberVerified: v.optional(v.union(v.null(), v.boolean())),
role: v.optional(v.union(v.null(), v.string())),
banned: v.optional(v.union(v.null(), v.boolean())),
banReason: v.optional(v.union(v.null(), v.string())),
banExpires: v.optional(v.union(v.null(), v.number())),
stripeCustomerId: v.optional(v.union(v.null(), v.string())),
userId: v.optional(v.union(v.null(), v.string())),
teamId: v.optional(v.union(v.null(), v.string())),
})
.index("email_name", ["email","name"])
.index("name", ["name"])
.index("userId", ["userId"])
.index("username", ["username"])
.index("phoneNumber", ["phoneNumber"]),
session: defineTable({
expiresAt: v.number(),
token: v.string(),
createdAt: v.number(),
updatedAt: v.number(),
ipAddress: v.optional(v.union(v.null(), v.string())),
userAgent: v.optional(v.union(v.null(), v.string())),
userId: v.string(),
impersonatedBy: v.optional(v.union(v.null(), v.string())),
activeOrganizationId: v.optional(v.union(v.null(), v.string())),
activeTeamId: v.optional(v.union(v.null(), v.string())),
})
.index("expiresAt", ["expiresAt"])
.index("expiresAt_userId", ["expiresAt","userId"])
.index("token", ["token"])
.index("userId", ["userId"]),
account: defineTable({
accountId: v.string(),
providerId: v.string(),
userId: v.string(),
accessToken: v.optional(v.union(v.null(), v.string())),
refreshToken: v.optional(v.union(v.null(), v.string())),
idToken: v.optional(v.union(v.null(), v.string())),
accessTokenExpiresAt: v.optional(v.union(v.null(), v.number())),
refreshTokenExpiresAt: v.optional(v.union(v.null(), v.number())),
scope: v.optional(v.union(v.null(), v.string())),
password: v.optional(v.union(v.null(), v.string())),
createdAt: v.number(),
updatedAt: v.number(),
})
.index("accountId", ["accountId"])
.index("accountId_providerId", ["accountId","providerId"])
.index("providerId_userId", ["providerId","userId"])
.index("userId", ["userId"]),
verification: defineTable({
identifier: v.string(),
value: v.string(),
expiresAt: v.number(),
createdAt: v.optional(v.union(v.null(), v.number())),
updatedAt: v.optional(v.union(v.null(), v.number())),
})
.index("expiresAt", ["expiresAt"])
.index("identifier", ["identifier"]),
twoFactor: defineTable({
secret: v.string(),
backupCodes: v.string(),
userId: v.string(),
})
.index("userId", ["userId"]),
passkey: defineTable({
name: v.optional(v.union(v.null(), v.string())),
publicKey: v.string(),
userId: v.string(),
credentialID: v.string(),
counter: v.number(),
deviceType: v.string(),
backedUp: v.boolean(),
transports: v.optional(v.union(v.null(), v.string())),
createdAt: v.optional(v.union(v.null(), v.number())),
aaguid: v.optional(v.union(v.null(), v.string())),
})
.index("credentialID", ["credentialID"])
.index("userId", ["userId"]),
apikey: defineTable({
name: v.optional(v.union(v.null(), v.string())),
start: v.optional(v.union(v.null(), v.string())),
prefix: v.optional(v.union(v.null(), v.string())),
key: v.string(),
userId: v.string(),
refillInterval: v.optional(v.union(v.null(), v.number())),
refillAmount: v.optional(v.union(v.null(), v.number())),
lastRefillAt: v.optional(v.union(v.null(), v.number())),
enabled: v.optional(v.union(v.null(), v.boolean())),
rateLimitEnabled: v.optional(v.union(v.null(), v.boolean())),
rateLimitTimeWindow: v.optional(v.union(v.null(), v.number())),
rateLimitMax: v.optional(v.union(v.null(), v.number())),
requestCount: v.optional(v.union(v.null(), v.number())),
remaining: v.optional(v.union(v.null(), v.number())),
lastRequest: v.optional(v.union(v.null(), v.number())),
expiresAt: v.optional(v.union(v.null(), v.number())),
createdAt: v.number(),
updatedAt: v.number(),
permissions: v.optional(v.union(v.null(), v.string())),
metadata: v.optional(v.union(v.null(), v.string())),
})
.index("key", ["key"])
.index("userId", ["userId"]),
oauthApplication: defineTable({
name: v.optional(v.union(v.null(), v.string())),
icon: v.optional(v.union(v.null(), v.string())),
metadata: v.optional(v.union(v.null(), v.string())),
clientId: v.optional(v.union(v.null(), v.string())),
clientSecret: v.optional(v.union(v.null(), v.string())),
redirectURLs: v.optional(v.union(v.null(), v.string())),
type: v.optional(v.union(v.null(), v.string())),
disabled: v.optional(v.union(v.null(), v.boolean())),
userId: v.optional(v.union(v.null(), v.string())),
createdAt: v.optional(v.union(v.null(), v.number())),
updatedAt: v.optional(v.union(v.null(), v.number())),
})
.index("clientId", ["clientId"]),
oauthAccessToken: defineTable({
accessToken: v.optional(v.union(v.null(), v.string())),
refreshToken: v.optional(v.union(v.null(), v.string())),
accessTokenExpiresAt: v.optional(v.union(v.null(), v.number())),
refreshTokenExpiresAt: v.optional(v.union(v.null(), v.number())),
clientId: v.optional(v.union(v.null(), v.string())),
userId: v.optional(v.union(v.null(), v.string())),
scopes: v.optional(v.union(v.null(), v.string())),
createdAt: v.optional(v.union(v.null(), v.number())),
updatedAt: v.optional(v.union(v.null(), v.number())),
})
.index("accessToken", ["accessToken"])
.index("refreshToken", ["refreshToken"]),
oauthConsent: defineTable({
clientId: v.optional(v.union(v.null(), v.string())),
userId: v.optional(v.union(v.null(), v.string())),
scopes: v.optional(v.union(v.null(), v.string())),
createdAt: v.optional(v.union(v.null(), v.number())),
updatedAt: v.optional(v.union(v.null(), v.number())),
consentGiven: v.optional(v.union(v.null(), v.boolean())),
})
.index("clientId_userId", ["clientId","userId"]),
organization: defineTable({
name: v.string(),
slug: v.optional(v.union(v.null(), v.string())),
logo: v.optional(v.union(v.null(), v.string())),
createdAt: v.number(),
metadata: v.optional(v.union(v.null(), v.string())),
})
.index("name", ["name"])
.index("slug", ["slug"]),
member: defineTable({
organizationId: v.string(),
userId: v.string(),
role: v.string(),
createdAt: v.number(),
})
.index("organizationId_userId", ["organizationId","userId"])
.index("userId", ["userId"])
.index("role", ["role"]),
invitation: defineTable({
organizationId: v.string(),
email: v.string(),
role: v.optional(v.union(v.null(), v.string())),
teamId: v.optional(v.union(v.null(), v.string())),
status: v.string(),
expiresAt: v.number(),
inviterId: v.string(),
})
.index("email_organizationId_status", ["email","organizationId","status"])
.index("organizationId_status", ["organizationId","status"])
.index("role", ["role"])
.index("teamId", ["teamId"])
.index("status", ["status"])
.index("inviterId", ["inviterId"]),
team: defineTable({
name: v.string(),
organizationId: v.string(),
createdAt: v.number(),
updatedAt: v.optional(v.union(v.null(), v.number())),
})
.index("organizationId", ["organizationId"]),
teamMember: defineTable({
teamId: v.string(),
userId: v.string(),
createdAt: v.optional(v.union(v.null(), v.number())),
})
.index("userId", ["userId"]),
ssoProvider: defineTable({
issuer: v.string(),
oidcConfig: v.optional(v.union(v.null(), v.string())),
samlConfig: v.optional(v.union(v.null(), v.string())),
userId: v.optional(v.union(v.null(), v.string())),
providerId: v.string(),
organizationId: v.optional(v.union(v.null(), v.string())),
domain: v.string(),
})
.index("organizationId", ["organizationId"])
.index("domain", ["domain"])
.index("userId", ["userId"])
.index("providerId", ["providerId"]),
jwks: defineTable({
publicKey: v.string(),
privateKey: v.string(),
createdAt: v.number(),
}),
subscription: defineTable({
plan: v.string(),
referenceId: v.string(),
stripeCustomerId: v.optional(v.union(v.null(), v.string())),
stripeSubscriptionId: v.optional(v.union(v.null(), v.string())),
status: v.optional(v.union(v.null(), v.string())),
periodStart: v.optional(v.union(v.null(), v.number())),
periodEnd: v.optional(v.union(v.null(), v.number())),
cancelAtPeriodEnd: v.optional(v.union(v.null(), v.boolean())),
seats: v.optional(v.union(v.null(), v.number())),
})
.index("stripeSubscriptionId", ["stripeSubscriptionId"])
.index("stripeCustomerId", ["stripeCustomerId"])
.index("referenceId", ["referenceId"]),
walletAddress: defineTable({
userId: v.string(),
address: v.string(),
chainId: v.number(),
isPrimary: v.optional(v.union(v.null(), v.boolean())),
createdAt: v.number(),
})
.index("userId", ["userId"]),
rateLimit: defineTable({
key: v.optional(v.union(v.null(), v.string())),
count: v.optional(v.union(v.null(), v.number())),
lastRequest: v.optional(v.union(v.null(), v.number())),
})
.index("key", ["key"]),
});
export default schema;
export const specialFields = {
user: {
name: {
sortable: true
},
email: {
sortable: true,
unique: true
},
username: {
sortable: true,
unique: true
},
phoneNumber: {
sortable: true,
unique: true
}
},
session: {
token: {
unique: true
},
userId: {
references: {
model: "user",
field: "id",
onDelete: "cascade"
}
}
},
account: {
userId: {
references: {
model: "user",
field: "id",
onDelete: "cascade"
}
}
},
twoFactor: {
userId: {
references: {
model: "user",
field: "id"
}
}
},
passkey: {
userId: {
references: {
model: "user",
field: "id"
}
}
},
apikey: {
userId: {
references: {
model: "user",
field: "id"
}
}
},
oauthApplication: {
clientId: {
unique: true
}
},
oauthAccessToken: {
accessToken: {
unique: true
},
refreshToken: {
unique: true
}
},
organization: {
name: {
sortable: true
},
slug: {
sortable: true,
unique: true
}
},
member: {
organizationId: {
references: {
model: "organization",
field: "id"
}
},
userId: {
references: {
model: "user",
field: "id"
}
},
role: {
sortable: true
}
},
invitation: {
organizationId: {
references: {
model: "organization",
field: "id"
}
},
email: {
sortable: true
},
role: {
sortable: true
},
teamId: {
sortable: true
},
status: {
sortable: true
},
inviterId: {
references: {
model: "user",
field: "id"
}
}
},
team: {
organizationId: {
references: {
model: "organization",
field: "id"
}
}
},
teamMember: {
userId: {
references: {
model: "user",
field: "id"
}
}
},
ssoProvider: {
userId: {
references: {
model: "user",
field: "id"
}
},
providerId: {
unique: true
}
},
walletAddress: {
userId: {
references: {
model: "user",
field: "id"
}
}
}
};