Skip to content
Merged
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
42 changes: 17 additions & 25 deletions broker/api/api-handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,40 +38,32 @@ var LIMIT_DEFAULT int32 = 10
var ARCHIVE_PROCESS_STARTED = "Archive process started"

type ApiHandler struct {
limitDefault int32
eventRepo events.EventRepo
illRepo ill_db.IllRepo
tenantToSymbol string // non-empty if in /broker mode
limitDefault int32
eventRepo events.EventRepo
illRepo ill_db.IllRepo
tenant common.Tenant
}

func NewApiHandler(eventRepo events.EventRepo, illRepo ill_db.IllRepo, tenentToSymbol string, limitDefault int32) ApiHandler {
func NewApiHandler(eventRepo events.EventRepo, illRepo ill_db.IllRepo, tenant common.Tenant, limitDefault int32) ApiHandler {
return ApiHandler{
eventRepo: eventRepo,
illRepo: illRepo,
tenantToSymbol: tenentToSymbol,
limitDefault: limitDefault,
eventRepo: eventRepo,
illRepo: illRepo,
tenant: tenant,
limitDefault: limitDefault,
}
}

func (a *ApiHandler) isTenantMode() bool {
return a.tenantToSymbol != ""
}

func (a *ApiHandler) getSymbolFromTenant(tenant string) string {
return strings.ReplaceAll(a.tenantToSymbol, "{tenant}", strings.ToUpper(tenant))
}

func (a *ApiHandler) isOwner(trans *ill_db.IllTransaction, tenant *string, requesterSymbol *string) bool {
if tenant == nil && requesterSymbol != nil {
return trans.RequesterSymbol.String == *requesterSymbol
}
if !a.isTenantMode() {
if !a.tenant.IsSpecified() {
return true
}
if tenant == nil {
return false
}
return trans.RequesterSymbol.String == a.getSymbolFromTenant(*tenant)
return trans.RequesterSymbol.String == a.tenant.GetSymbol(*tenant)
}

func (a *ApiHandler) getIllTranFromParams(ctx common.ExtendedContext, w http.ResponseWriter,
Expand Down Expand Up @@ -176,22 +168,22 @@ func (a *ApiHandler) GetIllTransactions(w http.ResponseWriter, r *http.Request,
fullCount = 1
resp.Items = append(resp.Items, toApiIllTransaction(r, *tran))
}
} else if a.isTenantMode() {
var tenantSymbol string
} else if a.tenant.IsSpecified() {
var symbol string
if params.XOkapiTenant != nil {
tenantSymbol = a.getSymbolFromTenant(*params.XOkapiTenant)
symbol = a.tenant.GetSymbol(*params.XOkapiTenant)
} else if params.RequesterSymbol != nil {
tenantSymbol = *params.RequesterSymbol
symbol = *params.RequesterSymbol
}
if tenantSymbol == "" {
if symbol == "" {
writeJsonResponse(w, resp)
return
}
dbparams := ill_db.GetIllTransactionsByRequesterSymbolParams{
Limit: limit,
Offset: offset,
RequesterSymbol: pgtype.Text{
String: tenantSymbol,
String: symbol,
Valid: true,
},
}
Expand Down
13 changes: 9 additions & 4 deletions broker/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import (
"github.com/indexdata/crosslink/broker/ill_db"
"github.com/indexdata/go-utils/utils"
"github.com/jackc/pgx/v5/pgxpool"

"github.com/indexdata/crosslink/broker/lms"
)

var HTTP_PORT = utils.Must(utils.GetEnvInt("HTTP_PORT", 8081))
Expand Down Expand Up @@ -157,8 +159,9 @@ func Init(ctx context.Context) (Context, error) {
iso18626Handler := handler.CreateIso18626Handler(eventBus, eventRepo, illRepo, dirAdapter)
supplierLocator := service.CreateSupplierLocator(eventBus, illRepo, dirAdapter, holdingsAdapter)
workflowManager := service.CreateWorkflowManager(eventBus, illRepo, service.WorkflowConfig{})
prActionService := prservice.CreatePatronRequestActionService(prRepo, illRepo, eventBus, &iso18626Handler)
prApiHandler := prapi.NewApiHandler(prRepo, eventBus)
lmsCreator := lms.NewLmsCreator(illRepo, dirAdapter)
prActionService := prservice.CreatePatronRequestActionService(prRepo, eventBus, &iso18626Handler, lmsCreator)
prApiHandler := prapi.NewApiHandler(prRepo, eventBus, common.NewTenant(TENANT_TO_SYMBOL))

AddDefaultHandlers(eventBus, iso18626Client, supplierLocator, workflowManager, iso18626Handler, prActionService, prApiHandler, prMessageHandler)
err = StartEventBus(ctx, eventBus)
Expand Down Expand Up @@ -196,14 +199,16 @@ func StartServer(ctx Context) error {
http.ServeFile(w, r, "handler/open-api.yaml")
})

apiHandler := api.NewApiHandler(ctx.EventRepo, ctx.IllRepo, "", API_PAGE_SIZE)
apiHandler := api.NewApiHandler(ctx.EventRepo, ctx.IllRepo, common.NewTenant(""), API_PAGE_SIZE)
oapi.HandlerFromMux(&apiHandler, ServeMux)
if TENANT_TO_SYMBOL != "" {
apiHandler := api.NewApiHandler(ctx.EventRepo, ctx.IllRepo, TENANT_TO_SYMBOL, API_PAGE_SIZE)
apiHandler := api.NewApiHandler(ctx.EventRepo, ctx.IllRepo, common.NewTenant(TENANT_TO_SYMBOL), API_PAGE_SIZE)
oapi.HandlerFromMuxWithBaseURL(&apiHandler, ServeMux, "/broker")
}

proapi.HandlerFromMux(&ctx.PrApiHandler, ServeMux)
// TODO: proapi.HandlerFromMuxWithBaseURL(&ctx.PrApiHandler, ServeMux, "/broker")

signatureHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Server", vcs.GetSignature())
ServeMux.ServeHTTP(w, r)
Expand Down
21 changes: 21 additions & 0 deletions broker/common/tenant.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package common

import (
"strings"
)

type Tenant struct {
mapping string
}

func NewTenant(tenantSymbol string) Tenant {
return Tenant{mapping: tenantSymbol}
}

func (t *Tenant) IsSpecified() bool {
return t.mapping != ""
}

func (t *Tenant) GetSymbol(tenant string) string {
return strings.ReplaceAll(t.mapping, "{tenant}", strings.ToUpper(tenant))
}
42 changes: 42 additions & 0 deletions broker/lms/lms_adapter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package lms

// LmsAdapter is an interface defining methods for interacting with a Library Management System (LMS)
// https://github.com/openlibraryenvironment/mod-rs/blob/master/service/src/main/groovy/org/olf/rs/lms/HostLMSActions.groovy
type LmsAdapter interface {
LookupUser(patron string) (string, error)

AcceptItem(
itemId string,
requestId string,
userId string,
author string,
title string,
isbn string,
callNumber string,
pickupLocation string,
requestedAction string,
) error

DeleteItem(itemId string) error

RequestItem(
requestId string,
itemId string,
borrowerBarcode string,
pickupLocation string,
itemLocation string,
) error

CancelRequestItem(requestId string, userId string) error

CheckInItem(itemId string) error

CheckOutItem(
requestId string,
itemId string,
borrowerBarcode string,
externalReferenceValue string,
) error

CreateUserFiscalTransaction(userId string, itemId string) error
}
61 changes: 61 additions & 0 deletions broker/lms/lms_adapter_manual.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package lms

type LmsAdapterManual struct {
}

func (l *LmsAdapterManual) LookupUser(patron string) (string, error) {
return patron, nil
}

func (l *LmsAdapterManual) AcceptItem(
itemId string,
requestId string,
userId string,
author string,
title string,
isbn string,
callNumber string,
pickupLocation string,
requestedAction string,
) error {
return nil
}

func (l *LmsAdapterManual) DeleteItem(itemId string) error {
return nil
}

func (l *LmsAdapterManual) RequestItem(
requestId string,
itemId string,
borrowerBarcode string,
pickupLocation string,
itemLocation string,
) error {
return nil
}

func (l *LmsAdapterManual) CancelRequestItem(requestId string, userId string) error {
return nil
}

func (l *LmsAdapterManual) CheckInItem(itemId string) error {
return nil
}

func (l *LmsAdapterManual) CheckOutItem(
requestId string,
itemId string,
borrowerBarcode string,
externalReferenceValue string,
) error {
return nil
}

func (l *LmsAdapterManual) CreateUserFiscalTransaction(userId string, itemId string) error {
return nil
}

func CreateLmsAdapterMockOK() LmsAdapter {
return &LmsAdapterManual{}
}
Loading
Loading