Path: blob/main/components/gitpod-protocol/src/admin-protocol.ts
2498 views
/**1* Copyright (c) 2020 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { User, Workspace, NamedWorkspaceFeatureFlag, EmailDomainFilterEntry } from "./protocol";7import { BlockedRepository } from "./blocked-repositories-protocol";8import { FindPrebuildsParams } from "./gitpod-service";9import { Project, Team, PrebuildWithStatus, TeamMemberInfo, TeamMemberRole } from "./teams-projects-protocol";10import { WorkspaceInstance, WorkspaceInstancePhase } from "./workspace-instance";11import { RoleOrPermission } from "./permission";12import { BillingMode } from "./billing-mode";13import { CostCenterJSON, ListUsageRequest, ListUsageResponse } from "./usage";1415export interface AdminServer {16adminGetUsers(req: AdminGetListRequest<User>): Promise<AdminGetListResult<User>>;17adminGetUser(id: string): Promise<User>;18adminBlockUser(req: AdminBlockUserRequest): Promise<User>;19adminDeleteUser(id: string): Promise<void>;20adminVerifyUser(id: string): Promise<User>;21adminModifyRoleOrPermission(req: AdminModifyRoleOrPermissionRequest): Promise<User>;22adminModifyPermanentWorkspaceFeatureFlag(req: AdminModifyPermanentWorkspaceFeatureFlagRequest): Promise<User>;2324adminCreateBlockedRepository(25urlRegexp: string,26blockUser: boolean,27blockFreeUsage: boolean,28): Promise<BlockedRepository>;29adminDeleteBlockedRepository(id: number): Promise<void>;30adminGetBlockedRepositories(31req: AdminGetListRequest<BlockedRepository>,32): Promise<AdminGetListResult<BlockedRepository>>;3334adminGetTeamMembers(teamId: string): Promise<TeamMemberInfo[]>;35adminGetTeams(req: AdminGetListRequest<Team>): Promise<AdminGetListResult<Team>>;36adminGetTeamById(id: string): Promise<Team | undefined>;37adminSetTeamMemberRole(teamId: string, userId: string, role: TeamMemberRole): Promise<void>;3839adminGetWorkspaces(req: AdminGetWorkspacesRequest): Promise<AdminGetListResult<WorkspaceAndInstance>>;40adminGetWorkspace(id: string): Promise<WorkspaceAndInstance>;41adminGetWorkspaceInstances(workspaceId: string): Promise<WorkspaceInstance[]>;42adminForceStopWorkspace(id: string): Promise<void>;43adminRestoreSoftDeletedWorkspace(id: string): Promise<void>;4445adminGetProjectsBySearchTerm(req: AdminGetListRequest<Project>): Promise<AdminGetListResult<Project>>;46adminGetProjectById(id: string): Promise<Project | undefined>;4748adminFindPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;4950adminGetBillingMode(attributionId: string): Promise<BillingMode>;5152adminGetCostCenter(attributionId: string): Promise<CostCenterJSON | undefined>;53adminSetUsageLimit(attributionId: string, usageLimit: number): Promise<void>;5455adminListUsage(req: ListUsageRequest): Promise<ListUsageResponse>;56adminAddUsageCreditNote(attributionId: string, credits: number, note: string): Promise<void>;57adminGetUsageBalance(attributionId: string): Promise<number>;5859adminGetBlockedEmailDomains(): Promise<EmailDomainFilterEntry[]>;60adminSaveBlockedEmailDomain(entry: EmailDomainFilterEntry): Promise<void>;61}6263export interface AdminGetListRequest<T> {64offset: number;65limit: number;66orderBy: keyof T;67orderDir: "asc" | "desc";68searchTerm?: string;69}7071export interface AdminGetListResult<T> {72total: number;73rows: T[];74}7576export interface AdminBlockUserRequest {77id: string;78blocked: boolean;79}8081export interface AdminModifyRoleOrPermissionRequest {82id: string;83rpp: {84r: RoleOrPermission;85add: boolean;86}[];87}8889export interface AdminModifyPermanentWorkspaceFeatureFlagRequest {90id: string;91changes: {92featureFlag: NamedWorkspaceFeatureFlag;93add: boolean;94}[];95}9697export interface WorkspaceAndInstance98extends Omit<Workspace, "id" | "creationTime">,99Omit<WorkspaceInstance, "id" | "creationTime"> {100workspaceId: string;101workspaceCreationTime: string;102instanceId: string;103instanceCreationTime: string;104phase: WorkspaceInstancePhase;105}106107export namespace WorkspaceAndInstance {108export function toWorkspace(wai: WorkspaceAndInstance): Workspace {109return {110id: wai.workspaceId,111creationTime: wai.workspaceCreationTime,112...wai,113};114}115116export function toInstance(wai: WorkspaceAndInstance): WorkspaceInstance | undefined {117if (!wai.instanceId) {118return undefined;119}120return {121id: wai.instanceId,122creationTime: wai.instanceCreationTime,123...wai,124};125}126}127128export type AdminGetWorkspacesRequest = AdminGetListRequest<WorkspaceAndInstance> & AdminGetWorkspacesQuery;129/** The fields are meant to be used either OR (not combined) */130export type AdminGetWorkspacesQuery = {131/** we use this field in case we have a UUIDv4 and don't know whether it's an (old) workspace or instance id */132instanceIdOrWorkspaceId?: string;133instanceId?: string;134workspaceId?: string;135ownerId?: string;136};137138139