Skip to content

Commit e2d9077

Browse files
committed
[server] Introduce RequestContext
1 parent 6c0bb90 commit e2d9077

20 files changed

+675
-395
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/v1/organization.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ message GetOrganizationSettingsResponse {
129129
message CreateOrganizationRequest {
130130
// name is the organization name
131131
string name = 1;
132+
133+
// the id of the owning user
134+
optional string owner_id = 2;
132135
}
133136

134137
message CreateOrganizationResponse {

components/public-api/go/v1/organization.pb.go

Lines changed: 223 additions & 210 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/v1/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: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import {
3939
import { PublicAPIConverter } from "@gitpod/gitpod-protocol/lib/public-api-converter";
4040
import { OrganizationService } from "../orgs/organization-service";
4141
import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_pb";
42+
import { ctx, userId } from "../util/request-context";
43+
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
4244

4345
@injectable()
4446
export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationServiceInterface> {
@@ -49,18 +51,19 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
4951
private readonly apiConverter: PublicAPIConverter,
5052
) {}
5153

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

62-
async getOrganization(req: GetOrganizationRequest, context: HandlerContext): Promise<GetOrganizationResponse> {
63-
const org = await this.orgService.getOrganization(context.user.id, req.organizationId);
65+
async getOrganization(req: GetOrganizationRequest, _: HandlerContext): Promise<GetOrganizationResponse> {
66+
const org = await this.orgService.getOrganization(userId(), req.organizationId);
6467
const response = new GetOrganizationResponse();
6568
response.organization = this.apiConverter.toOrganization(org);
6669
return response;
@@ -70,7 +73,7 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
7073
req: UpdateOrganizationRequest,
7174
context: HandlerContext,
7275
): Promise<UpdateOrganizationResponse> {
73-
const org = await this.orgService.updateOrganization(context.user.id, req.organizationId, {
76+
const org = await this.orgService.updateOrganization(userId(), req.organizationId, {
7477
name: req.name,
7578
});
7679
return new UpdateOrganizationResponse({
@@ -83,7 +86,7 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
8386
context: HandlerContext,
8487
): Promise<ListOrganizationsResponse> {
8588
const orgs = await this.orgService.listOrganizations(
86-
context.user.id,
89+
userId(),
8790
{
8891
limit: req.pagination?.pageSize || 100,
8992
offset: (req.pagination?.page || 0) * (req.pagination?.pageSize || 0),
@@ -97,46 +100,43 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
97100
return response;
98101
}
99102

100-
async deleteOrganization(
101-
req: DeleteOrganizationRequest,
102-
context: HandlerContext,
103-
): Promise<DeleteOrganizationResponse> {
104-
await this.orgService.deleteOrganization(context.user.id, req.organizationId);
103+
async deleteOrganization(req: DeleteOrganizationRequest, _: HandlerContext): Promise<DeleteOrganizationResponse> {
104+
await this.orgService.deleteOrganization(userId(), req.organizationId);
105105
return new DeleteOrganizationResponse();
106106
}
107107

108108
async getOrganizationInvitation(
109109
req: GetOrganizationInvitationRequest,
110-
context: HandlerContext,
110+
_: HandlerContext,
111111
): Promise<GetOrganizationInvitationResponse> {
112-
const invitation = await this.orgService.getOrCreateInvite(context.user.id, req.organizationId);
112+
const invitation = await this.orgService.getOrCreateInvite(userId(), req.organizationId);
113113
const response = new GetOrganizationInvitationResponse();
114114
response.invitationId = invitation.id;
115115
return response;
116116
}
117117

118-
async joinOrganization(req: JoinOrganizationRequest, context: HandlerContext): Promise<JoinOrganizationResponse> {
119-
const orgId = await this.orgService.joinOrganization(context.user.id, req.invitationId);
118+
async joinOrganization(req: JoinOrganizationRequest, _: HandlerContext): Promise<JoinOrganizationResponse> {
119+
const orgId = await this.orgService.joinOrganization(userId(), req.invitationId);
120120
const result = new JoinOrganizationResponse();
121121
result.organizationId = orgId;
122122
return result;
123123
}
124124

125125
async resetOrganizationInvitation(
126126
req: ResetOrganizationInvitationRequest,
127-
context: HandlerContext,
127+
_: HandlerContext,
128128
): Promise<ResetOrganizationInvitationResponse> {
129-
const inviteId = await this.orgService.resetInvite(context.user.id, req.organizationId);
129+
const inviteId = await this.orgService.resetInvite(userId(), req.organizationId);
130130
const result = new ResetOrganizationInvitationResponse();
131131
result.invitationId = inviteId.id;
132132
return result;
133133
}
134134

135135
async listOrganizationMembers(
136136
req: ListOrganizationMembersRequest,
137-
context: HandlerContext,
137+
_: HandlerContext,
138138
): Promise<ListOrganizationMembersResponse> {
139-
const members = await this.orgService.listMembers(context.user.id, req.organizationId);
139+
const members = await this.orgService.listMembers(userId(), req.organizationId);
140140
//TODO pagination
141141
const response = new ListOrganizationMembersResponse();
142142
response.members = members.map((member) => this.apiConverter.toOrganizationMember(member));
@@ -147,16 +147,16 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
147147

148148
async updateOrganizationMember(
149149
req: UpdateOrganizationMemberRequest,
150-
context: HandlerContext,
150+
_: HandlerContext,
151151
): Promise<UpdateOrganizationMemberResponse> {
152152
await this.orgService.addOrUpdateMember(
153-
context.user.id,
153+
userId(),
154154
req.organizationId,
155155
req.userId,
156156
this.apiConverter.fromOrgMemberRole(req.role),
157157
);
158158
const member = await this.orgService
159-
.listMembers(context.user.id, req.organizationId)
159+
.listMembers(userId(), req.organizationId)
160160
.then((members) => members.find((member) => member.userId === req.userId));
161161
return new UpdateOrganizationMemberResponse({
162162
member: member && this.apiConverter.toOrganizationMember(member),
@@ -165,27 +165,27 @@ export class OrganizationServiceAPI implements ServiceImpl<typeof OrganizationSe
165165

166166
async deleteOrganizationMember(
167167
req: DeleteOrganizationMemberRequest,
168-
context: HandlerContext,
168+
_: HandlerContext,
169169
): Promise<DeleteOrganizationMemberResponse> {
170-
await this.orgService.removeOrganizationMember(context.user.id, req.organizationId, req.userId);
170+
await this.orgService.removeOrganizationMember(userId(), req.organizationId, req.userId);
171171
return new DeleteOrganizationMemberResponse();
172172
}
173173

174174
async getOrganizationSettings(
175175
req: GetOrganizationSettingsRequest,
176-
context: HandlerContext,
176+
_: HandlerContext,
177177
): Promise<GetOrganizationSettingsResponse> {
178-
const settings = await this.orgService.getSettings(context.user.id, req.organizationId);
178+
const settings = await this.orgService.getSettings(userId(), req.organizationId);
179179
const response = new GetOrganizationSettingsResponse();
180180
response.settings = this.apiConverter.toOrganizationSettings(settings);
181181
return response;
182182
}
183183

184184
async updateOrganizationSettings(
185185
req: UpdateOrganizationSettingsRequest,
186-
context: HandlerContext,
186+
_: HandlerContext,
187187
): Promise<UpdateOrganizationSettingsResponse> {
188-
const settings = await this.orgService.updateSettings(context.user.id, req.organizationId, {
188+
const settings = await this.orgService.updateSettings(userId(), req.organizationId, {
189189
workspaceSharingDisabled: req.settings?.workspaceSharingDisabled,
190190
defaultWorkspaceImage: req.settings?.defaultWorkspaceImage,
191191
});

0 commit comments

Comments
 (0)