user_details.do.ts•1.25 kB
import { DurableObject } from 'cloudflare:workers'
import { z } from 'zod'
import { DurableKVStore } from '../durable-kv-store'
import type { DurableKVStorageKeys } from '../durable-kv-store'
// Durable Object for persisting UserDetails in DO storage across sessions based off the userId
export class UserDetails extends DurableObject {
	private readonly kv: DurableKVStore<UserDetailsKeys>
	constructor(state: DurableObjectState, env: unknown) {
		super(state, env)
		this.env = env
		this.kv = new DurableKVStore({
			state,
			prefix: 'meta',
			keys: UserDetailsKeys,
		})
	}
	public async getActiveAccountId() {
		return await this.kv.get('active_account_id')
	}
	public async setActiveAccountId(activeAccountId: string) {
		this.kv.put('active_account_id', activeAccountId)
	}
}
/**
 * Storage keys used by UserDetails
 */
type UserDetailsKeys = typeof UserDetailsKeys
const UserDetailsKeys = {
	active_account_id: z.string(),
} as const satisfies DurableKVStorageKeys
/** Get the UserDetails instance */
export function getUserDetails(
	env: { USER_DETAILS: DurableObjectNamespace<UserDetails> },
	user_id: string
): DurableObjectStub<UserDetails> {
	const id = env.USER_DETAILS.idFromName(user_id)
	return env.USER_DETAILS.get(id)
}