GraphQL works with Mongoose
This commit is contained in:
@@ -1,148 +1,203 @@
|
||||
const { ApolloServer, PubSub } = require('apollo-server');
|
||||
// const { Cors } = require('cors');
|
||||
// const { Express } = require('express');
|
||||
|
||||
const express = require("express");
|
||||
const { graphqlHTTP } = require('express-graphql');
|
||||
const mongoose = require("mongoose");
|
||||
const graphqlSchema = require("./graphql/schema/schema")
|
||||
const appointmentResolvers = require("./graphql/resolvers/appointment")
|
||||
const userResolvers = require("./graphql/resolvers/user")
|
||||
import dotenv from 'dotenv';
|
||||
import express from 'express';
|
||||
// const express = require("express");
|
||||
// const { ApolloServer, PubSub } = require('apollo-server');
|
||||
import { ApolloServer } from 'apollo-server-express';
|
||||
// const mongoose = require("mongoose");
|
||||
import mongoose from 'mongoose';
|
||||
|
||||
var MongoClient = require('mongodb', { useUnifiedTopology: true }).MongoClient;
|
||||
// import { MongoClient } from 'mongodb'
|
||||
const Query = require('./resolvers/Query');
|
||||
const Mutation = require('./resolvers/Mutation');
|
||||
const Subscription = require('./resolvers/Subscription');
|
||||
const User = require('./resolvers/User');
|
||||
const Appointment = require('./resolvers/Appointment');
|
||||
const Follow = require('./resolvers/Follow');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { getUserId } = require('./utils');
|
||||
|
||||
const pubsub = new PubSub();
|
||||
|
||||
const app = express()
|
||||
|
||||
const graphqlResolvers = {
|
||||
appointmentResolvers,
|
||||
userResolvers
|
||||
};
|
||||
import './utils/db.js';
|
||||
// require('./utils/db')
|
||||
import schema from './schema/index.js';
|
||||
// require('./schema')
|
||||
|
||||
|
||||
app.use(
|
||||
"/graphql",
|
||||
graphqlHTTP({
|
||||
schema: graphqlSchema,
|
||||
rootValue: appointmentResolvers,
|
||||
graphiql: true,
|
||||
})
|
||||
)
|
||||
const uri = `mongodb+srv://admin:hEbAjhvkrFDHAP3@cluster0.0hjtt.mongodb.net/Calendar?retryWrites=true&w=majority`
|
||||
const options = { useNewUrlParser: true, useUnifiedTopology: true }
|
||||
let db = mongoose
|
||||
.connect(uri, options)
|
||||
.then(() => app.listen(4000, console.log("Server is running")))
|
||||
.catch(error => {
|
||||
throw error
|
||||
})
|
||||
|
||||
// const app = new Express();
|
||||
// app.use(Cors());
|
||||
dotenv.config();
|
||||
|
||||
// const mongo = new MongoClient({
|
||||
// errorFormat: 'minimal'
|
||||
// });
|
||||
const app = express();
|
||||
|
||||
// const mongo = MongoClient.connect("mongodb+srv://admin:hEbAjhvkrFDHAP3@cluster0.0hjtt.mongodb.net/Calendar?retryWrites=true&w=majority", function (err, db) {
|
||||
const server = new ApolloServer({
|
||||
schema,
|
||||
cors: true,
|
||||
playground: process.env.NODE_ENV === 'development' ? true : false,
|
||||
introspection: true,
|
||||
tracing: true,
|
||||
path: '/',
|
||||
});
|
||||
|
||||
// if (err) throw err;
|
||||
// console.log("ALL good");
|
||||
// //Write databse Insert/Update/Query code here..
|
||||
server.applyMiddleware({
|
||||
app,
|
||||
path: '/',
|
||||
cors: true,
|
||||
onHealthCheck: () =>
|
||||
// eslint-disable-next-line no-undef
|
||||
new Promise((resolve, reject) => {
|
||||
if (mongoose.connection.readyState > 0) {
|
||||
resolve();
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
}),
|
||||
});
|
||||
|
||||
// });
|
||||
app.listen({ port: process.env.PORT }, () => {
|
||||
console.log(`🚀 Server listening on port ${process.env.PORT}`);
|
||||
console.log(`😷 Health checks available at ${process.env.HEALTH_ENDPOINT}`);
|
||||
});
|
||||
|
||||
// const dbClient = new MongoClient(
|
||||
// 'mongodb+srv://admin:hEbAjhvkrFDHAP3@cluster0.0hjtt.mongodb.net/Calendar?retryWrites=true&w=majority',
|
||||
// {
|
||||
// useNewUrlParser: true,
|
||||
// useUnifiedTopology: true,
|
||||
// }
|
||||
// )
|
||||
|
||||
// const resolvers = {
|
||||
// Query,
|
||||
// Mutation,
|
||||
// Subscription,
|
||||
// User,
|
||||
// Appointment,
|
||||
// Follow
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// const { ApolloServer, PubSub } = require('apollo-server');
|
||||
// // const { Cors } = require('cors');
|
||||
// // const { Express } = require('express');
|
||||
|
||||
// const express = require("express");
|
||||
// const { graphqlHTTP } = require('express-graphql');
|
||||
// const mongoose = require("mongoose");
|
||||
// const graphqlSchema = require("./graphql/schema/schema")
|
||||
// const appointmentResolvers = require("./graphql/resolvers/appointment")
|
||||
// const userResolvers = require("./graphql/resolvers/user")
|
||||
|
||||
// var MongoClient = require('mongodb', { useUnifiedTopology: true }).MongoClient;
|
||||
// // import { MongoClient } from 'mongodb'
|
||||
// const Query = require('./resolvers/Query');
|
||||
// const Mutation = require('./resolvers/Mutation');
|
||||
// const Subscription = require('./resolvers/Subscription');
|
||||
// const User = require('./resolvers/User');
|
||||
// const Appointment = require('./resolvers/Appointment');
|
||||
// const Follow = require('./resolvers/Follow');
|
||||
// const fs = require('fs');
|
||||
// const path = require('path');
|
||||
// const { getUserId } = require('./utils');
|
||||
|
||||
// const pubsub = new PubSub();
|
||||
|
||||
// const app = express()
|
||||
|
||||
// const graphqlResolvers = {
|
||||
// appointmentResolvers,
|
||||
// userResolvers
|
||||
// };
|
||||
|
||||
// let db;
|
||||
|
||||
// const server = new ApolloServer({
|
||||
// typeDefs: fs.readFileSync(
|
||||
// path.join(__dirname, 'schema.graphql'),
|
||||
// 'utf8'
|
||||
// ),
|
||||
// resolvers,
|
||||
// context: async ({ req }) => {
|
||||
// if (!db) {
|
||||
// try {
|
||||
// if (!dbClient.isConnected()) await dbClient.connect()
|
||||
// mongo = dbClient.db('Calendar') // database name
|
||||
// console.log(db);
|
||||
// } catch (e) {
|
||||
// console.log('--->error while connecting with graphql context (db)', e)
|
||||
// }
|
||||
// }
|
||||
// app.use(
|
||||
// "/graphql",
|
||||
// graphqlHTTP({
|
||||
// schema: graphqlSchema,
|
||||
// rootValue: appointmentResolvers,
|
||||
// graphiql: true,
|
||||
// })
|
||||
// )
|
||||
// const uri = `mongodb+srv://admin:hEbAjhvkrFDHAP3@cluster0.0hjtt.mongodb.net/Calendar?retryWrites=true&w=majority`
|
||||
// const options = { useNewUrlParser: true, useUnifiedTopology: true }
|
||||
// let db = mongoose
|
||||
// .connect(uri, options)
|
||||
// .then(() => app.listen(4000, console.log("Server is running")))
|
||||
// .catch(error => {
|
||||
// throw error
|
||||
// })
|
||||
|
||||
// return {
|
||||
// ...req,
|
||||
// mongo,
|
||||
// pubsub,
|
||||
// userId:
|
||||
// req && req.headers.authorization
|
||||
// ? getUserId(req)
|
||||
// : null
|
||||
// }
|
||||
// },
|
||||
// // context: ({ req }) => {
|
||||
// // return {
|
||||
// // ...req,
|
||||
// // mongo,
|
||||
// // pubsub,
|
||||
// // userId:
|
||||
// // req && req.headers.authorization
|
||||
// // ? getUserId(req)
|
||||
// // : null
|
||||
// // };
|
||||
// // },
|
||||
// // subscriptions: {
|
||||
// // onConnect: (connectionParams) => {
|
||||
// // if (connectionParams.authToken) {
|
||||
// // return {
|
||||
// // mongo,
|
||||
// // userId: getUserId(
|
||||
// // null,
|
||||
// // connectionParams.authToken
|
||||
// // )
|
||||
// // };
|
||||
// // } else {
|
||||
// // return {
|
||||
// // mongo
|
||||
// // };
|
||||
// // }
|
||||
// // }
|
||||
// // }
|
||||
// });
|
||||
// // const app = new Express();
|
||||
// // app.use(Cors());
|
||||
|
||||
// // server.applyMiddleware({ app });
|
||||
// // const mongo = new MongoClient({
|
||||
// // errorFormat: 'minimal'
|
||||
// // });
|
||||
|
||||
// server
|
||||
// .listen()
|
||||
// .then(({ url }) =>
|
||||
// console.log(`Server is running on ${url}`)
|
||||
// );
|
||||
// // const mongo = MongoClient.connect("mongodb+srv://admin:hEbAjhvkrFDHAP3@cluster0.0hjtt.mongodb.net/Calendar?retryWrites=true&w=majority", function (err, db) {
|
||||
|
||||
// // if (err) throw err;
|
||||
// // console.log("ALL good");
|
||||
// // //Write databse Insert/Update/Query code here..
|
||||
|
||||
// // });
|
||||
|
||||
// // const dbClient = new MongoClient(
|
||||
// // 'mongodb+srv://admin:hEbAjhvkrFDHAP3@cluster0.0hjtt.mongodb.net/Calendar?retryWrites=true&w=majority',
|
||||
// // {
|
||||
// // useNewUrlParser: true,
|
||||
// // useUnifiedTopology: true,
|
||||
// // }
|
||||
// // )
|
||||
|
||||
// // const resolvers = {
|
||||
// // Query,
|
||||
// // Mutation,
|
||||
// // Subscription,
|
||||
// // User,
|
||||
// // Appointment,
|
||||
// // Follow
|
||||
// // };
|
||||
|
||||
// // let db;
|
||||
|
||||
// // const server = new ApolloServer({
|
||||
// // typeDefs: fs.readFileSync(
|
||||
// // path.join(__dirname, 'schema.graphql'),
|
||||
// // 'utf8'
|
||||
// // ),
|
||||
// // resolvers,
|
||||
// // context: async ({ req }) => {
|
||||
// // if (!db) {
|
||||
// // try {
|
||||
// // if (!dbClient.isConnected()) await dbClient.connect()
|
||||
// // mongo = dbClient.db('Calendar') // database name
|
||||
// // console.log(db);
|
||||
// // } catch (e) {
|
||||
// // console.log('--->error while connecting with graphql context (db)', e)
|
||||
// // }
|
||||
// // }
|
||||
|
||||
// // return {
|
||||
// // ...req,
|
||||
// // mongo,
|
||||
// // pubsub,
|
||||
// // userId:
|
||||
// // req && req.headers.authorization
|
||||
// // ? getUserId(req)
|
||||
// // : null
|
||||
// // }
|
||||
// // },
|
||||
// // // context: ({ req }) => {
|
||||
// // // return {
|
||||
// // // ...req,
|
||||
// // // mongo,
|
||||
// // // pubsub,
|
||||
// // // userId:
|
||||
// // // req && req.headers.authorization
|
||||
// // // ? getUserId(req)
|
||||
// // // : null
|
||||
// // // };
|
||||
// // // },
|
||||
// // // subscriptions: {
|
||||
// // // onConnect: (connectionParams) => {
|
||||
// // // if (connectionParams.authToken) {
|
||||
// // // return {
|
||||
// // // mongo,
|
||||
// // // userId: getUserId(
|
||||
// // // null,
|
||||
// // // connectionParams.authToken
|
||||
// // // )
|
||||
// // // };
|
||||
// // // } else {
|
||||
// // // return {
|
||||
// // // mongo
|
||||
// // // };
|
||||
// // // }
|
||||
// // // }
|
||||
// // // }
|
||||
// // });
|
||||
|
||||
// // // server.applyMiddleware({ app });
|
||||
|
||||
// // server
|
||||
// // .listen()
|
||||
// // .then(({ url }) =>
|
||||
// // console.log(`Server is running on ${url}`)
|
||||
// // );
|
||||
|
||||
34
server/src/models/task.js
Normal file
34
server/src/models/task.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import mongoose from 'mongoose';
|
||||
const { Schema } = mongoose;
|
||||
import timestamps from 'mongoose-timestamp';
|
||||
import { composeWithMongoose } from 'graphql-compose-mongoose';
|
||||
|
||||
export const TaskSchema = new Schema(
|
||||
{
|
||||
user: {
|
||||
type: Schema.Types.ObjectId,
|
||||
ref: 'User',
|
||||
required: true,
|
||||
},
|
||||
task: {
|
||||
type: String,
|
||||
trim: true,
|
||||
required: true,
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
trim: true,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
collection: 'tasks',
|
||||
}
|
||||
);
|
||||
|
||||
TaskSchema.plugin(timestamps);
|
||||
|
||||
TaskSchema.index({ createdAt: 1, updatedAt: 1 });
|
||||
|
||||
export const Task = mongoose.model('Task', TaskSchema);
|
||||
export const TaskTC = composeWithMongoose(Task);
|
||||
31
server/src/models/user.js
Normal file
31
server/src/models/user.js
Normal file
@@ -0,0 +1,31 @@
|
||||
import mongoose from 'mongoose';
|
||||
const { Schema } = mongoose
|
||||
import timestamps from 'mongoose-timestamp';
|
||||
import { composeWithMongoose } from 'graphql-compose-mongoose';
|
||||
|
||||
export const UserSchema = new Schema(
|
||||
{
|
||||
name: {
|
||||
type: String,
|
||||
trim: true,
|
||||
required: true,
|
||||
},
|
||||
email: {
|
||||
type: String,
|
||||
lowercase: true,
|
||||
trim: true,
|
||||
unique: true,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
collection: 'users',
|
||||
}
|
||||
);
|
||||
|
||||
UserSchema.plugin(timestamps);
|
||||
|
||||
UserSchema.index({ createdAt: 1, updatedAt: 1 });
|
||||
|
||||
export const User = mongoose.model('User', UserSchema);
|
||||
export const UserTC = composeWithMongoose(User);
|
||||
@@ -8,7 +8,7 @@ async function feed(parent, args, context, info) {
|
||||
]
|
||||
}
|
||||
: {};
|
||||
|
||||
console.log(context.mongo);
|
||||
const appointments = await context.mongo.appointment.findMany({
|
||||
where,
|
||||
skip: args.skip,
|
||||
|
||||
20
server/src/schema/index.js
Normal file
20
server/src/schema/index.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import { SchemaComposer } from 'graphql-compose';
|
||||
|
||||
import db from '../utils/db.js';
|
||||
|
||||
const schemaComposer = new SchemaComposer();
|
||||
|
||||
import { UserQuery, UserMutation } from './user.js';
|
||||
import { TaskQuery, TaskMutation } from './task.js';
|
||||
|
||||
schemaComposer.Query.addFields({
|
||||
...UserQuery,
|
||||
...TaskQuery,
|
||||
});
|
||||
|
||||
schemaComposer.Mutation.addFields({
|
||||
...UserMutation,
|
||||
...TaskMutation,
|
||||
});
|
||||
|
||||
export default schemaComposer.buildSchema();
|
||||
24
server/src/schema/task.js
Normal file
24
server/src/schema/task.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import { Task, TaskTC } from '../models/task.js';
|
||||
|
||||
const TaskQuery = {
|
||||
taskById: TaskTC.getResolver('findById'),
|
||||
taskByIds: TaskTC.getResolver('findByIds'),
|
||||
taskOne: TaskTC.getResolver('findOne'),
|
||||
taskMany: TaskTC.getResolver('findMany'),
|
||||
taskCount: TaskTC.getResolver('count'),
|
||||
taskConnection: TaskTC.getResolver('connection'),
|
||||
taskPagination: TaskTC.getResolver('pagination'),
|
||||
};
|
||||
|
||||
const TaskMutation = {
|
||||
taskCreateOne: TaskTC.getResolver('createOne'),
|
||||
taskCreateMany: TaskTC.getResolver('createMany'),
|
||||
taskUpdateById: TaskTC.getResolver('updateById'),
|
||||
taskUpdateOne: TaskTC.getResolver('updateOne'),
|
||||
taskUpdateMany: TaskTC.getResolver('updateMany'),
|
||||
taskRemoveById: TaskTC.getResolver('removeById'),
|
||||
taskRemoveOne: TaskTC.getResolver('removeOne'),
|
||||
taskRemoveMany: TaskTC.getResolver('removeMany'),
|
||||
};
|
||||
|
||||
export { TaskQuery, TaskMutation };
|
||||
24
server/src/schema/user.js
Normal file
24
server/src/schema/user.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import { User, UserTC } from '../models/user.js';
|
||||
|
||||
const UserQuery = {
|
||||
userById: UserTC.getResolver('findById'),
|
||||
userByIds: UserTC.getResolver('findByIds'),
|
||||
userOne: UserTC.getResolver('findOne'),
|
||||
userMany: UserTC.getResolver('findMany'),
|
||||
userCount: UserTC.getResolver('count'),
|
||||
userConnection: UserTC.getResolver('connection'),
|
||||
userPagination: UserTC.getResolver('pagination'),
|
||||
};
|
||||
|
||||
const UserMutation = {
|
||||
userCreateOne: UserTC.getResolver('createOne'),
|
||||
userCreateMany: UserTC.getResolver('createMany'),
|
||||
userUpdateById: UserTC.getResolver('updateById'),
|
||||
userUpdateOne: UserTC.getResolver('updateOne'),
|
||||
userUpdateMany: UserTC.getResolver('updateMany'),
|
||||
userRemoveById: UserTC.getResolver('removeById'),
|
||||
userRemoveOne: UserTC.getResolver('removeOne'),
|
||||
userRemoveMany: UserTC.getResolver('removeMany'),
|
||||
};
|
||||
|
||||
export { UserQuery, UserMutation };
|
||||
31
server/src/scripts/buildSchema.js
Normal file
31
server/src/scripts/buildSchema.js
Normal file
@@ -0,0 +1,31 @@
|
||||
import fs from 'fs-extra';
|
||||
import path from 'path';
|
||||
import { graphql } from 'graphql';
|
||||
import { introspectionQuery, printSchema } from 'graphql/utilities';
|
||||
|
||||
import Schema from '../schema';
|
||||
|
||||
async function buildSchema() {
|
||||
await fs.ensureFile('../data/schema.graphql.json');
|
||||
await fs.ensureFile('../data/schema.graphql');
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(__dirname, '../data/schema.graphql.json'),
|
||||
JSON.stringify(await graphql(Schema, introspectionQuery), null, 2)
|
||||
);
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(__dirname, '../data/schema.graphql.txt'),
|
||||
printSchema(Schema)
|
||||
);
|
||||
}
|
||||
|
||||
async function run() {
|
||||
await buildSchema();
|
||||
console.log('Schema build complete!');
|
||||
}
|
||||
|
||||
run().catch(e => {
|
||||
console.log(e);
|
||||
process.exit(0);
|
||||
});
|
||||
29
server/src/utils/db.js
Normal file
29
server/src/utils/db.js
Normal file
@@ -0,0 +1,29 @@
|
||||
// const mongoose = require("mongoose");
|
||||
import mongoose from 'mongoose';
|
||||
|
||||
// const dotenv = require("../../.env");
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
mongoose.Promise = global.Promise;
|
||||
|
||||
const connection = mongoose.connect(process.env.MONGODB_URI, {
|
||||
autoIndex: true,
|
||||
reconnectTries: Number.MAX_VALUE,
|
||||
reconnectInterval: 500,
|
||||
poolSize: 50,
|
||||
bufferMaxEntries: 0,
|
||||
keepAlive: 120,
|
||||
useNewUrlParser: true,
|
||||
});
|
||||
|
||||
mongoose.set('useCreateIndex', true);
|
||||
|
||||
connection
|
||||
.then(db => db)
|
||||
.catch(err => {
|
||||
console.log(err);
|
||||
});
|
||||
|
||||
export default connection;
|
||||
Reference in New Issue
Block a user