Skip to content

Commit 3cd7b5a

Browse files
committed
more cleanup; pending proto adjustments
Tool: gitpod/catfood.gitpod.cloud
1 parent a5de813 commit 3cd7b5a

File tree

4 files changed

+47
-72
lines changed

4 files changed

+47
-72
lines changed

components/gitpod-db/src/typeorm/entity/db-team-settings.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,34 +25,34 @@ export class DBOrgSettings implements OrganizationSettings {
2525
workspaceSharingDisabled?: boolean;
2626

2727
@Column("varchar", { nullable: true })
28-
defaultWorkspaceImage?: string | null;
28+
defaultWorkspaceImage?: string;
2929

3030
@Column("json", { nullable: true })
31-
allowedWorkspaceClasses?: string[] | null;
31+
allowedWorkspaceClasses?: string[];
3232

3333
@Column("json", { nullable: true })
34-
pinnedEditorVersions?: { [key: string]: string } | null;
34+
pinnedEditorVersions?: { [key: string]: string };
3535

3636
@Column("json", { nullable: true })
37-
restrictedEditorNames?: string[] | null;
37+
restrictedEditorNames?: string[];
3838

3939
@Column("varchar", { nullable: true })
40-
defaultRole?: OrgMemberRole | undefined;
40+
defaultRole?: OrgMemberRole;
4141

4242
@Column("json", { nullable: true })
43-
timeoutSettings?: TimeoutSettings | undefined;
43+
timeoutSettings?: TimeoutSettings;
4444

4545
@Column("json", { nullable: true })
46-
roleRestrictions?: RoleRestrictions | undefined;
46+
roleRestrictions?: RoleRestrictions;
4747

4848
@Column({ type: "int", default: 0 })
4949
maxParallelRunningWorkspaces: number;
5050

5151
@Column("json", { nullable: true })
52-
onboardingSettings?: OnboardingSettings | undefined;
52+
onboardingSettings?: OnboardingSettings;
5353

5454
@Column({ type: "boolean", default: false })
55-
annotateGitCommits?: boolean | undefined;
55+
annotateGitCommits?: boolean;
5656

5757
@Column()
5858
deleted: boolean;

components/gitpod-protocol/src/teams-projects-protocol.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,15 +216,15 @@ export interface Organization {
216216

217217
export interface OrganizationSettings {
218218
workspaceSharingDisabled?: boolean;
219-
// null or empty string to reset to default
220-
defaultWorkspaceImage?: string | null;
219+
// undefined or empty string to reset to default
220+
defaultWorkspaceImage?: string;
221221

222222
// empty array to allow all kind of workspace classes
223-
allowedWorkspaceClasses?: string[] | null;
223+
allowedWorkspaceClasses?: string[];
224224

225-
pinnedEditorVersions?: { [key: string]: string } | null;
225+
pinnedEditorVersions?: { [key: string]: string };
226226

227-
restrictedEditorNames?: string[] | null;
227+
restrictedEditorNames?: string[];
228228

229229
// what role new members will get, default is "member"
230230
defaultRole?: OrgMemberRole;

components/server/src/api/organization-service-api.ts

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_
4545
import { validate as uuidValidate } from "uuid";
4646
import { ctxUserId } from "../util/request-context";
4747
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
48-
import { EntitlementService } from "../billing/entitlement-service";
4948

5049
@injectable()
5150
export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationServiceInterface> {
@@ -54,8 +53,6 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
5453
private readonly orgService: OrganizationService,
5554
@inject(PublicAPIConverter)
5655
private readonly apiConverter: PublicAPIConverter,
57-
@inject(EntitlementService)
58-
private readonly entitlementService: EntitlementService,
5956
) {}
6057

6158
async listOrganizationWorkspaceClasses(
@@ -266,16 +263,14 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
266263
"updateRestrictedEditorNames is required to be true to update restrictedEditorNames",
267264
);
268265
}
269-
if (typeof req.workspaceSharingDisabled === "boolean") {
270-
update.workspaceSharingDisabled = req.workspaceSharingDisabled;
271-
}
272-
if (typeof req.defaultWorkspaceImage === "string") {
273-
update.defaultWorkspaceImage = req.defaultWorkspaceImage;
274-
}
266+
267+
update.workspaceSharingDisabled = req.workspaceSharingDisabled;
268+
update.defaultWorkspaceImage = req.defaultWorkspaceImage;
275269
update.allowedWorkspaceClasses = req.allowedWorkspaceClasses;
276-
if (req.updatePinnedEditorVersions) {
277-
update.pinnedEditorVersions = req.pinnedEditorVersions;
278-
}
270+
update.pinnedEditorVersions = req.pinnedEditorVersions;
271+
update.annotateGitCommits = req.annotateGitCommits;
272+
update.maxParallelRunningWorkspaces = req.maxParallelRunningWorkspaces;
273+
279274
if (typeof req.defaultRole === "string" && req.defaultRole !== "") {
280275
switch (req.defaultRole) {
281276
case "owner":
@@ -288,13 +283,8 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
288283
}
289284
}
290285

291-
if (typeof req.timeoutSettings?.denyUserTimeouts === "boolean") {
292-
update.timeoutSettings = update.timeoutSettings || {};
293-
update.timeoutSettings.denyUserTimeouts = req.timeoutSettings.denyUserTimeouts;
294-
}
295-
if (typeof req.timeoutSettings?.inactivity === "object") {
296-
update.timeoutSettings = update.timeoutSettings || {};
297-
update.timeoutSettings.inactivity = this.apiConverter.toDurationString(req.timeoutSettings.inactivity);
286+
if (req.timeoutSettings) {
287+
update.timeoutSettings = this.apiConverter.fromTimeoutSettings(req.timeoutSettings);
298288
}
299289

300290
if (req.roleRestrictions.length > 0 && !req.updateRoleRestrictions) {
@@ -304,35 +294,7 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
304294
);
305295
}
306296
if (req.updateRoleRestrictions) {
307-
update.roleRestrictions = update.roleRestrictions ?? {};
308-
for (const roleRestriction of req.roleRestrictions) {
309-
const role = this.apiConverter.fromOrgMemberRole(roleRestriction.role);
310-
const permissions = roleRestriction.permissions.map((p) =>
311-
this.apiConverter.fromOrganizationPermission(p),
312-
);
313-
update.roleRestrictions[role] = permissions;
314-
}
315-
}
316-
317-
if (typeof req.maxParallelRunningWorkspaces === "number") {
318-
if (req.maxParallelRunningWorkspaces < 0) {
319-
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "maxParallelRunningWorkspaces must be >= 0");
320-
}
321-
const maxAllowance = await this.entitlementService.getMaxParallelWorkspaces(
322-
ctxUserId(),
323-
req.organizationId,
324-
);
325-
if (maxAllowance && req.maxParallelRunningWorkspaces > maxAllowance) {
326-
throw new ApplicationError(
327-
ErrorCodes.BAD_REQUEST,
328-
`maxParallelRunningWorkspaces must be <= ${maxAllowance}`,
329-
);
330-
}
331-
if (!Number.isInteger(req.maxParallelRunningWorkspaces)) {
332-
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "maxParallelRunningWorkspaces must be an integer");
333-
}
334-
335-
update.maxParallelRunningWorkspaces = req.maxParallelRunningWorkspaces;
297+
update.roleRestrictions = this.apiConverter.fromRoleRestrictions(req.roleRestrictions);
336298
}
337299

338300
if (req.onboardingSettings) {
@@ -349,10 +311,6 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
349311
}
350312
}
351313

352-
if (req.annotateGitCommits !== undefined) {
353-
update.annotateGitCommits = req.annotateGitCommits;
354-
}
355-
356314
if (Object.keys(update).length === 0) {
357315
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "nothing to update");
358316
}

components/server/src/orgs/organization-service.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { UsageService } from "./usage-service";
3636
import { CostCenter_BillingStrategy } from "@gitpod/gitpod-protocol/lib/usage";
3737
import { CreateUserParams, UserAuthentication } from "../user/user-authentication";
3838
import isURL from "validator/lib/isURL";
39+
import { EntitlementService } from "../billing/entitlement-service";
3940

4041
@injectable()
4142
export class OrganizationService {
@@ -53,6 +54,7 @@ export class OrganizationService {
5354
@inject(DefaultWorkspaceImageValidator)
5455
private readonly validateDefaultWorkspaceImage: DefaultWorkspaceImageValidator,
5556
@inject(UserAuthentication) private readonly userAuthentication: UserAuthentication,
57+
@inject(EntitlementService) private readonly entitlementService: EntitlementService,
5658
) {}
5759

5860
async listOrganizations(
@@ -490,19 +492,21 @@ export class OrganizationService {
490492
settings: Partial<OrganizationSettings>,
491493
): Promise<OrganizationSettings> {
492494
await this.auth.checkPermissionOnOrganization(userId, "write_settings", orgId);
495+
493496
if (typeof settings.defaultWorkspaceImage === "string") {
494497
const defaultWorkspaceImage = settings.defaultWorkspaceImage.trim();
495498
if (defaultWorkspaceImage) {
496499
await this.validateDefaultWorkspaceImage(userId, defaultWorkspaceImage, orgId);
497500
settings = { ...settings, defaultWorkspaceImage };
498501
} else {
499-
settings = { ...settings, defaultWorkspaceImage: null };
502+
settings = { ...settings, defaultWorkspaceImage: undefined };
500503
}
501504
}
505+
502506
if (settings.allowedWorkspaceClasses) {
503507
if (settings.allowedWorkspaceClasses.length === 0) {
504508
// Pass an empty array to allow all workspace classes
505-
settings.allowedWorkspaceClasses = null;
509+
settings.allowedWorkspaceClasses = undefined;
506510
} else {
507511
const allClasses = await this.installationService.getInstallationWorkspaceClasses(userId);
508512
const availableClasses = allClasses.filter((e) => settings.allowedWorkspaceClasses!.includes(e.id));
@@ -550,6 +554,22 @@ export class OrganizationService {
550554
}
551555
}
552556

557+
if (settings.maxParallelRunningWorkspaces !== undefined) {
558+
if (settings.maxParallelRunningWorkspaces < 0) {
559+
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "maxParallelRunningWorkspaces must be >= 0");
560+
}
561+
const maxAllowance = await this.entitlementService.getMaxParallelWorkspaces(userId, orgId);
562+
if (maxAllowance && settings.maxParallelRunningWorkspaces > maxAllowance) {
563+
throw new ApplicationError(
564+
ErrorCodes.BAD_REQUEST,
565+
`maxParallelRunningWorkspaces must be <= ${maxAllowance}`,
566+
);
567+
}
568+
if (!Number.isInteger(settings.maxParallelRunningWorkspaces)) {
569+
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "maxParallelRunningWorkspaces must be an integer");
570+
}
571+
}
572+
553573
if (settings.onboardingSettings) {
554574
if (settings.onboardingSettings.internalLink) {
555575
if (settings.onboardingSettings.internalLink.length > 255) {
@@ -636,10 +656,7 @@ export class OrganizationService {
636656
result.defaultRole = settings.defaultRole;
637657
}
638658
if (settings.timeoutSettings) {
639-
result.timeoutSettings = {
640-
denyUserTimeouts: settings.timeoutSettings?.denyUserTimeouts,
641-
inactivity: settings.timeoutSettings?.inactivity,
642-
};
659+
result.timeoutSettings = settings.timeoutSettings;
643660
}
644661
if (settings.roleRestrictions) {
645662
result.roleRestrictions = settings.roleRestrictions;

0 commit comments

Comments
 (0)