Skip to content

Commit 5a01915

Browse files
committed
[server] Introduce getBillingModeForUser/-Team
1 parent ccc20fa commit 5a01915

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

components/gitpod-protocol/src/gitpod-service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import { IDEServer } from "./ide-protocol";
6262
import { InstallationAdminSettings, TelemetryData } from "./installation-admin-protocol";
6363
import { Currency } from "./plans";
6464
import { BillableSession } from "./usage";
65+
import { BillingMode } from "./billing-mode";
6566

6667
export interface GitpodClient {
6768
onInstanceUpdate(instance: WorkspaceInstance): void;
@@ -296,6 +297,9 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
296297
listBilledUsage(attributionId: string): Promise<BillableSession[]>;
297298
setUsageAttribution(usageAttribution: string): Promise<void>;
298299

300+
getBillingModeForUser(): Promise<BillingMode>;
301+
getBillingModeForTeam(teamId: string): Promise<BillingMode>;
302+
299303
/**
300304
* Analytics
301305
*/

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { injectable, inject } from "inversify";
88
import { GitpodServerImpl, traceAPIParams, traceWI, censor } from "../../../src/workspace/gitpod-server-impl";
9-
import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing";
9+
import { TraceContext, TraceContextWithSpan } from "@gitpod/gitpod-protocol/lib/util/tracing";
1010
import {
1111
GitpodServer,
1212
GitpodClient,
@@ -106,10 +106,12 @@ import { ClientMetadata, traceClientMetadata } from "../../../src/websocket/webs
106106
import { BitbucketAppSupport } from "../bitbucket/bitbucket-app-support";
107107
import { URL } from "url";
108108
import { UserCounter } from "../user/user-counter";
109-
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
110109
import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution";
111110
import { CachingUsageServiceClientProvider } from "@gitpod/usage-api/lib/usage/v1/sugar";
112111
import * as usage from "@gitpod/usage-api/lib/usage/v1/usage_pb";
112+
import { BillingMode } from "@gitpod/gitpod-protocol/lib/billing-mode";
113+
import { BillingModes } from "../billing/billing-mode";
114+
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
113115

114116
@injectable()
115117
export class GitpodServerEEImpl extends GitpodServerImpl {
@@ -154,6 +156,8 @@ export class GitpodServerEEImpl extends GitpodServerImpl {
154156

155157
@inject(CostCenterDB) protected readonly costCenterDB: CostCenterDB;
156158

159+
@inject(BillingModes) protected readonly billingModes: BillingModes;
160+
157161
initialize(
158162
client: GitpodClient | undefined,
159163
user: User | undefined,
@@ -2166,6 +2170,22 @@ export class GitpodServerEEImpl extends GitpodServerImpl {
21662170
};
21672171
}
21682172

2173+
async getBillingModeForUser(ctx: TraceContextWithSpan): Promise<BillingMode> {
2174+
traceAPIParams(ctx, {});
2175+
2176+
const user = this.checkUser("getBillingModeForUser");
2177+
return this.billingModes.getBillingModeForUser(user, new Date());
2178+
}
2179+
2180+
async getBillingModeForTeam(ctx: TraceContextWithSpan, teamId: string): Promise<BillingMode> {
2181+
traceAPIParams(ctx, { teamId });
2182+
2183+
this.checkAndBlockUser("getBillingModeForTeam");
2184+
const team = await this.guardTeamOperation(teamId, "get");
2185+
2186+
return this.billingModes.getBillingModeForTeam(team, new Date());
2187+
}
2188+
21692189
// (SaaS) – admin
21702190
async adminGetAccountStatement(ctx: TraceContext, userId: string): Promise<AccountStatement> {
21712191
traceAPIParams(ctx, { userId });

components/server/src/auth/rate-limiter.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ function getConfig(config: RateLimiterConfig): RateLimiterConfig {
211211
subscribeTeamToStripe: { group: "default", points: 1 },
212212
getStripePortalUrlForTeam: { group: "default", points: 1 },
213213
listBilledUsage: { group: "default", points: 1 },
214+
getBillingModeForTeam: { group: "default", points: 1 },
215+
getBillingModeForUser: { group: "default", points: 1 },
216+
214217
trackEvent: { group: "default", points: 1 },
215218
trackLocation: { group: "default", points: 1 },
216219
identifyUser: { group: "default", points: 1 },

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ import {
108108
} from "@gitpod/gitpod-protocol/lib/team-subscription-protocol";
109109
import { Cancelable } from "@gitpod/gitpod-protocol/lib/util/cancelable";
110110
import { log, LogContext } from "@gitpod/gitpod-protocol/lib/util/logging";
111-
import { InterfaceWithTraceContext, TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing";
111+
import {
112+
InterfaceWithTraceContext,
113+
TraceContext,
114+
TraceContextWithSpan,
115+
} from "@gitpod/gitpod-protocol/lib/util/tracing";
112116
import {
113117
IdentifyMessage,
114118
RemoteIdentifyMessage,
@@ -170,6 +174,7 @@ import { Currency } from "@gitpod/gitpod-protocol/lib/plans";
170174
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
171175
import { BillableSession } from "@gitpod/gitpod-protocol/lib/usage";
172176
import { WorkspaceClusterImagebuilderClientProvider } from "./workspace-cluster-imagebuilder-client-provider";
177+
import { BillingMode } from "@gitpod/gitpod-protocol/lib/billing-mode";
173178

174179
// shortcut
175180
export const traceWI = (ctx: TraceContext, wi: Omit<LogContext, "userId">) => TraceContext.setOWI(ctx, wi); // userId is already taken care of in WebsocketConnectionManager
@@ -2055,13 +2060,14 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
20552060
return await this.projectsService.getProjectEnvironmentVariables(projectId);
20562061
}
20572062

2058-
protected async guardTeamOperation(teamId: string | undefined, op: ResourceAccessOp): Promise<void> {
2063+
protected async guardTeamOperation(teamId: string | undefined, op: ResourceAccessOp): Promise<Team> {
20592064
const team = await this.teamDB.findTeamById(teamId || "");
20602065
if (!team) {
20612066
throw new ResponseError(ErrorCodes.NOT_FOUND, "Team not found");
20622067
}
20632068
const members = await this.teamDB.findMembersByTeam(team.id);
20642069
await this.guardAccess({ kind: "team", subject: team, members }, op);
2070+
return team;
20652071
}
20662072

20672073
public async getTeams(ctx: TraceContext): Promise<Team[]> {
@@ -3211,6 +3217,18 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
32113217
}
32123218
}
32133219

3220+
async getBillingModeForUser(ctx: TraceContextWithSpan): Promise<BillingMode> {
3221+
traceAPIParams(ctx, {});
3222+
3223+
return BillingMode.NONE;
3224+
}
3225+
3226+
async getBillingModeForTeam(ctx: TraceContextWithSpan, teamId: string): Promise<BillingMode> {
3227+
traceAPIParams(ctx, { teamId });
3228+
3229+
return BillingMode.NONE;
3230+
}
3231+
32143232
//
32153233
//#endregion
32163234

0 commit comments

Comments
 (0)