mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-21 19:46:42 +02:00
style: auto-format codebase with Prettier
Applied formatting to 1487+ files using pnpm format:write - TypeScript/JavaScript files - Svelte components - Astro pages - JSON configs - Markdown docs 13 files still need manual review (Astro JSX comments)
This commit is contained in:
parent
0241f5554c
commit
d36b321d9d
3952 changed files with 661498 additions and 739751 deletions
|
|
@ -14,6 +14,6 @@ export type Database = PostgresJsDatabase<typeof schema>;
|
|||
|
||||
// Helper to create a new database connection
|
||||
export function createDb(url: string): Database {
|
||||
const client = postgres(url);
|
||||
return drizzle(client, { schema });
|
||||
const client = postgres(url);
|
||||
return drizzle(client, { schema });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,14 @@
|
|||
import { pgTable, uuid, text, timestamp, boolean, integer, real, pgEnum, index } from 'drizzle-orm/pg-core';
|
||||
import {
|
||||
pgTable,
|
||||
uuid,
|
||||
text,
|
||||
timestamp,
|
||||
boolean,
|
||||
integer,
|
||||
real,
|
||||
pgEnum,
|
||||
index,
|
||||
} from 'drizzle-orm/pg-core';
|
||||
import { users } from './users';
|
||||
import { categories } from './categories';
|
||||
|
||||
|
|
@ -6,59 +16,63 @@ export const articleTypeEnum = pgEnum('article_type', ['feed', 'summary', 'in_de
|
|||
export const articleSourceEnum = pgEnum('article_source', ['ai', 'user_saved']);
|
||||
export const summaryPeriodEnum = pgEnum('summary_period', ['morning', 'noon', 'evening', 'night']);
|
||||
|
||||
export const articles = pgTable('articles', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
export const articles = pgTable(
|
||||
'articles',
|
||||
{
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
|
||||
// Core fields
|
||||
type: articleTypeEnum('type').notNull(),
|
||||
sourceOrigin: articleSourceEnum('source_origin').default('ai').notNull(),
|
||||
title: text('title').notNull(),
|
||||
content: text('content').notNull(),
|
||||
summary: text('summary'),
|
||||
// Core fields
|
||||
type: articleTypeEnum('type').notNull(),
|
||||
sourceOrigin: articleSourceEnum('source_origin').default('ai').notNull(),
|
||||
title: text('title').notNull(),
|
||||
content: text('content').notNull(),
|
||||
summary: text('summary'),
|
||||
|
||||
// For user-saved articles
|
||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }),
|
||||
originalUrl: text('original_url'),
|
||||
parsedContent: text('parsed_content'),
|
||||
isArchived: boolean('is_archived').default(false),
|
||||
// For user-saved articles
|
||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }),
|
||||
originalUrl: text('original_url'),
|
||||
parsedContent: text('parsed_content'),
|
||||
isArchived: boolean('is_archived').default(false),
|
||||
|
||||
// Metadata
|
||||
categoryId: uuid('category_id').references(() => categories.id),
|
||||
sourceUrl: text('source_url'),
|
||||
sourceName: text('source_name'),
|
||||
sourceDomain: text('source_domain'),
|
||||
author: text('author'),
|
||||
imageUrl: text('image_url'),
|
||||
// Metadata
|
||||
categoryId: uuid('category_id').references(() => categories.id),
|
||||
sourceUrl: text('source_url'),
|
||||
sourceName: text('source_name'),
|
||||
sourceDomain: text('source_domain'),
|
||||
author: text('author'),
|
||||
imageUrl: text('image_url'),
|
||||
|
||||
// AI-generated metadata
|
||||
aiTags: text('ai_tags').array(),
|
||||
sentimentScore: real('sentiment_score'),
|
||||
// AI-generated metadata
|
||||
aiTags: text('ai_tags').array(),
|
||||
sentimentScore: real('sentiment_score'),
|
||||
|
||||
// Reading metrics
|
||||
readingTimeMinutes: integer('reading_time_minutes'),
|
||||
wordCount: integer('word_count'),
|
||||
// Reading metrics
|
||||
readingTimeMinutes: integer('reading_time_minutes'),
|
||||
wordCount: integer('word_count'),
|
||||
|
||||
// Summary-specific fields
|
||||
summaryDate: timestamp('summary_date'),
|
||||
summaryPeriod: summaryPeriodEnum('summary_period'),
|
||||
includedArticleIds: uuid('included_article_ids').array(),
|
||||
// Summary-specific fields
|
||||
summaryDate: timestamp('summary_date'),
|
||||
summaryPeriod: summaryPeriodEnum('summary_period'),
|
||||
includedArticleIds: uuid('included_article_ids').array(),
|
||||
|
||||
// In-depth specific fields
|
||||
keyInsights: text('key_insights'), // JSON string
|
||||
dataVisualizations: text('data_visualizations'), // JSON string
|
||||
relatedArticleIds: uuid('related_article_ids').array(),
|
||||
// In-depth specific fields
|
||||
keyInsights: text('key_insights'), // JSON string
|
||||
dataVisualizations: text('data_visualizations'), // JSON string
|
||||
relatedArticleIds: uuid('related_article_ids').array(),
|
||||
|
||||
// Timestamps
|
||||
publishedAt: timestamp('published_at').defaultNow().notNull(),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
}, (table) => [
|
||||
index('articles_type_idx').on(table.type),
|
||||
index('articles_user_idx').on(table.userId),
|
||||
index('articles_source_origin_idx').on(table.sourceOrigin),
|
||||
index('articles_published_at_idx').on(table.publishedAt),
|
||||
index('articles_category_idx').on(table.categoryId),
|
||||
]);
|
||||
// Timestamps
|
||||
publishedAt: timestamp('published_at').defaultNow().notNull(),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
},
|
||||
(table) => [
|
||||
index('articles_type_idx').on(table.type),
|
||||
index('articles_user_idx').on(table.userId),
|
||||
index('articles_source_origin_idx').on(table.sourceOrigin),
|
||||
index('articles_published_at_idx').on(table.publishedAt),
|
||||
index('articles_category_idx').on(table.categoryId),
|
||||
]
|
||||
);
|
||||
|
||||
export type Article = typeof articles.$inferSelect;
|
||||
export type NewArticle = typeof articles.$inferInsert;
|
||||
|
|
|
|||
|
|
@ -3,40 +3,44 @@ import { users } from './users';
|
|||
|
||||
// Better Auth Sessions
|
||||
export const sessions = pgTable('sessions', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
|
||||
token: text('token').notNull().unique(),
|
||||
expiresAt: timestamp('expires_at').notNull(),
|
||||
ipAddress: text('ip_address'),
|
||||
userAgent: text('user_agent'),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
userId: uuid('user_id')
|
||||
.references(() => users.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
token: text('token').notNull().unique(),
|
||||
expiresAt: timestamp('expires_at').notNull(),
|
||||
ipAddress: text('ip_address'),
|
||||
userAgent: text('user_agent'),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
});
|
||||
|
||||
// Better Auth Accounts (for OAuth providers)
|
||||
export const accounts = pgTable('accounts', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
|
||||
providerId: text('provider_id').notNull(), // 'credential', 'google', 'apple', etc.
|
||||
accountId: text('account_id').notNull(), // Provider's user ID or email for credential
|
||||
accessToken: text('access_token'),
|
||||
refreshToken: text('refresh_token'),
|
||||
accessTokenExpiresAt: timestamp('access_token_expires_at'),
|
||||
refreshTokenExpiresAt: timestamp('refresh_token_expires_at'),
|
||||
scope: text('scope'),
|
||||
password: text('password'), // Hashed, only for credential provider
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
userId: uuid('user_id')
|
||||
.references(() => users.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
providerId: text('provider_id').notNull(), // 'credential', 'google', 'apple', etc.
|
||||
accountId: text('account_id').notNull(), // Provider's user ID or email for credential
|
||||
accessToken: text('access_token'),
|
||||
refreshToken: text('refresh_token'),
|
||||
accessTokenExpiresAt: timestamp('access_token_expires_at'),
|
||||
refreshTokenExpiresAt: timestamp('refresh_token_expires_at'),
|
||||
scope: text('scope'),
|
||||
password: text('password'), // Hashed, only for credential provider
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
});
|
||||
|
||||
// Better Auth Verification Tokens
|
||||
export const verifications = pgTable('verifications', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
identifier: text('identifier').notNull(), // email or other identifier
|
||||
value: text('value').notNull(), // the token
|
||||
expiresAt: timestamp('expires_at').notNull(),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
identifier: text('identifier').notNull(), // email or other identifier
|
||||
value: text('value').notNull(), // the token
|
||||
expiresAt: timestamp('expires_at').notNull(),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
});
|
||||
|
||||
export type Session = typeof sessions.$inferSelect;
|
||||
|
|
|
|||
|
|
@ -1,15 +1,15 @@
|
|||
import { pgTable, uuid, text, timestamp, integer } from 'drizzle-orm/pg-core';
|
||||
|
||||
export const categories = pgTable('categories', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
name: text('name').notNull().unique(),
|
||||
displayName: text('display_name').notNull(),
|
||||
description: text('description'),
|
||||
icon: text('icon'),
|
||||
color: text('color'),
|
||||
priority: integer('priority').default(0).notNull(),
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
name: text('name').notNull().unique(),
|
||||
displayName: text('display_name').notNull(),
|
||||
description: text('description'),
|
||||
icon: text('icon'),
|
||||
color: text('color'),
|
||||
priority: integer('priority').default(0).notNull(),
|
||||
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
});
|
||||
|
||||
export type Category = typeof categories.$inferSelect;
|
||||
|
|
|
|||
|
|
@ -1,31 +1,48 @@
|
|||
import { pgTable, uuid, timestamp, boolean, real, integer, index, unique } from 'drizzle-orm/pg-core';
|
||||
import {
|
||||
pgTable,
|
||||
uuid,
|
||||
timestamp,
|
||||
boolean,
|
||||
real,
|
||||
integer,
|
||||
index,
|
||||
unique,
|
||||
} from 'drizzle-orm/pg-core';
|
||||
import { users } from './users';
|
||||
import { articles } from './articles';
|
||||
|
||||
export const userArticleInteractions = pgTable('user_article_interactions', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
|
||||
articleId: uuid('article_id').references(() => articles.id, { onDelete: 'cascade' }).notNull(),
|
||||
export const userArticleInteractions = pgTable(
|
||||
'user_article_interactions',
|
||||
{
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
userId: uuid('user_id')
|
||||
.references(() => users.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
articleId: uuid('article_id')
|
||||
.references(() => articles.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
|
||||
// Interaction states
|
||||
isRead: boolean('is_read').default(false).notNull(),
|
||||
isSaved: boolean('is_saved').default(false).notNull(),
|
||||
readProgress: real('read_progress').default(0), // 0.0 to 1.0
|
||||
rating: integer('rating'), // 1-5
|
||||
shareCount: integer('share_count').default(0).notNull(),
|
||||
// Interaction states
|
||||
isRead: boolean('is_read').default(false).notNull(),
|
||||
isSaved: boolean('is_saved').default(false).notNull(),
|
||||
readProgress: real('read_progress').default(0), // 0.0 to 1.0
|
||||
rating: integer('rating'), // 1-5
|
||||
shareCount: integer('share_count').default(0).notNull(),
|
||||
|
||||
// Timestamps
|
||||
openedAt: timestamp('opened_at'),
|
||||
readAt: timestamp('read_at'),
|
||||
savedAt: timestamp('saved_at'),
|
||||
ratedAt: timestamp('rated_at'),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
}, (table) => [
|
||||
unique('user_article_unique').on(table.userId, table.articleId),
|
||||
index('interactions_user_idx').on(table.userId),
|
||||
index('interactions_article_idx').on(table.articleId),
|
||||
]);
|
||||
// Timestamps
|
||||
openedAt: timestamp('opened_at'),
|
||||
readAt: timestamp('read_at'),
|
||||
savedAt: timestamp('saved_at'),
|
||||
ratedAt: timestamp('rated_at'),
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
},
|
||||
(table) => [
|
||||
unique('user_article_unique').on(table.userId, table.articleId),
|
||||
index('interactions_user_idx').on(table.userId),
|
||||
index('interactions_article_idx').on(table.articleId),
|
||||
]
|
||||
);
|
||||
|
||||
export type UserArticleInteraction = typeof userArticleInteractions.$inferSelect;
|
||||
export type NewUserArticleInteraction = typeof userArticleInteractions.$inferInsert;
|
||||
|
|
|
|||
|
|
@ -4,25 +4,25 @@ export const userTierEnum = pgEnum('user_tier', ['free', 'premium', 'enterprise'
|
|||
export const readingSpeedEnum = pgEnum('reading_speed', ['slow', 'normal', 'fast']);
|
||||
|
||||
export const users = pgTable('users', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
email: text('email').notNull().unique(),
|
||||
name: text('name'),
|
||||
avatarUrl: text('avatar_url'),
|
||||
emailVerified: boolean('email_verified').default(false).notNull(),
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
email: text('email').notNull().unique(),
|
||||
name: text('name'),
|
||||
avatarUrl: text('avatar_url'),
|
||||
emailVerified: boolean('email_verified').default(false).notNull(),
|
||||
|
||||
// Preferences
|
||||
tier: userTierEnum('tier').default('free').notNull(),
|
||||
readingSpeed: readingSpeedEnum('reading_speed').default('normal').notNull(),
|
||||
preferredCategories: text('preferred_categories').array(),
|
||||
blockedSources: text('blocked_sources').array(),
|
||||
// Preferences
|
||||
tier: userTierEnum('tier').default('free').notNull(),
|
||||
readingSpeed: readingSpeedEnum('reading_speed').default('normal').notNull(),
|
||||
preferredCategories: text('preferred_categories').array(),
|
||||
blockedSources: text('blocked_sources').array(),
|
||||
|
||||
// Settings
|
||||
onboardingCompleted: boolean('onboarding_completed').default(false).notNull(),
|
||||
notificationSettings: text('notification_settings'), // JSON string
|
||||
// Settings
|
||||
onboardingCompleted: boolean('onboarding_completed').default(false).notNull(),
|
||||
notificationSettings: text('notification_settings'), // JSON string
|
||||
|
||||
// Timestamps
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
// Timestamps
|
||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
});
|
||||
|
||||
export type User = typeof users.$inferSelect;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue