docs(scanner): Beam batch 7 — all 10 scanner endpoints backfilled
Scanner surface frontmatter'd (scan/start/stop/cancel/status/active/
active-summary + watch start/stop/status) with provenance comments;
active-summary on a non-admin group.
Claude registry: 10 entries. Fixed handler drift Beam missed: scan_library
request has no "recursive"; scanner/start binds folder_paths (not
invented interval_seconds); scanner/stop binds no body; response is
{message, job_id, status} with 409 coalescing variant
{error, active_job_id}.
Gate fix in drift_test seed: registerScannerRoutes group seeds used bare
"jwt"/"admin" tokens invisible to authLabel; and silently passed before
only because the seeded set was unchecked. Seeds now 'jwtMiddleware'/
'AdminMiddleware' markers. Also: cleanup of a stale-merge-script residue
in collections/update_rule.md example (extra null keys). make test 9/9.
This commit is contained in:
1 parent
25ef0d12ba
commit
2c56ae4b9d
13 files changed
+238
-61
No files matched your search
@@ -70,8 +70,11 @@ func extractRoutesFromRouterSource(t *testing.T) map[string]extractedRoute {
|
||||
// names the call site actually passes (router.go: protected=/api jwt,
|
||||
// admin=/api jwt+admin).
|
||||
if base == "scanner.go" {
|
||||
groups["protected"] = group{prefix: "/api", middleware: []string{"jwt"}}
|
||||
groups["admin"] = group{prefix: "/api", middleware: []string{"jwt", "admin"}}
|
||||
// Middleware values must carry the marker substrings authLabel
|
||||
// matches on (AdminMiddleware, createJWTMiddleware) — the seeded
|
||||
// "jwt"/"admin" tokens were invisible to it.
|
||||
groups["protected"] = group{prefix: "/api", middleware: []string{"jwtMiddleware"}}
|
||||
groups["admin"] = group{prefix: "/api", middleware: []string{"jwtMiddleware", "AdminMiddleware"}}
|
||||
}
|
||||
raw, err := os.ReadFile(file)
|
||||
if err != nil {
|
||||
|
||||
+57
-4
@@ -599,11 +599,64 @@ var Schemas = map[string]Schema{
|
||||
Response: json.RawMessage(`{"status": "reordered"}`),
|
||||
},
|
||||
"PUT /api/collections/:id/rules/:ruleId": {
|
||||
// Inline anonymous request struct — pinned by sample.
|
||||
Request: json.RawMessage(`{"rule": {}}`),
|
||||
// Handler is SetRuleEnabled: toggle only, request {enabled required},
|
||||
// response {collection_id, is_smart}.
|
||||
Request: json.RawMessage(`{"enabled": false}`),
|
||||
Response: json.RawMessage(`{
|
||||
"id": "", "collection_id": "", "field": "", "operator": "",
|
||||
"value": "", "priority": 0, "enabled": false, "is_smart": false
|
||||
"collection_id": "", "is_smart": false
|
||||
}`),
|
||||
},
|
||||
|
||||
// --- Beam batch 7: scanner ---
|
||||
"POST /api/scanner/scan": {
|
||||
Request: handlers.ScanLibraryRequest{},
|
||||
// 202 Accepted; 409 coalescing variant adds {active_job_id}.
|
||||
Response: json.RawMessage(`{
|
||||
"message": "", "job_id": "", "status": ""
|
||||
}`),
|
||||
},
|
||||
"POST /api/scanner/start": {
|
||||
// Starts the long-lived watch scanner over folder_paths.
|
||||
Request: handlers.ScanLibraryRequest{},
|
||||
Response: json.RawMessage(`{"message": ""}`),
|
||||
},
|
||||
"POST /api/scanner/stop": {
|
||||
Response: json.RawMessage(`{"message": ""}`),
|
||||
},
|
||||
"GET /api/scanner/status/:jobId": {
|
||||
// result is interface{} (job payload). 404 {error} when unknown job.
|
||||
Response: json.RawMessage(`{
|
||||
"job_id": "", "status": "", "error": "", "result": null,
|
||||
"progress": 0, "files_scanned": 0, "new_items": 0, "errors": 0
|
||||
}`),
|
||||
},
|
||||
"GET /api/scanner/active": {
|
||||
// jobs are []JobResult (job_id/status/progress/files_scanned/...).
|
||||
Response: json.RawMessage(`{
|
||||
"scanning": false, "jobs": []
|
||||
}`),
|
||||
},
|
||||
"GET /api/scanner/active-summary": {
|
||||
Response: json.RawMessage(`{
|
||||
"scanning": false, "progress": 0
|
||||
}`),
|
||||
},
|
||||
"POST /api/scanner/cancel/:jobId": {
|
||||
Response: json.RawMessage(`{
|
||||
"message": "", "job_id": "", "status": ""
|
||||
}`),
|
||||
},
|
||||
"POST /api/scanner/watch/start": {
|
||||
Request: json.RawMessage(`{"library_id": ""}`),
|
||||
Response: json.RawMessage(`{"message": "", "library_id": ""}`),
|
||||
},
|
||||
"POST /api/scanner/watch/stop": {
|
||||
Request: json.RawMessage(`{"library_id": ""}`),
|
||||
Response: json.RawMessage(`{"message": "", "library_id": ""}`),
|
||||
},
|
||||
"GET /api/scanner/watch/status": {
|
||||
Response: json.RawMessage(`{
|
||||
"watching_libraries": [""], "total_watching": 0
|
||||
}`),
|
||||
},
|
||||
}
|
||||
Reference in new issue
Block a user