diff --git a/src/plus/gk/models/organization.ts b/src/plus/gk/models/organization.ts index bf61599cf6062..7507af9a73ff4 100644 --- a/src/plus/gk/models/organization.ts +++ b/src/plus/gk/models/organization.ts @@ -8,26 +8,7 @@ export type OrganizationRole = 'owner' | 'admin' | 'billing' | 'user'; export type OrganizationsResponse = Organization[]; -export interface FullOrganization { - readonly id: string; - readonly name: string; - readonly domain: string; - readonly updatedToNewRoles: boolean; - readonly memberCount: number; - readonly members: OrganizationMember[]; - readonly connections: OrganizationConnection[]; - readonly type: OrganizationType; - readonly isOnChargebee: boolean; -} - -export enum OrganizationType { - Enterprise = 'ENTERPRISE', - Individual = 'INDIVIDUAL', - Pro = 'PRO', - Teams = 'TEAMS', -} - -export type OrganizationConnection = Record; +export type OrganizationMemberStatus = 'activated' | 'pending'; export interface OrganizationMember { readonly id: string; @@ -35,7 +16,7 @@ export interface OrganizationMember { readonly name: string; readonly username: string; readonly role: OrganizationRole; - readonly licenseConsumption: Record; + readonly status: OrganizationMemberStatus; } export interface OrganizationSettings { diff --git a/src/plus/gk/organizationService.ts b/src/plus/gk/organizationService.ts index 9f3b0d2ebd5bc..24e386b3e54d5 100644 --- a/src/plus/gk/organizationService.ts +++ b/src/plus/gk/organizationService.ts @@ -6,7 +6,6 @@ import { once } from '../../system/function'; import { Logger } from '../../system/logger'; import { getLogScope } from '../../system/logger.scope'; import type { - FullOrganization, Organization, OrganizationMember, OrganizationSettings, @@ -20,8 +19,8 @@ const organizationsCacheExpiration = 24 * 60 * 60 * 1000; // 1 day export class OrganizationService implements Disposable { private _disposable: Disposable; private _organizations: Organization[] | null | undefined; - private _fullOrganizations: Map | undefined; - private _organizationSettings: Map | undefined; + private _organizationSettings: Map | undefined; + private _organizationMembers: Map | undefined; constructor( private readonly container: Container, @@ -147,43 +146,34 @@ export class OrganizationService implements Disposable { } @gate() - private async getFullOrganization( - id: string, - options?: { force?: boolean }, - ): Promise { - if (!this._fullOrganizations?.has(id) || options?.force === true) { - const rsp = await this.connection.fetchGkApi(`organization/${id}`, { method: 'GET' }); + async getMembers(id?: string | undefined, options?: { force?: boolean }): Promise { + if (id == null) { + id = await this.getActiveOrganizationId(); + if (id == null) return []; + } + + if (!this._organizationMembers?.has(id) || options?.force === true) { + type MemberResponse = { + members: OrganizationMember[]; + }; + const rsp = await this.connection.fetchGkApi(`organization/${id}/members`, { method: 'GET' }); if (!rsp.ok) { Logger.error( '', getLogScope(), - `Unable to get organization; status=(${rsp.status}): ${rsp.statusText}`, + `Unable to get organization members; status=(${rsp.status}): ${rsp.statusText}`, ); - return undefined; + return []; } - const organization = (await rsp.json()) as FullOrganization; - if (this._fullOrganizations == null) { - this._fullOrganizations = new Map(); - } - organization.members.sort((a, b) => (a.name ?? a.username).localeCompare(b.name ?? b.username)); - this._fullOrganizations.set(id, organization); - } - return this._fullOrganizations.get(id); - } + const members: OrganizationMember[] = ((await rsp.json()) as MemberResponse).members; + sortOrgMembers(members); - @gate() - async getMembers( - organizationId?: string | undefined, - options?: { force?: boolean }, - ): Promise { - if (organizationId == null) { - organizationId = await this.getActiveOrganizationId(); - if (organizationId == null) return []; + this._organizationMembers ??= new Map(); + this._organizationMembers.set(id, members); } - const organization = await this.getFullOrganization(organizationId, options); - return organization?.members ?? []; + return this._organizationMembers.get(id) ?? []; } async getMemberById(id: string, organizationId: string): Promise { @@ -245,3 +235,7 @@ export class OrganizationService implements Disposable { return this._organizationSettings.get(id); } } + +function sortOrgMembers(members: OrganizationMember[]): OrganizationMember[] { + return members.sort((a, b) => (a.name ?? a.username).localeCompare(b.name ?? b.username)); +}