Skip to content
Open
Show file tree
Hide file tree
Changes from all 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.
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
}
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
}
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