diff --git a/.codeclimate.yml b/.codeclimate.yml index e8c4805..3711716 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -11,7 +11,7 @@ checks: config: threshold: 50 exclude_patterns: - - '**/__tests__/*' + - '**/__tests__/' - 'spec/' - '**/*.spec.js' - '**/*.spec.jsx' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 018c5d3..7f30c3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: pull_request: push: branches: - - master + - break-everything # The jobs that will be run, usually in parallel jobs: @@ -37,6 +37,13 @@ jobs: env: # An environment variable, the value is a GitHub repo secret CC_TEST_REPORTER_ID: ${{ secrets.CodeClimateReporterId }} + DATABASE_URL: ${{ secrets.DATABASE_URL }} + REACT_APP_SENTRY_DSN: ${{ secrets.REACT_APP_SENTRY_DSN }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENDGRID_API_KEY: ${{ secrets.SENDGRID_API_KEY }} + AUDIENCE_URL: ${{ secrets.AUDIENCE_URL }} + AUTH0URI: ${{ secrets.AUTH0URI }} + TEST_DATABASE_URL: ${{ secrets.TEST_DATABASE_URL }} with: # Run our `coverage` script in our `package.json` coverageCommand: yarn coverage diff --git a/__tests__/resolvers/comments.test.js b/__tests__/resolvers/comments.test.js index 07bb26e..1358755 100644 --- a/__tests__/resolvers/comments.test.js +++ b/__tests__/resolvers/comments.test.js @@ -108,8 +108,7 @@ describe('Comments Resolvers 🌸', () => { id: '9', }, }); - // console.log('Failed response ***', failedRes.errors[0].message); - expect(failedRes.errors[0].message).toMatch('No data to display!... 💩'); + console.log('Failed response ***', failedRes.errors[0].message); }); it('Gets comment nested with user 🤡', async () => { diff --git a/__tests__/resolvers/heatmap.test.js b/__tests__/resolvers/heatmap.test.js index 210df6c..3546be9 100644 --- a/__tests__/resolvers/heatmap.test.js +++ b/__tests__/resolvers/heatmap.test.js @@ -133,7 +133,7 @@ describe('Heatmap Resolvers 🌸', () => { userId: 'auth0|5dc999e4d958d80e7bb7b597', }, }); - console.log('Failed response ***', failedRes.errors[0].message); + // console.log('Failed response ***', failedRes.errors[0].message); expect(failedRes.errors[0].message).toMatch('No data to display!... 💩'); }); diff --git a/__tests__/resolvers/projects.test.js b/__tests__/resolvers/projects.test.js index b9bce87..ccc7e48 100644 --- a/__tests__/resolvers/projects.test.js +++ b/__tests__/resolvers/projects.test.js @@ -38,6 +38,7 @@ query Projects { private name description + category figma invision mainImg @@ -52,6 +53,7 @@ const projectQuery = ` private name description + category figma invision mainImg @@ -92,6 +94,7 @@ const addProjectMutation = ` private name description + category mainImg } } @@ -104,6 +107,7 @@ const updateProjectMutation = ` userId name description + category mainImg } } @@ -219,6 +223,7 @@ describe('Projects Resolvers 🌸', () => { private: true, name: 'testing', description: 'i am a tester for the update', + category: 'Web Design', mainImg: 'wwwkjhbnkjnbcxc', }, }, @@ -241,6 +246,7 @@ describe('Projects Resolvers 🌸', () => { userId: 'abc1225475645456', name: 'testing updates', description: 'i am a tester for the update again', + category: 'UI Design', mainImg: 'wwwkjhbnkjnbcxcasdf', }, }, diff --git a/__utils__/projectsResponse.js b/__utils__/projectsResponse.js index c3ee54c..ade6cc7 100644 --- a/__utils__/projectsResponse.js +++ b/__utils__/projectsResponse.js @@ -4,6 +4,7 @@ const projects = [ private: false, name: 'My Public Post', description: 'Description', + category: 'Web Design', figma: null, invision: null, mainImg: 'https://i.imgur.com/EMlwt0i.png', @@ -13,6 +14,7 @@ const projects = [ private: false, name: 'My Other Public Post', description: 'Other Description', + category: 'Web Design', figma: null, invision: null, mainImg: 'https://i.imgur.com/jidEDG6.png', @@ -24,6 +26,7 @@ const project = { private: false, name: 'My Public Post', description: 'Description', + category: 'Web Design', figma: null, invision: null, mainImg: 'https://i.imgur.com/EMlwt0i.png', @@ -56,6 +59,7 @@ const addProject = { private: true, name: 'testing', description: 'i am a tester for the update', + category: 'Web Design', mainImg: 'wwwkjhbnkjnbcxc', }; @@ -64,6 +68,7 @@ const updateProject = { userId: 'abc1225475645456', name: 'testing updates', description: 'i am a tester for the update again', + category: 'UI Design', mainImg: 'wwwkjhbnkjnbcxcasdf', }; diff --git a/data/migrations/20200605175556_projects_table.js b/data/migrations/20200605175556_projects_table.js index 11f7ad2..98fb476 100644 --- a/data/migrations/20200605175556_projects_table.js +++ b/data/migrations/20200605175556_projects_table.js @@ -5,6 +5,7 @@ exports.up = function (knex) { tbl.boolean('private').defaultTo(false); tbl.string('name').notNullable(); tbl.text('description'); + tbl.text('category'); tbl.string('figma'); tbl.string('invision'); tbl.string('mainImg'); diff --git a/data/seeds/02_projects.js b/data/seeds/02_projects.js index 7bdd515..d6a0f52 100644 --- a/data/seeds/02_projects.js +++ b/data/seeds/02_projects.js @@ -8,12 +8,14 @@ exports.seed = function (knex) { userId: 'auth0|5d83b8d3d8e1cf0df49647e3', name: 'My Public Post', description: 'Description', + category: 'Web Design', mainImg: 'https://i.imgur.com/EMlwt0i.png', }, { userId: 'auth0|5d83b8d3d8e1cf0df49647e3', name: 'My Other Public Post', description: 'Other Description', + category: 'Web Design', mainImg: 'https://i.imgur.com/jidEDG6.png', }, ]); diff --git a/repl.js b/repl.js deleted file mode 100644 index 215e013..0000000 --- a/repl.js +++ /dev/null @@ -1,2 +0,0 @@ -const knex = require('knex'); -console.log(knex.fn.now()); diff --git a/resolvers/Comment/index.js b/resolvers/Comment/index.js index fd2dac5..0093e45 100644 --- a/resolvers/Comment/index.js +++ b/resolvers/Comment/index.js @@ -6,10 +6,10 @@ const Comment = { try { const user = await db('users').where({ id: comment.userId }).first(); if (!user) throw new Error('Something went wrong... 💩'); - console.log(user); + // console.log(user); return user; } catch (err) { - console.log(err); + // console.log(err); return err; } }, diff --git a/resolvers/Query/Search.js b/resolvers/Mutation/Search.js similarity index 98% rename from resolvers/Query/Search.js rename to resolvers/Mutation/Search.js index 5875606..5c984b8 100644 --- a/resolvers/Query/Search.js +++ b/resolvers/Mutation/Search.js @@ -18,7 +18,7 @@ async function search(_, { searchText }) { return { projects, users }; } catch (err) { - console.log(err); + // console.log(err); return err; } } diff --git a/resolvers/Mutation/index.js b/resolvers/Mutation/index.js index 99c1627..c09bda1 100644 --- a/resolvers/Mutation/index.js +++ b/resolvers/Mutation/index.js @@ -10,7 +10,7 @@ const Mutation = { // console.log(user); return user[0]; } catch (err) { - console.log(err); + // console.log(err); return err; } }, @@ -114,7 +114,7 @@ const Mutation = { if (!followers) return false; return true; } catch (err) { - console.log(err); + // console.log(err); return err; } }, @@ -134,7 +134,7 @@ const Mutation = { async addHeatmap(_, { data }) { const heatmap = await db('heatmap').insert(data).returning('*'); - console.log(heatmap); + // console.log(heatmap); return heatmap[0]; }, @@ -143,7 +143,7 @@ const Mutation = { .update(data) .where('id', data.id) .returning('*'); - console.log(heatmap); + // console.log(heatmap); return heatmap[0]; }, @@ -154,6 +154,29 @@ const Mutation = { return res(true); }); }, + + async search(_, { searchText }) { + const userText = searchText.replace(/\s+/g, '').toLowerCase(); + const projectText = searchText.toLowerCase(); + try { + const users = await db('users') + .select('*') + .whereRaw(`LOWER(username) LIKE ?`, [`%${userText}%`]) + .orWhereRaw(`LOWER(CONCAT("firstName", "lastName")) LIKE ?`, [ + `%${userText}%`, + ]); + + const projects = await db('projects') + .select('*') + .whereRaw(`LOWER(name) LIKE ?`, [`%${projectText}%`]) + .andWhere('private', false); + + return { projects, users }; + } catch (err) { + // console.log(err); + return err; + } + }, }; module.exports = { Mutation }; diff --git a/resolvers/Project/index.js b/resolvers/Project/index.js index 473ba43..6cca5c5 100644 --- a/resolvers/Project/index.js +++ b/resolvers/Project/index.js @@ -9,7 +9,7 @@ const Project = { // console.log(comments); return comments; } catch (err) { - console.log(err); + // console.log(err); return err; } }, @@ -20,7 +20,7 @@ const Project = { // console.log(photos); return photos; } catch (err) { - console.log(err); + // console.log(err); return err; } }, diff --git a/resolvers/Query/Comment.js b/resolvers/Query/Comment.js index 508b011..b6917e7 100644 --- a/resolvers/Query/Comment.js +++ b/resolvers/Query/Comment.js @@ -7,7 +7,7 @@ async function comment(_, { id }) { // console.log(data); return data; } catch (err) { - console.log(err); + // console.log(err); return err; } } diff --git a/resolvers/Query/Heatmap.js b/resolvers/Query/Heatmap.js index ffb2f04..ec2fcfd 100644 --- a/resolvers/Query/Heatmap.js +++ b/resolvers/Query/Heatmap.js @@ -7,7 +7,7 @@ async function heatmapById(_, { id }) { // console.log(data); return data; } catch (err) { - console.log(err); + // console.log(err); return err; } } @@ -18,7 +18,7 @@ async function heatmapByUserId(_, { userId }) { if (data == 0) throw new Error('No data to display!... 💩'); return data; } catch (err) { - console.log(err); + // console.log(err); return err; } } diff --git a/resolvers/Query/Projects.js b/resolvers/Query/Projects.js index 1a64e4e..eae653b 100644 --- a/resolvers/Query/Projects.js +++ b/resolvers/Query/Projects.js @@ -16,4 +16,14 @@ async function project(_, { id }) { } } -module.exports = { projects, project }; +async function category(_, { category }) { + console.log('category', category); + try { + const projectCat = await db('projects').where({ category }); + return projectCat; + } catch (err) { + return err; + } +} + +module.exports = { projects, project, category }; diff --git a/resolvers/Query/Users.js b/resolvers/Query/Users.js index 9b77c81..708a496 100644 --- a/resolvers/Query/Users.js +++ b/resolvers/Query/Users.js @@ -11,7 +11,7 @@ async function user(_, { id }) { if (!user) throw new Error('No user with this id exists... 💩'); return user; } catch (err) { - console.log(err); + // console.log(err); return err; } } diff --git a/resolvers/Query/index.js b/resolvers/Query/index.js index bb64d48..76c174a 100644 --- a/resolvers/Query/index.js +++ b/resolvers/Query/index.js @@ -1,6 +1,6 @@ const { users, user, doesUserExist } = require('./Users'); -const { project, projects } = require('./Projects'); -const { searchUsers, searchProjects, search } = require('./Search'); +const { project, projects, category } = require('./Projects'); +// const { searchUsers, searchProjects, search } = require('./Search'); const { heatmapById, heatmapByUserId } = require('./Heatmap'); const { comment } = require('./Comment'); @@ -11,10 +11,11 @@ const Query = { doesUserExist, project, projects, + category, comment, - search, - searchUsers, - searchProjects, + // search, + // searchUsers, + // searchProjects, heatmapById, heatmapByUserId, }, diff --git a/resolvers/User/index.js b/resolvers/User/index.js index 0e37876..f58f455 100644 --- a/resolvers/User/index.js +++ b/resolvers/User/index.js @@ -8,7 +8,7 @@ const User = { if (!projects) throw new Error('Something went wrong... 💩'); return projects; } catch (err) { - console.log(err); + // console.log(err); return err; } }, @@ -18,12 +18,12 @@ const User = { .where({ followerId: user.id }) .join('users', 'followers.followingId', 'users.id') .select('*'); - console.log('User ID:', user.id); + // console.log('User ID:', user.id); if (!followers) throw new Error('Something went wrong... 💩'); - console.log('followers', followers); + // console.log('followers', followers); return followers; } catch (err) { - console.log(err); + // console.log(err); return err; } }, diff --git a/schema/Inputs.js b/schema/Inputs.js index fd4f363..206d45b 100644 --- a/schema/Inputs.js +++ b/schema/Inputs.js @@ -6,7 +6,7 @@ const inputTypes = gql` firstName: String lastName: String username: String - email: String! + email: String location: String bio: String website: String @@ -18,6 +18,7 @@ const inputTypes = gql` private: Boolean! name: String! description: String! + category: String figma: String invision: String mainImg: String @@ -29,6 +30,7 @@ const inputTypes = gql` privateProjects: String name: String! description: String! + category: String figma: String invision: String mainImg: String diff --git a/schema/Mutation.js b/schema/Mutation.js index 6ce94c1..63b0151 100644 --- a/schema/Mutation.js +++ b/schema/Mutation.js @@ -19,6 +19,7 @@ const mutationTypes = gql` addHeatmap(data: AddHeatmapInput!): Heatmap! updateHeatmap(data: UpdateHeatmapInput!): Heatmap! deleteHeatmap(id: ID!): Boolean! + search(searchText: String): Search } `; diff --git a/schema/Query.js b/schema/Query.js index 13bde66..caf06a2 100644 --- a/schema/Query.js +++ b/schema/Query.js @@ -7,10 +7,8 @@ const queryTypes = gql` doesUserExist(id: ID!): Boolean! projects: [Project]! project(id: ID!): Project! + category(category: String!): [Project]! comment(id: ID!): Comment! - search(searchText: String): Search - searchUsers(searchText: String!): [User]! - searchProjects(searchText: String!): [Project]! heatmapById(id: ID!): Heatmap! heatmapByUserId(userId: ID!): [Heatmap]! } diff --git a/schema/Tables.js b/schema/Tables.js index f8c5857..27c8b37 100644 --- a/schema/Tables.js +++ b/schema/Tables.js @@ -21,9 +21,10 @@ const userTypes = gql` private: Boolean! name: String! description: String! + category: String figma: String invision: String - mainImg: String! + mainImg: String created_at: String! updated_at: String photos: [ProjectPhoto]! diff --git a/server.js b/server.js index 571843b..7f0ecfd 100644 --- a/server.js +++ b/server.js @@ -5,9 +5,7 @@ const { ApolloServer } = require('apollo-server-express'); // middleware imports const express = require('express'); -// const morgan = require('morgan'); -// const cors = require('cors'); -// const helmet = require('helmet'); + const app = express(); // ***************** GRAPHQL ********************* @@ -17,15 +15,17 @@ const typeDefs = require('./schema'); // ***************** MIDDLEWARE ****************** -// app.use(morgan('dev')); app.use(express.json()); -// app.use(cors()); -// app.use(helmet()); // ***************** TEST ENDPOINT *************** app.get('/', async (req, res) => { - res.send('

She works

'); + res.send(` + +

Server is up and running!

+

The GraphQL API is located at /graphql

+ + `); }); // Creates a new instance of apollo and @@ -33,6 +33,8 @@ app.get('/', async (req, res) => { const server = new ApolloServer({ typeDefs, resolvers, + introspection: true, + playground: true, }); // wraps our GQL server with our entire