-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.js
147 lines (135 loc) · 4.46 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import express from 'express';
import {ApolloServer, gql} from 'apollo-server-express';
import fs from 'fs';
import https from 'https';
import http from 'http';
import {createRequire} from "module";
const require = createRequire(import.meta.url);
const folgenJson = require('./folgen.json')
const mathefactsJson = require('./mathefacts.json')
const staedtegeschichtenJson = require('./staedtegeschichten.json')
const playlistJson = require('./playlist.json')
const lexikonJson = require('./lexikon.json')
const typeDefs = gql`
type songs {
code: String!
draufgepackt: String!
}
type Playlist {
folgenId: ID!
startzeit: String!
songs: [songs]!
}
type Geschichte {
titel: String!
ort: String!
typ: String!
geo: [Float]!
geschichte: String!
}
type Staedtegeschichten {
startzeit: String!
endzeit: String!
geschichten: [Geschichte]!
folge: Folge!
}
type Mathefacts {
startzeit: String!
endzeit: String!
thema: String!
beschreibung: String!
folge: Folge!
}
type Folge {
folgenId: ID!
folgenname: String!
code: String!
}
# Close Words is a string to prevent infinite recursion
type Word {
word: String!
type: String!
explanation: String!
examples: [String]!
closeWords: [String]!
}
# The "Query" type is special: it lists all of the available queries that
# clients can execute, along with the return type for each. In this
# case, the "folgen" query returns an array of zero or more Folge (defined above).
type Query {
folgen: [Folge]
staedtegeschichten: [Staedtegeschichten]
mathefacts: [Mathefacts]
playlist: [Playlist]
word(filter: WordFilter): [Word]
}
input WordFilter {
word_contains: String
}
`;
// Resolvers define the technique for fetching the types defined in the
// schema. This resolver retrieves books from the "folgen" array above.
const resolvers = {
Query: {
playlist: () => playlistJson.data,
folgen: () => folgenJson.data,
staedtegeschichten(parent, args, context, info) {
let geschichten = []
const folgen = folgenJson.data
staedtegeschichtenJson.data.forEach((staedtegeschichtenFolge) => {
const folgeObj = folgen.find(item => item.folgenId === staedtegeschichtenFolge.folgenId)
geschichten.push(Object.assign(staedtegeschichtenFolge, {"folge": folgeObj}
)
)
});
return geschichten
},
mathefacts(parent, args, context, info) {
let facts = []
const folgen = folgenJson.data
mathefactsJson.data.forEach((mathefactsFolge) => {
const folgeObj = folgen.find(item => item.folgenId === mathefactsFolge.folgenId)
facts.push(Object.assign(mathefactsFolge, {"folge": folgeObj}
)
)
});
return facts
},
word(parent, args, context, info) {
let words = lexikonJson.data;
if (args.filter && args.filter.word_contains) {
const filterLowerCase = args.filter.word_contains.toLowerCase();
words = words.filter(word => word.word.toLowerCase().includes(filterLowerCase));
}
return words;
}
}
};
async function startApolloServer() {
const configurations = {
production: {ssl: true, port: 443, hostname: 'data.hobbylos.online'},
development: {ssl: false, port: 4000, hostname: 'localhost'},
};
const environment = process.env.NODE_ENV || 'production';
const config = configurations[environment];
const server = new ApolloServer({
typeDefs,
resolvers,
csrfPrevention: true,
});
await server.start();
const app = express();
server.applyMiddleware({app});
let httpServer;
if (config.ssl) {httpServer = https.createServer({key: fs.readFileSync(`./ssl/server.key`),cert: fs.readFileSync(`./ssl/server.crt`),},app,);}
else {httpServer = http.createServer(app);}
await new Promise(resolve =>httpServer.listen({port: config.port}, resolve),);
console.log(
'🚀 Server ready at',
`http${config.ssl ? 's' : ''}://${config.hostname}:${config.port}${
server.graphqlPath
}`,
);
return {server, app};
}
startApolloServer()