Skip to content

Commit ed4702a

Browse files
committed
feat: handlers + proto schema + repository for creating + getting onboarding
1 parent 43c24bf commit ed4702a

File tree

10 files changed

+2785
-1978
lines changed

10 files changed

+2785
-1978
lines changed

connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go

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

connect-go/gen/proto/wg/cosmo/platform/v1/platformv1connect/platform.connect.go

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

connect/src/wg/cosmo/platform/v1/platform-PlatformService_connectquery.ts

Lines changed: 31 additions & 1 deletion
Large diffs are not rendered by default.

connect/src/wg/cosmo/platform/v1/platform_connect.ts

Lines changed: 21 additions & 1 deletion
Large diffs are not rendered by default.

connect/src/wg/cosmo/platform/v1/platform_pb.ts

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24977,3 +24977,181 @@ export class RecomposeGraphResponse extends Message<RecomposeGraphResponse> {
2497724977
}
2497824978
}
2497924979

24980+
/**
24981+
* @generated from message wg.cosmo.platform.v1.GetOnboardingRequest
24982+
*/
24983+
export class GetOnboardingRequest extends Message<GetOnboardingRequest> {
24984+
constructor(data?: PartialMessage<GetOnboardingRequest>) {
24985+
super();
24986+
proto3.util.initPartial(data, this);
24987+
}
24988+
24989+
static readonly runtime: typeof proto3 = proto3;
24990+
static readonly typeName = "wg.cosmo.platform.v1.GetOnboardingRequest";
24991+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
24992+
]);
24993+
24994+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetOnboardingRequest {
24995+
return new GetOnboardingRequest().fromBinary(bytes, options);
24996+
}
24997+
24998+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetOnboardingRequest {
24999+
return new GetOnboardingRequest().fromJson(jsonValue, options);
25000+
}
25001+
25002+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetOnboardingRequest {
25003+
return new GetOnboardingRequest().fromJsonString(jsonString, options);
25004+
}
25005+
25006+
static equals(a: GetOnboardingRequest | PlainMessage<GetOnboardingRequest> | undefined, b: GetOnboardingRequest | PlainMessage<GetOnboardingRequest> | undefined): boolean {
25007+
return proto3.util.equals(GetOnboardingRequest, a, b);
25008+
}
25009+
}
25010+
25011+
/**
25012+
* @generated from message wg.cosmo.platform.v1.GetOnboardingResponse
25013+
*/
25014+
export class GetOnboardingResponse extends Message<GetOnboardingResponse> {
25015+
/**
25016+
* @generated from field: wg.cosmo.platform.v1.Response response = 1;
25017+
*/
25018+
response?: Response;
25019+
25020+
/**
25021+
* @generated from field: optional string finishedAt = 3;
25022+
*/
25023+
finishedAt?: string;
25024+
25025+
/**
25026+
* @generated from field: int32 federatedGraphsCount = 4;
25027+
*/
25028+
federatedGraphsCount = 0;
25029+
25030+
/**
25031+
* @generated from field: bool enabled = 5;
25032+
*/
25033+
enabled = false;
25034+
25035+
constructor(data?: PartialMessage<GetOnboardingResponse>) {
25036+
super();
25037+
proto3.util.initPartial(data, this);
25038+
}
25039+
25040+
static readonly runtime: typeof proto3 = proto3;
25041+
static readonly typeName = "wg.cosmo.platform.v1.GetOnboardingResponse";
25042+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
25043+
{ no: 1, name: "response", kind: "message", T: Response },
25044+
{ no: 3, name: "finishedAt", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true },
25045+
{ no: 4, name: "federatedGraphsCount", kind: "scalar", T: 5 /* ScalarType.INT32 */ },
25046+
{ no: 5, name: "enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
25047+
]);
25048+
25049+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetOnboardingResponse {
25050+
return new GetOnboardingResponse().fromBinary(bytes, options);
25051+
}
25052+
25053+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetOnboardingResponse {
25054+
return new GetOnboardingResponse().fromJson(jsonValue, options);
25055+
}
25056+
25057+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetOnboardingResponse {
25058+
return new GetOnboardingResponse().fromJsonString(jsonString, options);
25059+
}
25060+
25061+
static equals(a: GetOnboardingResponse | PlainMessage<GetOnboardingResponse> | undefined, b: GetOnboardingResponse | PlainMessage<GetOnboardingResponse> | undefined): boolean {
25062+
return proto3.util.equals(GetOnboardingResponse, a, b);
25063+
}
25064+
}
25065+
25066+
/**
25067+
* @generated from message wg.cosmo.platform.v1.CreateOnboardingRequest
25068+
*/
25069+
export class CreateOnboardingRequest extends Message<CreateOnboardingRequest> {
25070+
/**
25071+
* @generated from field: string organizationName = 1;
25072+
*/
25073+
organizationName = "";
25074+
25075+
/**
25076+
* @generated from field: repeated string invititationEmails = 2;
25077+
*/
25078+
invititationEmails: string[] = [];
25079+
25080+
/**
25081+
* @generated from field: bool slack = 3;
25082+
*/
25083+
slack = false;
25084+
25085+
/**
25086+
* @generated from field: bool email = 4;
25087+
*/
25088+
email = false;
25089+
25090+
constructor(data?: PartialMessage<CreateOnboardingRequest>) {
25091+
super();
25092+
proto3.util.initPartial(data, this);
25093+
}
25094+
25095+
static readonly runtime: typeof proto3 = proto3;
25096+
static readonly typeName = "wg.cosmo.platform.v1.CreateOnboardingRequest";
25097+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
25098+
{ no: 1, name: "organizationName", kind: "scalar", T: 9 /* ScalarType.STRING */ },
25099+
{ no: 2, name: "invititationEmails", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true },
25100+
{ no: 3, name: "slack", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
25101+
{ no: 4, name: "email", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
25102+
]);
25103+
25104+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): CreateOnboardingRequest {
25105+
return new CreateOnboardingRequest().fromBinary(bytes, options);
25106+
}
25107+
25108+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): CreateOnboardingRequest {
25109+
return new CreateOnboardingRequest().fromJson(jsonValue, options);
25110+
}
25111+
25112+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CreateOnboardingRequest {
25113+
return new CreateOnboardingRequest().fromJsonString(jsonString, options);
25114+
}
25115+
25116+
static equals(a: CreateOnboardingRequest | PlainMessage<CreateOnboardingRequest> | undefined, b: CreateOnboardingRequest | PlainMessage<CreateOnboardingRequest> | undefined): boolean {
25117+
return proto3.util.equals(CreateOnboardingRequest, a, b);
25118+
}
25119+
}
25120+
25121+
/**
25122+
* @generated from message wg.cosmo.platform.v1.CreateOnboardingResponse
25123+
*/
25124+
export class CreateOnboardingResponse extends Message<CreateOnboardingResponse> {
25125+
/**
25126+
* @generated from field: wg.cosmo.platform.v1.Response response = 1;
25127+
*/
25128+
response?: Response;
25129+
25130+
constructor(data?: PartialMessage<CreateOnboardingResponse>) {
25131+
super();
25132+
proto3.util.initPartial(data, this);
25133+
}
25134+
25135+
static readonly runtime: typeof proto3 = proto3;
25136+
static readonly typeName = "wg.cosmo.platform.v1.CreateOnboardingResponse";
25137+
static readonly fields: FieldList = proto3.util.newFieldList(() => [
25138+
{ no: 1, name: "response", kind: "message", T: Response },
25139+
]);
25140+
25141+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): CreateOnboardingResponse {
25142+
return new CreateOnboardingResponse().fromBinary(bytes, options);
25143+
}
25144+
25145+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): CreateOnboardingResponse {
25146+
return new CreateOnboardingResponse().fromJson(jsonValue, options);
25147+
}
25148+
25149+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CreateOnboardingResponse {
25150+
return new CreateOnboardingResponse().fromJsonString(jsonString, options);
25151+
}
25152+
25153+
static equals(a: CreateOnboardingResponse | PlainMessage<CreateOnboardingResponse> | undefined, b: CreateOnboardingResponse | PlainMessage<CreateOnboardingResponse> | undefined): boolean {
25154+
return proto3.util.equals(CreateOnboardingResponse, a, b);
25155+
}
25156+
}
25157+

controlplane/src/core/bufservices/PlatformService.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ import { migrateMonograph } from './monograph/migrateMonograph.js';
8181
import { moveMonograph } from './monograph/moveMonograph.js';
8282
import { publishMonograph } from './monograph/publishMonograph.js';
8383
import { updateMonograph } from './monograph/updateMonograph.js';
84+
import { createOnboarding } from './onboarding/createOnboarding.js';
85+
import { getOnboarding } from './onboarding/getOnboarding.js';
8486
import { createNamespace } from './namespace/createNamespace.js';
8587
import { deleteNamespace } from './namespace/deleteNamespace.js';
8688
import { getNamespace } from './namespace/getNamespace.js';
@@ -906,5 +908,13 @@ export default function (opts: RouterOptions): Partial<ServiceImpl<typeof Platfo
906908
recomposeGraph: (req, ctx) => {
907909
return recomposeGraph(opts, req, ctx);
908910
},
911+
912+
getOnboarding: (req, ctx) => {
913+
return getOnboarding(opts, req, ctx);
914+
},
915+
916+
createOnboarding: (req, ctx) => {
917+
return createOnboarding(opts, req, ctx);
918+
},
909919
};
910920
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { PlainMessage } from '@bufbuild/protobuf';
2+
import { HandlerContext } from '@connectrpc/connect';
3+
import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
4+
import {
5+
CreateOnboardingRequest,
6+
CreateOnboardingResponse,
7+
} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
8+
import { OnboardingRepository } from '../../repositories/OnboardingRepository.js';
9+
import { OrganizationRepository } from '../../repositories/OrganizationRepository.js';
10+
import type { RouterOptions } from '../../routes.js';
11+
import { enrichLogger, getLogger, handleError } from '../../util.js';
12+
13+
export function createOnboarding(
14+
opts: RouterOptions,
15+
req: CreateOnboardingRequest,
16+
ctx: HandlerContext,
17+
): Promise<PlainMessage<CreateOnboardingResponse>> {
18+
let logger = getLogger(ctx, opts.logger);
19+
20+
return handleError<PlainMessage<CreateOnboardingResponse>>(ctx, logger, async () => {
21+
const authContext = await opts.authenticator.authenticate(ctx.requestHeader);
22+
logger = enrichLogger(ctx, logger, authContext);
23+
24+
const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId);
25+
const org = await orgRepo.byId(authContext.organizationId);
26+
27+
if (!org || org.creatorUserId !== authContext.userId) {
28+
return {
29+
response: {
30+
code: EnumStatusCode.ERR,
31+
details: 'Only the organization creator can create onboarding.',
32+
},
33+
};
34+
}
35+
36+
// TODO: handle invitation flow + organization renaming
37+
38+
const onboardingRepo = new OnboardingRepository(opts.db, authContext.organizationId);
39+
await onboardingRepo.createOrUpdate({
40+
userId: authContext.userId,
41+
slack: req.slack,
42+
email: req.email,
43+
});
44+
45+
return {
46+
response: {
47+
code: EnumStatusCode.OK,
48+
},
49+
};
50+
});
51+
}

0 commit comments

Comments
 (0)