@franklx/iubenda-consent-solution-api
Version:
API client to implement Iubenda Consent Solution in backend service
110 lines (93 loc) • 3.21 kB
text/typescript
import {
get,
post,
put,
SuperAgentRequest,
} from 'superagent';
import {
ConsentExtended,
ConsentPostResponse,
ConsentResponse,
ConsentsQueryParameters,
} from './consent';
import {
Subject,
SubjectPostResponse,
SubjectQueryParameters,
SubjectResponse,
} from './subject';
export interface ResponseError {
error: boolean;
status: number;
message: string;
}
export interface ClientOption {
apiKey: string;
beta?: boolean;
unescape_json?: boolean;
}
export class IubendaConsentSolution {
apiKey: string;
beta: boolean;
unescape_json: boolean;
constructor(options: ClientOption) {
this.apiKey = options.apiKey;
this.beta = options.beta || false;
this.unescape_json = options.unescape_json || false;
}
get apiUrl(): string {
let url = 'https://consent.iubenda.com/';
if (this.beta)
url += 'beta/';
return url;
}
private addHeaders(request: SuperAgentRequest): SuperAgentRequest {
return request.set('Content-Type', 'application/json').set('ApiKey', this.apiKey).ok(res => true);
}
private generateUrl(path: string): string {
let url = this.apiUrl + '/' + path;
if (this.unescape_json)
url += '?unescape_json=true';
return url;
}
private static async sendRequest(request: SuperAgentRequest): Promise<ResponseError | any> {
const response = await request;
if (response.status < 300) {
return response.body;
} else {
return {status: response.status, message: response.body.message, error: true};
}
}
async getConsents(query?: ConsentsQueryParameters): Promise<ResponseError | ConsentResponse[]> {
const req = this.addHeaders(get(this.generateUrl('consent')));
if (query) {
req.query(query);
}
return await IubendaConsentSolution.sendRequest(req);
}
async getConsent(id: string): Promise<ResponseError | ConsentExtended> {
return await IubendaConsentSolution.sendRequest(this.addHeaders(get(this.generateUrl('consent/' + id))));
}
async createConsent(consent: ConsentExtended): Promise<ResponseError | ConsentPostResponse> {
return await IubendaConsentSolution.sendRequest(this.addHeaders(post(this.generateUrl('consent')).send(consent)));
}
async getSubjects(query?: SubjectQueryParameters): Promise<ResponseError | SubjectResponse[]> {
const req = this.addHeaders(get(this.generateUrl('subjects')));
if (query) {
req.query(query);
}
return await IubendaConsentSolution.sendRequest(req);
}
async getSubject(id: string): Promise<ResponseError | SubjectResponse> {
const req = this.addHeaders(get(this.generateUrl('subjects/' + id)));
return await IubendaConsentSolution.sendRequest(req);
}
async createSubject(subject: Subject): Promise<ResponseError | SubjectPostResponse | null> {
const req = this.addHeaders(post(this.generateUrl('subjects')).send(subject));
return await IubendaConsentSolution.sendRequest(req);
}
async updateSubject(subject: Subject, id: string): Promise<ResponseError | SubjectPostResponse> {
const req = this.addHeaders(put(this.generateUrl('subjects/' + id)).send(subject));
return await IubendaConsentSolution.sendRequest(req);
}
}