@finos/legend-server-sdlc
Version:
Legend SDLC server client
261 lines • 22.4 kB
JavaScript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { WorkspaceType } from './models/workspace/Workspace.js';
import { AbstractServerClient, ContentType, guaranteeNonNullable, HttpHeader, } from '@finos/legend-shared';
var SDLC_ACTIVITY_TRACE;
(function (SDLC_ACTIVITY_TRACE) {
SDLC_ACTIVITY_TRACE["IMPORT_PROJECT"] = "import project";
SDLC_ACTIVITY_TRACE["CREATE_PROJECT"] = "create project";
SDLC_ACTIVITY_TRACE["UPDATE_PROJECT"] = "update project";
SDLC_ACTIVITY_TRACE["CREATE_PATCH"] = "create patch";
SDLC_ACTIVITY_TRACE["CREATE_WORKSPACE"] = "create workspace";
SDLC_ACTIVITY_TRACE["UPDATE_WORKSPACE"] = "update workspace";
SDLC_ACTIVITY_TRACE["DELETE_WORKSPACE"] = "delete workspace";
SDLC_ACTIVITY_TRACE["CREATE_VERSION"] = "create version";
SDLC_ACTIVITY_TRACE["UPDATE_CONFIGURATION"] = "update configuration";
SDLC_ACTIVITY_TRACE["PERFORM_ENTITY_CHANGES"] = "perform entity changes";
SDLC_ACTIVITY_TRACE["UPDATE_ENTITIES"] = "update entities";
SDLC_ACTIVITY_TRACE["CREATE_REVIEW"] = "create review";
SDLC_ACTIVITY_TRACE["COMMIT_REVIEW"] = "commit review";
})(SDLC_ACTIVITY_TRACE || (SDLC_ACTIVITY_TRACE = {}));
export class SDLCServerClient extends AbstractServerClient {
currentUser;
_features;
_platformDependencyConfiguration;
env;
constructor(config) {
super({
baseUrl: config.serverUrl,
baseHeaders: config.baseHeaders,
});
this.env = config.env;
}
setCurrentUser = (value) => {
this.currentUser = value;
};
/**
* NOTE: Should only be used for test
*/
_setFeatures(val) {
this._features = val;
}
get featuresConfigHasBeenFetched() {
return Boolean(this._features);
}
get features() {
return guaranteeNonNullable(this._features, `SDLC server client features configuration has not been fetched`);
}
get platforms() {
return guaranteeNonNullable(this._platformDependencyConfiguration, `SDLC server client platforms configuration has not been fetched`);
}
getTraceData = (name, tracingTags) => ({
name,
tags: {
env: this.env,
userId: this.currentUser?.userId ?? '(unknown)',
...tracingTags,
},
});
// ------------------------------------------- Server -------------------------------------------
_server = () => `${this.baseUrl}/server`;
fetchServerFeaturesConfiguration = async () => {
this._features = await this.get(`${this._server()}/features`);
};
fetchServerPlatforms = async () => {
this._platformDependencyConfiguration = await this.get(`${this._server()}/platforms`);
};
// ------------------------------------------- Authorization -------------------------------------------
static authorizeCallbackUrl = (authenticationServerUrl, callbackURI) => `${authenticationServerUrl}/auth/authorize?redirect_uri=${callbackURI}`;
_auth = () => `${this.baseUrl}/auth`;
isAuthorized = () => this.get(`${this._auth()}/authorized`);
hasAcceptedTermsOfService = () => this.get(`${this._auth()}/termsOfServiceAcceptance`);
// ------------------------------------------- User -------------------------------------------
/**
* We expose this URL because it is needed for developer to authenticate using SDLC server during development.
*/
get currentUserUrl() {
return `${this.baseUrl}/currentUser`;
}
get usersUrl() {
return `${this.baseUrl}/users`;
}
getCurrentUser = () => this.get(this.currentUserUrl);
getUsers = (name) => this.get(this.usersUrl, undefined, undefined, { search: name });
// ------------------------------------------- Project -------------------------------------------
_projects = () => `${this.baseUrl}/projects`;
_project = (projectId) => `${this._projects()}/${encodeURIComponent(projectId)}`;
getProject = (projectId) => this.get(this._project(projectId));
getProjects = (user, search, tag, limit) => this.get(this._projects(), undefined, undefined, {
user,
search,
tag,
limit,
});
createProject = (command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.CREATE_PROJECT), this._projects(), command);
importProject = (command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.IMPORT_PROJECT), `${this._projects()}/import`, command);
updateProject = (projectId, command) => this.putWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.UPDATE_PROJECT), this._project(projectId), command);
// ------------------------------------------- Project Access -------------------------------------------
_authorizedActionProject = (projectId) => `${this._project(projectId)}/authorizedActions`;
getAutorizedActions = (projectId) => this.get(this._authorizedActionProject(projectId));
_acessRole = (projectId) => `${this._project(projectId)}/userAccessRole/currentUser`;
getAccessRole = (projectId) => this.get(this._acessRole(projectId));
// ------------------------------------------- Patch -------------------------------------------
_patches = (projectId) => `${this._project(projectId)}/patches`;
_patch = (projectId, patchReleaseVersionId) => `${this._project(projectId)}/patches/${encodeURIComponent(patchReleaseVersionId)}`;
_releasePatch = (projectId, patchReleaseVersionId) => `${this._patch(projectId, patchReleaseVersionId)}/release`;
getPatches = (projectId) => this.get(this._patches(projectId));
createPatch = (projectId, sourceVersion) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.CREATE_PATCH), this._patches(projectId), sourceVersion);
getPatch = (projectId, patchReleaseVersionId) => this.get(this._patch(projectId, patchReleaseVersionId));
releasePatch = (projectId, patchReleaseVersionId) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.CREATE_VERSION), this._releasePatch(projectId, patchReleaseVersionId));
// ------------------------------------------- Workspace -------------------------------------------
_workspaces = (projectId, patchReleaseVersionId) => `${this._project(projectId)}/${patchReleaseVersionId
? `patches/${encodeURIComponent(patchReleaseVersionId)}/`
: ''}workspaces`;
_groupWorkspaces = (projectId, patchReleaseVersionId) => `${this._project(projectId)}/${patchReleaseVersionId
? `patches/${encodeURIComponent(patchReleaseVersionId)}/`
: ''}groupWorkspaces`;
_workspaceByType = (projectId, patchReleaseVersionId, workspaceId, workspaceType) => workspaceType === WorkspaceType.GROUP
? `${this._groupWorkspaces(projectId, patchReleaseVersionId)}/${encodeURIComponent(workspaceId)}`
: `${this._workspaces(projectId, patchReleaseVersionId)}/${encodeURIComponent(workspaceId)}`;
_workspace = (projectId, workspace) => this._workspaceByType(projectId, workspace.source, workspace.workspaceId, workspace.workspaceType);
/**
* This method makes it possible that we don't have to repeat the set of endpoints twice for:
* 1. workspaceId === undefined (hence calling the project branch)
* 2. and normal workspace branch
*/
_adaptiveWorkspace = (projectId, workspace) => workspace
? this._workspace(projectId, workspace)
: this._project(projectId);
getWorkspaces = (projectId, patchReleaseVersionId) => Promise.all([
this.get(this._workspaces(projectId, patchReleaseVersionId)),
this.get(this._groupWorkspaces(projectId, patchReleaseVersionId)),
]).then((workspaces) => workspaces.flat());
getGroupWorkspaces = (projectId, patchReleaseVersionId) => this.get(this._groupWorkspaces(projectId, patchReleaseVersionId));
getWorkspace = (projectId, patchReleaseVersionId, workspaceId, workspaceType) => this.get(this._workspaceByType(projectId, patchReleaseVersionId, workspaceId, workspaceType));
isWorkspaceOutdated = (projectId, workspace) => this.get(`${this._workspace(projectId, workspace)}/outdated`);
checkIfWorkspaceIsInConflictResolutionMode = (projectId, workspace) => this.get(`${this._workspace(projectId, workspace)}/inConflictResolutionMode`);
createWorkspace = (projectId, patchReleaseVersionId, workspaceId, workspaceType) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.CREATE_WORKSPACE), this._workspaceByType(projectId, patchReleaseVersionId, workspaceId, workspaceType));
updateWorkspace = (projectId, workspace) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.UPDATE_WORKSPACE), `${this._workspace(projectId, workspace)}/update`);
deleteWorkspace = (projectId, workspace) => this.deleteWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.DELETE_WORKSPACE), this._workspace(projectId, workspace));
// ------------------------------------------- Revision -------------------------------------------
_revisions = (projectId, workspaceId) => `${this._adaptiveWorkspace(projectId, workspaceId)}/revisions`;
_revision = (projectId, workspace, revisionId) => `${this._adaptiveWorkspace(projectId, workspace)}/revisions/${encodeURIComponent(revisionId)}`;
getRevisions = (projectId, workspace, since, until) => this.get(this._revisions(projectId, workspace), {}, {}, { since: since?.toISOString(), until: until?.toISOString() });
getRevision = (projectId, workspace, revisionId) => this.get(this._revision(projectId, workspace, revisionId));
// ------------------------------------------- Version -------------------------------------------
_versions = (projectId) => `${this._project(projectId)}/versions`;
_version = (projectId, versionId) => `${this._versions(projectId)}/${encodeURIComponent(versionId)}`;
getVersions = (projectId) => this.get(this._versions(projectId));
getVersion = (projectId, versionId) => this.get(this._version(projectId, versionId));
createVersion = (projectId, command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.CREATE_VERSION), this._versions(projectId), command);
getLatestVersion = (projectId) => this.get(`${this._versions(projectId)}/latest`);
// ------------------------------------------- Configuration -------------------------------------------
_configuration = (projectId, workspace) => `${this._adaptiveWorkspace(projectId, workspace)}/configuration`;
getConfiguration = (projectId, workspace) => this.get(this._configuration(projectId, workspace));
getConfigurationByVersion = (projectId, versionId) => this.get(`${this._version(projectId, versionId)}/configuration`);
getConfigurationByRevision = (projectId, workspace, revisionId) => this.get(`${this._revision(projectId, workspace, revisionId)}/configuration`);
updateConfiguration = (projectId, workspace, command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.UPDATE_CONFIGURATION), this._configuration(projectId, workspace), command);
getLatestProjectStructureVersion = () => this.get(`${this.baseUrl}/configuration/latestProjectStructureVersion`);
projectConfigurationStatus = (projectId) => this.get(`${this.baseUrl}/projects/${projectId}/configuration/projectConfigurationStatus`);
// ------------------------------------------- Workflow -------------------------------------------
_workflows = (projectId, workspace) => `${this._adaptiveWorkspace(projectId, workspace)}/workflows`;
_workflow = (projectId, workspace, workflowId) => `${this._adaptiveWorkspace(projectId, workspace)}/workflows/${encodeURIComponent(workflowId)}`;
_workflowJobs = (projectId, workspace, workflowId) => `${this._workflow(projectId, workspace, workflowId)}/jobs`;
_workflowJob = (projectId, workspace, workflowId, workflowJobId) => `${this._workflow(projectId, workspace, workflowId)}/jobs/${encodeURIComponent(workflowJobId)}`;
getWorkflow = (projectId, workspace, workflowId) => this.get(this._workflow(projectId, workspace, workflowId));
getWorkflows = (projectId, workspace, status, revisionIds, limit) => this.get(this._workflows(projectId, workspace), undefined, undefined, {
status,
revisionIds,
limit,
});
getWorkflowsByRevision = (projectId, workspace, revisionId) => this.get(this._workflows(projectId, workspace), undefined, undefined, {
revisionId,
});
getWorkflowJobs = (projectId, workspace, workflowId, status, revisionIds, limit) => this.get(this._workflowJobs(projectId, workspace, workflowId), undefined, undefined, { status, revisionIds, limit });
getWorkflowJob = (projectId, workspace, workflowJob) => this.get(`${this._workflowJob(projectId, workspace, workflowJob.workflowId, workflowJob.id)}`);
getWorkflowJobLogs = (projectId, workspace, workflowJob) => this.get(`${this._workflowJob(projectId, workspace, workflowJob.workflowId, workflowJob.id)}/logs`, {}, { [HttpHeader.ACCEPT]: ContentType.TEXT_PLAIN });
cancelWorkflowJob = (projectId, workspace, workflowJob) => this.post(`${this._workflowJob(projectId, workspace, workflowJob.workflowId, workflowJob.id)}/cancel`);
retryWorkflowJob = (projectId, workspace, workflowJob) => this.post(`${this._workflowJob(projectId, workspace, workflowJob.workflowId, workflowJob.id)}/retry`);
runManualWorkflowJob = (projectId, workspace, workflowJob) => this.post(`${this._workflowJob(projectId, workspace, workflowJob.workflowId, workflowJob.id)}/run`);
_workflowsByVersion = (projectId, versionId) => `${this._version(projectId, versionId)}/workflows`;
_workflowByVersion = (projectId, versionId, workflowId) => `${this._workflowsByVersion(projectId, versionId)}/${encodeURIComponent(workflowId)}`;
_workflowJobsByVersion = (projectId, versionId, workflowId) => `${this._workflowByVersion(projectId, versionId, workflowId)}/jobs`;
_workflowJobByVersion = (projectId, versionId, workflowId, workflowJobId) => `${this._workflowJobsByVersion(projectId, versionId, workflowId)}/${encodeURIComponent(workflowJobId)}`;
getWorkflowByVersion = (projectId, versionId, workflowId) => this.get(this._workflowByVersion(projectId, versionId, workflowId));
getWorkflowsByVersion = (projectId, versionId, status, revisionIds, limit) => this.get(this._workflowsByVersion(projectId, versionId), undefined, undefined, {
status,
revisionIds,
limit,
});
getWorkflowJobsByVersion = (projectId, versionId, workflowId, status, revisionIds, limit) => this.get(this._workflowJobsByVersion(projectId, versionId, workflowId), undefined, undefined, { status, revisionIds, limit });
getWorkflowJobByVersion = (projectId, versionId, workflowJob) => this.get(`${this._workflowJobByVersion(projectId, versionId, workflowJob.workflowId, workflowJob.id)}`);
getWorkflowJobLogsByVersion = (projectId, versionId, workflowJob) => this.get(`${this._workflowJobByVersion(projectId, versionId, workflowJob.workflowId, workflowJob.id)}/logs`, {}, { [HttpHeader.ACCEPT]: ContentType.TEXT_PLAIN });
cancelWorkflowJobByVersion = (projectId, versionId, workflowJob) => this.post(`${this._workflowJobByVersion(projectId, versionId, workflowJob.workflowId, workflowJob.id)}/cancel`);
retryWorkflowJobByVersion = (projectId, versionId, workflowJob) => this.post(`${this._workflowJobByVersion(projectId, versionId, workflowJob.workflowId, workflowJob.id)}/retry`);
runManualWorkflowJobByVersion = (projectId, versionId, workflowJob) => this.post(`${this._workflowJobByVersion(projectId, versionId, workflowJob.workflowId, workflowJob.id)}/run`);
// ------------------------------------------- Entity -------------------------------------------
_entities = (projectId, workspace) => `${this._adaptiveWorkspace(projectId, workspace)}/entities`;
getEntities = (projectId, workspace) => this.get(this._entities(projectId, workspace));
getEntitiesByRevision = (projectId, workspace, revisionId) => this.get(`${this._revision(projectId, workspace, revisionId)}/entities`);
getEntitiesByVersion = (projectId, versionId) => this.get(`${this._version(projectId, versionId)}/entities`);
updateEntities = (projectId, workspace, command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.UPDATE_ENTITIES), this._entities(projectId, workspace), command);
performEntityChanges = (projectId, workspace, command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.PERFORM_ENTITY_CHANGES), `${this._adaptiveWorkspace(projectId, workspace)}/entityChanges`, command);
getWorkspaceEntity = (workspace, entityPath) => this.get(`${this._entities(workspace.projectId, workspace)}/${entityPath}`);
// ------------------------------------------- Review -------------------------------------------
_reviews = (projectId, patchReleaseVersionId) => `${this._project(projectId)}/${patchReleaseVersionId
? `patches/${encodeURIComponent(patchReleaseVersionId)}/`
: ''}reviews`;
_allReviews = () => `${this.baseUrl}/reviews`;
_review = (projectId, patchReleaseVersionId, reviewId) => `${this._reviews(projectId, patchReleaseVersionId)}/${encodeURIComponent(reviewId)}`;
getReviews = (projectId, patchReleaseVersionId, options) => this.get(this._reviews(projectId, patchReleaseVersionId), undefined, undefined, {
...options,
since: options?.since?.toISOString(),
until: options?.until?.toISOString(),
});
getAllReviews = (options) => this.get(this._allReviews(), undefined, undefined, {
...options,
since: options?.since?.toISOString(),
until: options?.until?.toISOString(),
});
getReview = (projectId, patchReleaseVersionId, reviewId) => this.get(this._review(projectId, patchReleaseVersionId, reviewId));
getReviewApprovals = (projectId, patchReleaseVersionId, reviewId) => this.get(`${this._review(projectId, patchReleaseVersionId, reviewId)}/approval`);
createReview = (projectId, patchReleaseVersionId, command) => this.postWithTracing(this.getTraceData(SDLC_ACTIVITY_TRACE.CREATE_REVIEW), this._reviews(projectId, patchReleaseVersionId), command);
approveReview = (projectId, patchReleaseVersionId, reviewId) => this.post(`${this._review(projectId, patchReleaseVersionId, reviewId)}/approve`);
rejectReview = (projectId, patchReleaseVersionId, reviewId) => this.post(`${this._review(projectId, patchReleaseVersionId, reviewId)}/reject`);
closeReview = (projectId, patchReleaseVersionId, reviewId) => this.post(`${this._review(projectId, patchReleaseVersionId, reviewId)}/close`);
reopenReview = (projectId, patchReleaseVersionId, reviewId) => this.post(`${this._review(projectId, patchReleaseVersionId, reviewId)}/reopen`);
commitReview = (projectId, patchReleaseVersionId, reviewId, command) => this.post(`${this._review(projectId, patchReleaseVersionId, reviewId)}/commit`, command);
// ------------------------------------------- Comparison -------------------------------------------
_reviewComparison = (projectId, patchReleaseVersionId, reviewId) => `${this._review(projectId, patchReleaseVersionId, reviewId)}/comparison`;
getReviewComparision = (projectId, patchReleaseVersionId, reviewId) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}`);
getReviewFromConfiguration = (projectId, patchReleaseVersionId, reviewId) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}/from/configuration`);
getReviewToConfiguration = (projectId, patchReleaseVersionId, reviewId) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}/to/configuration`);
getReviewFromEntities = (projectId, patchReleaseVersionId, reviewId) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}/from/entities`);
getReviewFromEntity = (projectId, patchReleaseVersionId, reviewId, entityPath) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}/from/entities/${entityPath}`);
getReviewToEntities = (projectId, patchReleaseVersionId, reviewId) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}/to/entities`);
getReviewToEntity = (projectId, patchReleaseVersionId, reviewId, entityPath) => this.get(`${this._reviewComparison(projectId, patchReleaseVersionId, reviewId)}/to/entities/${entityPath}`);
// ------------------------------------------- Conflict Resolution -------------------------------------------
_conflictResolution = (projectId, workspace) => `${this._adaptiveWorkspace(projectId, workspace)}/conflictResolution`;
getWorkspacesInConflictResolutionMode = (projectId, patchReleaseVersionId) => this.get(this._conflictResolution(projectId, undefined));
abortConflictResolution = (projectId, workspace) => this.delete(this._conflictResolution(projectId, workspace));
discardConflictResolutionChanges = (projectId, workspace) => this.post(`${this._conflictResolution(projectId, workspace)}/discardChanges`);
acceptConflictResolution = (projectId, workspace, command) => this.post(`${this._conflictResolution(projectId, workspace)}/accept`, command);
isConflictResolutionOutdated = (projectId, workspace) => this.get(`${this._conflictResolution(projectId, workspace)}/outdated`);
getConflictResolutionRevision = (projectId, workspace, revisionId) => this.get(`${this._conflictResolution(projectId, workspace)}/revisions/${revisionId}`);
getEntitiesByRevisionFromWorkspaceInConflictResolutionMode = (projectId, workspace, revisionId) => this.get(`${this._conflictResolution(projectId, workspace)}/revisions/${revisionId}/entities`);
getConfigurationOfWorkspaceInConflictResolutionMode = (projectId, workspace) => this.get(`${this._conflictResolution(projectId, workspace)}/configuration`);
}
//# sourceMappingURL=SDLCServerClient.js.map