diff --git a/apis/api-gateway/schema.graphql b/apis/api-gateway/schema.graphql index f6a96c81fb0..968383353b5 100644 --- a/apis/api-gateway/schema.graphql +++ b/apis/api-gateway/schema.graphql @@ -2199,8 +2199,9 @@ type UserRole @join__type(graph: API_JOURNEYS, key: "id") @join__type(graph: AP roles: [Role!] } -type AuthenticatedUser @join__type(graph: API_JOURNEYS, key: "id", extension: true) @join__type(graph: API_JOURNEYS_MODERN, key: "id", extension: true) @join__type(graph: API_USERS, key: "id") { +type AuthenticatedUser @join__type(graph: API_JOURNEYS, key: "id", extension: true) @join__type(graph: API_JOURNEYS_MODERN, key: "id", extension: true) @join__type(graph: API_LANGUAGES, key: "id", extension: true) @join__type(graph: API_USERS, key: "id") { id: ID! + languageUserRoles: [LanguageRole!]! @join__field(graph: API_LANGUAGES) firstName: String! @join__field(graph: API_USERS) lastName: String @join__field(graph: API_USERS) email: String! @join__field(graph: API_USERS) @@ -3738,15 +3739,15 @@ enum PlausibleEvent @join__type(graph: API_JOURNEYS_MODERN) { journeyResponses @join__enumValue(graph: API_JOURNEYS_MODERN) } +enum LanguageRole @join__type(graph: API_LANGUAGES) { + publisher @join__enumValue(graph: API_LANGUAGES) +} + enum LanguageIdType @join__type(graph: API_LANGUAGES) { databaseId @join__enumValue(graph: API_LANGUAGES) bcp47 @join__enumValue(graph: API_LANGUAGES) } -enum LanguageRole @join__type(graph: API_LANGUAGES) { - publisher @join__enumValue(graph: API_LANGUAGES) -} - enum DefaultPlatform @join__type(graph: API_MEDIA) { ios @join__enumValue(graph: API_MEDIA) android @join__enumValue(graph: API_MEDIA) diff --git a/apis/api-languages/schema.graphql b/apis/api-languages/schema.graphql index cff25a5040e..f2a3bca05b6 100644 --- a/apis/api-languages/schema.graphql +++ b/apis/api-languages/schema.graphql @@ -13,6 +13,14 @@ type AudioPreview codec: String! } +type AuthenticatedUser + @key(fields: "id") + @extends +{ + id: ID! @external + languageUserRoles: [LanguageRole!]! +} + type Continent { id: ID! name(languageId: ID, primary: Boolean): [ContinentName!]! diff --git a/apis/api-languages/src/schema/user/user.ts b/apis/api-languages/src/schema/user/user.ts index 642944b581f..15647bc8580 100644 --- a/apis/api-languages/src/schema/user/user.ts +++ b/apis/api-languages/src/schema/user/user.ts @@ -24,3 +24,26 @@ builder.externalRef('User', builder.selection<{ id: string }>('id')).implement({ }) }) }) + +builder + .externalRef('AuthenticatedUser', builder.selection<{ id: string }>('id')) + .implement({ + externalFields: (t) => ({ + id: t.id({ nullable: false }) + }), + fields: (t) => ({ + languageUserRoles: t.field({ + type: [LanguageRole], + nullable: false, + resolve: async (data) => { + return ( + ( + await prisma.userLanguageRole.findUnique({ + where: { userId: data.id } + }) + )?.roles ?? [] + ) + } + }) + }) + }) diff --git a/libs/shared/gql/src/__generated__/graphql-env.d.ts b/libs/shared/gql/src/__generated__/graphql-env.d.ts index e50e15558a1..96edaf412b5 100644 --- a/libs/shared/gql/src/__generated__/graphql-env.d.ts +++ b/libs/shared/gql/src/__generated__/graphql-env.d.ts @@ -6,7 +6,7 @@ export type introspection_types = { 'App': { name: 'App'; enumValues: 'NextSteps' | 'JesusFilmOne'; }; 'ArclightApiKey': { kind: 'OBJECT'; name: 'ArclightApiKey'; fields: { 'defaultPlatform': { name: 'defaultPlatform'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'DefaultPlatform'; ofType: null; }; } }; 'desc': { name: 'desc'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'key': { name: 'key'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; }; 'AudioPreview': { kind: 'OBJECT'; name: 'AudioPreview'; fields: { 'bitrate': { name: 'bitrate'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'codec': { name: 'codec'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'duration': { name: 'duration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'language': { name: 'language'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Language'; ofType: null; }; } }; 'languageId': { name: 'languageId'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'ID'; ofType: null; }; } }; 'size': { name: 'size'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'value': { name: 'value'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; }; - 'AuthenticatedUser': { kind: 'OBJECT'; name: 'AuthenticatedUser'; fields: { 'email': { name: 'email'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'emailVerified': { name: 'emailVerified'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'firstName': { name: 'firstName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'ID'; ofType: null; }; } }; 'imageUrl': { name: 'imageUrl'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'lastName': { name: 'lastName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'superAdmin': { name: 'superAdmin'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; } }; }; }; + 'AuthenticatedUser': { kind: 'OBJECT'; name: 'AuthenticatedUser'; fields: { 'email': { name: 'email'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'emailVerified': { name: 'emailVerified'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'firstName': { name: 'firstName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'ID'; ofType: null; }; } }; 'imageUrl': { name: 'imageUrl'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'languageUserRoles': { name: 'languageUserRoles'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'LanguageRole'; ofType: null; }; }; }; } }; 'lastName': { name: 'lastName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'superAdmin': { name: 'superAdmin'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; } }; }; }; 'BaseError': { kind: 'INTERFACE'; name: 'BaseError'; fields: { 'message': { name: 'message'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; possibleTypes: 'Error' | 'ForeignKeyConstraintError' | 'NotFoundError' | 'NotUniqueError' | 'ZodError'; }; 'BibleBook': { kind: 'OBJECT'; name: 'BibleBook'; fields: { 'alternateName': { name: 'alternateName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'ID'; ofType: null; }; } }; 'isNewTestament': { name: 'isNewTestament'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'BibleBookName'; ofType: null; }; }; }; } }; 'order': { name: 'order'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'osisId': { name: 'osisId'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'paratextAbbreviation': { name: 'paratextAbbreviation'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; }; 'BibleBookName': { kind: 'OBJECT'; name: 'BibleBookName'; fields: { 'language': { name: 'language'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Language'; ofType: null; }; } }; 'primary': { name: 'primary'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'value': { name: 'value'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };