import {Injectable} from '@angular/core'; import {PollConfig} from '../config/PollConfig'; import {HttpClient, HttpHeaders} from "@angular/common/http"; import {environment} from "../../environments/environment"; import {MessageService} from 'primeng/api'; /** * le service transverse à chaque page qui permet de syncroniser la configuration de sondage souhaitée */ @Injectable({ providedIn: 'root' }) export class ConfigService extends PollConfig { myEmail: string; loading: boolean = false; baseHref: any = environment.baseApiHref; myPolls: any;// list of retrieved polls from the backend api constructor(private http: HttpClient, private messageService: MessageService) { super(); } set(key, val) { this[key] = val; } clear() { this.messageService.clear(); } /** ================================== * * poll public calls to get non authenticated info * * ==================================/ /** * convert current poll config to a payload to send to the backend API */ getPollConfig() { const jsonConfig = { method: 'POST', data: { owner: { email: this.myEmail, pseudo: this.myName, }, title: this.title, description: this.description, type: this.pollType, visibility: this.visibility, voteChoices: this.voteChoices, allowSeveralHours: this.allowSeveralHours, expirationDate: this.expirationDate, passwordAccess: this.passwordAccess, password: this.password, customUrl: this.customUrl, canModifyAnswers: this.canModifyAnswers, whoModifiesAnswers: this.whoModifiesAnswers, dateList: this.dateList, timeList: this.timeList, answers: this.answers, } }; console.log('jsonConfig', jsonConfig); return jsonConfig } makeHeaders(bodyContent?: any) { const headerDict = { 'Charset': 'UTF-8', 'Content-Type': 'application/json', 'Accept': 'application/json', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE', 'Access-Control-Allow-Origin': '*' }; const requestOptions = { headers: new HttpHeaders(headerDict), body: bodyContent }; return requestOptions; } /** * search in localstorage, fallback asking the backend to send an email to the owner if it exists * @param email */ findPollsByEmail(email: string) { this.findLocalStorageData(); // If no key is found in the localstorage, ask the backend to send an email to the user this.myEmail = email; this.loading = true; this.http.get(`${this.baseHref}/my-polls`, this.makeHeaders({email: this.myEmail}), ) .subscribe(res => { // message: 'Trouvé! Allez voir votre boite email', this.myPolls = res; console.log('res', res) this.loading = false; this.messageService.add({ severity: 'success', summary: 'Service Message', detail: 'Via MessageService' }); }, (e) => { this.handleError(e) } ) } /** * display error message depending on the response of the backend * @param err */ handleError(err: any) { // TODO handle a toast message console.error('err', err); this.loading = false; this.messageService.add({severity: 'warning', summary: "Erreur lors de l'appel "}); } findLocalStorageData() { // TODO check if the person has a key to retrieve her polls } /** * get one poll by its slug name * @param url */ getPollByURL(url: string) { this.http.get(`${this.baseHref}/poll/${url}`, this.makeHeaders()).subscribe( (res: any) => { this.myPolls = res.data; }, (e) => { this.handleError(e) } ); } /** * GET * api/v1/poll/{id} * @param id */ getPollById(id: string, password: string) { this.http .get(`${this.baseHref}/poll/${id}`, this.makeHeaders({body: password})) .subscribe( (res: any) => { this.myPolls = res.data; }, (e) => { this.handleError(e) } ); } /** * GET * api/v1/my-polls * @param ownerEmail */ getMyPolls(ownerEmail: string) { this.http .get(`${this.baseHref}/my-polls`, this.makeHeaders({ownerEmail: ownerEmail}) ) .subscribe( (res: any) => { this.myPolls = res.data; }, (e) => { this.handleError(e) } ); } /** * action of the form */ createPoll() { console.log('sends the form'); // alert('envoi de formulaire pour création de sondage en XHR à faire'); this.http.get(`${this.baseHref}/`, this.makeHeaders()) .subscribe((res) => { console.log('res', res); this.createPollFromConfig(this.getPollConfig()) }, this.handleError ) ; } /** * POST * /api/v1/poll/{id}/poll * @param config */ createPollFromConfig(config: any) { this.http.post(`${this.baseHref}/poll`, this.makeHeaders({config: config})) .subscribe((res: any) => { // redirect to the page to administrate the new poll this.messageService.add({severity: 'success', summary: 'Sondage Créé',}); this.selectedPoll = res; this.pollId = res.pollId; }, (e) => { this.handleError(e) } ); } /** * UPDATE * /api/v1/poll/{id}/vote * @param voteStack */ updatePoll(voteStack: any) { this.http.put( `${this.baseHref}/poll/${this.pollId}`, voteStack, this.makeHeaders() ) .subscribe((res: any) => { this.messageService.add({ severity: 'success', summary: 'Sondage mis à jour', }); this.myPolls = res; }, (e) => { this.handleError(e) } ); } /** * POST * /api/v1/poll/{id}/vote * @param voteStack */ addVote(voteStack: any) { this.http.post( `${this.baseHref}/poll/${this.pollId}/vote`, voteStack, this.makeHeaders()) .subscribe((res: any) => { this.messageService.add({severity: 'success', summary: 'Vote ajouté'}); alert("succès!"); this.myPolls = res; }, (e) => { this.handleError(e) } ); } /** * UPDATE * /api/v1/poll/{id}/vote * @param voteStack */ updateVote(voteStack: any) { this.http.put( `${this.baseHref}/poll/${this.pollId}/vote`, voteStack, this.makeHeaders()) .subscribe((res: any) => { this.messageService.add({severity: 'success', summary: 'Vote mis à jour'}); this.myPolls = res; }, (e) => { this.handleError(e) } ); } /** * POST * /api/v1/poll/{id}/comment * @param comment */ addComment(comment: any) { this.http.post( `${this.baseHref}/poll/${this.pollId}/comment`, comment, this.makeHeaders()) .subscribe((res: any) => { this.messageService.add({ severity: 'success', summary: 'Commentaire Créé', detail: 'Via MessageService' }); }, (e) => { this.handleError(e) } ); } /** * administrator calls */ }