Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"presets": ["es2016", "env"],
"plugins": ["transform-object-rest-spread"]
}
24 changes: 24 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"plugins": [
"node"
],
"extends": [
"eslint:recommended",
"plugin:node/recommended"
],
"rules": {
"node/exports-style": [
"error",
"module.exports"
],
"no-console": [
"error",
{
"allow": [
"clear"
]
}
],
"no-undef": 0
}
}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,6 @@ typings/

# next.js build output
.next

Logs/
.idea/
68 changes: 68 additions & 0 deletions Libs/logger.lib.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/* eslint-disable no-console */

// const _ = require('lodash')
// const moment = require('moment')
const loggerLib = require('tracer');
const colors = require('colors');

const path = require('path');
const appDir = path.dirname(require.main.filename);

const fileLogger = loggerLib.dailyfile({
format: '[{{timestamp}}]: <{{title}}> {{message}}',
dateformat: 'dd-mm-yy HH:MM',
root: path.join(appDir, 'Logs'),
// maxLogFiles: 10
});

const consoleLogger = loggerLib.colorConsole({
format: '[{{timestamp}}]: <{{title}}> {{message}}',
dateformat: 'dd-mm-yy HH:MM',
methods: ['event', 'trace', 'debug', 'info', 'warn', 'error'],
filters: {
//log : colors.black,
event: colors.green,
trace: colors.magenta,
debug: colors.white,
info: colors.blue,
warn: colors.yellow,
error: [colors.red, colors.bold],
},
});

const logger = {};

logger.info = (...args) => {
consoleLogger.info(...args);
fileLogger.info(...args);
};

logger.warn = (...args) => {
consoleLogger.warn(...args);
fileLogger.warn(...args);
};

logger.error = (...args) => {
consoleLogger.error(...args);
fileLogger.error(...args);
};

logger.debug = (...args) => {
consoleLogger.debug(...args);
fileLogger.debug(...args);
};

logger.event = (...args) => {
consoleLogger.event(...args);
fileLogger.log(...args);
};

logger.logStart = () => {
console.group();
};

logger.logEnd = () => {
console.groupEnd();
};

global.logger = logger;
3 changes: 3 additions & 0 deletions Models/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import ToDoList from './toDoList'

export { ToDoList }
11 changes: 11 additions & 0 deletions Models/toDoList.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import mongoose, { Schema } from 'mongoose'

const todoSchema = new Schema({
description: { type: String, required: true },
completed: Boolean,
priority: Number
}, {
timestamps: true
})

export default mongoose.model('ToDoList', todoSchema)
3 changes: 3 additions & 0 deletions Resolvers/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import toDoList from './toDoList'

export default [toDoList]
97 changes: 97 additions & 0 deletions Resolvers/toDoList.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { ToDoList } from '../Models'

const sortByFields = {
description: true,
createdAt: true,
priority: true
}
const sortOrders = ['asc', 'desc', 'ascending', 'descending']

export default {
Query: {
todoList: async (
_,
{ sortBy = 'createdAt', order = sortOrders[1], completed = false }
) => {
try {
const sortQuery = {}
// deciding if we should sort and what is the order
if (sortBy && sortByFields[sortBy]) {
sortQuery[sortBy] = sortOrders.includes(order) ? order : sortOrders[1]
}

const todoList = await ToDoList
.find({
completed
})
.sort(sortQuery)
.lean(true).exec()
return todoList
} catch (e) {
logger.error(e)
return []
}
},
oneTodo: async (_, { id }, { models }) => {
try {
const todo = await ToDoList.findById(id).lean(true).exec()
return todo
} catch (e) {
logger.error(e)
return {}
}
}
},

Mutation: {
createTodo: async (
_,
{ description, completed, priority = 1 },
{ models }
) => {
try {
const todo = new ToDoList({
description,
completed: completed || false,
priority
})
const newTodo = await todo.save()
return newTodo
} catch (e) {
logger.error('Error', e)
throw e
}
},
updateTodo: async (_, { id, ...data }) => {
try {
const { priority } = data
if (priority === 0 || (priority && priority < 1)) throw new Error('priority must be 1 or greater')

const updatedTodo = await ToDoList.findOneAndUpdate({ _id: id }, data, { new: true }).exec()
return updatedTodo
} catch (e) {
logger.error('Error', e)
throw e
}
},
markTodoAsCompleted: async (_, { id }) => {
try {
const updatedTodo = await ToDoList.findOneAndUpdate({ _id: id }, { completed: true }, { new: true }).exec()
return updatedTodo
} catch (e) {
logger.error('Error', e)
throw e
}
},
deleteTodo: async (_, { id }) => {
try {
const deletedData = await ToDoList.deleteOne({ _id: id }).exec()
logger.info('deletedData', deletedData)
return { _id: id }
} catch (e) {
logger.error('Error', e)
throw e
}
},
},
}
3 changes: 3 additions & 0 deletions Schemas/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import toDoList from './toDoList'

export default [toDoList]
33 changes: 33 additions & 0 deletions Schemas/toDoList.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { gql } from 'apollo-server-express'

export default gql`
type Status {
_id: String!
}

type Todo {
_id: ID!
description: String!
createdAt: Date
completed: Boolean
priority: Int!
}
scalar Date
type Query {
"This is a query that fetch and returns array of todos. can be sorted by 'description', 'createdAt' and 'priority' and filtered by 'completed' field"
todoList(completed: Boolean, sortBy: String, order: String): [Todo!]
"This is a query to fetch and return the Todo based on 'id' argument"
oneTodo(id: ID!): Todo
}

type Mutation {
"This is a mutatuion that create and return todo"
createTodo(description: String!, completed: Boolean, priority: Int): Todo
"This is a mutation that update and return the existing todo based on 'id' argument"
updateTodo(id: String!, description: String, priority: Int): Todo
"This is a mutation to mark existing Todo as completed based on 'id' argument"
markTodoAsCompleted(id: String!): Todo
"This is a mutation that delete existing Todo and return 'id' of deleted todo based on 'id' argument"
deleteTodo(id: String!): Status
}
`
4 changes: 4 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
require('babel-register')
require('babel-polyfill')
require('dotenv').config()
require('./server.js')
Loading