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

Add DojoBackendManager

parent b062a067
No related branches found
No related tags found
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';
import FormData from 'form-data';
import logger from '../shared/logging/WinstonLogger';
import GitlabManager from './GitlabManager';
import { StatusCodes } from 'http-status-codes';
class HttpManager {
private _API_BASE_URL!: string;
public LOGIN_URL!: string;
public TEST_SESSION_URL!: string;
public handleCommandErrors: boolean = true;
private static _instance: HttpManager;
......@@ -23,16 +20,7 @@ class HttpManager {
return HttpManager._instance;
}
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`;
}
private constructor() { }
registerAxiosInterceptor() {
this.registerRequestInterceptor();
......@@ -45,14 +33,13 @@ class HttpManager {
config.headers = { ...config.headers, ...(config.data as FormData).getHeaders() } as AxiosRequestHeaders;
}
if ( SessionManager.isLogged && config.url && config.url.indexOf(Config.apiURL) !== -1 ) {
config.headers = {
...config.headers,
'Content-Type': 'multipart/form-data'
} as AxiosRequestHeaders;
if ( config.url && (config.url.indexOf(Config.apiURL) !== -1) ) {
config.headers['Content-Type'] = 'multipart/form-data';
if ( SessionManager.isLogged ) {
config.headers.Authorization = 'Bearer ' + SessionManager.token;
}
}
if ( GitlabManager.isLogged && config.url && config.url.indexOf(Config.gitlab.apiURL) !== -1 ) {
config.headers['PRIVATE-TOKEN'] = GitlabManager.token;
......
......@@ -6,6 +6,9 @@ import axios, { AxiosError } from 'axios';
import HttpManager from './HttpManager';
import ora from 'ora';
import Permissions from '../types/Permissions';
import ApiRoutes from '../types/ApiRoutes';
import DojoBackendManager from './DojoBackendManager';
import { StatusCodes } from 'http-status-codes';
class SessionManager {
......@@ -54,7 +57,7 @@ class SessionManager {
try {
this.profile = new User();
const response = await axios.post(HttpManager.LOGIN_URL, {
const response = await axios.post(DojoBackendManager.getApiUrl(ApiRoutes.LOGIN), {
user : user,
password: password
});
......@@ -83,7 +86,7 @@ class SessionManager {
const hasPermission = (permissionPredicate: () => boolean, verboseText: string): boolean => {
const spinner: ora.Ora = ora({
text : verboseText,
indent: 4
indent: 8
});
let isAllowed: boolean = this.profile.id !== -1 && permissionPredicate();
......@@ -119,7 +122,7 @@ class SessionManager {
}
try {
await axios.get(HttpManager.TEST_SESSION_URL, {});
await axios.get(DojoBackendManager.getApiUrl(ApiRoutes.TEST_SESSION), {});
if ( verbose ) {
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