@restorecommerce/facade 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,49 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.3.0](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.2.2...@restorecommerce/facade@0.3.0) (2022-02-22)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **facade:** do not internal error ([a98594d](https://github.com/restorecommerce/libs/commit/a98594d2a478965eb3b22fff530b86c290afbbb2))
12
+ * **facade:** use jwt token ([666a08f](https://github.com/restorecommerce/libs/commit/666a08f9b7727cda26a499c3ebaa5335ed38a27a))
13
+ * **protos:** add token to code exchange ([9c17cb6](https://github.com/restorecommerce/libs/commit/9c17cb6e3a16761a85a4b9379c3c6996cc5422e8))
14
+
15
+
16
+ ### Features
17
+
18
+ * **facade:** support maps ([2c466fe](https://github.com/restorecommerce/libs/commit/2c466fe1e0ef883ab4b7eb19f637ef13f1f88e96))
19
+
20
+
21
+
22
+
23
+
24
+ ## [0.2.2](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.2.1...@restorecommerce/facade@0.2.2) (2022-02-15)
25
+
26
+
27
+ ### Bug Fixes
28
+
29
+ * store facade token in cookies ([5fe1b53](https://github.com/restorecommerce/libs/commit/5fe1b538955993f6d20626968699867f0120589c))
30
+
31
+
32
+
33
+
34
+
35
+ ## [0.2.1](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.2.0...@restorecommerce/facade@0.2.1) (2022-02-14)
36
+
37
+
38
+ ### Bug Fixes
39
+
40
+ * **facade:** regenerated schema ([a8fba43](https://github.com/restorecommerce/libs/commit/a8fba43233999191d2583139cefe9a8af647706b))
41
+ * bypass non-compliant koa modules ([8a92b83](https://github.com/restorecommerce/libs/commit/8a92b83ce717f52caa843b00d5db894ca07ab1a9))
42
+ * copy hbs on build ([efd8e78](https://github.com/restorecommerce/libs/commit/efd8e783a09badb84d76f2b72377de438f34d014))
43
+ * switch to sh ([5756072](https://github.com/restorecommerce/libs/commit/57560723184a300b2d315068f29339a5f2dc517e))
44
+
45
+
46
+
47
+
48
+
6
49
  # [0.2.0](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.1.44...@restorecommerce/facade@0.2.0) (2022-02-09)
7
50
 
8
51
 
package/copy-hbs.sh ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env sh
2
+
3
+ set -ex
4
+
5
+ find ./src -type f -name "*.hbs" | cut -d'/' -f3- | xargs -I{} dirname {} | xargs -I{} mkdir -p ./dist/{}
6
+ find ./src -type f -name "*.hbs" | cut -d'/' -f3- | xargs -I{} cp -u ./src/{} ./dist/{}
@@ -223,6 +223,7 @@ const getTyping = (type) => {
223
223
  };
224
224
  exports.getTyping = getTyping;
225
225
  const resolveMeta = (key, field, rootObjType, objName, input) => {
226
+ var _a;
226
227
  let result;
227
228
  switch (field.type) {
228
229
  case descriptor_1.FieldDescriptorProto_Type.TYPE_BOOL:
@@ -237,14 +238,23 @@ const resolveMeta = (key, field, rootObjType, objName, input) => {
237
238
  if (!exports.registeredTypings.has(objType)) {
238
239
  throw new Error("Typing '" + objType + "' not registered for key '" + key + "' in object: " + objName);
239
240
  }
241
+ let typingData = exports.registeredTypings.get(objType);
242
+ let mapEntry = false;
243
+ if (typingData.meta.options) {
244
+ mapEntry = !!((_a = typingData.meta.options) === null || _a === void 0 ? void 0 : _a.mapEntry);
245
+ }
246
+ // TODO Actually unroll maps into entries
247
+ if (mapEntry) {
248
+ return MapScalar;
249
+ }
240
250
  if (!input) {
241
- result = exports.registeredTypings.get(objType).output;
251
+ result = typingData.output;
242
252
  break;
243
253
  }
244
254
  if (objType === types_1.authSubjectType) {
245
255
  return null;
246
256
  }
247
- result = exports.registeredTypings.get(objType).input;
257
+ result = typingData.input;
248
258
  break;
249
259
  case descriptor_1.FieldDescriptorProto_Type.TYPE_BYTES:
250
260
  if (input) {
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="koa-bodyparser" />
1
2
  /// <reference types="node" />
2
3
  import Koa from 'koa';
3
4
  import { Logger } from 'winston';
@@ -1,3 +1,4 @@
1
+ /// <reference types="koa-bodyparser" />
1
2
  /// <reference types="node" />
2
3
  import Koa from 'koa';
3
4
  import { Logger } from 'winston';
@@ -24,8 +24,9 @@ export declare type Scalars = {
24
24
  Boolean: boolean;
25
25
  Int: number;
26
26
  Float: number;
27
- Upload: any;
28
27
  TodoScalar: any;
28
+ Upload: any;
29
+ MapScalar: any;
29
30
  };
30
31
  export declare type Query = {
31
32
  __typename?: 'Query';
@@ -37,6 +38,7 @@ export declare type IdentityQuery = {
37
38
  role: IdentityRoleQuery;
38
39
  authentication_log: IdentityAuthenticationLogQuery;
39
40
  token: IdentityTokenQuery;
41
+ oauth: IdentityOauthQuery;
40
42
  };
41
43
  export declare type IdentityUserQuery = {
42
44
  __typename?: 'IdentityUserQuery';
@@ -99,6 +101,7 @@ export declare type IoRestorecommerceUserUser = {
99
101
  invitedByUserLastName?: Maybe<Scalars['String']>;
100
102
  tokens?: Maybe<Array<IoRestorecommerceAuthTokens>>;
101
103
  lastAccess?: Maybe<Scalars['Float']>;
104
+ data?: Maybe<GoogleProtobufAny>;
102
105
  };
103
106
  export declare type IoRestorecommerceMetaMeta = {
104
107
  __typename?: 'IoRestorecommerceMetaMeta';
@@ -123,6 +126,7 @@ export declare type IoRestorecommerceAuthRoleAssociation = {
123
126
  role?: Maybe<Scalars['String']>;
124
127
  attributes?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
125
128
  id?: Maybe<Scalars['String']>;
129
+ created?: Maybe<Scalars['Float']>;
126
130
  };
127
131
  export declare type IoRestorecommerceImageImage = {
128
132
  __typename?: 'IoRestorecommerceImageImage';
@@ -151,6 +155,11 @@ export declare type IoRestorecommerceAuthTokens = {
151
155
  interactive?: Maybe<Scalars['Boolean']>;
152
156
  lastLogin?: Maybe<Scalars['Float']>;
153
157
  };
158
+ export declare type GoogleProtobufAny = {
159
+ __typename?: 'GoogleProtobufAny';
160
+ typeUrl?: Maybe<Scalars['String']>;
161
+ value?: Maybe<Scalars['TodoScalar']>;
162
+ };
154
163
  export declare type IoRestorecommerceStatusStatus = {
155
164
  __typename?: 'IoRestorecommerceStatusStatus';
156
165
  id?: Maybe<Scalars['String']>;
@@ -353,15 +362,31 @@ export declare type ProtoGoogleProtobufAny = {
353
362
  __typename?: 'ProtoGoogleProtobufAny';
354
363
  details?: Maybe<GoogleProtobufAny>;
355
364
  };
356
- export declare type GoogleProtobufAny = {
357
- __typename?: 'GoogleProtobufAny';
358
- typeUrl?: Maybe<Scalars['String']>;
359
- value?: Maybe<Scalars['TodoScalar']>;
360
- };
361
365
  export declare type IIoRestorecommerceTokenIdentifier = {
362
366
  id?: Maybe<Scalars['String']>;
363
367
  type?: Maybe<Scalars['String']>;
364
368
  };
369
+ export declare type IdentityOauthQuery = {
370
+ __typename?: 'IdentityOauthQuery';
371
+ AvailableServices?: Maybe<ProtoIoRestorecommerceOauthServicesResponse>;
372
+ GenerateLinks?: Maybe<ProtoIoRestorecommerceOauthGenerateLinksResponse>;
373
+ };
374
+ export declare type ProtoIoRestorecommerceOauthServicesResponse = {
375
+ __typename?: 'ProtoIoRestorecommerceOauthServicesResponse';
376
+ details?: Maybe<IoRestorecommerceOauthServicesResponse>;
377
+ };
378
+ export declare type IoRestorecommerceOauthServicesResponse = {
379
+ __typename?: 'IoRestorecommerceOauthServicesResponse';
380
+ services?: Maybe<Array<Scalars['String']>>;
381
+ };
382
+ export declare type ProtoIoRestorecommerceOauthGenerateLinksResponse = {
383
+ __typename?: 'ProtoIoRestorecommerceOauthGenerateLinksResponse';
384
+ details?: Maybe<IoRestorecommerceOauthGenerateLinksResponse>;
385
+ };
386
+ export declare type IoRestorecommerceOauthGenerateLinksResponse = {
387
+ __typename?: 'IoRestorecommerceOauthGenerateLinksResponse';
388
+ links?: Maybe<Scalars['MapScalar']>;
389
+ };
365
390
  export declare type Mutation = {
366
391
  __typename?: 'Mutation';
367
392
  identity: IdentityMutation;
@@ -372,6 +397,7 @@ export declare type IdentityMutation = {
372
397
  role: IdentityRoleMutation;
373
398
  authentication_log: IdentityAuthenticationLogMutation;
374
399
  token: IdentityTokenMutation;
400
+ oauth: IdentityOauthMutation;
375
401
  };
376
402
  export declare type IdentityUserMutation = {
377
403
  __typename?: 'IdentityUserMutation';
@@ -467,6 +493,7 @@ export declare type IIoRestorecommerceUserUser = {
467
493
  invitedByUserLastName?: Maybe<Scalars['String']>;
468
494
  tokens?: Maybe<Array<IIoRestorecommerceAuthTokens>>;
469
495
  lastAccess?: Maybe<Scalars['Float']>;
496
+ data?: Maybe<IGoogleProtobufAny>;
470
497
  };
471
498
  export declare type IIoRestorecommerceMetaMeta = {
472
499
  created?: Maybe<Scalars['Float']>;
@@ -482,6 +509,7 @@ export declare type IIoRestorecommerceAuthRoleAssociation = {
482
509
  role?: Maybe<Scalars['String']>;
483
510
  attributes?: Maybe<Array<IIoRestorecommerceAttributeAttribute>>;
484
511
  id?: Maybe<Scalars['String']>;
512
+ created?: Maybe<Scalars['Float']>;
485
513
  };
486
514
  export declare type IIoRestorecommerceImageImage = {
487
515
  id?: Maybe<Scalars['String']>;
@@ -679,6 +707,28 @@ export declare type IIoRestorecommerceTokenTokenData = {
679
707
  export declare type IIoRestorecommerceTokenGrantId = {
680
708
  grantId?: Maybe<Scalars['String']>;
681
709
  };
710
+ export declare type IdentityOauthMutation = {
711
+ __typename?: 'IdentityOauthMutation';
712
+ ExchangeCode?: Maybe<ProtoIoRestorecommerceOauthExchangeCodeResponse>;
713
+ };
714
+ export declare type IdentityOauthMutationExchangeCodeArgs = {
715
+ input: IIoRestorecommerceOauthExchangeCodeRequest;
716
+ };
717
+ export declare type ProtoIoRestorecommerceOauthExchangeCodeResponse = {
718
+ __typename?: 'ProtoIoRestorecommerceOauthExchangeCodeResponse';
719
+ details?: Maybe<IoRestorecommerceOauthExchangeCodeResponse>;
720
+ };
721
+ export declare type IoRestorecommerceOauthExchangeCodeResponse = {
722
+ __typename?: 'IoRestorecommerceOauthExchangeCodeResponse';
723
+ user?: Maybe<IoRestorecommerceUserUserResponse>;
724
+ email?: Maybe<Scalars['String']>;
725
+ token?: Maybe<IoRestorecommerceAuthTokens>;
726
+ };
727
+ export declare type IIoRestorecommerceOauthExchangeCodeRequest = {
728
+ service?: Maybe<Scalars['String']>;
729
+ code?: Maybe<Scalars['String']>;
730
+ state?: Maybe<Scalars['String']>;
731
+ };
682
732
  export declare type WithIndex<TObject> = TObject & Record<string, any>;
683
733
  export declare type ResolversObject<TObject> = WithIndex<TObject>;
684
734
  export declare type ResolverTypeWrapper<T> = Promise<T> | T;
@@ -723,6 +773,8 @@ export declare type ResolversTypes = ResolversObject<{
723
773
  IoRestorecommerceImageImage: ResolverTypeWrapper<IoRestorecommerceImageImage>;
724
774
  IoRestorecommerceUserUserType: IoRestorecommerceUserUserType;
725
775
  IoRestorecommerceAuthTokens: ResolverTypeWrapper<IoRestorecommerceAuthTokens>;
776
+ GoogleProtobufAny: ResolverTypeWrapper<GoogleProtobufAny>;
777
+ TodoScalar: ResolverTypeWrapper<Scalars['TodoScalar']>;
726
778
  IoRestorecommerceStatusStatus: ResolverTypeWrapper<IoRestorecommerceStatusStatus>;
727
779
  Int: ResolverTypeWrapper<Scalars['Int']>;
728
780
  IoRestorecommerceStatusOperationStatus: ResolverTypeWrapper<IoRestorecommerceStatusOperationStatus>;
@@ -759,9 +811,13 @@ export declare type ResolversTypes = ResolversObject<{
759
811
  IoRestorecommerceAuthenticationLogAuthenticationLog: ResolverTypeWrapper<IoRestorecommerceAuthenticationLogAuthenticationLog>;
760
812
  IdentityTokenQuery: ResolverTypeWrapper<IdentityTokenQuery>;
761
813
  ProtoGoogleProtobufAny: ResolverTypeWrapper<ProtoGoogleProtobufAny>;
762
- GoogleProtobufAny: ResolverTypeWrapper<GoogleProtobufAny>;
763
- TodoScalar: ResolverTypeWrapper<Scalars['TodoScalar']>;
764
814
  IIoRestorecommerceTokenIdentifier: IIoRestorecommerceTokenIdentifier;
815
+ IdentityOauthQuery: ResolverTypeWrapper<IdentityOauthQuery>;
816
+ ProtoIoRestorecommerceOauthServicesResponse: ResolverTypeWrapper<ProtoIoRestorecommerceOauthServicesResponse>;
817
+ IoRestorecommerceOauthServicesResponse: ResolverTypeWrapper<IoRestorecommerceOauthServicesResponse>;
818
+ ProtoIoRestorecommerceOauthGenerateLinksResponse: ResolverTypeWrapper<ProtoIoRestorecommerceOauthGenerateLinksResponse>;
819
+ IoRestorecommerceOauthGenerateLinksResponse: ResolverTypeWrapper<IoRestorecommerceOauthGenerateLinksResponse>;
820
+ MapScalar: ResolverTypeWrapper<Scalars['MapScalar']>;
765
821
  Mutation: ResolverTypeWrapper<{}>;
766
822
  IdentityMutation: ResolverTypeWrapper<IdentityMutation>;
767
823
  IdentityUserMutation: ResolverTypeWrapper<IdentityUserMutation>;
@@ -802,6 +858,10 @@ export declare type ResolversTypes = ResolversObject<{
802
858
  IdentityTokenMutation: ResolverTypeWrapper<IdentityTokenMutation>;
803
859
  IIoRestorecommerceTokenTokenData: IIoRestorecommerceTokenTokenData;
804
860
  IIoRestorecommerceTokenGrantId: IIoRestorecommerceTokenGrantId;
861
+ IdentityOauthMutation: ResolverTypeWrapper<IdentityOauthMutation>;
862
+ ProtoIoRestorecommerceOauthExchangeCodeResponse: ResolverTypeWrapper<ProtoIoRestorecommerceOauthExchangeCodeResponse>;
863
+ IoRestorecommerceOauthExchangeCodeResponse: ResolverTypeWrapper<IoRestorecommerceOauthExchangeCodeResponse>;
864
+ IIoRestorecommerceOauthExchangeCodeRequest: IIoRestorecommerceOauthExchangeCodeRequest;
805
865
  }>;
806
866
  /** Mapping between all available schema types and the resolvers parents */
807
867
  export declare type ResolversParentTypes = ResolversObject<{
@@ -821,6 +881,8 @@ export declare type ResolversParentTypes = ResolversObject<{
821
881
  IoRestorecommerceAuthRoleAssociation: IoRestorecommerceAuthRoleAssociation;
822
882
  IoRestorecommerceImageImage: IoRestorecommerceImageImage;
823
883
  IoRestorecommerceAuthTokens: IoRestorecommerceAuthTokens;
884
+ GoogleProtobufAny: GoogleProtobufAny;
885
+ TodoScalar: Scalars['TodoScalar'];
824
886
  IoRestorecommerceStatusStatus: IoRestorecommerceStatusStatus;
825
887
  Int: Scalars['Int'];
826
888
  IoRestorecommerceStatusOperationStatus: IoRestorecommerceStatusOperationStatus;
@@ -850,9 +912,13 @@ export declare type ResolversParentTypes = ResolversObject<{
850
912
  IoRestorecommerceAuthenticationLogAuthenticationLog: IoRestorecommerceAuthenticationLogAuthenticationLog;
851
913
  IdentityTokenQuery: IdentityTokenQuery;
852
914
  ProtoGoogleProtobufAny: ProtoGoogleProtobufAny;
853
- GoogleProtobufAny: GoogleProtobufAny;
854
- TodoScalar: Scalars['TodoScalar'];
855
915
  IIoRestorecommerceTokenIdentifier: IIoRestorecommerceTokenIdentifier;
916
+ IdentityOauthQuery: IdentityOauthQuery;
917
+ ProtoIoRestorecommerceOauthServicesResponse: ProtoIoRestorecommerceOauthServicesResponse;
918
+ IoRestorecommerceOauthServicesResponse: IoRestorecommerceOauthServicesResponse;
919
+ ProtoIoRestorecommerceOauthGenerateLinksResponse: ProtoIoRestorecommerceOauthGenerateLinksResponse;
920
+ IoRestorecommerceOauthGenerateLinksResponse: IoRestorecommerceOauthGenerateLinksResponse;
921
+ MapScalar: Scalars['MapScalar'];
856
922
  Mutation: {};
857
923
  IdentityMutation: IdentityMutation;
858
924
  IdentityUserMutation: IdentityUserMutation;
@@ -892,6 +958,10 @@ export declare type ResolversParentTypes = ResolversObject<{
892
958
  IdentityTokenMutation: IdentityTokenMutation;
893
959
  IIoRestorecommerceTokenTokenData: IIoRestorecommerceTokenTokenData;
894
960
  IIoRestorecommerceTokenGrantId: IIoRestorecommerceTokenGrantId;
961
+ IdentityOauthMutation: IdentityOauthMutation;
962
+ ProtoIoRestorecommerceOauthExchangeCodeResponse: ProtoIoRestorecommerceOauthExchangeCodeResponse;
963
+ IoRestorecommerceOauthExchangeCodeResponse: IoRestorecommerceOauthExchangeCodeResponse;
964
+ IIoRestorecommerceOauthExchangeCodeRequest: IIoRestorecommerceOauthExchangeCodeRequest;
895
965
  }>;
896
966
  export declare type QueryResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = ResolversObject<{
897
967
  identity?: Resolver<ResolversTypes['IdentityQuery'], ParentType, ContextType>;
@@ -901,6 +971,7 @@ export declare type IdentityQueryResolvers<ContextType = IdentityContext, Parent
901
971
  role?: Resolver<ResolversTypes['IdentityRoleQuery'], ParentType, ContextType>;
902
972
  authentication_log?: Resolver<ResolversTypes['IdentityAuthenticationLogQuery'], ParentType, ContextType>;
903
973
  token?: Resolver<ResolversTypes['IdentityTokenQuery'], ParentType, ContextType>;
974
+ oauth?: Resolver<ResolversTypes['IdentityOauthQuery'], ParentType, ContextType>;
904
975
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
905
976
  }>;
906
977
  export declare type IdentityUserQueryResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IdentityUserQuery'] = ResolversParentTypes['IdentityUserQuery']> = ResolversObject<{
@@ -951,6 +1022,7 @@ export declare type IoRestorecommerceUserUserResolvers<ContextType = IdentityCon
951
1022
  invitedByUserLastName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
952
1023
  tokens?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAuthTokens']>>, ParentType, ContextType>;
953
1024
  lastAccess?: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
1025
+ data?: Resolver<Maybe<ResolversTypes['GoogleProtobufAny']>, ParentType, ContextType>;
954
1026
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
955
1027
  }>;
956
1028
  export declare type IoRestorecommerceMetaMetaResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IoRestorecommerceMetaMeta'] = ResolversParentTypes['IoRestorecommerceMetaMeta']> = ResolversObject<{
@@ -975,6 +1047,7 @@ export declare type IoRestorecommerceAuthRoleAssociationResolvers<ContextType =
975
1047
  role?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
976
1048
  attributes?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAttributeAttribute']>>, ParentType, ContextType>;
977
1049
  id?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1050
+ created?: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
978
1051
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
979
1052
  }>;
980
1053
  export declare type IoRestorecommerceImageImageResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IoRestorecommerceImageImage'] = ResolversParentTypes['IoRestorecommerceImageImage']> = ResolversObject<{
@@ -1004,6 +1077,14 @@ export declare type IoRestorecommerceAuthTokensResolvers<ContextType = IdentityC
1004
1077
  lastLogin?: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
1005
1078
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1006
1079
  }>;
1080
+ export declare type GoogleProtobufAnyResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['GoogleProtobufAny'] = ResolversParentTypes['GoogleProtobufAny']> = ResolversObject<{
1081
+ typeUrl?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1082
+ value?: Resolver<Maybe<ResolversTypes['TodoScalar']>, ParentType, ContextType>;
1083
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1084
+ }>;
1085
+ export interface TodoScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['TodoScalar'], any> {
1086
+ name: 'TodoScalar';
1087
+ }
1007
1088
  export declare type IoRestorecommerceStatusStatusResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IoRestorecommerceStatusStatus'] = ResolversParentTypes['IoRestorecommerceStatusStatus']> = ResolversObject<{
1008
1089
  id?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1009
1090
  code?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
@@ -1138,13 +1219,29 @@ export declare type ProtoGoogleProtobufAnyResolvers<ContextType = IdentityContex
1138
1219
  details?: Resolver<Maybe<ResolversTypes['GoogleProtobufAny']>, ParentType, ContextType>;
1139
1220
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1140
1221
  }>;
1141
- export declare type GoogleProtobufAnyResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['GoogleProtobufAny'] = ResolversParentTypes['GoogleProtobufAny']> = ResolversObject<{
1142
- typeUrl?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1143
- value?: Resolver<Maybe<ResolversTypes['TodoScalar']>, ParentType, ContextType>;
1222
+ export declare type IdentityOauthQueryResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IdentityOauthQuery'] = ResolversParentTypes['IdentityOauthQuery']> = ResolversObject<{
1223
+ AvailableServices?: Resolver<Maybe<ResolversTypes['ProtoIoRestorecommerceOauthServicesResponse']>, ParentType, ContextType>;
1224
+ GenerateLinks?: Resolver<Maybe<ResolversTypes['ProtoIoRestorecommerceOauthGenerateLinksResponse']>, ParentType, ContextType>;
1144
1225
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1145
1226
  }>;
1146
- export interface TodoScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['TodoScalar'], any> {
1147
- name: 'TodoScalar';
1227
+ export declare type ProtoIoRestorecommerceOauthServicesResponseResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['ProtoIoRestorecommerceOauthServicesResponse'] = ResolversParentTypes['ProtoIoRestorecommerceOauthServicesResponse']> = ResolversObject<{
1228
+ details?: Resolver<Maybe<ResolversTypes['IoRestorecommerceOauthServicesResponse']>, ParentType, ContextType>;
1229
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1230
+ }>;
1231
+ export declare type IoRestorecommerceOauthServicesResponseResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IoRestorecommerceOauthServicesResponse'] = ResolversParentTypes['IoRestorecommerceOauthServicesResponse']> = ResolversObject<{
1232
+ services?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;
1233
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1234
+ }>;
1235
+ export declare type ProtoIoRestorecommerceOauthGenerateLinksResponseResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['ProtoIoRestorecommerceOauthGenerateLinksResponse'] = ResolversParentTypes['ProtoIoRestorecommerceOauthGenerateLinksResponse']> = ResolversObject<{
1236
+ details?: Resolver<Maybe<ResolversTypes['IoRestorecommerceOauthGenerateLinksResponse']>, ParentType, ContextType>;
1237
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1238
+ }>;
1239
+ export declare type IoRestorecommerceOauthGenerateLinksResponseResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IoRestorecommerceOauthGenerateLinksResponse'] = ResolversParentTypes['IoRestorecommerceOauthGenerateLinksResponse']> = ResolversObject<{
1240
+ links?: Resolver<Maybe<ResolversTypes['MapScalar']>, ParentType, ContextType>;
1241
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1242
+ }>;
1243
+ export interface MapScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MapScalar'], any> {
1244
+ name: 'MapScalar';
1148
1245
  }
1149
1246
  export declare type MutationResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = ResolversObject<{
1150
1247
  identity?: Resolver<ResolversTypes['IdentityMutation'], ParentType, ContextType>;
@@ -1154,6 +1251,7 @@ export declare type IdentityMutationResolvers<ContextType = IdentityContext, Par
1154
1251
  role?: Resolver<ResolversTypes['IdentityRoleMutation'], ParentType, ContextType>;
1155
1252
  authentication_log?: Resolver<ResolversTypes['IdentityAuthenticationLogMutation'], ParentType, ContextType>;
1156
1253
  token?: Resolver<ResolversTypes['IdentityTokenMutation'], ParentType, ContextType>;
1254
+ oauth?: Resolver<ResolversTypes['IdentityOauthMutation'], ParentType, ContextType>;
1157
1255
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1158
1256
  }>;
1159
1257
  export declare type IdentityUserMutationResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IdentityUserMutation'] = ResolversParentTypes['IdentityUserMutation']> = ResolversObject<{
@@ -1217,6 +1315,20 @@ export declare type IdentityTokenMutationResolvers<ContextType = IdentityContext
1217
1315
  consume?: Resolver<Maybe<ResolversTypes['ProtoGoogleProtobufAny']>, ParentType, ContextType, RequireFields<IdentityTokenMutationConsumeArgs, 'input'>>;
1218
1316
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1219
1317
  }>;
1318
+ export declare type IdentityOauthMutationResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IdentityOauthMutation'] = ResolversParentTypes['IdentityOauthMutation']> = ResolversObject<{
1319
+ ExchangeCode?: Resolver<Maybe<ResolversTypes['ProtoIoRestorecommerceOauthExchangeCodeResponse']>, ParentType, ContextType, RequireFields<IdentityOauthMutationExchangeCodeArgs, 'input'>>;
1320
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1321
+ }>;
1322
+ export declare type ProtoIoRestorecommerceOauthExchangeCodeResponseResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['ProtoIoRestorecommerceOauthExchangeCodeResponse'] = ResolversParentTypes['ProtoIoRestorecommerceOauthExchangeCodeResponse']> = ResolversObject<{
1323
+ details?: Resolver<Maybe<ResolversTypes['IoRestorecommerceOauthExchangeCodeResponse']>, ParentType, ContextType>;
1324
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1325
+ }>;
1326
+ export declare type IoRestorecommerceOauthExchangeCodeResponseResolvers<ContextType = IdentityContext, ParentType extends ResolversParentTypes['IoRestorecommerceOauthExchangeCodeResponse'] = ResolversParentTypes['IoRestorecommerceOauthExchangeCodeResponse']> = ResolversObject<{
1327
+ user?: Resolver<Maybe<ResolversTypes['IoRestorecommerceUserUserResponse']>, ParentType, ContextType>;
1328
+ email?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1329
+ token?: Resolver<Maybe<ResolversTypes['IoRestorecommerceAuthTokens']>, ParentType, ContextType>;
1330
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1331
+ }>;
1220
1332
  export declare type Resolvers<ContextType = IdentityContext> = ResolversObject<{
1221
1333
  Query?: QueryResolvers<ContextType>;
1222
1334
  IdentityQuery?: IdentityQueryResolvers<ContextType>;
@@ -1232,6 +1344,8 @@ export declare type Resolvers<ContextType = IdentityContext> = ResolversObject<{
1232
1344
  IoRestorecommerceImageImage?: IoRestorecommerceImageImageResolvers<ContextType>;
1233
1345
  IoRestorecommerceUserUserType?: IoRestorecommerceUserUserTypeResolvers;
1234
1346
  IoRestorecommerceAuthTokens?: IoRestorecommerceAuthTokensResolvers<ContextType>;
1347
+ GoogleProtobufAny?: GoogleProtobufAnyResolvers<ContextType>;
1348
+ TodoScalar?: GraphQLScalarType;
1235
1349
  IoRestorecommerceStatusStatus?: IoRestorecommerceStatusStatusResolvers<ContextType>;
1236
1350
  IoRestorecommerceStatusOperationStatus?: IoRestorecommerceStatusOperationStatusResolvers<ContextType>;
1237
1351
  IoRestorecommerceResourcebaseSortSortOrder?: IoRestorecommerceResourcebaseSortSortOrderResolvers;
@@ -1255,8 +1369,12 @@ export declare type Resolvers<ContextType = IdentityContext> = ResolversObject<{
1255
1369
  IoRestorecommerceAuthenticationLogAuthenticationLog?: IoRestorecommerceAuthenticationLogAuthenticationLogResolvers<ContextType>;
1256
1370
  IdentityTokenQuery?: IdentityTokenQueryResolvers<ContextType>;
1257
1371
  ProtoGoogleProtobufAny?: ProtoGoogleProtobufAnyResolvers<ContextType>;
1258
- GoogleProtobufAny?: GoogleProtobufAnyResolvers<ContextType>;
1259
- TodoScalar?: GraphQLScalarType;
1372
+ IdentityOauthQuery?: IdentityOauthQueryResolvers<ContextType>;
1373
+ ProtoIoRestorecommerceOauthServicesResponse?: ProtoIoRestorecommerceOauthServicesResponseResolvers<ContextType>;
1374
+ IoRestorecommerceOauthServicesResponse?: IoRestorecommerceOauthServicesResponseResolvers<ContextType>;
1375
+ ProtoIoRestorecommerceOauthGenerateLinksResponse?: ProtoIoRestorecommerceOauthGenerateLinksResponseResolvers<ContextType>;
1376
+ IoRestorecommerceOauthGenerateLinksResponse?: IoRestorecommerceOauthGenerateLinksResponseResolvers<ContextType>;
1377
+ MapScalar?: GraphQLScalarType;
1260
1378
  Mutation?: MutationResolvers<ContextType>;
1261
1379
  IdentityMutation?: IdentityMutationResolvers<ContextType>;
1262
1380
  IdentityUserMutation?: IdentityUserMutationResolvers<ContextType>;
@@ -1269,6 +1387,9 @@ export declare type Resolvers<ContextType = IdentityContext> = ResolversObject<{
1269
1387
  IdentityRoleMutation?: IdentityRoleMutationResolvers<ContextType>;
1270
1388
  IdentityAuthenticationLogMutation?: IdentityAuthenticationLogMutationResolvers<ContextType>;
1271
1389
  IdentityTokenMutation?: IdentityTokenMutationResolvers<ContextType>;
1390
+ IdentityOauthMutation?: IdentityOauthMutationResolvers<ContextType>;
1391
+ ProtoIoRestorecommerceOauthExchangeCodeResponse?: ProtoIoRestorecommerceOauthExchangeCodeResponseResolvers<ContextType>;
1392
+ IoRestorecommerceOauthExchangeCodeResponse?: IoRestorecommerceOauthExchangeCodeResponseResolvers<ContextType>;
1272
1393
  }>;
1273
1394
  /**
1274
1395
  * @deprecated
@@ -32,4 +32,9 @@ exports.subServices = [
32
32
  service: token_1.protoMetadata.fileDescriptor.service[0],
33
33
  queries: ['find']
34
34
  },
35
+ {
36
+ name: 'oauth',
37
+ service: oauth_1.protoMetadata.fileDescriptor.service[0],
38
+ queries: ['AvailableServices', 'GenerateLinks']
39
+ },
35
40
  ];
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.identityModule = void 0;
4
- const koa_mount_1 = require("koa-mount");
5
4
  const utils_1 = require("../../utils");
6
5
  const federation_1 = require("./gql/federation");
7
6
  const oidc_1 = require("./oidc");
8
7
  const api_key_1 = require("./api-key/api-key");
9
8
  const grpc_1 = require("./grpc");
10
9
  const oauth_1 = require("./oauth/oauth");
10
+ const mount = eval('require("koa-mount")');
11
11
  exports.identityModule = utils_1.createFacadeModuleFactory('identity', (facade, config) => {
12
12
  const identitySrvClient = new grpc_1.IdentitySrvGrpcClient(config.identitySrvClientConfig, facade.logger);
13
13
  if (!!config.apiKey) {
@@ -28,7 +28,7 @@ exports.identityModule = utils_1.createFacadeModuleFactory('identity', (facade,
28
28
  config: config.oidc
29
29
  });
30
30
  facade.koa.use(router.routes());
31
- facade.koa.use(koa_mount_1.default(provider.app));
31
+ facade.koa.use(mount(provider.app));
32
32
  }
33
33
  if (config.oauth) {
34
34
  facade.koa.use(oauth_1.createOAuth().routes());
@@ -1,7 +1,7 @@
1
- import Router from "koa-router";
1
+ import KoaRouter from "koa-router";
2
2
  import { IdentityContext } from "../interfaces";
3
3
  import { User } from "@restorecommerce/rc-grpc-clients/dist/generated/io/restorecommerce/user";
4
- export declare const createOAuth: () => Router<{}, IdentityContext>;
4
+ export declare const createOAuth: () => KoaRouter<{}, IdentityContext>;
5
5
  export declare const layout: (context: {
6
6
  body: string;
7
7
  title: string;
@@ -1,26 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.account = exports.login = exports.register = exports.layout = exports.createOAuth = void 0;
4
- const koa_router_1 = require("koa-router");
5
4
  const fs_1 = require("fs");
6
5
  const path_1 = require("path");
7
6
  const handlebars_1 = require("handlebars");
8
7
  const utils_1 = require("../oidc/utils");
9
8
  const uuid = require("uuid");
10
9
  const user_1 = require("@restorecommerce/rc-grpc-clients/dist/generated/io/restorecommerce/user");
11
- const koa_body_1 = require("koa-body");
10
+ const jose = require("jose");
11
+ const Router = eval('require("koa-router")');
12
+ const bodyParser = eval('require("koa-body")');
12
13
  const createOAuth = () => {
13
- const router = new koa_router_1.default();
14
- router.use(koa_body_1.default({ multipart: true }));
14
+ const router = new Router();
15
+ router.use(bodyParser({ multipart: true }));
15
16
  router.get('/oauth2-login', async (ctx, next) => {
16
17
  ctx.type = 'html';
17
18
  ctx.body = await exports.login((await ctx.identitySrvClient.oauth.GenerateLinks({})).links);
18
19
  return next();
19
20
  });
21
+ router.get('/oauth2-logout', async (ctx, next) => {
22
+ ctx.cookies.set('token', undefined);
23
+ ctx.status = 303;
24
+ ctx.redirect('/oauth2-login');
25
+ ctx.body = 'Redirecting to login page';
26
+ return next();
27
+ });
20
28
  router.get('/oauth2-urls', async (ctx, next) => {
21
29
  ctx.body = (await ctx.identitySrvClient.oauth.GenerateLinks({})).links;
22
30
  return next();
23
31
  });
32
+ router.get('/oauth2-account', async (ctx, next) => {
33
+ const token = ctx.cookies.get('token');
34
+ if (!token) {
35
+ ctx.body = 'user not logged in';
36
+ return next();
37
+ }
38
+ const ids = ctx.identitySrvClient;
39
+ const user = await ids.user.FindByToken({
40
+ token: token
41
+ });
42
+ if (!user || !user.payload) {
43
+ ctx.body = 'user not logged in';
44
+ return next();
45
+ }
46
+ ctx.type = 'html';
47
+ ctx.body = await exports.account(user.payload);
48
+ return next();
49
+ });
24
50
  router.post('/oauth2-register', async (ctx, next) => {
25
51
  const ids = ctx.identitySrvClient;
26
52
  const body = ctx.request.body;
@@ -34,8 +60,11 @@ const createOAuth = () => {
34
60
  guest: false,
35
61
  }));
36
62
  if (user.payload) {
37
- ctx.type = 'html';
38
- ctx.body = await exports.account(user.payload);
63
+ const token = await upsertUserToken(ids, user.payload.id);
64
+ ctx.cookies.set('token', token);
65
+ ctx.status = 303;
66
+ ctx.redirect('/oauth2-account');
67
+ ctx.body = 'Redirecting to account page';
39
68
  return next();
40
69
  }
41
70
  if (user.status) {
@@ -50,43 +79,45 @@ const createOAuth = () => {
50
79
  code: ctx.request.query['code'],
51
80
  state: ctx.request.query['state']
52
81
  });
53
- console.log(user);
54
82
  if (!user.user || !user.user.payload || (user.user.status && user.user.status.code !== 200)) {
55
- if (user.email) {
56
- ctx.type = 'html';
57
- ctx.body = await exports.register(user.email);
58
- return next();
59
- }
60
- else {
61
- ctx.body = 'Internal Error';
62
- return next();
63
- }
83
+ ctx.type = 'html';
84
+ ctx.body = await exports.register(user.email || '');
85
+ return next();
64
86
  }
65
- const token = utils_1.nanoid();
66
- // 1 Month
67
- const expiresIn = Date.now() + (1000 * 60 * 60 * 24 * 30);
68
- await ids.token.upsert({
69
- id: uuid.v4().replace(/-/g, ''),
70
- type: 'access_token',
71
- expiresIn: expiresIn,
72
- payload: utils_1.marshallProtobufAny({
73
- accountId: user.user.payload.id,
74
- exp: expiresIn,
75
- jti: token
76
- })
77
- });
78
- ctx.type = 'html';
79
- ctx.body = await exports.account(user.user.payload);
87
+ const token = await upsertUserToken(ids, user.user.payload.id);
88
+ ctx.cookies.set('token', token);
89
+ ctx.status = 303;
90
+ ctx.redirect('/oauth2-account');
91
+ ctx.body = 'Redirecting to account page';
80
92
  return next();
81
93
  });
82
94
  return router;
83
95
  };
84
96
  exports.createOAuth = createOAuth;
97
+ const upsertUserToken = async (ids, accountId) => {
98
+ const token = new jose.UnsecuredJWT({})
99
+ .setIssuedAt()
100
+ .setExpirationTime('30d')
101
+ .encode();
102
+ // 1 Month
103
+ const expiresIn = Date.now() + (1000 * 60 * 60 * 24 * 30);
104
+ await ids.token.upsert({
105
+ id: uuid.v4().replace(/-/g, ''),
106
+ type: 'access_token',
107
+ expiresIn: expiresIn,
108
+ payload: utils_1.marshallProtobufAny({
109
+ accountId: accountId,
110
+ exp: expiresIn,
111
+ jti: token
112
+ })
113
+ });
114
+ return token;
115
+ };
85
116
  let layoutHbs;
86
117
  const layout = async (context) => {
87
118
  if (!layoutHbs) {
88
119
  const layoutTpl = await new Promise((resolve, reject) => {
89
- fs_1.default.readFile(path_1.default.resolve(__dirname, 'views/layout.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
120
+ fs_1.readFile(path_1.resolve(__dirname, 'views/layout.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
90
121
  });
91
122
  layoutHbs = handlebars_1.default.compile(layoutTpl);
92
123
  }
@@ -97,7 +128,7 @@ let registerHbs;
97
128
  const register = async (email) => {
98
129
  if (!registerHbs) {
99
130
  const registerTpl = await new Promise((resolve, reject) => {
100
- fs_1.default.readFile(path_1.default.resolve(__dirname, 'views/register.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
131
+ fs_1.readFile(path_1.resolve(__dirname, 'views/register.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
101
132
  });
102
133
  registerHbs = handlebars_1.default.compile(registerTpl);
103
134
  }
@@ -111,7 +142,7 @@ let loginHbs;
111
142
  const login = async (links) => {
112
143
  if (!loginHbs) {
113
144
  const loginTpl = await new Promise((resolve, reject) => {
114
- fs_1.default.readFile(path_1.default.resolve(__dirname, 'views/login.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
145
+ fs_1.readFile(path_1.resolve(__dirname, 'views/login.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
115
146
  });
116
147
  loginHbs = handlebars_1.default.compile(loginTpl);
117
148
  }
@@ -125,7 +156,7 @@ let accountHbs;
125
156
  const account = async (user) => {
126
157
  if (!accountHbs) {
127
158
  const accountTpl = await new Promise((resolve, reject) => {
128
- fs_1.default.readFile(path_1.default.resolve(__dirname, 'views/account.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
159
+ fs_1.readFile(path_1.resolve(__dirname, 'views/account.hbs'), (err, data) => err ? reject(err) : resolve(data.toString()));
129
160
  });
130
161
  accountHbs = handlebars_1.default.compile(accountTpl);
131
162
  }
@@ -0,0 +1,27 @@
1
+ <style>
2
+ .rc-login {
3
+ height: 100%;
4
+ background-color: #00adef;
5
+ }
6
+
7
+ .rc-account {
8
+ width: 815px;
9
+ box-sizing: border-box;
10
+ border-radius: .3rem;
11
+ background: #fff;
12
+ padding: 1rem;
13
+ }
14
+ </style>
15
+
16
+ <div class="rc-login flex col justify-center">
17
+ <div class="self-center justify-center rc-account scale110p">
18
+ <h2>{{title}}</h2>
19
+ <div class="col center justify-center">
20
+ <h3>Welcome {{user.firstName}} {{user.lastName}}!</h3>
21
+
22
+ <a href="/oauth2-logout" class="button emphasized">
23
+ <div class="icogram"><span class="text">Logout</span></div>
24
+ </a>
25
+ </div>
26
+ </div>
27
+ </div>
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html >
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
7
+ <title>{{title}}</title>
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@vcl/vcl@2/dist/index.css">
9
+ <style>
10
+ .app {
11
+ height: 100vh;
12
+ max-width: 100%;
13
+ }
14
+ .debug summary {
15
+ font-weight: bold;
16
+ }
17
+ .debug .debug-content {
18
+ display: none;
19
+ }
20
+ .debug .debug-content.visible {
21
+ display: block;
22
+ }
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <div class="app col">
27
+ <main class="flex col">
28
+ <div class="flex">
29
+ {{{ body }}}
30
+ </div>
31
+ </main>
32
+ </div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,27 @@
1
+ <style>
2
+ .rc-login {
3
+ height: 100%;
4
+ background-color: #00adef;
5
+ }
6
+
7
+ .rc-account {
8
+ width: 815px;
9
+ box-sizing: border-box;
10
+ border-radius: .3rem;
11
+ background: #fff;
12
+ padding: 1rem;
13
+ }
14
+ </style>
15
+
16
+ <div class="rc-login flex col justify-center">
17
+ <div class="self-center justify-center rc-account scale110p">
18
+ <h2>{{title}}</h2>
19
+ <div class="col center justify-center">
20
+ <h3>Login using one of the following providers:</h3>
21
+
22
+ <a href="{{links.google}}" class="button emphasized">
23
+ <div class="icogram"><span class="text">Google</span></div>
24
+ </a>
25
+ </div>
26
+ </div>
27
+ </div>
@@ -0,0 +1,134 @@
1
+ <style>
2
+ .rc-login {
3
+ height: 100%;
4
+ background-color: #00adef;
5
+ }
6
+
7
+ .rc-account {
8
+ width: 815px;
9
+ box-sizing: border-box;
10
+ border-radius: .3rem;
11
+ background: #fff;
12
+ padding: 1rem;
13
+ }
14
+ </style>
15
+
16
+ <div class="rc-login flex col justify-center">
17
+ <div class="self-center justify-center rc-account scale110p">
18
+ <h2>{{title}}</h2>
19
+ <div class="col center justify-center">
20
+ <h3>Please register!</h3>
21
+ <form class="form w-100p" method="post" action="/oauth2-register">
22
+ <div class="form-control-group embedded-input-field-label floating">
23
+ <label for="first_name" class="form-control-label">
24
+ First Name
25
+ <em class="required-indicator">•</em>
26
+ </label>
27
+ <div class="input-field">
28
+ <input class="input" type="text" autocomplete="off" name="first_name" required>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="form-control-group embedded-input-field-label floating">
33
+ <label for="last_name" class="form-control-label">
34
+ Last Name
35
+ <em class="required-indicator">•</em>
36
+ </label>
37
+ <div class="input-field">
38
+ <input class="input" type="text" autocomplete="off" name="last_name" required>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="form-control-group embedded-input-field-label floating">
43
+ <label for="username" class="form-control-label">
44
+ Username
45
+ <em class="required-indicator">•</em>
46
+ </label>
47
+ <div class="input-field">
48
+ <input class="input" type="text" autocomplete="off" name="username" required>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="form-control-group embedded-input-field-label">
53
+ <label for="email" class="form-control-label">
54
+ Email
55
+ <em class="required-indicator">•</em>
56
+ </label>
57
+ <div class="input-field">
58
+ <input class="input" type="email" autocomplete="off" name="email" value="{{email}}" required>
59
+ </div>
60
+ </div>
61
+
62
+ <div class="form-control-group embedded-input-field-label floating">
63
+ <label for="password" class="form-control-label">
64
+ Password
65
+ <em class="required-indicator">•</em>
66
+ </label>
67
+ <div class="input-field">
68
+ <input class="input" type="password" autocomplete="off" name="password" required>
69
+ </div>
70
+ </div>
71
+
72
+ <div class="form-control-group embedded-input-field-label floating">
73
+ <label for="password_repeated" class="form-control-label">
74
+ Password Repeated
75
+ <em class="required-indicator">•</em>
76
+ </label>
77
+ <div class="input-field">
78
+ <input class="input" type="password" autocomplete="off" name="password_repeated" required>
79
+ </div>
80
+ </div>
81
+
82
+ <button type="submit" class="button emphasized">
83
+ <div class="icogram"><span class="text">Register</span></div>
84
+ </button>
85
+ </form>
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ <script>
91
+ !function() {
92
+ const docRoot = document.demoShadowRoot || document;
93
+
94
+ function registerInputFieldListeners(fcg) {
95
+ const inputField = fcg.querySelector('.input-field');
96
+ const input = inputField.querySelector('input, textarea');
97
+
98
+ function updateState() {
99
+ const hasValue = typeof input.value === 'string' && input.value.length > 0;
100
+ const hasFocus = docRoot.activeElement === input;
101
+
102
+ if (hasFocus) {
103
+ inputField.classList.add('focused');
104
+ fcg.classList.add('focused');
105
+ } else {
106
+ inputField.classList.remove('focused');
107
+ fcg.classList.remove('focused');
108
+ }
109
+
110
+ if (hasValue || hasFocus) {
111
+ fcg.classList.remove('floating');
112
+ } else {
113
+ fcg.classList.add('floating');
114
+ }
115
+ }
116
+
117
+ input.addEventListener('focus', updateState);
118
+ input.addEventListener('blur', updateState);
119
+ input.addEventListener('input', updateState);
120
+
121
+ updateState();
122
+
123
+ let prependedElements = 0, sibling = input;
124
+ while (sibling = sibling.previousElementSibling) {
125
+ prependedElements++;
126
+ }
127
+ fcg.style.setProperty('--prepended-elements', prependedElements);
128
+
129
+ }
130
+
131
+ const form = docRoot.querySelector('form');
132
+ form.querySelectorAll('.form-control-group').forEach(fcg => registerInputFieldListeners(fcg));
133
+ }();
134
+ </script>
@@ -1,4 +1,4 @@
1
- import Router from 'koa-router';
1
+ import KoaRouter from 'koa-router';
2
2
  import { Provider } from 'oidc-provider';
3
3
  import { Logger } from 'winston';
4
4
  import { IdentityContext } from '../interfaces';
@@ -10,4 +10,4 @@ export interface CreateOIDCRouterArgs {
10
10
  templates?: OIDCHbsTemplates;
11
11
  loginFn: OIDCBodyLoginFn;
12
12
  }
13
- export declare function createOIDCRouter({ logger, loginFn, provider, env, templates }: CreateOIDCRouterArgs): Router<{}, IdentityContext>;
13
+ export declare function createOIDCRouter({ logger, loginFn, provider, env, templates }: CreateOIDCRouterArgs): KoaRouter<{}, IdentityContext>;
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOIDCRouter = void 0;
4
- const koa_router_1 = require("koa-router");
5
- const koa_body_1 = require("koa-body");
6
4
  const templates_1 = require("./templates");
5
+ const Router = eval('require("koa-router")');
6
+ const bodyParser = eval('require("koa-body")');
7
7
  function createOIDCRouter({ logger, loginFn, provider, env, templates }) {
8
8
  const dev = env === 'development';
9
9
  const tplEngine = new templates_1.OIDCTemplateEngine(templates);
10
- const router = new koa_router_1.default();
10
+ const router = new Router();
11
11
  router.get('/interaction/:uid', async (ctx, next) => {
12
12
  const { uid, prompt, params, session, } = await provider.interactionDetails(ctx.req, ctx.res);
13
13
  const client = await provider.Client.find(params.client_id);
@@ -70,7 +70,7 @@ function createOIDCRouter({ logger, loginFn, provider, env, templates }) {
70
70
  // mergeWithLastSubmission: true,
71
71
  // });
72
72
  // });
73
- router.post('/interaction/:uid/login', koa_body_1.default({
73
+ router.post('/interaction/:uid/login', bodyParser({
74
74
  text: false, json: false
75
75
  }), async (ctx) => {
76
76
  const { prompt, uid, params, session } = await provider.interactionDetails(ctx.req, ctx.res);
@@ -0,0 +1,49 @@
1
+ <style>
2
+ </style>
3
+ {{!-- <div class="login-client-image">
4
+ <% if (client.logoUri) { %><img src="<%= client.logoUri %>"><% } %>
5
+ </div>
6
+
7
+ <ul>
8
+ <% if ([details.scopes.accepted, details.scopes.rejected, details.claims.accepted, details.claims.rejected].every(({ length }) => length === 0)) { %>
9
+ <li>this is a new authorization</li>
10
+ <% } %>
11
+
12
+ <% if ([details.scopes.new, details.claims.new].every(({ length }) => length === 0)) { %>
13
+ <li>the client is asking you to confirm previously given authorization</li>
14
+ <% } %>
15
+
16
+ <% newScopes = new Set(details.scopes.new); newScopes.delete('openid'); newScopes.delete('offline_access') %>
17
+ <% if (newScopes.size) { %>
18
+ <li>scopes:</li>
19
+ <ul>
20
+ <% newScopes.forEach((scope) => { %>
21
+ <li><%= scope %></li>
22
+ <% }) %>
23
+ </ul>
24
+ <% } %>
25
+
26
+ <% newClaims = new Set(details.claims.new); ['sub', 'sid', 'auth_time', 'acr', 'amr', 'iss'].forEach(Set.prototype.delete.bind(newClaims)) %>
27
+ <% if (newClaims.size) { %>
28
+ <li>claims:</li>
29
+ <ul>
30
+ <% newClaims.forEach((claim) => { %>
31
+ <li><%= claim %></li>
32
+ <% }) %>
33
+ </ul>
34
+ <% } %>
35
+
36
+ <% if (params.scope && params.scope.includes('offline_access')) { %>
37
+ <li>
38
+ the client is asking to have offline access to this authorization
39
+ <% if (!details.scopes.new.includes('offline_access')) { %>
40
+ (which you've previously granted)
41
+ <% } %>
42
+ </li>
43
+ <% } %>
44
+
45
+ </ul>
46
+ --}}
47
+ <form autocomplete="off" action="/interaction/{{ uid }}/confirm" method="post">
48
+ <button autofocus type="submit" class="login login-submit">Continue</button>
49
+ </form>
@@ -0,0 +1,79 @@
1
+ <!DOCTYPE html>
2
+ <html >
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
7
+ <title>{{title}}</title>
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@vcl/vcl@2/dist/index.css">
9
+ <style>
10
+ .app {
11
+ height: 100vh;
12
+ max-width: 100%;
13
+ }
14
+ .debug summary {
15
+ font-weight: bold;
16
+ }
17
+ .debug .debug-content {
18
+ display: none;
19
+ }
20
+ .debug .debug-content.visible {
21
+ display: block;
22
+ }
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <div class="app col">
27
+ <main class="flex col">
28
+ <div class="flex">
29
+ {{{ body }}}
30
+ </div>
31
+ {{#if dev }}
32
+ {{#if dbg }}
33
+
34
+ <div class="debug col align-items-center">
35
+ <summary class="" style="cursor: pointer;">(Click to expand) DEBUG information</summary>
36
+ <div class="debug-content">
37
+ <div>
38
+ <h2>uid</h2>
39
+ <p>{{ uid }}</p>
40
+ </div>
41
+ {{#if dbg.session}}
42
+ <div>
43
+ <h3>Session</h3>
44
+ <p>{{{ json dbg.session }}}</p>
45
+ </div>
46
+ {{/if}}
47
+
48
+ {{#if dbg.params}}
49
+ <div>
50
+ <h3>Params</h3>
51
+ <p>{{{ json dbg.params }}}</p>
52
+ </div>
53
+ {{/if}}
54
+ {{#if dbg.prompt}}
55
+ <div>
56
+ <h3>Prompt</h3>
57
+ <p>{{{ json dbg.prompt }}}</p>
58
+ </div>
59
+ {{/if}}
60
+ </div>
61
+ </div>
62
+ <script>
63
+ const sumEl = document.querySelector('.debug > summary');
64
+ const debugContentEl = document.querySelector('.debug-content');
65
+ sumEl.addEventListener('click', () => {
66
+ if (debugContentEl.classList.contains('visible')) {
67
+ debugContentEl.classList.remove('visible');
68
+ } else {
69
+ debugContentEl.classList.add('visible');
70
+ }
71
+ });
72
+ </script>
73
+ {{/if}}
74
+ {{/if}}
75
+ </main>
76
+ </div>
77
+
78
+ </body>
79
+ </html>
@@ -0,0 +1,62 @@
1
+ <style>
2
+ .rc-login {
3
+ height: 100%;
4
+ background-color: #00adef;
5
+ }
6
+
7
+ .rc-login-form {
8
+ width: 815px;
9
+ box-sizing: border-box;
10
+ border-radius: .3rem;
11
+ background: #fff;
12
+ padding: 1rem;
13
+ }
14
+ </style>
15
+
16
+ <div class="rc-login flex col justify-center">
17
+ <div class="self-center justify-center rc-login-form scale110p">
18
+ <h2>{{title}}</h2>
19
+ <div class="row rc-login-form-inner">
20
+ <div class="w-45p gutter-margin-t-b">
21
+ <form class="form m-0 ng-pristine ng-invalid ng-touched" autocomplete="off" action="/interaction/{{ uid}}/login" method="post">
22
+ <div class="form-control-group embedded-input-field-label">
23
+ <label for="identifier" class="form-control-label">
24
+ E-Mail or Username
25
+ </label>
26
+ <div class="input-field {{#if error}}error{{/if}}">
27
+ <input value="testuser" id="identifier" name="identifier" type="text">
28
+ </div>
29
+ </div>
30
+ <div class="form-control-group embedded-input-field-label">
31
+ <label for="password" class="form-control-label">
32
+ Password
33
+ </label>
34
+ <div class="input-field {{#if error}}error{{/if}}">
35
+ <input value="testpassword" name="password" name="password" type="text">
36
+ </div>
37
+ {{#if error}}
38
+ <div class="form-control-hint error">{{error.message}}</div>
39
+ {{/if}}
40
+ </div>
41
+ <div class="row justify-between">
42
+ <button type="button" class="button half-transparent"> Forgot your password? </button>
43
+ <button type="submit" class="button emphasized"> Log in </button>
44
+ </div>
45
+ </form>
46
+ </div>
47
+ <div class="w-10p divider divider-vertical row center justify-center rc-login-form-divider-v">
48
+ <div class="divider-rule"></div>
49
+ <div class="icogram divider-element">
50
+ <div class="text">or</div>
51
+ </div>
52
+ </div>
53
+ <div class="w-45p col justify-center gutter-margin-t-b">
54
+ <a href="https://todo" class="col justify-center">
55
+ <button type="button" class="button emphasized">
56
+ Create an Account
57
+ </button>
58
+ </a>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
@@ -442,9 +442,9 @@ export declare type IoRestorecommerceLocationLocation = {
442
442
  description?: Maybe<Scalars['String']>;
443
443
  organizationId?: Maybe<Scalars['String']>;
444
444
  parentId?: Maybe<Scalars['String']>;
445
- childrenIds?: Maybe<Array<Scalars['String']>>;
446
445
  addressId?: Maybe<Scalars['String']>;
447
446
  data?: Maybe<GoogleProtobufAny>;
447
+ type?: Maybe<Scalars['String']>;
448
448
  };
449
449
  export declare type GoogleProtobufAny = {
450
450
  __typename?: 'GoogleProtobufAny';
@@ -479,7 +479,6 @@ export declare type IoRestorecommerceOrganizationOrganization = {
479
479
  meta?: Maybe<IoRestorecommerceMetaMeta>;
480
480
  addressId?: Maybe<Scalars['String']>;
481
481
  parentId?: Maybe<Scalars['String']>;
482
- childrenIds?: Maybe<Array<Scalars['String']>>;
483
482
  contactPointIds?: Maybe<Array<Scalars['String']>>;
484
483
  website?: Maybe<Scalars['String']>;
485
484
  email?: Maybe<Scalars['String']>;
@@ -860,9 +859,9 @@ export declare type IIoRestorecommerceLocationLocation = {
860
859
  description?: Maybe<Scalars['String']>;
861
860
  organizationId?: Maybe<Scalars['String']>;
862
861
  parentId?: Maybe<Scalars['String']>;
863
- childrenIds?: Maybe<Array<Scalars['String']>>;
864
862
  addressId?: Maybe<Scalars['String']>;
865
863
  data?: Maybe<IGoogleProtobufAny>;
864
+ type?: Maybe<Scalars['String']>;
866
865
  };
867
866
  export declare type ResourceOrganizationMutation = {
868
867
  __typename?: 'ResourceOrganizationMutation';
@@ -885,7 +884,6 @@ export declare type IIoRestorecommerceOrganizationOrganization = {
885
884
  meta?: Maybe<IIoRestorecommerceMetaMeta>;
886
885
  addressId?: Maybe<Scalars['String']>;
887
886
  parentId?: Maybe<Scalars['String']>;
888
- childrenIds?: Maybe<Array<Scalars['String']>>;
889
887
  contactPointIds?: Maybe<Array<Scalars['String']>>;
890
888
  website?: Maybe<Scalars['String']>;
891
889
  email?: Maybe<Scalars['String']>;
@@ -1636,9 +1634,9 @@ export declare type IoRestorecommerceLocationLocationResolvers<ContextType = Res
1636
1634
  description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1637
1635
  organizationId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1638
1636
  parentId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1639
- childrenIds?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;
1640
1637
  addressId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1641
1638
  data?: Resolver<Maybe<ResolversTypes['GoogleProtobufAny']>, ParentType, ContextType>;
1639
+ type?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1642
1640
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1643
1641
  }>;
1644
1642
  export declare type GoogleProtobufAnyResolvers<ContextType = ResourceContext, ParentType extends ResolversParentTypes['GoogleProtobufAny'] = ResolversParentTypes['GoogleProtobufAny']> = ResolversObject<{
@@ -1673,7 +1671,6 @@ export declare type IoRestorecommerceOrganizationOrganizationResolvers<ContextTy
1673
1671
  meta?: Resolver<Maybe<ResolversTypes['IoRestorecommerceMetaMeta']>, ParentType, ContextType>;
1674
1672
  addressId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1675
1673
  parentId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1676
- childrenIds?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;
1677
1674
  contactPointIds?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;
1678
1675
  website?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1679
1676
  email?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restorecommerce/facade",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Facade for Restorecommerce microservices",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -24,15 +24,16 @@
24
24
  "@cloudnative/health": "^2.1.2",
25
25
  "@grpc/grpc-js": "^1.2.12",
26
26
  "@grpc/proto-loader": "^0.6.0",
27
- "@restorecommerce/grpc-client": "^0.3.0",
28
- "@restorecommerce/kafka-client": "^0.3.0",
29
- "@restorecommerce/logger": "^0.12.0",
30
- "@restorecommerce/rc-grpc-clients": "^0.4.0",
31
- "@restorecommerce/service-config": "^0.4.24",
27
+ "@restorecommerce/grpc-client": "^0.3.1",
28
+ "@restorecommerce/kafka-client": "^0.3.1",
29
+ "@restorecommerce/logger": "^0.12.1",
30
+ "@restorecommerce/rc-grpc-clients": "^0.4.2",
31
+ "@restorecommerce/service-config": "^0.4.25",
32
32
  "apollo-server-koa": "^2.21.2",
33
33
  "debug": "^4.3.1",
34
34
  "googleapis": "^92.0.0",
35
35
  "handlebars": "^4.7.7",
36
+ "jose": "^4.5.0",
36
37
  "koa": "^2.13.1",
37
38
  "koa-body": "^4.2.0",
38
39
  "koa-helmet": "^6.1.0",
@@ -85,7 +86,7 @@
85
86
  "typescript": "^4.2.3"
86
87
  },
87
88
  "scripts": {
88
- "build": "npm-run-all build:clean generate build:compile build:codegen:clean build:codegen:compile",
89
+ "build": "npm-run-all build:clean generate build:compile build:codegen:clean build:codegen:compile copyhbs",
89
90
  "build:clean": "rimraf -rf ./dist",
90
91
  "build:compile": "tsc -p tsconfig.lib.json",
91
92
  "build:codegen:clean": "rimraf -rf ./codegen",
@@ -97,7 +98,8 @@
97
98
  "dev:serve": "TS_NODE_PROJECT=tsconfig.test.json nodemon -e ts,hbs -w ./tests -w ./src -x node --inspect=7000 -r ts-node/register tests/server.ts",
98
99
  "generate": "ts-node --project tsconfig.generate.json -r tsconfig-paths/register generate.ts",
99
100
  "prepublishOnly": "npm run build",
100
- "debug-run": "ts-node --project tsconfig.debug.json debug-run.ts"
101
+ "debug-run": "ts-node --project tsconfig.debug.json debug-run.ts",
102
+ "copyhbs": "sh copy-hbs.sh"
101
103
  },
102
104
  "engines": {
103
105
  "node": ">= 12.18.0"
@@ -105,5 +107,5 @@
105
107
  "publishConfig": {
106
108
  "access": "public"
107
109
  },
108
- "gitHead": "97966555c4e421699a8a7c054f41ccc4385f618f"
110
+ "gitHead": "48d54d4a52972fa4c7f03a105241ea0662454e83"
109
111
  }