@@ -30,6 +30,11 @@ class CollectorClient {
3030 return this . eventData . content . requesterEventId ;
3131 }
3232
33+ /** @property {String } */
34+ get requesterApiEndpoint ( ) {
35+ return this . eventData . content . apiEndpoint ;
36+ }
37+
3338 /** @property {Object } - full content of the request */
3439 get requestData ( ) {
3540 return this . eventData . content . requesterEventData . content ;
@@ -38,10 +43,21 @@ class CollectorClient {
3843 /** @property {string } - one of 'Incoming', 'Active', 'Deactivated', 'Refused' */
3944 get status ( ) {
4045 const eventStatus = this . eventData . content . status ;
46+ if ( eventStatus === 'Deactivated' || eventStatus === 'Refused' ) {
47+ if ( ! this . accessData ?. deleted ) {
48+ logger . error ( '>> CollectorClient.status TODO check consitency when access is still valid and deactivated or refused' , this . accessData ) ;
49+ }
50+ return eventStatus ;
51+ }
52+
4153 if ( this . accessData && ! this . accessData . deleted && this . eventData . content . status !== CollectorClient . STATUSES . active ) {
42- console . log ( this . accessData ) ;
54+ logger . error ( '>> CollectorClient.status: accessData ' , this . accessData ) ;
4355 throw new HDSLibError ( 'Should be active, try checkConsiency()' ) ;
4456 }
57+ if ( ! eventStatus ) {
58+ logger . error ( '>> CollectorClient.status is null' , { eventData : this . eventData , accessData : this . accessData } ) ;
59+ }
60+
4561 return eventStatus ;
4662 }
4763
@@ -77,10 +93,41 @@ class CollectorClient {
7793 return new CollectorClient ( app , event ) ;
7894 }
7995
96+ /**
97+ * reset with new request Event of ApiEndpoint
98+ * Identical as create but keep current event
99+ */
100+ async reset ( apiEndpoint , requesterEventId , accessInfo ) {
101+ if ( this . accessData && this . accessData ?. deleted != null ) {
102+ logger . error ( 'TODO try to revoke current access' ) ;
103+ }
104+ // check content of accessInfo
105+ const publicStreamId = accessInfo . clientData . hdsCollector . public . streamId ;
106+ // get request event cont
107+ const requesterConnection = new pryv . Connection ( apiEndpoint ) ;
108+ const requesterEvents = await requesterConnection . apiOne ( 'events.get' , { types : [ 'request/collector-v1' ] , streams : [ publicStreamId ] , limit : 1 } , 'events' ) ;
109+ if ( ! requesterEvents [ 0 ] ) throw new HDSLibError ( 'Cannot find requester event in public stream' , requesterEvents ) ;
110+
111+ const eventData = await this . app . connection . apiOne ( 'events.update' , {
112+ id : this . eventData . id ,
113+ update : {
114+ content : {
115+ apiEndpoint,
116+ requesterEventId,
117+ requesterEventData : requesterEvents [ 0 ] ,
118+ accessInfo,
119+ status : CollectorClient . STATUSES . incoming
120+ }
121+ }
122+ } , 'event' ) ;
123+ this . eventData = eventData ;
124+ return this ;
125+ }
126+
80127 /**
81128 * Update business event with new status
82129 * @param {string } newStatus
83- * @param {Object } [extraData] - if given this will be added to content ⚠️ - This can ovveride content!
130+ * @param {Object } [extraData] - if given this will be added to content ⚠️ - This can overide content!
84131 */
85132 async #updateStatus ( newStatus , extraData = null ) {
86133 const newContent = structuredClone ( this . eventData . content ) ;
@@ -95,48 +142,15 @@ class CollectorClient {
95142 this . eventData = eventData ;
96143 }
97144
98- /**
99- * Refuse current request
100- */
101- async refuse ( ) {
102- if ( this . status !== 'Incoming' ) throw new HDSLibError ( 'Cannot only refuse incoming requests' ) ;
103- // sent access credentials to requester
104- // check content of accessInfo
105- const publicStreamId = this . eventData . content . accessInfo . clientData . hdsCollector . inbox . streamId ;
106- const requesterEventId = this . requesterEventId ;
107- const requestrerApiEndpoint = this . eventData . content . apiEndpoint ;
108-
109- // refuseEvent to be sent to requester
110- const refuseEvent = {
111- type : 'refusal/collector-v1' ,
112- streamIds : [ publicStreamId ] ,
113- content : {
114- eventId : requesterEventId
115- }
116- } ;
117-
118- const requesterConnection = new pryv . Connection ( requestrerApiEndpoint ) ;
119- const requesterEvent = await requesterConnection . apiOne ( 'events.create' , refuseEvent , 'event' ) ;
120-
121- await this . #updateStatus( CollectorClient . STATUSES . refused ) ;
122- return { requesterEvent } ;
123- }
124-
125- /**
126- * Revoke current request
127- * @param {boolean } forceAndSkipAccessCreation - internal temporary option,
128- */
129- async revoke ( ) {
130- if ( this . status !== 'Active' ) throw new HDSLibError ( 'Cannot only revoke an Active CollectorClient' ) ;
131-
132- console . log ( 'Do something for revoke' ) ;
133- }
134-
135145 /**
136146 * Accept current request
137147 * @param {boolean } forceAndSkipAccessCreation - internal temporary option,
138148 */
139149 async accept ( forceAndSkipAccessCreation = false ) {
150+ if ( this . accessData && this . accessData . deleted == null && this . status !== 'Active' ) {
151+ forceAndSkipAccessCreation = true ;
152+ logger . error ( 'CollectorClient.accept TODO fix accept when access valid' ) ;
153+ }
140154 if ( forceAndSkipAccessCreation ) {
141155 if ( ! this . accessData ?. apiEndpoint || this . accessData ?. delete ) throw new HDSLibError ( 'Cannot force accept with empty or deleted accessData' , this . accessData ) ;
142156 } else {
@@ -162,36 +176,65 @@ class CollectorClient {
162176 if ( ! this . accessData ?. apiEndpoint ) throw new HDSLibError ( 'Failed creating request access' , accessData ) ;
163177 }
164178
179+ const responseContent = {
180+ apiEndpoint : this . accessData . apiEndpoint
181+ } ;
182+
183+ const requesterEvent = await this . #updateRequester( 'accept' , responseContent ) ;
184+ if ( requesterEvent != null ) {
185+ await this . #updateStatus( CollectorClient . STATUSES . active ) ;
186+ return { accessData : this . accessData , requesterEvent } ;
187+ }
188+ return null ;
189+ }
190+
191+ async refuse ( ) {
192+ const responseContent = { } ;
193+
194+ const requesterEvent = await this . #updateRequester( 'refuse' , responseContent ) ;
195+ if ( requesterEvent != null ) {
196+ await this . #updateStatus( CollectorClient . STATUSES . refused ) ;
197+ return { requesterEvent } ;
198+ }
199+ return null ;
200+ }
201+
202+ /**
203+ * @param {string } type - one of 'accpet', 'revoke', 'refuse'
204+ * @param {object } responseContent - content is related to type
205+ * @returns {Object } - response
206+ */
207+ async #updateRequester ( type , responseContent ) {
165208 // sent access credentials to requester
166209 // check content of accessInfo
167210 const publicStreamId = this . eventData . content . accessInfo . clientData . hdsCollector . inbox . streamId ;
168211 const requesterEventId = this . requesterEventId ;
169212 const requestrerApiEndpoint = this . eventData . content . apiEndpoint ;
170213
214+ // add eventId to content
215+ const content = Object . assign ( { type, eventId : requesterEventId } , responseContent ) ;
216+
171217 // acceptEvent to be sent to requester
172- const acceptEvent = {
173- type : 'credentials /collector-v1' ,
218+ const responseEvent = {
219+ type : 'response /collector-v1' ,
174220 streamIds : [ publicStreamId ] ,
175- content : {
176- apiEndpoint : this . accessData . apiEndpoint ,
177- eventId : requesterEventId
178- }
221+ content
179222 } ;
180223
181224 try {
182225 const requesterConnection = new pryv . Connection ( requestrerApiEndpoint ) ;
183- const requesterEvent = await requesterConnection . apiOne ( 'events.create' , acceptEvent , 'event' ) ;
184- await this . #updateStatus( CollectorClient . STATUSES . active ) ;
185- return { accessData : this . accessData , requesterEvent } ;
226+ const requesterEvent = await requesterConnection . apiOne ( 'events.create' , responseEvent , 'event' ) ;
227+ return requesterEvent ;
186228 } catch ( e ) {
187229 const deactivatedDetail = {
188230 type : 'error' ,
189231 message : e . message
190232 } ;
191233 if ( e . innerObject ) deactivatedDetail . data = e . innerObject ;
192234 logger . error ( 'Failed activating' , deactivatedDetail ) ;
193- await this . #updateStatus( CollectorClient . STATUSES . deactivated , { deactivatedDetail } ) ;
194- return false ;
235+ const deactivatedResult = await this . #updateStatus( CollectorClient . STATUSES . deactivated , { deactivatedDetail } ) ;
236+ console . log ( '***** ' , { deactivatedResult } ) ;
237+ return null ;
195238 }
196239 }
197240
@@ -202,13 +245,13 @@ class CollectorClient {
202245 // accessData but not active
203246 if ( this . accessData && this . eventData . content . status == null ) {
204247 logger . info ( 'Found discrepency with accessData and status not active, fixing it' ) ;
205- if ( this . accessData . deleted ) {
248+ if ( ! this . accessData . deleted ) {
206249 await this . accept ( true ) ;
207250 } else {
208251 await this . revoke ( ) ;
209252 }
210253 } else {
211- logger . debug ( 'CollectorClient:checkConsistency' , this . accessData ) ;
254+ // logger.debug('CollectorClient:checkConsistency', this.accessData);
212255 }
213256 }
214257
0 commit comments