Skip to content

Commit 604774c

Browse files
committed
Added Data Loader Packages
0 parents  commit 604774c

File tree

7,302 files changed

+653988
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

7,302 files changed

+653988
-0
lines changed

.env

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
PORT=3001
2+
MONGO_DB_URL = mongodb://localhost/mydb
3+
JWT_SECRET_KEY = test@1234

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"deno.enable": false
3+
}

Resolvers/index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
const {GraphQLDateTime} = require('graphql-iso-date')
3+
const userResolver = require('./user')
4+
const taskResolver = require('./task')
5+
6+
7+
const customDateScalarResolver = {
8+
Date: GraphQLDateTime
9+
10+
}
11+
module.exports = [
12+
userResolver,
13+
taskResolver,
14+
customDateScalarResolver
15+
];

Resolvers/middleware/index.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
const {skip} = require('graphql-resolvers')
3+
const Task = require('../../database/Models/task')
4+
const {isValidObjectId} = require('../../database/util')
5+
module.exports.isAuthenticated = (_, __, {email}) => {
6+
if(!email) {
7+
throw new Error('Access Denied!Please login to continue')
8+
}
9+
return skip
10+
}
11+
12+
module.exports.isTaskOwner = async (_,{ id }, {loggedInUserId}) => {
13+
try {
14+
if(!isValidObjectId(id)){
15+
throw new Error('Invalid Task id')
16+
}
17+
const task = await Task.findById(id)
18+
if (!task){
19+
throw new Error('Task not found')
20+
}else if (task.user.toString() !== loggedInUserId){
21+
throw new Error('Not authorized as task owner')
22+
}
23+
return skip
24+
} catch (error) {
25+
console.log(error)
26+
throw error
27+
}
28+
29+
}

Resolvers/task.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
2+
const {combineResolvers} = require('graphql-resolvers')
3+
4+
const {stringToBase64, base64ToString } = require('../helper')
5+
const Task = require('../database/Models/task')
6+
const User = require('../database/Models/user')
7+
const { isAuthenticated, isTaskOwner} = require('./middleware')
8+
const task = require('../typeDefs/task')
9+
10+
module.exports = {
11+
Query: {
12+
tasks:combineResolvers(isAuthenticated,async (_,{ cursor,limit=10 },{loggedInUserId}) => {
13+
try {
14+
const query = { user: loggedInUserId}
15+
if(cursor){
16+
query['_id'] = {
17+
'$lt': base64ToString(cursor)
18+
}
19+
}
20+
let tasks = await Task.find(query).sort({_id: -1}).limit(limit + 1)
21+
const hasNextPage = tasks.length > limit
22+
tasks = hasNextPage ? tasks.slice(0, -1) : tasks
23+
return {
24+
25+
taskFeed: tasks,
26+
pageInfo: {
27+
nextPageCursor: hasNextPage ? stringToBase64(tasks[tasks.length - 1].id) : null,
28+
hasNextPage
29+
}
30+
31+
}
32+
} catch (error) {
33+
console.log(error)
34+
throw error
35+
}
36+
37+
}),
38+
task:combineResolvers(isAuthenticated,isTaskOwner, async(_, { id }) => {
39+
try {
40+
const task = await Task.findById(id)
41+
return task
42+
} catch (error) {
43+
console.log(error)
44+
throw error
45+
46+
}
47+
48+
}) ,
49+
},
50+
Mutation: {
51+
createTask: combineResolvers(isAuthenticated,async(_, { input }, {email}) => {
52+
try {
53+
const user = await User.findOne({email})
54+
const task = new Task({...input, user:user.id})
55+
const result = await task.save();
56+
user.tasks.push(result.id)
57+
await user.save();
58+
return result
59+
} catch (error) {
60+
61+
}
62+
63+
}),
64+
updateTask: combineResolvers(isAuthenticated, isTaskOwner, async (_, {id, input})=>{
65+
66+
try {
67+
const task = await Task.findByIdAndUpdate(id, {...input},{new: true})
68+
return task
69+
} catch (error) {
70+
console.log(error)
71+
throw error
72+
}
73+
74+
75+
76+
}),
77+
deleteTask: combineResolvers(isAuthenticated,isTaskOwner,async (_,{id},{loggedInUserId}) =>{
78+
79+
try {
80+
const task = await Task.findByIdAndDelete(id)
81+
await User.updateOne({_id: loggedInUserId },{$pull: {tasks: task.id}})
82+
return task;
83+
} catch (error) {
84+
console.log(error)
85+
throw error
86+
}
87+
88+
89+
90+
})
91+
92+
93+
},
94+
Task: {
95+
user: async(parent) => {
96+
try {
97+
const user = await User.findById(parent.user)
98+
return user
99+
} catch (error) {
100+
console.log(error)
101+
throw error
102+
103+
}
104+
105+
}
106+
}
107+
}

Resolvers/user.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
const bcrypt = require('bcryptjs')
2+
const jwt = require('jsonwebtoken')
3+
const {combineResolvers} = require('graphql-resolvers')
4+
5+
const User = require('../database/Models/user')
6+
const Task = require('../database/Models/task')
7+
const {isAuthenticated} = require('./middleware')
8+
const PubSub = require('../subscription')
9+
const {userEvents} = require('../subscription/events')
10+
11+
module.exports = {
12+
Query: {
13+
14+
user: combineResolvers(isAuthenticated, async (_,__, {email}) =>{
15+
try {
16+
const user = await User.findOne({ email })
17+
if(!user){
18+
throw new Error('User not found!')
19+
}
20+
return user
21+
} catch (error) {
22+
23+
console.log(error)
24+
throw error
25+
26+
}
27+
28+
})
29+
},
30+
Mutation: {
31+
signup: async (_, {input }) => {
32+
try{
33+
34+
const user = await User.findOne({ email: input.email })
35+
if (user) {
36+
throw new Error('Email already in use')
37+
}
38+
39+
const hashedPassword = await bcrypt.hash(input.password, 12)
40+
const newUser = new User({...input, password: hashedPassword })
41+
const result = await newUser.save()
42+
PubSub.publish(userEvents.USER_CREATED,{
43+
userCreated: result
44+
})
45+
console.log(result.id, typeof result.id)//result.id virtual getter type string
46+
console.log(result._id, typeof result._id)//underscore id type object
47+
return result
48+
49+
}catch(error){
50+
51+
console.log(error)
52+
throw error
53+
54+
55+
}
56+
57+
58+
} ,
59+
60+
login:async (_,{input}) => {
61+
try {
62+
63+
const user = await User.findOne({email: input.email})
64+
if(!user){
65+
throw new Error('User not found')
66+
}
67+
const isPasswordValid = await bcrypt.compare(input.password,user.password)
68+
if(!isPasswordValid){
69+
throw new Error('Incorrect Password')
70+
}
71+
const secret = process.env.JWT_SECRET_KEY || 'mysecretkey'
72+
const token = jwt.sign({email: user.email},secret,{expiresIn: '1d'} )
73+
return {token}
74+
75+
} catch (error) {
76+
77+
console.log(error)
78+
throw error
79+
80+
}
81+
82+
}
83+
84+
85+
},
86+
Subscription: {
87+
userCreated: {
88+
subscribe: () => PubSub.asyncIterator(userEvents.USER_CREATED)
89+
}
90+
},
91+
User: {
92+
tasks: async ({ id }) => {
93+
try {
94+
const tasks = await Task.find({ user: id})
95+
return tasks
96+
} catch (error) {
97+
console.log(error)
98+
throw error
99+
}
100+
101+
102+
103+
}
104+
105+
}
106+
}

database/Models/task.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const mongoose = require('mongoose');
2+
3+
const taskSchema = new mongoose.Schema({
4+
name: {
5+
type: String,
6+
required: true
7+
},
8+
completed: {
9+
type: Boolean,
10+
required: true
11+
},
12+
user: {
13+
type: mongoose.Schema.Types.ObjectId,
14+
ref: 'User'
15+
}
16+
}, {
17+
timestamps: true
18+
});
19+
20+
module.exports = mongoose.model('Task', taskSchema);

database/Models/user.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const mongoose = require('mongoose')
2+
3+
const userSchema = new mongoose.Schema({
4+
name: {
5+
type: String,
6+
required: true
7+
},
8+
email: {
9+
type: String,
10+
required: true
11+
},
12+
password: {
13+
type: String,
14+
required: true
15+
},
16+
tasks: [
17+
{type: mongoose.Schema.Types.ObjectId,
18+
ref: 'Task'}
19+
]
20+
}, {
21+
timestamps: true
22+
})
23+
24+
module.exports = mongoose.model('User', userSchema)

database/util/index.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const mongoose = require('mongoose')
2+
3+
module.exports.connection = async () => {
4+
5+
try {
6+
7+
8+
9+
await mongoose.connect(process.env.MONGO_DB_URL, { useNewUrlParser: true, useUnifiedTopology: true})
10+
console.log('Database Connected Successfully')
11+
12+
}catch(error){
13+
14+
console.log(error)
15+
throw error
16+
17+
18+
}
19+
20+
}
21+
22+
module.exports.isValidObjectId = (id) =>
23+
{
24+
return mongoose.Types.ObjectId.isValid(id)
25+
}
26+

helper/context/index.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const jwt = require('jsonwebtoken')
2+
const User = require('../../database/Models/user')
3+
module.exports.verifyUser =async (req) => {
4+
try {
5+
req.email = null
6+
req.loggedInUserId = null
7+
8+
const bearerHeader = req.headers.authorization
9+
if (bearerHeader){
10+
const token = bearerHeader.split(' ')[1]
11+
const payload = jwt.verify(token, process.env.JWT_SECRET_KEY || 'mysecretkey')
12+
req.email = payload.email
13+
const user = await User.findOne({email: payload.email})
14+
req.loggedInUserId = user.id
15+
}
16+
17+
} catch (error) {
18+
console.log(error)
19+
throw error
20+
21+
}
22+
23+
24+
}

0 commit comments

Comments
 (0)