UNPKG

@finos/legend-server-sdlc

Version:
277 lines 23.1 kB
/** * 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; client; constructor(config) { super({ baseUrl: config.serverUrl, baseHeaders: config.baseHeaders, }); this.env = config.env; this.client = config.client; } setCurrentUser = (value) => { this.currentUser = value; }; get clientName() { return this.client; } /** * 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`); } async request(method, url, data, options, headers, parameters, requestProcessConfig, responseProcessConfig, traceData) { const params = this.client ? { ...parameters, client_name: this.client } : parameters; return super.request(method, url, data, options, headers, params, requestProcessConfig, responseProcessConfig, traceData); } 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, client) => { const clientParam = client ? `&client_name=${encodeURIComponent(client)}` : ''; return `${authenticationServerUrl}/auth/authorize?redirect_uri=${callbackURI}${clientParam}`; }; _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