Skip to content

Commit 4816e34

Browse files
committed
Add batch action events endpoint, refactor/tighten other endpoints
1 parent 32aaecf commit 4816e34

22 files changed

Lines changed: 587 additions & 72 deletions

broker/api/api-handler.go

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (a *ApiHandler) Get(w http.ResponseWriter, r *http.Request) {
9898
index.Links.PeersLink = Link(r, Path(PEERS_PATH), nil)
9999
index.Links.BorrowingRequestsLink = Link(r, Path(PATRON_REQUESTS_PATH), Query("side", "borrowing"))
100100
index.Links.LendingRequestsLink = Link(r, Path(PATRON_REQUESTS_PATH), Query("side", "lending"))
101+
index.Links.BatchActionsLink = Link(r, Path("batch_actions"), nil)
101102
WriteJsonResponse(w, index)
102103
}
103104

@@ -109,29 +110,63 @@ func (a *ApiHandler) GetEvents(w http.ResponseWriter, r *http.Request, params oa
109110
ctx := common.CreateExtCtxWithArgs(r.Context(), &common.LoggerArgs{
110111
Other: logParams,
111112
})
113+
if params.IllTransactionId != nil && events.IsSyntheticID(*params.IllTransactionId) {
114+
AddBadRequestError(ctx, w, errors.New("synthetic IDs are not allowed for event lookup"))
115+
return
116+
}
112117
tran, err := a.getIllTranFromParams(ctx, w, r, params.RequesterSymbol,
113118
params.RequesterReqId, params.IllTransactionId)
114119
if err != nil {
115120
return
116121
}
117-
var resp oapi.Events
118-
resp.Items = make([]oapi.Event, 0)
119122
if tran == nil {
120-
WriteJsonResponse(w, resp)
123+
WriteJsonResponse(w, oapi.Events{Items: make([]oapi.Event, 0)})
121124
return
122125
}
123-
var fullCount int64
124-
var eventList []events.Event
125-
eventList, fullCount, err = a.eventRepo.GetIllTransactionEvents(ctx, tran.ID)
126-
if err != nil && !errors.Is(err, pgx.ErrNoRows) {
126+
resp, err := a.illTransactionEventsResponse(ctx, tran.ID)
127+
if err != nil {
127128
AddInternalError(ctx, w, err)
128129
return
129130
}
131+
WriteJsonResponse(w, resp)
132+
}
133+
134+
func (a *ApiHandler) GetIllTransactionsIdEvents(w http.ResponseWriter, r *http.Request, id string, params oapi.GetIllTransactionsIdEventsParams) {
135+
ctx := common.CreateExtCtxWithArgs(r.Context(), &common.LoggerArgs{
136+
Other: map[string]string{"method": "GetIllTransactionsIdEvents", "id": id},
137+
})
138+
if events.IsSyntheticID(id) {
139+
AddBadRequestError(ctx, w, errors.New("synthetic IDs are not allowed for event lookup"))
140+
return
141+
}
142+
143+
tran, err := a.getIllTranFromParams(ctx, w, r, params.RequesterSymbol, nil, &id)
144+
if err != nil {
145+
return
146+
}
147+
if tran == nil {
148+
AddNotFoundError(w)
149+
return
150+
}
151+
resp, err := a.illTransactionEventsResponse(ctx, tran.ID)
152+
if err != nil {
153+
AddInternalError(ctx, w, err)
154+
return
155+
}
156+
WriteJsonResponse(w, resp)
157+
}
158+
159+
func (a *ApiHandler) illTransactionEventsResponse(ctx common.ExtendedContext, id string) (oapi.Events, error) {
160+
resp := oapi.Events{Items: make([]oapi.Event, 0)}
161+
eventList, fullCount, err := a.eventRepo.GetIllTransactionEvents(ctx, id)
162+
if err != nil && !errors.Is(err, pgx.ErrNoRows) {
163+
return resp, err
164+
}
130165
resp.About.Count = fullCount
131166
for _, event := range eventList {
132167
resp.Items = append(resp.Items, ToApiEvent(event, event.IllTransactionID, nil))
133168
}
134-
WriteJsonResponse(w, resp)
169+
return resp, nil
135170
}
136171

137172
func (a *ApiHandler) GetIllTransactions(w http.ResponseWriter, r *http.Request, params oapi.GetIllTransactionsParams) {
@@ -652,7 +687,7 @@ func toApiIllTransaction(r *http.Request, trans ill_db.IllTransaction) oapi.IllT
652687
api.SupplierRequestID = getString(trans.SupplierRequestID)
653688
api.LastSupplierStatus = getString(trans.LastSupplierStatus)
654689
api.PrevSupplierStatus = getString(trans.PrevSupplierStatus)
655-
api.EventsLink = Link(r, Path(EVENTS_PATH), Query("ill_transaction_id", trans.ID))
690+
api.EventsLink = Link(r, Path("ill_transactions", trans.ID, "events"), nil)
656691
api.LocatedSuppliersLink = Link(r, Path(LOCATED_SUPPLIERS_PATH), Query("ill_transaction_id", trans.ID))
657692
if trans.RequesterID.Valid {
658693
api.RequesterPeerLink = Link(r, Path(PEERS_PATH, trans.RequesterID.String), nil)

broker/api/api_handler_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package api
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/indexdata/crosslink/broker/events"
9+
"github.com/indexdata/crosslink/broker/oapi"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestGetEventsRejectsSyntheticIDs(t *testing.T) {
14+
for _, id := range []string{events.DEFAULT_ILL_TRANSACTION_ID, events.DEFAULT_PATRON_REQUEST_ID} {
15+
t.Run(id, func(t *testing.T) {
16+
h := ApiHandler{}
17+
req := httptest.NewRequest(http.MethodGet, "/events", nil)
18+
rr := httptest.NewRecorder()
19+
h.GetEvents(rr, req, oapi.GetEventsParams{IllTransactionId: &id})
20+
assert.Equal(t, http.StatusBadRequest, rr.Code)
21+
})
22+
}
23+
}
24+
25+
func TestGetIllTransactionsIdEventsRejectsSyntheticIDs(t *testing.T) {
26+
for _, id := range []string{events.DEFAULT_ILL_TRANSACTION_ID, events.DEFAULT_PATRON_REQUEST_ID} {
27+
t.Run(id, func(t *testing.T) {
28+
h := ApiHandler{}
29+
req := httptest.NewRequest(http.MethodGet, "/ill_transactions/"+id+"/events", nil)
30+
rr := httptest.NewRecorder()
31+
h.GetIllTransactionsIdEvents(rr, req, id, oapi.GetIllTransactionsIdEventsParams{})
32+
assert.Equal(t, http.StatusBadRequest, rr.Code)
33+
})
34+
}
35+
}

broker/app/app.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ func Init(ctx context.Context) (Context, error) {
219219
}
220220

221221
schedRepoRepo := sched_db.CreateSchedRepo(pool)
222-
schedApiHandler := schedapi.NewSchedulerApiHandler(API_PAGE_SIZE, schedRepoRepo, tenantResolver)
222+
schedApiHandler := schedapi.NewSchedulerApiHandler(API_PAGE_SIZE, schedRepoRepo, eventRepo, tenantResolver)
223223
if err = StartScheduler(ctx, schedRepoRepo, eventBus); err != nil {
224224
return Context{}, err
225225
}

broker/descriptors/ModuleDescriptor-template.json

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515
"broker.ill_transactions.item.get"
1616
]
1717
},
18+
{
19+
"methods": [
20+
"GET"
21+
],
22+
"pathPattern": "/broker/ill_transactions/{id}/events",
23+
"permissionsRequired": [
24+
"broker.ill_transactions.item.events.get"
25+
]
26+
},
1827
{
1928
"methods": [
2029
"GET"
@@ -267,6 +276,15 @@
267276
"broker.batch_actions.item.get"
268277
]
269278
},
279+
{
280+
"methods": [
281+
"GET"
282+
],
283+
"pathPattern": "/broker/batch_actions/{id}/events",
284+
"permissionsRequired": [
285+
"broker.batch_actions.item.events.get"
286+
]
287+
},
270288
{
271289
"methods": [
272290
"PUT"
@@ -360,6 +378,7 @@
360378
"visible": true,
361379
"subPermissions": [
362380
"broker.ill_transactions.item.get",
381+
"broker.ill_transactions.item.events.get",
363382
"broker.ill_transactions.get",
364383
"broker.located_suppliers.get",
365384
"broker.events.get",
@@ -382,6 +401,11 @@
382401
"displayName": "Broker - read ILL transactions",
383402
"permissionName": "broker.ill_transactions.get"
384403
},
404+
{
405+
"description": "Read events for an ILL transaction",
406+
"displayName": "Broker - read ILL transaction events",
407+
"permissionName": "broker.ill_transactions.item.events.get"
408+
},
385409
{
386410
"description": "Read located suppliers",
387411
"displayName": "Broker - read located suppliers",
@@ -497,6 +521,11 @@
497521
"displayName": "Broker - read batch action",
498522
"permissionName": "broker.batch_actions.item.get"
499523
},
524+
{
525+
"description": "Read events for a batch action",
526+
"displayName": "Broker - read batch action events",
527+
"permissionName": "broker.batch_actions.item.events.get"
528+
},
500529
{
501530
"description": "Update a batch action",
502531
"displayName": "Broker - update batch action",
@@ -580,7 +609,8 @@
580609
"visible": true,
581610
"subPermissions": [
582611
"broker.batch_actions.get",
583-
"broker.batch_actions.item.get"
612+
"broker.batch_actions.item.get",
613+
"broker.batch_actions.item.events.get"
584614
]
585615
},
586616
{
@@ -673,6 +703,7 @@
673703
"visible": true,
674704
"subPermissions": [
675705
"broker.ill_transactions.item.get",
706+
"broker.ill_transactions.item.events.get",
676707
"broker.ill_transactions.get",
677708
"broker.located_suppliers.get",
678709
"broker.events.get",
@@ -701,6 +732,7 @@
701732
"broker.batch_actions.get",
702733
"broker.batch_actions.post",
703734
"broker.batch_actions.item.get",
735+
"broker.batch_actions.item.events.get",
704736
"broker.batch_actions.item.put",
705737
"broker.batch_actions.item.delete",
706738
"broker.batch_actions.item.enable.post",

broker/events/eventbus_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ func (r *exclusiveCheckErrorRepo) GetIllTransactionEvents(ctx common.ExtendedCon
8686
return nil, 0, nil
8787
}
8888

89+
func (r *exclusiveCheckErrorRepo) GetBatchActionEvents(ctx common.ExtendedContext, taskID string) ([]Event, error) {
90+
return nil, nil
91+
}
92+
8993
func (r *exclusiveCheckErrorRepo) DeleteEventsByIllTransaction(ctx common.ExtendedContext, illTransId string) error {
9094
return nil
9195
}

broker/events/eventmodels.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ const (
3131
EventDomainScheduler EventDomain = "SCHEDULER"
3232
)
3333

34+
func IsSyntheticID(id string) bool {
35+
return id == DEFAULT_ILL_TRANSACTION_ID || id == DEFAULT_PATRON_REQUEST_ID
36+
}
37+
3438
type EventName string
3539

3640
const (

broker/events/eventrepo.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type EventRepo interface {
1818
ClaimEventForSignal(ctx common.ExtendedContext, id string, signal Signal) (Event, error)
1919
Notify(ctx common.ExtendedContext, eventId string, signal Signal, target SignalTarget) error
2020
GetIllTransactionEvents(ctx common.ExtendedContext, id string) ([]Event, int64, error)
21+
GetBatchActionEvents(ctx common.ExtendedContext, taskID string) ([]Event, error)
2122
DeleteEventsByIllTransaction(ctx common.ExtendedContext, illTransId string) error
2223
GetLatestRequestEventByAction(ctx common.ExtendedContext, illTransId string, action string) (Event, error)
2324
GetPatronRequestEvents(ctx common.ExtendedContext, id string) ([]Event, error)
@@ -117,6 +118,17 @@ func (r *PgEventRepo) GetPatronRequestEvents(ctx common.ExtendedContext, id stri
117118
return events, err
118119
}
119120

121+
func (r *PgEventRepo) GetBatchActionEvents(ctx common.ExtendedContext, taskID string) ([]Event, error) {
122+
rows, err := r.queries.GetBatchActionEvents(ctx, r.GetConnOrTx(), taskID)
123+
var eventList []Event
124+
if err == nil {
125+
for _, row := range rows {
126+
eventList = append(eventList, row.Event)
127+
}
128+
}
129+
return eventList, err
130+
}
131+
120132
func (r *PgEventRepo) DeleteEventsByIllTransaction(ctx common.ExtendedContext, illTransId string) error {
121133
return r.queries.DeleteEventsByIllTransaction(ctx, r.GetConnOrTx(), illTransId)
122134
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP INDEX IF EXISTS idx_event_batch_action_task_timestamp;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
CREATE INDEX idx_event_batch_action_task_timestamp
2+
ON event ((event_data -> 'batchActionData' ->> 'taskId'), timestamp DESC)
3+
WHERE event_name = 'invoke-batch-action';

0 commit comments

Comments
 (0)