{"openapi":"3.1.0","info":{"title":"WorkLog API","description":"Logging & tracking API — logs.rizal.studio","version":"1.0.0"},"paths":{"/daily":{"get":{"summary":"Daily","description":"Get daily work logs.\n\nReturns all public work logs for a specific date.\nDate format: YYYY-MM-DD (default: today UTC).","operationId":"daily_daily_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"Date (YYYY-MM-DD), default: today","title":"Date"},"description":"Date (YYYY-MM-DD), default: today"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyLogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_name}":{"get":{"summary":"Project","description":"Get logs for a specific project.\n\nReturns public work logs filtered by project name.\nUse the folder name (e.g., \"unism-sso\", \"simkeu\", \"spmi\").","operationId":"project_project__project_name__get","parameters":[{"name":"project_name","in":"path","required":true,"schema":{"type":"string","title":"Project Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectLogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats":{"get":{"summary":"Stats","description":"Get aggregated statistics.\n\nReturns summary stats: total commits, projects, lines changed,\nbreakdown per project, and daily activity for last 30 days.","operationId":"stats_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}}}}},"/health":{"get":{"summary":"Health","description":"Health check endpoint.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/logs":{"post":{"summary":"Ingest Logs","description":"Ingest work logs from Local CLI.\n\nAccepts a batch of commits for a single project.\nDeduplicates by commit_hash.","operationId":"ingest_logs_api_logs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/logs/batch-status":{"get":{"summary":"Batch Status","description":"Get summary of ingested logs.","operationId":"batch_status_api_logs_batch_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/summarize":{"post":{"summary":"Summarize Logs","operationId":"summarize_logs_api_summarize_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummarizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/summarize/date":{"post":{"summary":"Summarize Date","operationId":"summarize_date_api_summarize_date_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Dashboard","operationId":"dashboard__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"CommitData":{"properties":{"project_name":{"type":"string","title":"Project Name"},"project_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Display Name"},"commit_hash":{"type":"string","title":"Commit Hash"},"commit_message":{"type":"string","title":"Commit Message"},"commit_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Body"},"author_name":{"type":"string","title":"Author Name"},"author_email":{"type":"string","title":"Author Email"},"committed_at":{"type":"string","format":"date-time","title":"Committed At"},"branch":{"type":"string","title":"Branch","default":"main"},"files_changed":{"type":"integer","title":"Files Changed","default":0},"insertions":{"type":"integer","title":"Insertions","default":0},"deletions":{"type":"integer","title":"Deletions","default":0},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]}},"type":"object","required":["project_name","commit_hash","commit_message","author_name","author_email","committed_at"],"title":"CommitData","description":"Single commit from ingest request."},"DailyLogResponse":{"properties":{"date":{"type":"string","title":"Date"},"date_iso":{"type":"string","title":"Date Iso"},"total_commits":{"type":"integer","title":"Total Commits"},"total_files_changed":{"type":"integer","title":"Total Files Changed"},"total_insertions":{"type":"integer","title":"Total Insertions"},"total_deletions":{"type":"integer","title":"Total Deletions"},"projects":{"items":{"type":"string"},"type":"array","title":"Projects"},"logs":{"items":{"$ref":"#/components/schemas/WorkLogPublic"},"type":"array","title":"Logs"}},"type":"object","required":["date","date_iso","total_commits","total_files_changed","total_insertions","total_deletions","projects","logs"],"title":"DailyLogResponse","description":"Response for /daily endpoint."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IngestRequest":{"properties":{"project":{"type":"string","title":"Project"},"project_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Display Name"},"branch":{"type":"string","title":"Branch"},"pusher":{"type":"string","title":"Pusher"},"pushed_at":{"type":"string","title":"Pushed At"},"commits":{"items":{"$ref":"#/components/schemas/CommitData"},"type":"array","title":"Commits"}},"type":"object","required":["project","branch","pusher","pushed_at","commits"],"title":"IngestRequest","description":"Request body for POST /api/logs."},"IngestResponse":{"properties":{"received":{"type":"integer","title":"Received"},"inserted":{"type":"integer","title":"Inserted"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["received","inserted","skipped","errors"],"title":"IngestResponse","description":"Response for POST /api/logs."},"ProjectLogResponse":{"properties":{"project_name":{"type":"string","title":"Project Name"},"project_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Display Name"},"total_commits":{"type":"integer","title":"Total Commits"},"logs":{"items":{"$ref":"#/components/schemas/WorkLogPublic"},"type":"array","title":"Logs"}},"type":"object","required":["project_name","project_display_name","total_commits","logs"],"title":"ProjectLogResponse","description":"Response for /project/{name} endpoint."},"StatsResponse":{"properties":{"total_projects":{"type":"integer","title":"Total Projects"},"total_commits":{"type":"integer","title":"Total Commits"},"total_insertions":{"type":"integer","title":"Total Insertions"},"total_deletions":{"type":"integer","title":"Total Deletions"},"date_range":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Date Range"},"commits_per_project":{"additionalProperties":{"type":"integer"},"type":"object","title":"Commits Per Project"},"commits_per_day":{"additionalProperties":{"type":"integer"},"type":"object","title":"Commits Per Day"}},"type":"object","required":["total_projects","total_commits","total_insertions","total_deletions","date_range","commits_per_project","commits_per_day"],"title":"StatsResponse","description":"Response for /stats endpoint."},"SummarizeResponse":{"properties":{"processed":{"type":"integer","title":"Processed"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["processed","skipped","errors"],"title":"SummarizeResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkLogPublic":{"properties":{"id":{"type":"integer","title":"Id"},"project_name":{"type":"string","title":"Project Name"},"project_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Display Name"},"commit_hash":{"type":"string","title":"Commit Hash"},"commit_message":{"type":"string","title":"Commit Message"},"commit_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Body"},"author_name":{"type":"string","title":"Author Name"},"committed_at":{"type":"string","format":"date-time","title":"Committed At"},"branch":{"type":"string","title":"Branch"},"files_changed":{"type":"integer","title":"Files Changed"},"insertions":{"type":"integer","title":"Insertions"},"deletions":{"type":"integer","title":"Deletions"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"ai_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary"}},"type":"object","required":["id","project_name","project_display_name","commit_hash","commit_message","commit_body","author_name","committed_at","branch","files_changed","insertions","deletions","tags","ai_summary"],"title":"WorkLogPublic","description":"Public work log response."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}