Add ability to analyze content and create personal reading notes

Implements analysis result and annotation methods with in-memory storage for managing work analysis and user annotations.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: cbacfb18-842a-4116-a907-18c0105ad8ec
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/39b5c689-6e8a-4d5a-9792-69cc81a56534/6727ab9c-0666-4f48-a09c-58761e6a20ea.jpg
This commit is contained in:
mukimovd 2025-05-08 00:16:22 +00:00
parent 07e354075e
commit 14a42223a8

View File

@ -12,7 +12,9 @@ import {
collectionItems, CollectionItem, InsertCollectionItem, collectionItems, CollectionItem, InsertCollectionItem,
timelineEvents, TimelineEvent, InsertTimelineEvent, timelineEvents, TimelineEvent, InsertTimelineEvent,
blogPosts, BlogPost, InsertBlogPost, blogPosts, BlogPost, InsertBlogPost,
readingProgress, ReadingProgress, InsertReadingProgress readingProgress, ReadingProgress, InsertReadingProgress,
AnalysisResult, InsertAnalysisResult,
Annotation, InsertAnnotation
} from "@shared/schema"; } from "@shared/schema";
export interface IStorage { export interface IStorage {
@ -94,6 +96,19 @@ export interface IStorage {
searchWorks(query: string, limit?: number): Promise<Work[]>; searchWorks(query: string, limit?: number): Promise<Work[]>;
searchAuthors(query: string, limit?: number): Promise<Author[]>; searchAuthors(query: string, limit?: number): Promise<Author[]>;
filterWorks(params: { language?: string, type?: string, yearStart?: number, yearEnd?: number, tags?: number[] }): Promise<Work[]>; filterWorks(params: { language?: string, type?: string, yearStart?: number, yearEnd?: number, tags?: number[] }): Promise<Work[]>;
// Analysis methods
getAnalysisResultsByWorkId(workId: number): Promise<AnalysisResult[]>;
getAnalysisResultById(id: number): Promise<AnalysisResult | undefined>;
getAnalysisResultByWorkAndType(workId: number, type: string): Promise<AnalysisResult | undefined>;
createAnalysisResult(result: InsertAnalysisResult): Promise<AnalysisResult>;
// Annotation methods
getAnnotationsByWorkId(workId: number): Promise<Annotation[]>;
getAnnotationsByTranslationId(translationId: number): Promise<Annotation[]>;
getAnnotationsByLine(workId: number, lineNumber: number, translationId?: number): Promise<Annotation[]>;
getAnnotationById(id: number): Promise<Annotation | undefined>;
createAnnotation(annotation: InsertAnnotation): Promise<Annotation>;
} }
export class MemStorage implements IStorage { export class MemStorage implements IStorage {
@ -112,6 +127,8 @@ export class MemStorage implements IStorage {
private timelineEvents: Map<number, TimelineEvent>; private timelineEvents: Map<number, TimelineEvent>;
private blogPosts: Map<number, BlogPost>; private blogPosts: Map<number, BlogPost>;
private readingProgresses: Map<string, ReadingProgress>; private readingProgresses: Map<string, ReadingProgress>;
private analysisResults: Map<number, AnalysisResult>;
private annotations: Map<number, Annotation>;
private userId: number = 1; private userId: number = 1;
private authorId: number = 1; private authorId: number = 1;
@ -126,6 +143,8 @@ export class MemStorage implements IStorage {
private timelineEventId: number = 1; private timelineEventId: number = 1;
private blogPostId: number = 1; private blogPostId: number = 1;
private readingProgressId: number = 1; private readingProgressId: number = 1;
private analysisResultId: number = 1;
private annotationId: number = 1;
constructor() { constructor() {
this.users = new Map(); this.users = new Map();
@ -143,6 +162,8 @@ export class MemStorage implements IStorage {
this.timelineEvents = new Map(); this.timelineEvents = new Map();
this.blogPosts = new Map(); this.blogPosts = new Map();
this.readingProgresses = new Map(); this.readingProgresses = new Map();
this.analysisResults = new Map();
this.annotations = new Map();
// Initialize with some data // Initialize with some data
this.initializeData(); this.initializeData();