LinkSyncServer: - Fix app.py imports, add CORS middleware, lifespan events - Create api/routes.py router aggregator - Create config/settings.py for centralized configuration - Rewrite models/base.py with proper relationships and serialization - Rewrite all API endpoints with real DB integration (auth, links, collections, sync, queries, tags) - Add admin endpoints (user management, stats, audit log) - Complete query parser with recursive descent and proper precedence - Complete query executor with set operations and field filters - Set up Alembic migrations with initial schema - Create web interface (templates, CSS, JS) - Add 42 passing tests (auth, links, collections, queries) - Add deploy.ps1 and deploy.sh scripts - Update README with deployment workflow LinkSyncExtension: - Create utils/api.js (REST client with retries, auth, error handling) - Create utils/sync.js (3 sync modes + conflict detection) - Create utils/collection.js (collection management) - Create utils/query-engine.js (client-side query parser) - Rewrite background.js (sync loop, bookmark events, message routing) - Rewrite popup.js (tabs, settings modal, notifications, CRUD) - Update popup.html (tabbed interface, query builder, modal) - Update popup.css (full redesign) - Create content/content.js (page metadata extraction) - Create options.html/js (dedicated settings page) - Generate icons (48x48, 96x96) - Update manifest.json (host permissions, content scripts, options) - Create AGENTS.md
52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
// LinkSync Collection Management
|
|
// Handles collection CRUD and query execution
|
|
|
|
const CollectionManager = {
|
|
async listCollections() {
|
|
return API.getCollections();
|
|
},
|
|
|
|
async createCollection(name, description, queryType, queryExpression, isPublic) {
|
|
return API.createCollection({
|
|
name,
|
|
description: description || "",
|
|
query_type: queryType || "static",
|
|
query_expression: queryExpression || null,
|
|
is_public: isPublic || false,
|
|
link_ids: [],
|
|
});
|
|
},
|
|
|
|
async updateCollection(id, data) {
|
|
return API.updateCollection(id, data);
|
|
},
|
|
|
|
async deleteCollection(id) {
|
|
return API.deleteCollection(id);
|
|
},
|
|
|
|
async refreshCollection(id) {
|
|
return API.refreshCollection(id);
|
|
},
|
|
|
|
async addLinksToCollection(collectionId, linkIds) {
|
|
return API.post(`/api/collections/${collectionId}/add-links`, linkIds);
|
|
},
|
|
|
|
async removeLinksFromCollection(collectionId, linkIds) {
|
|
return API.delete(`/api/collections/${collectionId}/remove-links`, { body: linkIds });
|
|
},
|
|
|
|
async executeQuery(expression, limit = 50) {
|
|
return API.executeQuery(expression, limit);
|
|
},
|
|
|
|
async parseQuery(expression) {
|
|
return API.parseQuery(expression);
|
|
},
|
|
|
|
async createDynamicCollection(name, description, queryExpression) {
|
|
return this.createCollection(name, description, "dynamic", queryExpression, false);
|
|
},
|
|
};
|