|
|
|
import { Injectable } from '@angular/core';
|
|
|
|
import axios, { AxiosInstance, AxiosResponse } from 'axios';
|
|
|
|
import { environment } from 'src/environments/environment';
|
|
|
|
|
|
|
|
import { Poll } from '../models/poll.model';
|
|
|
|
import { User } from '../models/user.model';
|
|
|
|
|
|
|
|
@Injectable({
|
|
|
|
providedIn: 'root',
|
|
|
|
})
|
|
|
|
export class ApiService {
|
|
|
|
private axiosInstance: AxiosInstance;
|
|
|
|
private readonly pollsEndpoint = environment.api.endpoints.polls.name;
|
|
|
|
private readonly commentsEndpoint = environment.api.endpoints.polls.comments.name;
|
|
|
|
private readonly votesEndpoint = environment.api.endpoints.polls.votes.name;
|
|
|
|
private readonly slugsEndpoint = environment.api.endpoints.polls.slugs.name;
|
|
|
|
private readonly votesStacksEndpoint = environment.api.endpoints.polls.votesStacks.name;
|
|
|
|
private readonly usersEndpoint = environment.api.endpoints.users.name;
|
|
|
|
private readonly usersPollsEndpoint = environment.api.endpoints.users.polls.name;
|
|
|
|
private readonly usersPollsSendEmailEndpoint = environment.api.endpoints.users.polls.sendEmail.name;
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this.axiosInstance = axios.create({ baseURL: environment.api.baseHref });
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////
|
|
|
|
// CREATE //
|
|
|
|
////////////
|
|
|
|
public async savePoll(poll: Poll): Promise<void> {
|
|
|
|
try {
|
|
|
|
await this.axiosInstance.post(`${this.pollsEndpoint}`, poll);
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async saveVote(poll: Poll): Promise<void> {
|
|
|
|
try {
|
|
|
|
// TODO: add the votestack in the params
|
|
|
|
await this.axiosInstance.post(`${this.pollsEndpoint}/${poll.configuration.slug}${this.votesEndpoint}`, {
|
|
|
|
params: { voteStack: {} },
|
|
|
|
});
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async saveComment(poll: Poll, comment: string): Promise<void> {
|
|
|
|
try {
|
|
|
|
// TODO: add the comment in the params
|
|
|
|
await this.axiosInstance.post(
|
|
|
|
`${this.pollsEndpoint}/${poll.configuration.slug}${this.commentsEndpoint}`,
|
|
|
|
comment
|
|
|
|
);
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////
|
|
|
|
// READ //
|
|
|
|
//////////
|
|
|
|
public async isSlugAvailable(slug: string): Promise<boolean> {
|
|
|
|
try {
|
|
|
|
// TODO: scenario should be : if we can get this slug, it exists. if not, it doesn't. It's just a GET.
|
|
|
|
const response: AxiosResponse = await this.axiosInstance.get(
|
|
|
|
`${this.pollsEndpoint}${this.slugsEndpoint}/${slug}`
|
|
|
|
);
|
|
|
|
if (response?.status !== 404) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
if (error.response?.status === 404) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async sendEmailToUserOfItsPollsList(user: User): Promise<void> {
|
|
|
|
// If user is not authenticated: the list of polls is send to user's email by the backend.
|
|
|
|
try {
|
|
|
|
await this.axiosInstance.get<Poll[]>(
|
|
|
|
`${this.usersEndpoint}/${user.email}${this.usersPollsEndpoint}${this.usersPollsSendEmailEndpoint}`
|
|
|
|
);
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async getPollsByUserEmail(user: User): Promise<Poll[]> {
|
|
|
|
// If user is authenticated : retrieve polls & display directly in frontend.
|
|
|
|
// TODO: Backend should handle this case. Actually the endpoint doesn't exist in backend.
|
|
|
|
try {
|
|
|
|
const response: AxiosResponse<Poll[]> = await this.axiosInstance.get<Poll[]>(
|
|
|
|
`${this.usersEndpoint}/${user.email}${this.usersPollsEndpoint}`
|
|
|
|
);
|
|
|
|
return response?.data;
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async getPollByIdentifier(identifier: string): Promise<Poll | undefined> {
|
|
|
|
// TODO: identifier should be decided according to backend : Id || Slug ?
|
|
|
|
try {
|
|
|
|
// TODO: this interceptor should not be existing, backend should return the good object poll
|
|
|
|
const adapterInterceptor: number = this.axiosInstance.interceptors.response.use(
|
|
|
|
(response): AxiosResponse => {
|
|
|
|
response.data = response.data['poll'];
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
const response: AxiosResponse<Poll> = await this.axiosInstance.get<Poll>(
|
|
|
|
`${this.pollsEndpoint}/${identifier}`
|
|
|
|
);
|
|
|
|
axios.interceptors.request.eject(adapterInterceptor);
|
|
|
|
return response?.data;
|
|
|
|
} catch (error) {
|
|
|
|
if (error.response?.status === 404) {
|
|
|
|
return undefined;
|
|
|
|
} else {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////
|
|
|
|
// UPDATE //
|
|
|
|
////////////
|
|
|
|
public async updatePoll(poll: Poll): Promise<void> {
|
|
|
|
try {
|
|
|
|
// TODO: implement the params when entities are finalized.
|
|
|
|
await this.axiosInstance.put(`${this.pollsEndpoint}/${poll.configuration.slug}`, {
|
|
|
|
params: { voteStack: {}, token: '' },
|
|
|
|
});
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async updateVote(voteStack: any): Promise<void> {
|
|
|
|
try {
|
|
|
|
// TODO: implement the params when entities are finalized.
|
|
|
|
await this.axiosInstance.patch(`${this.votesStacksEndpoint}/${voteStack.id}`, {
|
|
|
|
params: { voteStack: {}, token: '' },
|
|
|
|
});
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////
|
|
|
|
// DELETE //
|
|
|
|
////////////
|
|
|
|
public async deletePoll(poll: Poll): Promise<void> {
|
|
|
|
try {
|
|
|
|
await this.axiosInstance.delete(`${this.pollsEndpoint}${poll.configuration.slug}`, {});
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async deletePollVotes(poll: Poll): Promise<void> {
|
|
|
|
try {
|
|
|
|
// TODO: update endpoint in Backend
|
|
|
|
await this.axiosInstance.delete(`${this.pollsEndpoint}${poll.configuration.slug}${this.votesEndpoint}`);
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async deletePollComments(poll: Poll): Promise<void> {
|
|
|
|
try {
|
|
|
|
// TODO: modify endpoint in Backend
|
|
|
|
await this.axiosInstance.delete(`${this.pollsEndpoint}${poll.configuration.slug}${this.commentsEndpoint}`);
|
|
|
|
} catch (error) {
|
|
|
|
this.handleError(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////
|
|
|
|
// PRIVATE METHODS //
|
|
|
|
/////////////////////
|
|
|
|
private handleError(error): void {
|
|
|
|
if (error.response) {
|
|
|
|
// The request was made and the server responded with a status code
|
|
|
|
// that falls out of the range of 2xx
|
|
|
|
console.log(error.response.data);
|
|
|
|
console.log(error.response.status);
|
|
|
|
console.log(error.response.headers);
|
|
|
|
} else if (error.request) {
|
|
|
|
// The request was made but no response was received
|
|
|
|
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
|
|
|
// http.ClientRequest in node.js
|
|
|
|
console.log(error.request);
|
|
|
|
} else {
|
|
|
|
// Something happened in setting up the request that triggered an Error
|
|
|
|
console.log('Error', error.message);
|
|
|
|
}
|
|
|
|
console.log(error.config);
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
}
|