Driven adapter: ResourceRepository backed by declared manifest rows whose
content keys are resolved through a BlobStore on every read.
Mirrors InMemoryResourceRepository's query semantics exactly — same
methods, same listByModule / listByCourse "return everything" behaviour
because Resource does not currently carry moduleId / courseId fields.
The difference is the storage shape: rows hold opaque content KEYS in url,
and resolution happens here at read time rather than when the manifest is
written, so
the storage backend can change without touching the course manifests.
Driven adapter:
ResourceRepositorybacked by declared manifest rows whose content keys are resolved through aBlobStoreon every read.Mirrors
InMemoryResourceRepository's query semantics exactly — same methods, samelistByModule/listByCourse"return everything" behaviour becauseResourcedoes not currently carrymoduleId/courseIdfields. The difference is the storage shape: rows hold opaque content KEYS inurl, and resolution happens here at read time rather than when the manifest is written, so the storage backend can change without touching the course manifests.