@codecovevienna/gittt-cli
Version:
Tracking time with CLI into a git repository
105 lines (104 loc) • 5 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MultipieHelper = exports.DEFAULT_ROLE = void 0;
const axios_1 = __importDefault(require("axios"));
const _1 = require(".");
const moment_1 = __importDefault(require("moment"));
exports.DEFAULT_ROLE = '?';
class MultipieHelper {
constructor() {
this.getValidRoles = (project, record, oldRole) => __awaiter(this, void 0, void 0, function* () {
let roles = [
{
name: oldRole || exports.DEFAULT_ROLE,
value: oldRole || exports.DEFAULT_ROLE,
}
];
const configHelper = _1.ConfigHelper.getInstance();
const links = yield configHelper.findLinksByProject(project, 'Multipie');
if (links.length > 1) {
throw new Error(`Multiple multipie links found for "${project.name}"`);
}
// check if everything is configured
const link = links[0];
if (!link.rolesEndpoint) {
throw new Error(`No roles endpoint set in link for "${project.name}".`);
}
const rolesFromApi = yield this.getRolesFromApi(link, record);
// merge roles with default roles
// so if we have an oldRole that is not in the rolesFromApi it will be available afterwards
roles = [
...roles
.filter(choice => !rolesFromApi
.map(multipieApiRole => multipieApiRole.role)
.includes(choice.name)),
...rolesFromApi
.map(multipieApiRole => ({
name: multipieApiRole.role,
value: multipieApiRole.role
}))
];
return roles;
});
this.getRolesFromApi = (link, record) => __awaiter(this, void 0, void 0, function* () {
const multipieLink = link;
const authHelper = new _1.AuthHelper();
let authorizationHeader = "";
if (multipieLink.username) {
// Legacy flow
_1.LogHelper.debug("Found username parameter in link configuration, using legacy auth method");
authorizationHeader = authHelper.getLegacyAuth(multipieLink);
}
else {
const multipieAuth = authHelper.getAuthClient(multipieLink);
const { refreshToken } = multipieLink;
if (!refreshToken) {
throw new Error(`Unable to find refresh token for this project, please login via 'gittt link'`);
}
const offlineToken = yield multipieAuth.createToken("", refreshToken, {});
_1.LogHelper.debug(`Refreshing token to get access token`);
const refreshedToken = yield offlineToken.refresh();
_1.LogHelper.debug(`Got access token`);
authorizationHeader = `Bearer ${refreshedToken.accessToken}`;
}
const rolesUrl = `${link.rolesEndpoint}?project=${link.projectName}&time=${(0, moment_1.default)(record.end)
.format('YYYY-MM-DDTHH:mm:ss')}`;
try {
_1.LogHelper.debug(`Loading roles from ${rolesUrl}`);
const rolesResult = yield axios_1.default
.get(rolesUrl, {
headers: {
"Authorization": authorizationHeader,
"Cache-Control": "no-cache",
"Content-Type": "application/json",
},
});
const { data } = rolesResult;
if (!data.success) {
return [];
}
return data.data || [];
}
catch (err) {
delete err.config;
delete err.request;
delete err.response;
_1.LogHelper.debug("Loading roles request failed", err);
throw new Error("Loading roles request failed");
}
});
}
}
exports.MultipieHelper = MultipieHelper;