- /legal/terms and /legal/privacy pages (linked from sign-in) - Consent (consentGiven=true) recorded on first Google sign-in - tip_views table: one row per tip served — enables activation + reaction rate queries - tip_views purged on account deletion - Delete account button on /connect (confirm → revoke tokens → purge data → sign out) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
|
|
|
|
export const users = sqliteTable('users', {
|
|
id: text('id').primaryKey(),
|
|
email: text('email').notNull().unique(),
|
|
name: text('name'),
|
|
image: text('image'),
|
|
googleId: text('google_id').unique(),
|
|
consentGiven: integer('consent_given', { mode: 'boolean' }).notNull().default(false),
|
|
consentAt: text('consent_at'),
|
|
createdAt: text('created_at').notNull(),
|
|
deletedAt: text('deleted_at'),
|
|
});
|
|
|
|
export const integrationTokens = sqliteTable('integration_tokens', {
|
|
id: text('id').primaryKey(),
|
|
userId: text('user_id').notNull().references(() => users.id),
|
|
provider: text('provider').notNull(), // 'todoist'
|
|
accessToken: text('access_token').notNull(),
|
|
refreshToken: text('refresh_token'),
|
|
expiresAt: text('expires_at'),
|
|
connectedAt: text('connected_at').notNull(),
|
|
});
|
|
|
|
export const tipFeedback = sqliteTable('tip_feedback', {
|
|
id: text('id').primaryKey(),
|
|
userId: text('user_id').notNull().references(() => users.id),
|
|
tipId: text('tip_id').notNull(),
|
|
action: text('action').notNull(), // 'done' | 'dismiss' | 'snooze'
|
|
sourceId: text('source_id'),
|
|
createdAt: text('created_at').notNull(),
|
|
});
|
|
|
|
// Each row = one tip served. Join with tipFeedback on tipId to compute reaction rate + dwell.
|
|
export const tipViews = sqliteTable('tip_views', {
|
|
id: text('id').primaryKey(),
|
|
userId: text('user_id').notNull().references(() => users.id),
|
|
tipId: text('tip_id').notNull(),
|
|
servedAt: text('served_at').notNull(),
|
|
});
|
|
|
|
export const sessions = sqliteTable('sessions', {
|
|
id: text('id').primaryKey(),
|
|
userId: text('user_id').notNull().references(() => users.id),
|
|
expiresAt: text('expires_at').notNull(),
|
|
createdAt: text('created_at').notNull(),
|
|
});
|