Skip to content

Commit 362f123

Browse files
committed
WorkspaceService.getSupportedWorkspaceClasses + updateGitStatus
1 parent 553f9b2 commit 362f123

File tree

3 files changed

+64
-28
lines changed

3 files changed

+64
-28
lines changed

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
TracedWorkspaceDB,
1313
EmailDomainFilterDB,
1414
TeamDB,
15-
RedisPublisher,
1615
DBGitpodToken,
1716
} from "@gitpod/gitpod-db/lib";
1817
import { BlockedRepositoryDB } from "@gitpod/gitpod-db/lib/blocked-repository-db";
@@ -260,8 +259,6 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
260259
@inject(EmailDomainFilterDB) private emailDomainFilterdb: EmailDomainFilterDB,
261260

262261
@inject(RedisSubscriber) private readonly subscriber: RedisSubscriber,
263-
@inject(RedisPublisher) private readonly publisher: RedisPublisher,
264-
@inject(TracedWorkspaceDB) private readonly workspaceDB: DBWithTracing<WorkspaceDB>,
265262
) {}
266263

267264
/** Id the uniquely identifies this server instance */
@@ -1854,23 +1851,11 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
18541851
const user = await this.checkAndBlockUser("updateGitStatus");
18551852

18561853
const workspace = await this.workspaceService.getWorkspace(user.id, workspaceId);
1857-
let instance = await this.workspaceDb.trace(ctx).findCurrentInstance(workspaceId);
1858-
if (!instance) {
1859-
throw new ApplicationError(ErrorCodes.NOT_FOUND, `workspace ${workspaceId} has no instance`);
1860-
}
1854+
const instance = await this.workspaceService.getCurrentInstance(user.id, workspaceId);
18611855
traceWI(ctx, { instanceId: instance.id });
18621856
await this.guardAccess({ kind: "workspaceInstance", subject: instance, workspace }, "update");
18631857

1864-
if (WorkspaceInstanceRepoStatus.equals(instance.gitStatus, gitStatus)) {
1865-
return;
1866-
}
1867-
1868-
instance = await this.workspaceDB.trace(ctx).updateInstancePartial(instance.id, { gitStatus });
1869-
await this.publisher.publishInstanceUpdate({
1870-
instanceID: instance.id,
1871-
ownerID: workspace.ownerId,
1872-
workspaceID: workspace.id,
1873-
});
1858+
await this.workspaceService.updateGitStatus(user.id, workspaceId, gitStatus);
18741859
}
18751860

18761861
public async openPort(
@@ -3385,16 +3370,8 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
33853370
}
33863371

33873372
async getSupportedWorkspaceClasses(ctx: TraceContext): Promise<SupportedWorkspaceClass[]> {
3388-
await this.checkAndBlockUser("getSupportedWorkspaceClasses");
3389-
const classes = this.config.workspaceClasses.map((c) => ({
3390-
id: c.id,
3391-
category: c.category,
3392-
displayName: c.displayName,
3393-
description: c.description,
3394-
powerups: c.powerups,
3395-
isDefault: c.isDefault,
3396-
}));
3397-
return classes;
3373+
const user = await this.checkAndBlockUser("getSupportedWorkspaceClasses");
3374+
return this.workspaceService.getSupportedWorkspaceClasses(user.id);
33983375
}
33993376

34003377
//#region gitpod.io concerns

components/server/src/workspace/workspace-service.spec.db.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,26 @@ describe("WorkspaceService", async () => {
302302
"should fail on non-running workspace",
303303
);
304304
});
305+
306+
it("should updateGitStatus", async () => {
307+
const svc = container.get(WorkspaceService);
308+
const ws = await createTestWorkspace(svc, org, owner, project);
309+
310+
await expectError(
311+
ErrorCodes.NOT_FOUND,
312+
svc.updateGitStatus(owner.id, ws.id, {
313+
branch: "main",
314+
uncommitedFiles: ["new-unit.ts"],
315+
latestCommit: "asdf",
316+
totalUncommitedFiles: 1,
317+
totalUntrackedFiles: 1,
318+
unpushedCommits: [],
319+
untrackedFiles: ["new-unit.ts"],
320+
totalUnpushedCommits: 0,
321+
}),
322+
"should fail on non-running workspace",
323+
);
324+
});
305325
});
306326

307327
async function createTestWorkspace(svc: WorkspaceService, org: Organization, owner: User, project: Project) {

components/server/src/workspace/workspace-service.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { inject, injectable } from "inversify";
88
import * as grpc from "@grpc/grpc-js";
9-
import { WorkspaceDB } from "@gitpod/gitpod-db/lib";
9+
import { RedisPublisher, WorkspaceDB } from "@gitpod/gitpod-db/lib";
1010
import {
1111
GitpodServer,
1212
PortProtocol,
@@ -18,6 +18,7 @@ import {
1818
WorkspaceContext,
1919
WorkspaceInstance,
2020
WorkspaceInstancePort,
21+
WorkspaceInstanceRepoStatus,
2122
WorkspaceSoftDeletion,
2223
} from "@gitpod/gitpod-protocol";
2324
import { ErrorCodes, ApplicationError } from "@gitpod/gitpod-protocol/lib/messaging/error";
@@ -42,6 +43,8 @@ import { RegionService } from "./region-service";
4243
import { ProjectsService } from "../projects/projects-service";
4344
import { EnvVarService } from "../user/env-var-service";
4445
import { WorkspaceManagerClientProvider } from "@gitpod/ws-manager/lib/client-provider";
46+
import { SupportedWorkspaceClass } from "@gitpod/gitpod-protocol/lib/workspace-class";
47+
import { Config } from "../config";
4548

4649
export interface StartWorkspaceOptions extends GitpodServer.StartWorkspaceOptions {
4750
/**
@@ -53,13 +56,15 @@ export interface StartWorkspaceOptions extends GitpodServer.StartWorkspaceOption
5356
@injectable()
5457
export class WorkspaceService {
5558
constructor(
59+
@inject(Config) private readonly config: Config,
5660
@inject(WorkspaceFactory) private readonly factory: WorkspaceFactory,
5761
@inject(WorkspaceStarter) private readonly workspaceStarter: WorkspaceStarter,
5862
@inject(WorkspaceManagerClientProvider) private readonly clientProvider: WorkspaceManagerClientProvider,
5963
@inject(WorkspaceDB) private readonly db: WorkspaceDB,
6064
@inject(EntitlementService) private readonly entitlementService: EntitlementService,
6165
@inject(EnvVarService) private readonly envVarService: EnvVarService,
6266
@inject(ProjectsService) private readonly projectsService: ProjectsService,
67+
@inject(RedisPublisher) private readonly publisher: RedisPublisher,
6368
@inject(Authorizer) private readonly auth: Authorizer,
6469
) {}
6570

@@ -539,6 +544,40 @@ export class WorkspaceService {
539544
await this.auth.checkPermissionOnWorkspace(userId, "access", workspaceId);
540545
await this.db.updatePartial(workspaceId, { description });
541546
}
547+
548+
public async updateGitStatus(
549+
userId: string,
550+
workspaceId: string,
551+
gitStatus: Required<WorkspaceInstanceRepoStatus> | undefined,
552+
) {
553+
await this.auth.checkPermissionOnWorkspace(userId, "access", workspaceId);
554+
555+
let instance = await this.getCurrentInstance(userId, workspaceId);
556+
if (WorkspaceInstanceRepoStatus.equals(instance.gitStatus, gitStatus)) {
557+
return;
558+
}
559+
560+
const workspace = await this.getWorkspace(userId, workspaceId);
561+
instance = await this.db.updateInstancePartial(instance.id, { gitStatus });
562+
await this.publisher.publishInstanceUpdate({
563+
instanceID: instance.id,
564+
ownerID: workspace.ownerId,
565+
workspaceID: workspace.id,
566+
});
567+
}
568+
569+
public async getSupportedWorkspaceClasses(userId: string): Promise<SupportedWorkspaceClass[]> {
570+
// No access check required, valid session/user is enough
571+
const classes = this.config.workspaceClasses.map((c) => ({
572+
id: c.id,
573+
category: c.category,
574+
displayName: c.displayName,
575+
description: c.description,
576+
powerups: c.powerups,
577+
isDefault: c.isDefault,
578+
}));
579+
return classes;
580+
}
542581
}
543582

544583
// TODO(gpl) Make private after FGA rollout

0 commit comments

Comments
 (0)