Skip to content

Commit a835644

Browse files
committed
Merge remote-tracking branch 'origin/account'
2 parents 863b774 + 875dbe2 commit a835644

File tree

6 files changed

+200
-1286
lines changed

6 files changed

+200
-1286
lines changed

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@
5151
"apollo-server": "^2.25.3",
5252
"apollo-server-express": "^2.4.8",
5353
"apollo-upload-client": "^14.1.3",
54-
"auth0": "^2.27.1",
55-
"auth0-get-all-users": "^1.1.0",
5654
"babel-loader": "^8.0.5",
5755
"body-parser": "^1.18.3",
5856
"cross-fetch": "^3.0.6",

src/remoteTransport.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import extractFiles from 'extract-files/public/extractFiles';
1212
function makeExecutor(httpEndpoint, options) {
1313
return async function executor({ document, variables, context }) {
1414
const allowedHeaders = Object.keys(context?.headers || {})
15-
.filter((name) => name.toLowerCase().substr(0, 2) === 'x-')
15+
.filter((name) => name.toLowerCase().startsWith(prefix))
1616
.reduce((accum, name) => ({ ...accum, [name]: context?.headers[name] }), {});
1717

1818
const query = print(document);

src/remotes/account.js

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import { wrapSchema, introspectSchema } from "@graphql-tools/wrap";
2+
import makeRemoteTransport from "../remoteTransport";
3+
import { delegateToSchema } from "@graphql-tools/delegate";
4+
import { batchDelegateToSchema } from "@graphql-tools/batch-delegate";
5+
import { TransformQuery } from "@graphql-tools/wrap";
6+
import { Kind } from "graphql";
7+
import { AddFieldToRequestTransform } from "../gql-utils";
8+
9+
function getConnectionTypes(prefix) {
10+
return `
11+
extend type ${prefix}Badge {
12+
details: CmsBadge
13+
}
14+
15+
extend type ${prefix}User {
16+
sites: [CmsSite]
17+
}
18+
`;
19+
}
20+
21+
function getConnectionResolvers(prefix, schemas) {
22+
return {
23+
[`${prefix}Badge`]: {
24+
details: {
25+
selectionSet: "{ id }",
26+
async resolve(parent, args, context, info) {
27+
return batchDelegateToSchema({
28+
schema: schemas.cms,
29+
operation: "query",
30+
fieldName: "badgeCollection",
31+
key: parent.id,
32+
argsFromKeys: (ids) => ({
33+
where: { OR: [...ids?.map((id) => ({ id }))] },
34+
}),
35+
context,
36+
info,
37+
valuesFromResults: (results, keys) =>
38+
keys?.map((key) => results.find((result) => result?.id === key)),
39+
transforms: [
40+
new AddFieldToRequestTransform(schemas.cms, "Badge", "id"),
41+
new TransformQuery({
42+
path: ["badgeCollection"],
43+
queryTransformer: (subtree) => ({
44+
kind: Kind.SELECTION_SET,
45+
selections: [
46+
{
47+
kind: Kind.FIELD,
48+
name: {
49+
kind: Kind.NAME,
50+
value: "items",
51+
},
52+
selectionSet: subtree,
53+
},
54+
],
55+
}),
56+
resultTransformer: (result) => result?.items || [],
57+
}),
58+
],
59+
});
60+
},
61+
},
62+
},
63+
[`${prefix}User`]: {
64+
sites: {
65+
selectionSet: "{ roles }",
66+
async resolve(parent, args, context, info) {
67+
return delegateToSchema({
68+
schema: schemas.cms,
69+
operation: "query",
70+
fieldName: "siteCollection",
71+
args: {
72+
where: {
73+
OR: [
74+
...parent.roles.map((role) => {
75+
if (role.name == "Staff") return { type: "Volunteer" };
76+
return { type: role.name };
77+
}),
78+
{ type: "Student" },
79+
],
80+
},
81+
},
82+
context,
83+
info,
84+
transforms: [
85+
new TransformQuery({
86+
path: ["siteCollection"],
87+
queryTransformer: (subtree) => ({
88+
kind: Kind.SELECTION_SET,
89+
selections: [
90+
{
91+
kind: Kind.FIELD,
92+
name: {
93+
kind: Kind.NAME,
94+
value: "items",
95+
},
96+
selectionSet: subtree,
97+
},
98+
],
99+
}),
100+
resultTransformer: (r) => r?.items,
101+
}),
102+
],
103+
});
104+
},
105+
},
106+
},
107+
};
108+
}
109+
110+
export default async function createAccountSchema(uri, wsUri) {
111+
console.log(` * account(${uri})`);
112+
const { executor, subscriber } = makeRemoteTransport(uri, wsUri, "");
113+
const schema = wrapSchema({
114+
schema: await introspectSchema(executor),
115+
executor,
116+
subscriber,
117+
});
118+
return {
119+
schema,
120+
transforms: [],
121+
getConnectionTypes,
122+
getConnectionResolvers,
123+
};
124+
}

src/remotes/auth0/utils.js

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

src/server.js

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,60 +3,54 @@ import http from 'http';
33
import { ApolloServer } from 'apollo-server-express';
44
import { graphqlUploadExpress } from 'graphql-upload';
55
import { SubscriptionServer } from 'subscriptions-transport-ws';
6-
import { default as WebSocket } from 'ws';
7-
import ws from 'ws';
6+
import WebSocket from 'ws';
87
import { execute, subscribe } from 'graphql';
98
import createWordpressSchema from './remotes/wordpress';
109
import createContentfulSchema from './remotes/contentful';
1110
import createDiscordPostsSchema from './remotes/discordPosts';
1211
import createAuth0Schema from './remotes/auth0';
13-
import createGithubSchema from './remotes/github';
1412
import createShowcaseSchema from './remotes/showcase';
1513
import createCalendarSchema from './remotes/calendar';
1614
import createLabsSchema from './remotes/labs';
1715
import createAdvisorsSchema from './remotes/advisors';
1816
import createTwitchSchema from './remotes/twitch';
1917
import createGeoSchema from './remotes/geo';
2018
import createClearSchema from "./remotes/clear";
21-
import { addAuthContext, addWsAuthContext } from './auth';
19+
import createAccountSchema from './remotes/account';
2220
import { weave } from './schema';
2321
import log from './plugins/log';
2422

2523
const port = process.env.PORT || 4000;
2624

2725
async function buildSchema() {
2826
console.log('Fetching sub-schemas...');
29-
const [blog, showYourWork, showcase, calendar, labs, advisors, clear, cms, account, geo, twitch, github] =
30-
await Promise.all([
31-
await createWordpressSchema(process.env.WORDPRESS_URL || 'https://wp.codeday.org/graphql'),
32-
await createDiscordPostsSchema(process.env.SHOWYOURWORK_URL || 'http://discord-posts.codeday.cloud'),
33-
await createShowcaseSchema(
34-
process.env.SHOWCASE_URL || 'http://showcase-gql.codeday.cloud/graphql',
35-
process.env.SHOWCASE_WS || 'ws://showcase-gql.codeday.cloud/graphql'
36-
),
37-
await createCalendarSchema(process.env.CALENDAR_URL || 'http://calendar-gql.codeday.cloud/graphql'),
38-
await createLabsSchema(process.env.LABS_URL || 'http://labs-gql.codeday.cloud/graphql'),
39-
await createAdvisorsSchema(process.env.ADVISORS_URL || 'http://advisors-gql.codeday.cloud/graphql'),
40-
await createClearSchema(process.env.CLEAR_URL || 'http://clear-gql.codeday.cloud/graphql'),
41-
await createContentfulSchema('d5pti1xheuyu', process.env.CONTENTFUL_TOKEN),
42-
await createAuth0Schema(
43-
process.env.AUTH0_DOMAIN,
44-
process.env.AUTH0_CLIENT_ID,
45-
process.env.AUTH0_CLIENT_SECRET
46-
),
47-
await createGeoSchema(
48-
process.env.MAXMIND_ACCOUNT,
49-
process.env.MAXMIND_KEY
50-
),
51-
await createTwitchSchema(
52-
process.env.TWITCH_CHANNEL,
53-
process.env.TWITCH_CLIENT_ID,
54-
process.env.TWITCH_CLIENT_SECRET
55-
),
56-
await createGithubSchema(
57-
process.env.GITHUB_TOKEN,
58-
),
59-
]);
27+
const [blog, showYourWork, showcase, calendar, labs, advisors, clear, cms, account, geo, twitch] = await Promise.all([
28+
await createWordpressSchema(process.env.WORDPRESS_URL || 'https://wp.codeday.org/graphql'),
29+
await createDiscordPostsSchema(process.env.SHOWYOURWORK_URL || 'http://discord-posts.codeday.cloud'),
30+
await createShowcaseSchema(
31+
process.env.SHOWCASE_URL || 'http://showcase-gql.codeday.cloud/graphql',
32+
process.env.SHOWCASE_WS || 'ws://showcase-gql.codeday.cloud/graphql'
33+
),
34+
await createCalendarSchema(process.env.CALENDAR_URL || 'http://calendar-gql.codeday.cloud/graphql'),
35+
await createLabsSchema(process.env.LABS_URL || 'http://labs-gql.codeday.cloud/graphql'),
36+
await createAdvisorsSchema(process.env.ADVISORS_URL || 'http://advisors-gql.codeday.cloud/graphql'),
37+
await createClearSchema(process.env.CLEAR_URL || 'http://clear-gql.codeday.cloud/graphql'),
38+
await createContentfulSchema('d5pti1xheuyu', process.env.CONTENTFUL_TOKEN),
39+
await createAuth0Schema(
40+
process.env.AUTH0_DOMAIN,
41+
process.env.AUTH0_CLIENT_ID,
42+
process.env.AUTH0_CLIENT_SECRET
43+
),
44+
await createGeoSchema(
45+
process.env.MAXMIND_ACCOUNT,
46+
process.env.MAXMIND_KEY
47+
),
48+
await createTwitchSchema(
49+
process.env.TWITCH_CHANNEL,
50+
process.env.TWITCH_CLIENT_ID,
51+
process.env.TWITCH_CLIENT_SECRET
52+
),
53+
]);
6054
console.log('...sub-schemas fetched.');
6155

6256
return weave({
@@ -92,7 +86,6 @@ export default async () => {
9286
context: ({ req }) => ({
9387
headers: req?.headers,
9488
req,
95-
...addAuthContext(req || {}),
9689
}),
9790
});
9891

@@ -117,9 +110,6 @@ export default async () => {
117110
schema,
118111
execute,
119112
subscribe,
120-
onConnect: (connectionParams, webSocket) => {
121-
return addWsAuthContext(connectionParams)
122-
}
123113
}, { server, path: '/subscriptions' });
124114
console.log(`Listening on http://0.0.0.0:${port}`);
125115
});

0 commit comments

Comments
 (0)