Skip to content

Commit c3bde8b

Browse files
committed
[server] Introduce RequestContext
1 parent 1ec7186 commit c3bde8b

File tree

20 files changed

+690
-416
lines changed

20 files changed

+690
-416
lines changed

components/gitpod-protocol/src/analytics.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77
export const IAnalyticsWriter = Symbol("IAnalyticsWriter");
88

9-
type Identity =
10-
| { userId: string | number; anonymousId?: string | number }
11-
| { userId?: string | number; anonymousId: string | number };
9+
type Identity = { userId?: string | number; anonymousId?: string | number; subjectId?: string };
1210

1311
interface Message {
1412
messageId?: string;

components/gitpod-protocol/src/util/logging.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface LogContext {
1717
organizationId?: string;
1818
sessionId?: string;
1919
userId?: string;
20+
subjectId?: string;
2021
workspaceId?: string;
2122
instanceId?: string;
2223
}

components/public-api/gitpod/experimental/v2/organization.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ message GetOrganizationSettingsResponse {
111111
message CreateOrganizationRequest {
112112
// name is the organization name
113113
string name = 1;
114+
115+
// the id of the owning user
116+
optional string owner_id = 2;
114117
}
115118

116119
message CreateOrganizationResponse {

components/public-api/go/experimental/v2/organization.pb.go

Lines changed: 235 additions & 222 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/public-api/typescript/src/gitpod/experimental/v2/organization_pb.ts

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/server/src/api/handler-context-augmentation.d.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66

77
import { HandlerContext, ServiceImpl } from "@connectrpc/connect";
8-
import { User } from "@gitpod/gitpod-protocol";
98
import { HelloService } from "@gitpod/public-api/lib/gitpod/experimental/v1/dummy_connect";
109
import {
1110
LotsOfRepliesRequest,
@@ -14,27 +13,28 @@ import {
1413
SayHelloResponse,
1514
} from "@gitpod/public-api/lib/gitpod/experimental/v1/dummy_pb";
1615
import { injectable } from "inversify";
16+
import { ctx } from "../util/request-context";
1717

1818
@injectable()
1919
export class HelloServiceAPI implements ServiceImpl<typeof HelloService> {
20-
async sayHello(req: SayHelloRequest, context: HandlerContext): Promise<SayHelloResponse> {
20+
async sayHello(req: SayHelloRequest, _: HandlerContext): Promise<SayHelloResponse> {
2121
const response = new SayHelloResponse();
22-
response.reply = "Hello " + this.getSubject(context);
22+
response.reply = "Hello " + getSubject();
2323
return response;
2424
}
25-
async *lotsOfReplies(req: LotsOfRepliesRequest, context: HandlerContext): AsyncGenerator<LotsOfRepliesResponse> {
25+
async *lotsOfReplies(req: LotsOfRepliesRequest, _: HandlerContext): AsyncGenerator<LotsOfRepliesResponse> {
2626
let count = req.previousCount || 0;
27-
while (!context.signal.aborted) {
27+
while (!ctx().signal.aborted) {
2828
const response = new LotsOfRepliesResponse();
29-
response.reply = `Hello ${this.getSubject(context)} ${count}`;
29+
response.reply = `Hello ${getSubject()} ${count}`;
3030
response.count = count;
3131
yield response;
3232
count++;
3333
await new Promise((resolve) => setTimeout(resolve, 30000));
3434
}
3535
}
36+
}
3637

37-
private getSubject(context: HandlerContext): string {
38-
return User.getName(context.user) || "World";
39-
}
38+
function getSubject(): string {
39+
return ctx().subjectId?.toString() || "World";
4040
}

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

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import {
3838
import { PublicAPIConverter } from "@gitpod/gitpod-protocol/lib/public-api-converter";
3939
import { OrganizationService } from "../orgs/organization-service";
4040
import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/experimental/v2/pagination_pb";
41+
import { ctx, userId } from "../util/request-context";
42+
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
4143

4244
@injectable()
4345
export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationServiceInterface> {
@@ -48,38 +50,33 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
4850
private readonly apiConverter: PublicAPIConverter,
4951
) {}
5052

51-
async createOrganization(
52-
req: CreateOrganizationRequest,
53-
context: HandlerContext,
54-
): Promise<CreateOrganizationResponse> {
55-
const org = await this.orgService.createOrganization(context.user.id, req.name);
53+
async createOrganization(req: CreateOrganizationRequest, _: HandlerContext): Promise<CreateOrganizationResponse> {
54+
const ownerId = req.ownerId || ctx().subjectId?.userId();
55+
if (!ownerId) {
56+
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "No userId available");
57+
}
58+
const org = await this.orgService.createOrganization(ownerId, req.name);
5659
const response = new CreateOrganizationResponse();
5760
response.organization = this.apiConverter.toOrganization(org);
5861
return response;
5962
}
6063

61-
async getOrganization(req: GetOrganizationRequest, context: HandlerContext): Promise<GetOrganizationResponse> {
62-
const org = await this.orgService.getOrganization(context.user.id, req.organizationId);
64+
async getOrganization(req: GetOrganizationRequest, _: HandlerContext): Promise<GetOrganizationResponse> {
65+
const org = await this.orgService.getOrganization(userId(), req.organizationId);
6366
const response = new GetOrganizationResponse();
6467
response.organization = this.apiConverter.toOrganization(org);
6568
return response;
6669
}
6770

68-
async updateOrganization(
69-
req: UpdateOrganizationRequest,
70-
context: HandlerContext,
71-
): Promise<UpdateOrganizationResponse> {
72-
await this.orgService.updateOrganization(context.user.id, req.organizationId, {
71+
async updateOrganization(req: UpdateOrganizationRequest, _: HandlerContext): Promise<UpdateOrganizationResponse> {
72+
await this.orgService.updateOrganization(userId(), req.organizationId, {
7373
name: req.name,
7474
});
7575
return new UpdateOrganizationResponse();
7676
}
7777

78-
async listOrganizations(
79-
req: ListOrganizationsRequest,
80-
context: HandlerContext,
81-
): Promise<ListOrganizationsResponse> {
82-
const orgs = await this.orgService.listOrganizations(context.user.id, {
78+
async listOrganizations(req: ListOrganizationsRequest, _: HandlerContext): Promise<ListOrganizationsResponse> {
79+
const orgs = await this.orgService.listOrganizations(userId(), {
8380
limit: req.pagination?.pageSize || 100,
8481
offset: (req.pagination?.page || 0) * (req.pagination?.pageSize || 0),
8582
});
@@ -90,46 +87,43 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
9087
return response;
9188
}
9289

93-
async deleteOrganization(
94-
req: DeleteOrganizationRequest,
95-
context: HandlerContext,
96-
): Promise<DeleteOrganizationResponse> {
97-
await this.orgService.deleteOrganization(context.user.id, req.organizationId);
90+
async deleteOrganization(req: DeleteOrganizationRequest, _: HandlerContext): Promise<DeleteOrganizationResponse> {
91+
await this.orgService.deleteOrganization(userId(), req.organizationId);
9892
return new DeleteOrganizationResponse();
9993
}
10094

10195
async getOrganizationInvitation(
10296
req: GetOrganizationInvitationRequest,
103-
context: HandlerContext,
97+
_: HandlerContext,
10498
): Promise<GetOrganizationInvitationResponse> {
105-
const invitation = await this.orgService.getOrCreateInvite(context.user.id, req.organizationId);
99+
const invitation = await this.orgService.getOrCreateInvite(userId(), req.organizationId);
106100
const response = new GetOrganizationInvitationResponse();
107101
response.invitationId = invitation.id;
108102
return response;
109103
}
110104

111-
async joinOrganization(req: JoinOrganizationRequest, context: HandlerContext): Promise<JoinOrganizationResponse> {
112-
const orgId = await this.orgService.joinOrganization(context.user.id, req.invitationId);
105+
async joinOrganization(req: JoinOrganizationRequest, _: HandlerContext): Promise<JoinOrganizationResponse> {
106+
const orgId = await this.orgService.joinOrganization(userId(), req.invitationId);
113107
const result = new JoinOrganizationResponse();
114108
result.organizationId = orgId;
115109
return result;
116110
}
117111

118112
async resetOrganizationInvitation(
119113
req: ResetOrganizationInvitationRequest,
120-
context: HandlerContext,
114+
_: HandlerContext,
121115
): Promise<ResetOrganizationInvitationResponse> {
122-
const inviteId = await this.orgService.resetInvite(context.user.id, req.organizationId);
116+
const inviteId = await this.orgService.resetInvite(userId(), req.organizationId);
123117
const result = new ResetOrganizationInvitationResponse();
124118
result.invitationId = inviteId.id;
125119
return result;
126120
}
127121

128122
async listOrganizationMembers(
129123
req: ListOrganizationMembersRequest,
130-
context: HandlerContext,
124+
_: HandlerContext,
131125
): Promise<ListOrganizationMembersResponse> {
132-
const members = await this.orgService.listMembers(context.user.id, req.organizationId);
126+
const members = await this.orgService.listMembers(userId(), req.organizationId);
133127
//TODO pagination
134128
const response = new ListOrganizationMembersResponse();
135129
response.members = members.map((member) => this.apiConverter.toOrganizationMember(member));
@@ -140,10 +134,10 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
140134

141135
async updateOrganizationMember(
142136
req: UpdateOrganizationMemberRequest,
143-
context: HandlerContext,
137+
_: HandlerContext,
144138
): Promise<UpdateOrganizationMemberResponse> {
145139
await this.orgService.addOrUpdateMember(
146-
context.user.id,
140+
userId(),
147141
req.organizationId,
148142
req.userId,
149143
this.apiConverter.fromOrgMemberRole(req.role),
@@ -153,27 +147,27 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
153147

154148
async deleteOrganizationMember(
155149
req: DeleteOrganizationMemberRequest,
156-
context: HandlerContext,
150+
_: HandlerContext,
157151
): Promise<DeleteOrganizationMemberResponse> {
158-
await this.orgService.removeOrganizationMember(context.user.id, req.organizationId, req.userId);
152+
await this.orgService.removeOrganizationMember(userId(), req.organizationId, req.userId);
159153
return new DeleteOrganizationMemberResponse();
160154
}
161155

162156
async getOrganizationSettings(
163157
req: GetOrganizationSettingsRequest,
164-
context: HandlerContext,
158+
_: HandlerContext,
165159
): Promise<GetOrganizationSettingsResponse> {
166-
const settings = await this.orgService.getSettings(context.user.id, req.organizationId);
160+
const settings = await this.orgService.getSettings(userId(), req.organizationId);
167161
const response = new GetOrganizationSettingsResponse();
168162
response.settings = this.apiConverter.toOrganizationSettings(settings);
169163
return response;
170164
}
171165

172166
async updateOrganizationSettings(
173167
req: UpdateOrganizationSettingsRequest,
174-
context: HandlerContext,
168+
_: HandlerContext,
175169
): Promise<UpdateOrganizationSettingsResponse> {
176-
await this.orgService.updateSettings(context.user.id, req.organizationId, {
170+
await this.orgService.updateSettings(userId(), req.organizationId, {
177171
workspaceSharingDisabled: req.settings?.workspaceSharingDisabled,
178172
defaultWorkspaceImage: req.settings?.defaultWorkspaceImage,
179173
});

0 commit comments

Comments
 (0)