better-auth-cloudflare
Version:
Seamlessly integrate better-auth with Cloudflare Workers, D1, Hyperdrive, KV, R2, and geolocation services.
127 lines (126 loc) • 2.88 kB
JavaScript
/**
* Database fields for Cloudflare geolocation
*/
const geolocationFields = {
timezone: {
type: "string",
required: false,
input: false,
},
city: {
type: "string",
required: false,
input: false,
},
country: {
type: "string",
required: false,
input: false,
},
region: {
type: "string",
required: false,
input: false,
},
regionCode: {
type: "string",
required: false,
input: false,
},
colo: {
type: "string",
required: false,
input: false,
},
latitude: {
type: "string",
required: false,
input: false,
},
longitude: {
type: "string",
required: false,
input: false,
},
};
/**
* Core database fields for file tracking
*/
const coreFileFields = {
userId: {
type: "string",
required: true,
input: false,
references: {
model: "user",
field: "id",
},
},
filename: {
type: "string",
required: true,
input: false,
},
originalName: {
type: "string",
required: true,
input: false,
},
contentType: {
type: "string",
required: true,
input: false,
},
size: {
type: "number",
required: true,
input: false,
},
r2Key: {
type: "string",
required: true,
input: false,
},
uploadedAt: {
type: "date",
required: true,
input: false,
},
};
/**
* Generates file tracking fields including custom fields
*/
function generateFileFields(additionalFields) {
const fields = { ...coreFileFields };
if (additionalFields) {
for (const [fieldName, fieldConfig] of Object.entries(additionalFields)) {
// Use FieldAttribute directly - no conversion needed!
fields[fieldName] = fieldConfig;
}
}
return fields;
}
/**
* Generates database schema for Cloudflare plugin
*
* @param options - Plugin configuration
* @returns Schema with geolocation fields and file tracking
*/
export const schema = (options) => {
const sessionFields = options.geolocationTracking === undefined || options.geolocationTracking === true ? geolocationFields : {};
const authSchema = {
session: {
fields: sessionFields,
},
};
// Add file tracking table if R2 is configured
if (options.r2) {
const fileFields = generateFileFields(options.r2.additionalFields);
// Use the base model name that Better Auth will pluralize
// When usePlural is true, "userFile" becomes "userFiles"
authSchema.userFile = {
fields: fileFields,
};
}
return authSchema;
};