# Requests and responses are ordinary records selected by both participants. # The `By` checks and exact RecordLink relation are application policy. datalog { request(R) :- Have(R), Field(R,'Group',_,'request-response'), Field(R,'App',_,'request-response/request'), Field(R,'By',_,'{{CLIENT_KEY}}'). response_for(E,R) :- Have(E), Field(E,'Group',_,'request-response'), Field(E,'App',_,'request-response/response'), Field(E,'By',_,'{{SERVICE_KEY}}'), RecordLink(E,'+Link',_,'request',R), request(R). SelectStoredRecord(R) :- request(R). ExposeRecord(R) :- request(R). SelectAdvertisedCandidate(R) :- Advertised(R), AdvertisedField(R,'Group',_,'request-response'), AdvertisedField(R,'App',_,'request-response/request'), AdvertisedField(R,'By',_,'{{CLIENT_KEY}}'). SelectStoredRecord(E) :- response_for(E,_). ExposeRecord(E) :- response_for(E,_). SelectAdvertisedCandidate(E) :- Advertised(E), AdvertisedField(E,'Group',_,'request-response'), AdvertisedField(E,'App',_,'request-response/response'), AdvertisedField(E,'By',_,'{{SERVICE_KEY}}'). }