Skip to content
Snippets Groups Projects
Commit 58266dfc authored by michael.minelli's avatar michael.minelli
Browse files

Add DojoBackendManager

parent b062a067
Branches
Tags
No related merge requests found
import axios, { AxiosError } from 'axios';
import Config from '../config/Config';
import ora from 'ora';
import ApiRoutes from '../types/ApiRoutes';
import { StatusCodes } from 'http-status-codes';
import Enonce from '../types/Enonce';
import GitlabUser from '../shared/types/Gitlab/GitlabUser';
class DojoBackendManager {
constructor() { }
private static _instance: DojoBackendManager;
public static get instance(): DojoBackendManager {
if ( !DojoBackendManager._instance ) {
DojoBackendManager._instance = new DojoBackendManager();
}
return DojoBackendManager._instance;
}
public getApiUrl(route: ApiRoutes): string {
return `${ Config.apiURL }${ route }`;
}
public async checkTemplateAccess(idOrNamespace: string, verbose: boolean = true): Promise<boolean> {
const spinner: ora.Ora = ora('Checking template access');
if ( verbose ) {
spinner.start();
}
try {
await axios.get(this.getApiUrl(ApiRoutes.GITLAB_CHECK_TEMPLATE_ACCESS).replace('{{id}}', idOrNamespace));
if ( verbose ) {
spinner.succeed('Template access granted');
}
return true;
} catch ( error ) {
if ( verbose ) {
if ( error instanceof AxiosError ) {
if ( error.response ) {
if ( error.response.status === StatusCodes.NOT_FOUND ) {
spinner.fail(`Template not found or access denied. Please check the template ID or url. Also, please check that the template have public/internal visibility or that your and Dojo account (${ Config.gitlab.dojoAccount.username }) have at least reporter role to the template (if private).`);
} else if ( error.response.status === StatusCodes.UNAUTHORIZED ) {
spinner.fail(`Please check that the template have public/internal visibility or that your and Dojo account (${ Config.gitlab.dojoAccount.username }) have at least reporter role to the template (if private).`);
} else {
spinner.fail(`Template error: ${ error.response.statusText }`);
}
}
} else {
spinner.fail(`Template error: ${ error }`);
}
}
return false;
}
}
public async createProject(name: string, members: Array<GitlabUser>, verbose: boolean = true): Promise<Enonce> {
const spinner: ora.Ora = ora('Creating enonce...');
if ( verbose ) {
spinner.start();
}
try {
const response = await axios.post<Enonce>(this.getApiUrl(ApiRoutes.ENONCE_CREATE), {
name : name,
members: JSON.stringify(members)
});
return response.data;
} catch ( error ) {
if ( verbose ) {
if ( error instanceof AxiosError ) {
spinner.fail(`Error...`);
} else {
spinner.fail(`Error...`);
}
}
throw error;
}
}
}
export default DojoBackendManager.instance;
...@@ -4,13 +4,10 @@ import SessionManager from './SessionManager'; ...@@ -4,13 +4,10 @@ import SessionManager from './SessionManager';
import FormData from 'form-data'; import FormData from 'form-data';
import logger from '../shared/logging/WinstonLogger'; import logger from '../shared/logging/WinstonLogger';
import GitlabManager from './GitlabManager'; import GitlabManager from './GitlabManager';
import { StatusCodes } from 'http-status-codes';
class HttpManager { class HttpManager {
private _API_BASE_URL!: string;
public LOGIN_URL!: string;
public TEST_SESSION_URL!: string;
public handleCommandErrors: boolean = true; public handleCommandErrors: boolean = true;
private static _instance: HttpManager; private static _instance: HttpManager;
...@@ -23,16 +20,7 @@ class HttpManager { ...@@ -23,16 +20,7 @@ class HttpManager {
return HttpManager._instance; return HttpManager._instance;
} }
private constructor() { private constructor() { }
}
set API_BASE_URL(url: string) {
this._API_BASE_URL = url;
this.LOGIN_URL = `${ this._API_BASE_URL }/login`;
this.TEST_SESSION_URL = `${ this._API_BASE_URL }/test_session`;
}
registerAxiosInterceptor() { registerAxiosInterceptor() {
this.registerRequestInterceptor(); this.registerRequestInterceptor();
...@@ -45,14 +33,13 @@ class HttpManager { ...@@ -45,14 +33,13 @@ class HttpManager {
config.headers = { ...config.headers, ...(config.data as FormData).getHeaders() } as AxiosRequestHeaders; config.headers = { ...config.headers, ...(config.data as FormData).getHeaders() } as AxiosRequestHeaders;
} }
if ( SessionManager.isLogged && config.url && config.url.indexOf(Config.apiURL) !== -1 ) { if ( config.url && (config.url.indexOf(Config.apiURL) !== -1) ) {
config.headers = { config.headers['Content-Type'] = 'multipart/form-data';
...config.headers,
'Content-Type': 'multipart/form-data'
} as AxiosRequestHeaders;
if ( SessionManager.isLogged ) {
config.headers.Authorization = 'Bearer ' + SessionManager.token; config.headers.Authorization = 'Bearer ' + SessionManager.token;
} }
}
if ( GitlabManager.isLogged && config.url && config.url.indexOf(Config.gitlab.apiURL) !== -1 ) { if ( GitlabManager.isLogged && config.url && config.url.indexOf(Config.gitlab.apiURL) !== -1 ) {
config.headers['PRIVATE-TOKEN'] = GitlabManager.token; config.headers['PRIVATE-TOKEN'] = GitlabManager.token;
......
...@@ -6,6 +6,9 @@ import axios, { AxiosError } from 'axios'; ...@@ -6,6 +6,9 @@ import axios, { AxiosError } from 'axios';
import HttpManager from './HttpManager'; import HttpManager from './HttpManager';
import ora from 'ora'; import ora from 'ora';
import Permissions from '../types/Permissions'; import Permissions from '../types/Permissions';
import ApiRoutes from '../types/ApiRoutes';
import DojoBackendManager from './DojoBackendManager';
import { StatusCodes } from 'http-status-codes';
class SessionManager { class SessionManager {
...@@ -54,7 +57,7 @@ class SessionManager { ...@@ -54,7 +57,7 @@ class SessionManager {
try { try {
this.profile = new User(); this.profile = new User();
const response = await axios.post(HttpManager.LOGIN_URL, { const response = await axios.post(DojoBackendManager.getApiUrl(ApiRoutes.LOGIN), {
user : user, user : user,
password: password password: password
}); });
...@@ -83,7 +86,7 @@ class SessionManager { ...@@ -83,7 +86,7 @@ class SessionManager {
const hasPermission = (permissionPredicate: () => boolean, verboseText: string): boolean => { const hasPermission = (permissionPredicate: () => boolean, verboseText: string): boolean => {
const spinner: ora.Ora = ora({ const spinner: ora.Ora = ora({
text : verboseText, text : verboseText,
indent: 4 indent: 8
}); });
let isAllowed: boolean = this.profile.id !== -1 && permissionPredicate(); let isAllowed: boolean = this.profile.id !== -1 && permissionPredicate();
...@@ -119,7 +122,7 @@ class SessionManager { ...@@ -119,7 +122,7 @@ class SessionManager {
} }
try { try {
await axios.get(HttpManager.TEST_SESSION_URL, {}); await axios.get(DojoBackendManager.getApiUrl(ApiRoutes.TEST_SESSION), {});
if ( verbose ) { if ( verbose ) {
spinner.succeed(`The session is valid`); spinner.succeed(`The session is valid`);
......
enum ApiRoutes {
LOGIN = '/login',
TEST_SESSION = '/test_session',
GITLAB_CHECK_TEMPLATE_ACCESS = '/gitlab/project/{{id}}/checkTemplateAccess',
ENONCE_CREATE = '/enonces',
}
export default ApiRoutes;
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment