Skip to content

Commit bf83b50

Browse files
committed
Add mailing list subscription
1 parent 832e217 commit bf83b50

File tree

5 files changed

+65
-4
lines changed

5 files changed

+65
-4
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@
5858
"emoji-strip": "^1.0.1",
5959
"express": "^4.16.4",
6060
"extract-files": "^10.0.0",
61-
"form-data": "^3.0.0",
61+
"form-data": "^4.0.0",
6262
"graphql": "15.3.0",
63+
"graphql-scalars": "^1.21.3",
6364
"graphql-upload": "^11.0.0",
6465
"graphql-ws": "^2.0.0",
6566
"husky": "^1.3.1",

src/remotes/email/index.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* eslint-disable camelcase */
2+
import fs from 'fs';
3+
import path from 'path';
4+
import { makeExecutableSchema } from '@graphql-tools/schema';
5+
import fetch from 'node-fetch';
6+
import FormData from 'form-data';
7+
import {JSONObjectResolver, JSONObjectDefinition} from 'graphql-scalars';
8+
9+
const typeDefs = [JSONObjectDefinition, fs.readFileSync(path.join(__dirname, 'schema.gql')).toString()];
10+
11+
export default function createEmailSchema() {
12+
const resolvers = {
13+
JSONObject: JSONObjectResolver,
14+
15+
Query: {
16+
status() { return true; },
17+
},
18+
19+
Mutation: {
20+
async subscribe(parent, args) {
21+
const res = await fetch(`https://emailoctopus.com/api/1.6/lists/${args.list}/contacts`, {
22+
method: 'POST',
23+
headers: { 'Content-Type': 'application/json', },
24+
body: JSON.stringify({
25+
api_key: process.env.EMAIL_OCTOPUS_TOKEN,
26+
email_address: args.email,
27+
fields: { ...args.fields, FirstName: args.firstName, LastName: args.lastName },
28+
}),
29+
});
30+
return true;
31+
},
32+
},
33+
};
34+
35+
const schema = makeExecutableSchema({
36+
typeDefs,
37+
resolvers,
38+
});
39+
40+
return {
41+
schema,
42+
};
43+
}

src/remotes/email/schema.gql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type Query {
2+
status: Boolean
3+
}
4+
5+
type Mutation {
6+
subscribe(list: String!, email: String!, firstName: String, lastName: String, fields: JSONObject): String
7+
}

src/server.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import createCalendarSchema from './remotes/calendar';
1414
import createLabsSchema from './remotes/labs';
1515
import createAdvisorsSchema from './remotes/advisors';
1616
import createTwitchSchema from './remotes/twitch';
17+
import createEmailSchema from './remotes/email';
1718
import createGeoSchema from './remotes/geo';
1819
import createClearSchema from "./remotes/clear";
1920
import createAccountSchema from './remotes/account';
@@ -24,7 +25,7 @@ const port = process.env.PORT || 4000;
2425

2526
async function buildSchema() {
2627
console.log('Fetching sub-schemas...');
27-
const [blog, showYourWork, showcase, calendar, labs, advisors, clear, cms, account, geo, twitch, github] =
28+
const [blog, showYourWork, showcase, calendar, labs, advisors, clear, cms, account, geo, email, twitch, github] =
2829
await Promise.all([
2930
await createWordpressSchema(process.env.WORDPRESS_URL || 'https://wp.codeday.org/graphql'),
3031
await createDiscordPostsSchema(process.env.SHOWYOURWORK_URL || 'http://discord-posts.codeday.cloud'),
@@ -42,6 +43,7 @@ async function buildSchema() {
4243
process.env.MAXMIND_ACCOUNT,
4344
process.env.MAXMIND_KEY
4445
),
46+
await createEmailSchema(),
4547
await createTwitchSchema(
4648
process.env.TWITCH_CHANNEL,
4749
process.env.TWITCH_CLIENT_ID,
@@ -60,6 +62,7 @@ async function buildSchema() {
6062
showYourWork,
6163
showcase,
6264
calendar,
65+
email,
6366
twitch,
6467
labs,
6568
advisors,

yarn.lock

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2688,7 +2688,7 @@ flatted@^3.1.0:
26882688
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067"
26892689
integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==
26902690

2691-
form-data@4.0.0:
2691+
form-data@4.0.0, form-data@^4.0.0:
26922692
version "4.0.0"
26932693
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
26942694
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
@@ -2896,6 +2896,13 @@ graphql-extensions@^0.15.0:
28962896
apollo-server-env "^3.1.0"
28972897
apollo-server-types "^0.9.0"
28982898

2899+
graphql-scalars@^1.21.3:
2900+
version "1.21.3"
2901+
resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.21.3.tgz#21eb0b9349cc94ae62b40f40ebe87220d3a5f1b1"
2902+
integrity sha512-QLWw3BHmqHZMp9JeYmPpjq7JT9aw/H8TpwmWKJEuMSE3+O7Xe7TduQbOLFzbs1q9UxX6CVkc0O1JO/YfkP/pAw==
2903+
dependencies:
2904+
tslib "^2.5.0"
2905+
28992906
graphql-subscriptions@^1.0.0:
29002907
version "1.1.0"
29012908
resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz#5f2fa4233eda44cf7570526adfcf3c16937aef11"
@@ -5020,7 +5027,7 @@ tslib@^1.10.0, tslib@^1.14.1, tslib@^1.9.3:
50205027
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
50215028
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
50225029

5023-
tslib@^2.0.3, tslib@^2.1.0:
5030+
tslib@^2.0.3, tslib@^2.1.0, tslib@^2.5.0:
50245031
version "2.5.0"
50255032
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
50265033
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==

0 commit comments

Comments
 (0)