1+ import { HttpHeaders } from '@angular/common/http' ;
12import { Injectable } from '@angular/core' ;
23import { Store } from '@ngrx/store' ;
3- import { Observable } from 'rxjs' ;
4+ import {
5+ map ,
6+ Observable ,
7+ } from 'rxjs' ;
8+ import {
9+ distinctUntilChanged ,
10+ take ,
11+ takeWhile ,
12+ } from 'rxjs/operators' ;
413
14+ import {
15+ hasValue ,
16+ isNotEmptyOperator ,
17+ } from '../../shared/empty.util' ;
18+ import { NotificationOptions } from '../../shared/notifications/models/notification-options.model' ;
519import { NotificationsService } from '../../shared/notifications/notifications.service' ;
20+ import { getClassForType } from '../cache/builders/build-decorators' ;
621import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service' ;
722import { RequestParam } from '../cache/models/request-param.model' ;
823import { ObjectCacheService } from '../cache/object-cache.service' ;
@@ -12,7 +27,10 @@ import {
1227} from '../data/base/create-data' ;
1328import { IdentifiableDataService } from '../data/base/identifiable-data.service' ;
1429import { RemoteData } from '../data/remote-data' ;
30+ import { CreateRequest } from '../data/request.models' ;
1531import { RequestService } from '../data/request.service' ;
32+ import { DSpaceSerializer } from '../dspace-rest/dspace.serializer' ;
33+ import { HttpOptions } from '../dspace-rest/dspace-rest.service' ;
1634import { HALEndpointService } from '../shared/hal-endpoint.service' ;
1735import {
1836 getFirstSucceededRemoteData ,
@@ -24,7 +42,9 @@ import { Feedback } from './models/feedback.model';
2442 * Service for checking and managing the feedback
2543 */
2644@Injectable ( { providedIn : 'root' } )
27- export class FeedbackDataService extends IdentifiableDataService < Feedback > implements CreateData < Feedback > {
45+ export class FeedbackDataService
46+ extends IdentifiableDataService < Feedback >
47+ implements CreateData < Feedback > {
2848 private createData : CreateDataImpl < Feedback > ;
2949
3050 constructor (
@@ -37,7 +57,15 @@ export class FeedbackDataService extends IdentifiableDataService<Feedback> imple
3757 ) {
3858 super ( 'feedbacks' , requestService , rdbService , objectCache , halService ) ;
3959
40- this . createData = new CreateDataImpl ( this . linkPath , requestService , rdbService , objectCache , halService , notificationsService , this . responseMsToLive ) ;
60+ this . createData = new CreateDataImpl (
61+ this . linkPath ,
62+ requestService ,
63+ rdbService ,
64+ objectCache ,
65+ halService ,
66+ notificationsService ,
67+ this . responseMsToLive ,
68+ ) ;
4169 }
4270
4371 /**
@@ -51,14 +79,71 @@ export class FeedbackDataService extends IdentifiableDataService<Feedback> imple
5179 ) ;
5280 }
5381
54-
5582 /**
5683 * Create a new object on the server, and store the response in the object cache
5784 *
5885 * @param object The object to create
5986 * @param params Array with additional params to combine with query string
6087 */
61- public create ( object : Feedback , ...params : RequestParam [ ] ) : Observable < RemoteData < Feedback > > {
88+ public create (
89+ object : Feedback ,
90+ ...params : RequestParam [ ]
91+ ) : Observable < RemoteData < Feedback > > {
6292 return this . createData . create ( object , ...params ) ;
6393 }
94+
95+ createWithCaptcha (
96+ object : Feedback ,
97+ captchaToken : string = null ,
98+ ...params : RequestParam [ ]
99+ ) : Observable < RemoteData < Feedback > > {
100+ const requestId = this . requestService . generateRequestId ( ) ;
101+
102+ const endpoint$ = this . getEndpoint ( ) . pipe (
103+ isNotEmptyOperator ( ) ,
104+ distinctUntilChanged ( ) ,
105+ map ( ( endpoint : string ) => this . buildHrefWithParams ( endpoint , params ) ) ,
106+ ) ;
107+
108+ const serializedObject = new DSpaceSerializer (
109+ getClassForType ( object . type ) ,
110+ ) . serialize ( object ) ;
111+
112+ endpoint$ . pipe ( take ( 1 ) ) . subscribe ( ( endpoint : string ) => {
113+ const options : HttpOptions = Object . create ( { } ) ;
114+ let headers = new HttpHeaders ( ) ;
115+ if ( captchaToken ) {
116+ headers = headers . set ( 'x-recaptcha-token' , captchaToken ) ;
117+ }
118+ options . headers = headers ;
119+
120+ const request = new CreateRequest (
121+ requestId ,
122+ endpoint ,
123+ JSON . stringify ( serializedObject ) ,
124+ options ,
125+ ) ;
126+
127+ if ( hasValue ( this . responseMsToLive ) ) {
128+ request . responseMsToLive = this . responseMsToLive ;
129+ }
130+ this . requestService . send ( request ) ;
131+ } ) ;
132+
133+ const result$ = this . rdbService . buildFromRequestUUID < Feedback > ( requestId ) ;
134+
135+ result$
136+ . pipe ( takeWhile ( ( rd : RemoteData < Feedback > ) => rd . isLoading , true ) )
137+ . subscribe ( ( rd : RemoteData < Feedback > ) => {
138+ if ( rd . hasFailed ) {
139+ this . notificationsService . error (
140+ 'Server Error:' ,
141+ rd . errorMessage ,
142+ new NotificationOptions ( - 1 ) ,
143+ ) ;
144+ }
145+ } ) ;
146+
147+ return result$ ;
148+ }
64149}
0 commit comments