Skip to content

Commit 95dc348

Browse files
geroplroboquat
authored andcommitted
[server] Introduce getBillingModeForUser/-Team
1 parent 2db0172 commit 95dc348

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
@@ -63,6 +63,7 @@ import { InstallationAdminSettings, TelemetryData } from "./installation-admin-p
6363
import { Currency } from "./plans";
6464
import { BillableSession, BillableSessionRequest } from "./usage";
6565
import { SupportedWorkspaceClass } from "./workspace-class";
66+
import { BillingMode } from "./billing-mode";
6667

6768
export interface GitpodClient {
6869
onInstanceUpdate(instance: WorkspaceInstance): void;
@@ -298,6 +299,9 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
298299

299300
setUsageAttribution(usageAttribution: string): Promise<void>;
300301

302+
getBillingModeForUser(): Promise<BillingMode>;
303+
getBillingModeForTeam(teamId: string): Promise<BillingMode>;
304+
301305
/**
302306
* Analytics
303307
*/

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,12 +106,14 @@ 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";
113112
import { Timestamp } from "google-protobuf/google/protobuf/timestamp_pb";
114113
import { EntitlementService } from "../../../src/billing/entitlement-service";
114+
import { BillingMode } from "@gitpod/gitpod-protocol/lib/billing-mode";
115+
import { BillingModes } from "../billing/billing-mode";
116+
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
115117

116118
@injectable()
117119
export class GitpodServerEEImpl extends GitpodServerImpl {
@@ -157,6 +159,8 @@ export class GitpodServerEEImpl extends GitpodServerImpl {
157159
@inject(CostCenterDB) protected readonly costCenterDB: CostCenterDB;
158160
@inject(EntitlementService) protected readonly entitlementService: EntitlementService;
159161

162+
@inject(BillingModes) protected readonly billingModes: BillingModes;
163+
160164
initialize(
161165
client: GitpodClient | undefined,
162166
user: User | undefined,
@@ -2176,6 +2180,22 @@ export class GitpodServerEEImpl extends GitpodServerImpl {
21762180
};
21772181
}
21782182

2183+
async getBillingModeForUser(ctx: TraceContextWithSpan): Promise<BillingMode> {
2184+
traceAPIParams(ctx, {});
2185+
2186+
const user = this.checkUser("getBillingModeForUser");
2187+
return this.billingModes.getBillingModeForUser(user, new Date());
2188+
}
2189+
2190+
async getBillingModeForTeam(ctx: TraceContextWithSpan, teamId: string): Promise<BillingMode> {
2191+
traceAPIParams(ctx, { teamId });
2192+
2193+
this.checkAndBlockUser("getBillingModeForTeam");
2194+
const team = await this.guardTeamOperation(teamId, "get");
2195+
2196+
return this.billingModes.getBillingModeForTeam(team, new Date());
2197+
}
2198+
21792199
// (SaaS) – admin
21802200
async adminGetAccountStatement(ctx: TraceContext, userId: string): Promise<AccountStatement> {
21812201
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,
@@ -171,6 +175,7 @@ import { Currency } from "@gitpod/gitpod-protocol/lib/plans";
171175
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
172176
import { BillableSession, BillableSessionRequest } from "@gitpod/gitpod-protocol/lib/usage";
173177
import { WorkspaceClusterImagebuilderClientProvider } from "./workspace-cluster-imagebuilder-client-provider";
178+
import { BillingMode } from "@gitpod/gitpod-protocol/lib/billing-mode";
174179

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

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

20682074
public async getTeams(ctx: TraceContext): Promise<Team[]> {
@@ -3227,6 +3233,18 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
32273233
}
32283234
}
32293235

3236+
async getBillingModeForUser(ctx: TraceContextWithSpan): Promise<BillingMode> {
3237+
traceAPIParams(ctx, {});
3238+
3239+
return BillingMode.NONE;
3240+
}
3241+
3242+
async getBillingModeForTeam(ctx: TraceContextWithSpan, teamId: string): Promise<BillingMode> {
3243+
traceAPIParams(ctx, { teamId });
3244+
3245+
return BillingMode.NONE;
3246+
}
3247+
32303248
//
32313249
//#endregion
32323250

0 commit comments

Comments
 (0)