feat: brain service — self-contained second brain knowledge manager
Full backend service with: - FastAPI REST API with CRUD, search, reprocess endpoints - PostgreSQL + pgvector for items and semantic search - Redis + RQ for background job processing - Meilisearch for fast keyword/filter search - Browserless/Chrome for JS rendering and screenshots - OpenAI structured output for AI classification - Local file storage with S3-ready abstraction - Gateway auth via X-Gateway-User-Id header - Own docker-compose stack (6 containers) Classification: fixed folders (Home/Family/Work/Travel/Knowledge/Faith/Projects) and fixed tags (28 predefined). AI assigns exactly 1 folder, 2-3 tags, title, summary, and confidence score per item. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,8 +4,9 @@ Platform Gateway — Session and service-connection helpers.
|
||||
|
||||
import secrets
|
||||
from datetime import datetime, timedelta
|
||||
import bcrypt
|
||||
|
||||
from config import SESSION_MAX_AGE
|
||||
from config import SESSION_MAX_AGE, DEV_AUTO_LOGIN_USERNAME, DEV_AUTO_LOGIN_DISPLAY_NAME
|
||||
from database import get_db
|
||||
|
||||
|
||||
@@ -52,6 +53,24 @@ def get_service_token(user_id, service):
|
||||
return dict(row) if row else None
|
||||
|
||||
|
||||
def get_or_create_dev_user():
|
||||
conn = get_db()
|
||||
row = conn.execute("SELECT * FROM users WHERE username = ?", (DEV_AUTO_LOGIN_USERNAME,)).fetchone()
|
||||
if row:
|
||||
conn.close()
|
||||
return dict(row)
|
||||
|
||||
pw_hash = bcrypt.hashpw(secrets.token_hex(16).encode(), bcrypt.gensalt()).decode()
|
||||
conn.execute(
|
||||
"INSERT INTO users (username, password_hash, display_name) VALUES (?, ?, ?)",
|
||||
(DEV_AUTO_LOGIN_USERNAME, pw_hash, DEV_AUTO_LOGIN_DISPLAY_NAME)
|
||||
)
|
||||
conn.commit()
|
||||
row = conn.execute("SELECT * FROM users WHERE username = ?", (DEV_AUTO_LOGIN_USERNAME,)).fetchone()
|
||||
conn.close()
|
||||
return dict(row) if row else None
|
||||
|
||||
|
||||
def set_service_token(user_id, service, auth_token, auth_type="bearer"):
|
||||
conn = get_db()
|
||||
conn.execute("""
|
||||
|
||||
Reference in New Issue
Block a user