11import { Injectable } from '@angular/core' ;
22import { Store } from '@ngrx/store' ;
3- import { Observable } from 'rxjs' ;
3+ import { Observable , map } from 'rxjs' ;
44
55import { NotificationsService } from '../../shared/notifications/notifications.service' ;
66import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service' ;
77import { RequestParam } from '../cache/models/request-param.model' ;
88import { ObjectCacheService } from '../cache/object-cache.service' ;
9- import {
10- CreateData ,
11- CreateDataImpl ,
12- } from '../data/base/create-data' ;
9+ import { CreateData , CreateDataImpl } from '../data/base/create-data' ;
1310import { IdentifiableDataService } from '../data/base/identifiable-data.service' ;
1411import { RemoteData } from '../data/remote-data' ;
1512import { RequestService } from '../data/request.service' ;
@@ -19,12 +16,23 @@ import {
1916 getRemoteDataPayload ,
2017} from '../shared/operators' ;
2118import { Feedback } from './models/feedback.model' ;
19+ import { HttpHeaders } from '@angular/common/http' ;
20+ import { distinctUntilChanged , take , takeWhile } from 'rxjs/operators' ;
21+ import { hasValue , isNotEmptyOperator } from '../../shared/empty.util' ;
22+ import { NotificationOptions } from '../../shared/notifications/models/notification-options.model' ;
23+ import { getClassForType } from '../cache/builders/build-decorators' ;
24+ import { CreateRequest } from '../data/request.models' ;
25+ import { DSpaceSerializer } from '../dspace-rest/dspace.serializer' ;
26+ import { HttpOptions } from '../dspace-rest/dspace-rest.service' ;
2227
2328/**
2429 * Service for checking and managing the feedback
2530 */
2631@Injectable ( { providedIn : 'root' } )
27- export class FeedbackDataService extends IdentifiableDataService < Feedback > implements CreateData < Feedback > {
32+ export class FeedbackDataService
33+ extends IdentifiableDataService < Feedback >
34+ implements CreateData < Feedback >
35+ {
2836 private createData : CreateDataImpl < Feedback > ;
2937
3038 constructor (
@@ -37,7 +45,15 @@ export class FeedbackDataService extends IdentifiableDataService<Feedback> imple
3745 ) {
3846 super ( 'feedbacks' , requestService , rdbService , objectCache , halService ) ;
3947
40- this . createData = new CreateDataImpl ( this . linkPath , requestService , rdbService , objectCache , halService , notificationsService , this . responseMsToLive ) ;
48+ this . createData = new CreateDataImpl (
49+ this . linkPath ,
50+ requestService ,
51+ rdbService ,
52+ objectCache ,
53+ halService ,
54+ notificationsService ,
55+ this . responseMsToLive ,
56+ ) ;
4157 }
4258
4359 /**
@@ -51,14 +67,71 @@ export class FeedbackDataService extends IdentifiableDataService<Feedback> imple
5167 ) ;
5268 }
5369
54-
5570 /**
5671 * Create a new object on the server, and store the response in the object cache
5772 *
5873 * @param object The object to create
5974 * @param params Array with additional params to combine with query string
6075 */
61- public create ( object : Feedback , ...params : RequestParam [ ] ) : Observable < RemoteData < Feedback > > {
76+ public create (
77+ object : Feedback ,
78+ ...params : RequestParam [ ]
79+ ) : Observable < RemoteData < Feedback > > {
6280 return this . createData . create ( object , ...params ) ;
6381 }
82+
83+ createWithCaptcha (
84+ object : Feedback ,
85+ captchaToken : string = null ,
86+ ...params : RequestParam [ ]
87+ ) : Observable < RemoteData < Feedback > > {
88+ const requestId = this . requestService . generateRequestId ( ) ;
89+
90+ const endpoint$ = this . getEndpoint ( ) . pipe (
91+ isNotEmptyOperator ( ) ,
92+ distinctUntilChanged ( ) ,
93+ map ( ( endpoint : string ) => this . buildHrefWithParams ( endpoint , params ) ) ,
94+ ) ;
95+
96+ const serializedObject = new DSpaceSerializer (
97+ getClassForType ( object . type ) ,
98+ ) . serialize ( object ) ;
99+
100+ endpoint$ . pipe ( take ( 1 ) ) . subscribe ( ( endpoint : string ) => {
101+ const options : HttpOptions = Object . create ( { } ) ;
102+ let headers = new HttpHeaders ( ) ;
103+ if ( captchaToken ) {
104+ headers = headers . set ( 'x-recaptcha-token' , captchaToken ) ;
105+ }
106+ options . headers = headers ;
107+
108+ const request = new CreateRequest (
109+ requestId ,
110+ endpoint ,
111+ JSON . stringify ( serializedObject ) ,
112+ options ,
113+ ) ;
114+
115+ if ( hasValue ( this . responseMsToLive ) ) {
116+ request . responseMsToLive = this . responseMsToLive ;
117+ }
118+ this . requestService . send ( request ) ;
119+ } ) ;
120+
121+ const result$ = this . rdbService . buildFromRequestUUID < Feedback > ( requestId ) ;
122+
123+ result$
124+ . pipe ( takeWhile ( ( rd : RemoteData < Feedback > ) => rd . isLoading , true ) )
125+ . subscribe ( ( rd : RemoteData < Feedback > ) => {
126+ if ( rd . hasFailed ) {
127+ this . notificationsService . error (
128+ 'Server Error:' ,
129+ rd . errorMessage ,
130+ new NotificationOptions ( - 1 ) ,
131+ ) ;
132+ }
133+ } ) ;
134+
135+ return result$ ;
136+ }
64137}
0 commit comments