Class Diagrams for JsonDbApp¶
Overview¶
This document contains updated class diagrams for the JsonDbApp library, optimised for minimal Drive API usage and adherence to SOLID principles. The diagrams reflect the separation of concerns for Collection and FileService components in the MVP.
- Class Diagrams for JsonDbApp
- Overview
- Main Classes
- Database Class Diagram
- DatabaseConfig Class Diagram
- Collection Facade and Operations
- DocumentOperations Class Diagram
- CollectionMetadata Class Diagram
- FileService Class Diagram
- FileOperations Class Diagram
- QueryEngine
- UpdateEngine Class Diagram
- IdGenerator Class Diagram
- DbLockService Class Diagram
- JDbLogger Class Diagram
- ErrorHandler Class Diagram
- JsonDbError Class Diagram
- Specific Error Classes
- MasterIndex Class Diagram
- Class Relationships
- Sequence Diagrams
Main Classes¶
Database Class Diagram¶
classDiagram
class Database {
-_config: DatabaseConfig
-_masterIndex: MasterIndex
-_fileService: FileService
-_logger: JDbLogger
-_collectionCoordinator: CollectionCoordinator
-_initialised: boolean
-_collections: Map
+constructor(config)
+initialise(): void
+getCollection(name): Collection
+createCollection(name): Collection
+listCollections(): String[]
+deleteCollection(name): void
+backupIndexToDrive(): void
+createAndInitialiseDatabase(config): Database
+loadDatabase(config): Database
-_findOrCreateIndexFile(): String
-_createIndexFile(): String
-_findExistingIndexFile(): String
-_loadCollections(): void
-_createCollection(name, fileId): Collection
}
DatabaseConfig Class Diagram¶
classDiagram
class DatabaseConfig {
+rootFolderId: String
+autoCreateCollections: Boolean
+lockTimeout: Number
+cacheEnabled: Boolean
+logLevel: String
+masterIndexKey: String
+retryAttempts: Number
+retryDelayMs: Number
+constructor(config: Object)
+clone(): DatabaseConfig
+toJSON(): Object
+fromJSON(obj: Object): DatabaseConfig
-_getDefaultRootFolder(): String
-_validateConfig(): void
}
Collection Facade and Operations¶
The Collection class acts as a facade, delegating operations to specialized handler classes.
classDiagram
Collection "1" --o "1" CollectionReadOperations
Collection "1" --o "1" CollectionWriteOperations
class Collection {
-_name: String
-_driveFileId: String
-_database: Database
-_fileService: FileService
-_logger: JDbLogger
-_loaded: Boolean
-_dirty: Boolean
-_documents: Object
-_metadata: CollectionMetadata
-_documentOperations: DocumentOperations
-_coordinator: CollectionCoordinator
-_readOps: CollectionReadOperations
-_writeOps: CollectionWriteOperations
+constructor(name, driveFileId, database, fileService)
+insertOne(doc): Object
+updateOne(filterOrId, update): Object
+updateMany(filter, update): Object
+replaceOne(filterOrId, doc): Object
+deleteOne(filter): Object
+deleteMany(filter): Object
+findOne(filter): Object|null
+find(filter): Array~Object~
+countDocuments(filter): Number
+aggregate(pipeline): Array
+save(): Object
+getMetadata(): Object
+getName(): String
+isDirty(): Boolean
+getDriveFileId(): String
+getDatabase(): Database
+getFileService(): FileService
+getLogger(): JDbLogger
-_ensureLoaded(): void
-_loadData(): void
-_saveData(): void
-_markDirty(): void
-_updateMetadata(changes): void
-_validateFilter(filter, operation): void
}
class CollectionReadOperations {
-_collection: Collection
+constructor(collection)
+findOne(filter): Object|null
+find(filter): Array~Object~
+countDocuments(filter): Number
+aggregate(pipeline): Array
}
class CollectionWriteOperations {
-_collection: Collection
-_coordinator: CollectionCoordinator
+constructor(collection)
+insertOne(doc): Object
+updateOne(filterOrId, update): Object
+updateMany(filter, update): Object
+replaceOne(filterOrId, doc): Object
+deleteOne(filter): Object
+deleteMany(filter): Object
-_updateOneWithOperators(filter, update): Object
-_updateOneWithReplacement(filter, update): Object
}
DocumentOperations Class Diagram¶
classDiagram
class DocumentOperations {
-_collection: Collection
-_logger: JDbLogger
-_queryEngine: QueryEngine
-_updateEngine: UpdateEngine
+constructor(collection, logger, queryEngine, updateEngine)
+insert(doc): Object
+find(query): Object[]
+findOne(query): Object
+count(query): Number
+updateOne(query, update): Object
+updateMany(query, update): Object
+replaceOne(query, replacement): Object
+deleteOne(query): Object
+deleteMany(query): Object
-_validateDoc(doc): void
-_validateId(id): void
}
CollectionMetadata Class Diagram¶
classDiagram
class CollectionMetadata {
+name: String
+fileId: String
+created: Date
+lastUpdated: Date
+documentCount: Number
+modificationToken: String | null
+lockStatus: Object | null
+constructor(name: String, fileId: String, initialMetadata?: Object)
+updateLastModified(): void
+touch(): void
+incrementDocumentCount(): void
+decrementDocumentCount(): void
+setDocumentCount(count: Number): void
+getModificationToken(): String | null
+setModificationToken(token: String | null): void
+getLockStatus(): Object | null
+setLockStatus(lockStatus: Object | null): void
+toJSON(): Object
+clone(): CollectionMetadata
+fromJSON(obj: Object): CollectionMetadata
+create(name: String, fileId: String): CollectionMetadata
}
FileService Class Diagram¶
classDiagram
class FileService {
- _fileOps: FileOperations
- _logger: JDbLogger
- _cache: Map~String,Object~
- _maxCacheSize: Number
- _cacheEnabled: Boolean
+readFile(fileId): Object
+writeFile(fileId, data): void
+createFile(name, data, folderId): String
+deleteFile(fileId): Boolean
+fileExists(fileId): Boolean
+getFileMetadata(fileId): Object
+batchReadFiles(fileIds): Array~Object~
+batchGetMetadata(fileIds): Array~Object~
+clearCache(): void
+getCacheStats(): Object
+setCacheEnabled(enabled): void
-_addToCache(fileId, content): void
}
FileOperations Class Diagram¶
classDiagram
class FileOperations {
- _logger: JDbLogger
- _maxRetries: Number
- _retryDelayMs: Number
+readFile(fileId): Object
+writeFile(fileId, data): void
+createFile(name, data, folderId): String
+deleteFile(fileId): Boolean
+fileExists(fileId): Boolean
+getFileMetadata(fileId): Object
-_handleDriveApiError(error, op, fileId): void
-_retryOperation(fn, operationName): *
}
QueryEngine¶
classDiagram
class QueryEngine {
-_logger: JDbLogger
-_config: Object
+constructor(logger, config)
+find(documents, query): Object[]
-_matchDocument(doc, query): boolean
-_matchField(value, query): boolean
-_validateQuery(query): void
-_validateOperator(operator, field, query): void
-_validateLogicalQuery(operator, subQueries): void
-_validateComparisonQuery(operator, queryValue): void
}
UpdateEngine Class Diagram¶
classDiagram
class UpdateEngine {
-_logger: JDbLogger
-_operatorHandlers: Map
+constructor(logger)
+applyOperators(doc, updateQuery): Object
-_applyUpdate(doc, field, operator, value): void
-_validateUpdateQuery(updateQuery): void
-_getUpdateOperations(updateQuery): Object[]
- _handleSet(doc, field, value)
- _handleInc(doc, field, value)
- _handleMul(doc, field, value)
- _handleMin(doc, field, value)
- _handleMax(doc, field, value)
- _handlePush(doc, field, value)
- _handlePull(doc, field, value)
- _handleAddToSet(doc, field, value)
}
IdGenerator Class Diagram¶
classDiagram
class IdGenerator {
+generateUUID(): String
+generateFallbackUUID(): String
+generateTimestampId(prefix): String
+generateShortId(length): String
+generateAlphanumericId(length): String
+generateNumericId(length): String
+generateObjectId(): String
+generateSequentialId(prefix): String
+generateReadableId(): String
+isValidUUID(id): Boolean
+isValidObjectId(id): Boolean
+getDefaultGenerator(): Function
+createCustomGenerator(options): Function
}
DbLockService Class Diagram¶
classDiagram
class DbLockService {
-_logger: JDbLogger
-_lockTimeout: Number
-_scriptLock: Lock | null
+constructor(logger, lockTimeout)
+acquireScriptLock(): void
+releaseScriptLock(): void
-_getScriptLock(): Lock
}
JDbLogger Class Diagram¶
classDiagram
class JDbLogger {
+LOG_LEVELS: Object
+currentLevel: Number
+setLevel(level): void
+setLevelByName(levelName): void
+getLevel(): Number
+getLevelName(): String
+formatMessage(level, message, context): String
+error(message, context): void
+warn(message, context): void
+info(message, context): void
+debug(message, context): void
+log(level, message, context): void
+createComponentLogger(component): Object
+startOperation(operation, context): void
+endOperation(operation, duration, context): void
+timeOperation(operation, fn, context): *
}
ErrorHandler Class Diagram¶
classDiagram
class ErrorHandler {
+ErrorTypes: Object
+createError(errorType, ...args): Error
+handleError(error, context, rethrow): void
+wrapFunction(fn, context): Function
+isErrorType(error, errorType): Boolean
+extractErrorInfo(error): Object
+validateRequired(value, name): void
+validateType(value, expectedType, name): void
+validateNotEmpty(value, name): void
+validateNotEmptyArray(value, name): void
+validateRange(value, min, max, name): void
+detectDoubleParsing(data, parseError, context): void
}
JsonDbError Class Diagram¶
classDiagram
class JsonDbError {
+name: String
+message: String
+code: String
+context: Object
+timestamp: Date
+constructor(message, code, context): void
+toJSON(): Object
}
Specific Error Classes¶
classDiagram
JsonDbError <|-- ConfigurationError
JsonDbError <|-- InvalidArgumentError
JsonDbError <|-- DatabaseStateError
JsonDbError <|-- FileIOError
JsonDbError <|-- FileNotFoundError
JsonDbError <|-- MasterIndexError
JsonDbError <|-- CollectionNotFoundError
JsonDbError <|-- DocumentNotFoundError
JsonDbError <|-- DuplicateKeyError
JsonDbError <|-- InvalidQueryError
JsonDbError <|-- UpdateOperationError
JsonDbError <|-- LockTimeoutError
JsonDbError <|-- ConflictError
JsonDbError <|-- OperationError
JsonDbError <|-- SerializationError
JsonDbError <|-- DeserializationError
class ConfigurationError { +constructor(message) }
class InvalidArgumentError { +constructor(argName, value, message) }
class DatabaseStateError { +constructor(message) }
class FileIOError { +constructor(operation, fileId, message) }
class FileNotFoundError { +constructor(fileId) }
class MasterIndexError { +constructor(message) }
class CollectionNotFoundError { +constructor(collectionName) }
class DocumentNotFoundError { +constructor(query, collectionName) }
class DuplicateKeyError { +constructor(key, value) }
class InvalidQueryError { +constructor(message) }
class UpdateOperationError { +constructor(message) }
class LockTimeoutError { +constructor(lockName, timeout) }
class ConflictError { +constructor(message) }
class OperationError { +constructor(message) }
class SerializationError { +constructor(message) }
class DeserializationError { +constructor(message) }
MasterIndex Class Diagram¶
classDiagram
class MasterIndex {
-_dbLockService: DbLockService
-_logger: JDbLogger
-_config: Object
-_masterIndexData: MasterIndexData
-_isInitialised: boolean
+constructor(dbLockService, logger, config)
+load(): void
+isInitialised(): boolean
+addCollections(collections): void
+getCollectionMetadata(collectionName): Object
+updateCollectionMetadata(collectionName, metadata): void
+getAllCollections(): Object
+removeCollection(collectionName): void
+acquireCollectionLock(collectionName, operationId): Object
+releaseCollectionLock(collectionName, operationId): void
+getCollectionLockStatus(collectionName): Object
+cleanupExpiredLocks(): void
+save(): void
-_loadFromScriptProperties(): void
-_saveToScriptProperties(): void
-_withScriptLock(operation): *
-_isLockExpired(lock): boolean
}
class MasterIndexData {
version: String
lastUpdated: String
collections: Map
}
MasterIndex "1" -- "1" MasterIndexData : contains
Class Relationships¶
classDiagram
Database "1" -- "1" DatabaseConfig : uses
Database "1" -- "*" Collection : creates
DatabaseConfig "1" -- "1" Collection : configures
Collection "1" -- "1" CollectionMetadata : contains
Collection "1" -- "1" DocumentOperations : contains
DocumentOperations "1" -- "1" QueryEngine : uses
DocumentOperations "1" -- "1" UpdateEngine : uses
QueryEngine "1" -- "1" ErrorHandler : uses
UpdateEngine "1" -- "1" ErrorHandler : uses
ErrorHandler "1" -- "1" IdGenerator : uses
ErrorHandler "1" -- "1" DbLockService : uses
Database "1" -- "1" FileService : uses
FileService "1" -- "1" Collection : uses
FileService "1" -- "1" FileCache : contains
FileService "1" -- "1" FileOperations : contains
FileOperations "1" -- "1" JDbLogger : uses
Sequence Diagrams¶
Document Operation Sequence¶
sequenceDiagram
participant Client
participant Collection
participant DocumentOperations
participant FileService
Client->>Collection: find(query)
Collection->>Collection: ensureLoaded()
Collection->>DocumentOperations: findDocuments(query)
DocumentOperations->>DocumentOperations: executeQuery()
DocumentOperations-->>Collection:
Collection-->>Client: matching documents
File Operation Sequence¶
sequenceDiagram
participant C as Collection
participant FS as FileService
participant FO as FileOperations
participant FC as FileCache
C->>FS: loadData()
FS->>FC: getCachedFile()
FC-->>FS: (data if cached)
alt cache miss
FS->>FO: readFile()
FO-->>FS: file content
FS->>FC: setFile()
end
FS-->>C: file data