Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions broker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,12 @@ Configuration is provided via environment variables:
| `CLIENT_DELAY` | Delay duration for outgoing ISO18626 messages | `0ms` |
| `SHUTDOWN_DELAY` | Delay duration for graceful shutdown (in-flight connections) | `15s` |
| `MAX_MESSAGE_SIZE` | Max accepted ISO18626 message size | `100KB` |
| `HOLDINGS_ADAPTER` | Holdings lookup method: `mock`, `sru` or `consortia` | `mock` |
| `HOLDINGS_ADAPTER` | Holdings lookup method: `mock`, `sru` or `consortium` | `mock` |
| `HOLDINGS_SRU_URL` | Comma separated list of URLs when `HOLDINGS_ADAPTER` is `sru` | `http://localhost:8081/sru` |
| `HOLDINGS_ISXN_LOOKUP` | Whether to use ISBN/ISSN lookup for `sru` method | `false` |
| `HOLDINGS_FORMAT` | Parser for SRU holdings: `reservoir`, `marc`, `opac` or `MARC-21plus-1` | `reservoir` |
| `CONSORTIA_SYMBOL` | Designates peer for which configuration is used for consortia. At this time, it is | (empty value) |
| | used when `HOLDINGS_ADAPTER` = `consortia`. | |
| `CONSORTIUM_SYMBOL` | Designates peer for which configuration is used for consortium. At this time, it is | (empty value) |
| | used when `HOLDINGS_ADAPTER` = `consortium`. | |
| `DIRECTORY_ADAPTER` | Directory lookup method: `mock` or `api` | `mock` |
| `DIRECTORY_API_URL` | Comma separated list of URLs when `DIRECTORY_ADAPTER` is `api` | `http://localhost:8081/directory/entries` |
| `AVAILABILITY_ADAPTER` | Availability adapter: `mock` , `zoom`, `metaproxy`. | `zoom` |
Expand Down
4 changes: 2 additions & 2 deletions broker/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ var HOLDINGS_ADAPTER = utils.GetEnv("HOLDINGS_ADAPTER", "mock")
var HOLDINGS_SRU_URL = common.GetEnvWithDeprecated("HOLDINGS_SRU_URL", "SRU_URL", "http://localhost:8081/sru")
var HOLDINGS_ISXN_LOOKUP, _ = utils.GetEnvBool("HOLDINGS_ISXN_LOOKUP", false)
var HOLDINGS_FORMAT = utils.GetEnv("HOLDINGS_FORMAT", "reservoir")
var CONSORTIA_SYMBOL = utils.GetEnv("CONSORTIA_SYMBOL", "")
var CONSORTIUM_SYMBOL = utils.GetEnv("CONSORTIUM_SYMBOL", "")
Comment thread
adamdickmeiss marked this conversation as resolved.
Comment thread
adamdickmeiss marked this conversation as resolved.
Comment thread
adamdickmeiss marked this conversation as resolved.
var DIRECTORY_ADAPTER = utils.GetEnv("DIRECTORY_ADAPTER", "mock")
var AVAILABILITY_ADAPTER = utils.GetEnv("AVAILABILITY_ADAPTER", "zoom")
var DIRECTORY_API_URL = utils.GetEnv("DIRECTORY_API_URL", "http://localhost:8081/directory/entries")
Expand Down Expand Up @@ -181,7 +181,7 @@ func Init(ctx context.Context) (Context, error) {
prActionService := prservice.CreatePatronRequestActionService(prRepo, eventBus, &iso18626Handler, lmsCreator)
prMessageHandler.SetAutoActionRunner(prActionService)
iso18626Client := client.CreateIso18626Client(eventBus, illRepo, prMessageHandler, MAX_MESSAGE_SIZE, delay)
supplierLocator := service.CreateSupplierLocator(eventBus, illRepo, dirAdapter, holdingsAdapter, availabilityCreator, CONSORTIA_SYMBOL)
supplierLocator := service.CreateSupplierLocator(eventBus, illRepo, dirAdapter, holdingsAdapter, availabilityCreator, CONSORTIUM_SYMBOL)
workflowManager := service.CreateWorkflowManager(eventBus, illRepo, service.WorkflowConfig{})
tenantResolver := tenant.NewResolver().WithIllRepo(illRepo).WithLookupAdapter(dirAdapter).WithTenantToSymbol(TENANT_TO_SYMBOL)
apiHandler := api.NewApiHandler(eventRepo, illRepo, *tenantResolver, API_PAGE_SIZE)
Expand Down
2 changes: 1 addition & 1 deletion broker/holdings/adapter_mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type MockAvailabilityAdapter struct {
Holdings []Holding
}

func NewMockAvailabilityAdapter(config directory.AvailabilityConfig) (LookupAdapter, error) {
func NewMockAvailabilityAdapter(config directory.HoldingsConfig) (LookupAdapter, error) {
if config.Zoom != nil && config.Zoom.Options != nil {
options := *config.Zoom.Options
// For testing purposes, we can use the presence of "adapter-error" in options to trigger an error response
Expand Down
4 changes: 2 additions & 2 deletions broker/holdings/create_holdings.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ func CreateHoldingsLookupShared(cfg map[string]any) (LookupAdapter, error) {
if !ok {
return nil, fmt.Errorf("missing value for %s", HoldingsAdapter)
}
if holdingsAdapterVal == "consortia" {
// consortia must be determined per-peer, so we can't create a single adapter for all peers
if holdingsAdapterVal == "consortium" {
// consortium must be determined per-peer, so we can't create a single adapter for all peers
return nil, nil
Comment thread
adamdickmeiss marked this conversation as resolved.
}
if holdingsAdapterVal == "sru" {
Expand Down
4 changes: 2 additions & 2 deletions broker/holdings/creator_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ func getParser(config *directory.ParserConfig) (HoldingsParser, error) {

func (c *AvailabilityCreatorImpl) GetAdapter(peer ill_db.Peer) (LookupAdapter, error) {
entry := peer.CustomData
config := entry.AvailabilityConfig
config := entry.HoldingsConfig
if config == nil {
return nil, nil // No availability adapter for this peer
return nil, nil // No holdings adapter for this peer
Comment thread
adamdickmeiss marked this conversation as resolved.
}
if c.mode == AvailabilityAdapterMock {
return NewMockAvailabilityAdapter(*config)
Expand Down
16 changes: 8 additions & 8 deletions broker/holdings/creator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func TestGetAdapterBadParser(t *testing.T) {
creator := NewAvailabilityCreator(AvailabilityAdapterZoom, "")
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: "a",
},
Expand All @@ -76,7 +76,7 @@ func TestGetAdapterOtherWithConfig(t *testing.T) {
creator := NewAvailabilityCreator("other", "")
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: "a",
},
Expand All @@ -92,7 +92,7 @@ func TestGetAdapterMissingProperties(t *testing.T) {
creator := NewAvailabilityCreator("zoom", "")
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{},
HoldingsConfig: &directory.HoldingsConfig{},
},
}
_, err := creator.GetAdapter(peer)
Expand All @@ -103,7 +103,7 @@ func TestGetAdapterMissingProperties(t *testing.T) {
func TestGetAdapterMock(t *testing.T) {
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: "a",
},
Expand All @@ -119,7 +119,7 @@ func TestGetAdapterMock(t *testing.T) {
func TestGetAdapterZoom(t *testing.T) {
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: "a",
},
Expand All @@ -141,7 +141,7 @@ func TestGetAdapterZoom(t *testing.T) {
func TestGetAdapterMetaproxy(t *testing.T) {
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: "a",
},
Expand All @@ -157,7 +157,7 @@ func TestGetAdapterMetaproxy(t *testing.T) {
func TestGetAdapterMetaproxyMissingProxy(t *testing.T) {
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: "a",
},
Expand All @@ -173,7 +173,7 @@ func TestGetAdapterMetaproxyMissingProxy(t *testing.T) {
func TestGetAdapterSRU(t *testing.T) {
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Sru: &directory.SruConfig{
Address: "a",
},
Expand Down
2 changes: 1 addition & 1 deletion broker/holdings/gvi_holdings_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ func TestGviHoldings(t *testing.T) {
qtype := directory.Cql
peer := ill_db.Peer{
CustomData: directory.Entry{
AvailabilityConfig: &directory.AvailabilityConfig{
HoldingsConfig: &directory.HoldingsConfig{
Zoom: &directory.ZoomConfig{
Address: server.URL,
Options: &map[string]string{
Expand Down
18 changes: 9 additions & 9 deletions broker/service/supplierlocator.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,17 @@ type SupplierLocator struct {
dirAdapter adapter.DirectoryLookupAdapter
holdingsAdapter holdings.LookupAdapter
availabilityCreator holdings.AvailabilityCreator
consortiaSymbol string
consortiumSymbol string
}

func CreateSupplierLocator(eventBus events.EventBus, illRepo ill_db.IllRepo, dirAdapter adapter.DirectoryLookupAdapter, holdingsAdapter holdings.LookupAdapter, availabilityCreator holdings.AvailabilityCreator, consortiaSymbol string) SupplierLocator {
func CreateSupplierLocator(eventBus events.EventBus, illRepo ill_db.IllRepo, dirAdapter adapter.DirectoryLookupAdapter, holdingsAdapter holdings.LookupAdapter, availabilityCreator holdings.AvailabilityCreator, consortiumSymbol string) SupplierLocator {
return SupplierLocator{
eventBus: eventBus,
illRepo: illRepo,
dirAdapter: dirAdapter,
holdingsAdapter: holdingsAdapter,
availabilityCreator: availabilityCreator,
consortiaSymbol: consortiaSymbol,
consortiumSymbol: consortiumSymbol,
}
}

Expand Down Expand Up @@ -78,17 +78,17 @@ func createHoldingsParams(illTransactionData ill_db.IllTransactionData) holdings

// 3 cases to consider for getting the adapter:
// 1. If holdingsAdapter is set from the start (for example for testing), use it directly
// 2. If consortiaSymbol is set, lookup the peer for the consortia and use its availability adapter
// 3. Otherwise, use the availability adapter for the requesting peer
func (s *SupplierLocator) getAdapterForConsortia(ctx common.ExtendedContext, requestPeer ill_db.Peer) (holdings.LookupAdapter, error) {
// 2. If consortiumSymbol is set, lookup the peer for the consortium and use its holdings adapter
// 3. Otherwise, use the holdings adapter for the requesting peer
func (s *SupplierLocator) getConsortialAdapter(ctx common.ExtendedContext, requestPeer ill_db.Peer) (holdings.LookupAdapter, error) {
lookupAdapter := s.holdingsAdapter
if lookupAdapter != nil {
return lookupAdapter, nil
}
if s.consortiaSymbol == "" {
if s.consortiumSymbol == "" {
return s.availabilityCreator.GetAdapter(requestPeer)
}
peer, err := s.illRepo.GetPeerBySymbol(ctx, s.consortiaSymbol)
peer, err := s.illRepo.GetPeerBySymbol(ctx, s.consortiumSymbol)
if err != nil {
return nil, err
}
Expand All @@ -110,7 +110,7 @@ func (s *SupplierLocator) locateSuppliers(ctx common.ExtendedContext, event even
if err != nil {
return events.LogErrorAndReturnResult(ctx, "failed to read requester peer", err)
}
lookupAdapter, err := s.getAdapterForConsortia(ctx, requester)
lookupAdapter, err := s.getConsortialAdapter(ctx, requester)
if err != nil {
return events.LogErrorAndReturnResult(ctx, "failed to get holdings adapter for locating suppliers", err)
}
Expand Down
67 changes: 67 additions & 0 deletions broker/test/holdings/gvi_directory.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
[
{
"id": "5dca993d-b32d-4bca-8273-61d1547a4645",
"name": "GVI test library 1",
"description": "gvi_1",
"type": "institution",
"symbols": [
{
"id": "aaa09db9-a001-43cd-a871-1e03afb77b48",
"symbol": "GVI1",
"authority": "ISIL"
}
],
"holdingsConfig": {
"zoom": {
"address": "http://localhost:8083/holdings/zoom",
"options": {
"sru": "get",
"sru_version": "1.2"
}
},
"queryConfig": {
"type": "cql",
"identifier": "rec.id = {term}",
"title": "",
"isbn": "",
"issn": ""
},
"parserConfig": {
"marc21plus1": {}
}
},
"endpoints": [
{
"id": "59bb2aab-d7e2-4766-9bec-b3ee8877df88",
"entry": "5dca993d-b32d-4bca-8273-61d1547a4645",
"name": "VCGR ISO18626 Service",
"type": "ISO18626",
"address": "http://localhost:8083/iso18626"
}
],
"networks": []
},
{
"id": "d3e02ac8-af87-44f9-b892-8bf4564c6607",
"name": "DE library 24",
"description": "de_24",
"type": "institution",
"symbols": [
{
"id": "1fd24a28-9383-495f-a7df-3dee279627b0",
"symbol": "DE-24",
"authority": "ISIL"
}
],
"endpoints": [
{
"id": "59bb2aab-d7e2-4766-9bec-b3ee8877df88",
"entry": "d3e02ac8-af87-44f9-b892-8bf4564c6607",
"name": "VCGR ISO18626 Service",
"type": "ISO18626",
"address": "http://localhost:8083/iso18626"
}
],
"networks": []
}
]
Loading
Loading