Files
homelab-frontend/internal/serviceadapter/adapters.go
T
Admin Bot e8ee03c8fc
CI / CI (pull_request) Successful in 2m55s
feat(sessions): add SessionAdapter — REST CRUD for sessions/milestones/episodes (#50)
New internal/sessions package with Handler bridging 7 REST endpoints to:
- POST /memory/ingest on poimen-memory:8080 (writes)
- GraphQL hybridSearch/entity on poimen-graphql:8090 (reads)

Adapter registration: X-Service: sessions with resources sessions,
session, milestones, episodes, episode. IDs via query params
(?session_id=, ?episode_id=) — dispatcher does not substitute path params.

episode_id = sha256(session_id+milestone_id+attempt) per §4.14 Q6.
Content JSON-encoded (prevents key:value injection on user fields).
Limit capped at 200. GraphQL error body detected and surfaced as 502.
tracing.NewTransport wired for cross-service trace propagation.
JWT forwarded to both upstreams for auth.

30 tests in handler_test.go covering all 7 handlers + EpisodeID helper.

Closes #50
2026-09-28 09:39:19 +08:00

38 lines
865 B
Go

package serviceadapter
// SQSAdapter handles X-Service: sqs requests.
type SQSAdapter struct{}
// S3Adapter handles X-Service: s3 requests.
type S3Adapter struct{}
// IAMAdapter handles X-Service: iam requests.
type IAMAdapter struct{}
// MemoryAdapter handles X-Service: memory requests (core + extended).
type MemoryAdapter struct{
// Extended resources: notes, context, nodes (git-aware)
// Requires M3.5.6+, M3.7.7+, M3.7.8+, M3.5.9
}
// AdapterFactory creates adapters by type.
func AdapterFactory(serviceName string) interface{} {
switch serviceName {
case "workflow":
return &WorkflowAdapter{}
case "sqs":
return &SQSAdapter{}
case "s3":
return &S3Adapter{}
case "iam":
return &IAMAdapter{}
case "memory":
return &MemoryAdapter{}
case "sessions":
// code-registered; see NewSessionAdapter()
return nil
default:
return nil
}
}