From 27778a8360deffa4fd1eca6278cd651eb897c478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Babi=C4=8D?= Date: Thu, 3 Oct 2019 23:04:21 +0200 Subject: [PATCH] rename tokens to loginTokens --- package-lock.json | 91 ++++++++++--------- package.json | 4 +- src/app.ts | 9 +- src/app/UserResolver.spec.ts | 28 +++--- src/app/UserResolver.ts | 8 +- src/app/schema.ts | 24 +++-- .../{Tokens.ts => LoginTokens.ts} | 2 +- src/app/userResolver/auth.ts | 6 +- 8 files changed, 88 insertions(+), 84 deletions(-) rename src/app/userResolver/{Tokens.ts => LoginTokens.ts} (78%) diff --git a/package-lock.json b/package-lock.json index 5500a2e..276c9a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -560,16 +560,6 @@ "@types/serve-static": "*" } }, - "@types/express-jwt": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", - "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/express-unless": "*" - } - }, "@types/express-serve-static-core": { "version": "4.16.9", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", @@ -579,15 +569,6 @@ "@types/range-parser": "*" } }, - "@types/express-unless": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz", - "integrity": "sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, "@types/fs-capacitor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", @@ -732,6 +713,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==" }, + "@types/node-fetch": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.2.tgz", + "integrity": "sha512-djYYKmdNRSBtL1x4CiE9UJb9yZhwtI1VC+UxZD0psNznrUj80ywsxKlEGAE+QL1qvLjPbfb24VosjkYM6W4RSQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", @@ -1216,11 +1206,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -2146,6 +2131,15 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -2360,22 +2354,6 @@ } } }, - "express-jwt": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz", - "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==", - "requires": { - "async": "^1.5.0", - "express-unless": "^0.3.0", - "jsonwebtoken": "^8.1.0", - "lodash.set": "^4.0.0" - } - }, - "express-unless": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", - "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3719,6 +3697,28 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -4535,11 +4535,6 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -6903,6 +6898,12 @@ "iconv-lite": "0.4.24" } }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", + "dev": true + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", diff --git a/package.json b/package.json index 8c0ef6a..f4139c3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "src/app.js", "scripts": { "dev": "ts-node-dev --respawn src/app.ts", - "test": "jest -i --coverage", + "test": "jest --coverage", + "test:debug": "jest -i --verbose --detectOpenHandles", "test:watch": "jest -i --watch", "gen:key": "ssh-keygen -t rsa -b 2048 -f src/app/userResolver/auth/jwtRS256.key && openssl rsa -in src/app/userResolver/auth/wtRS256.key -pubout -outform PEM -out src/app/userResolver/auth/wtRS256.key.pub" }, @@ -29,7 +30,6 @@ "@types/express": "^4.17.1", "@types/graphql": "^14.5.0", "@types/jest": "^24.0.18", - "@types/js-cookie": "^2.2.2", "@types/jsonwebtoken": "^8.3.3", "@types/node": "^12.7.5", "class-transformer": "^0.2.3", diff --git a/src/app.ts b/src/app.ts index f508f60..f9b6f5b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,10 +1,10 @@ require("dotenv").config() import { ApolloServer } from "apollo-server-express" import { createConnection } from "typeorm" -import { connectionOptions, createSchema } from "./app/schema" +import { connectionOptionsforDB, createSchema } from "./app/schema" import express = require("express") ;(async () => { - await createConnection(connectionOptions) + await createConnection(connectionOptionsforDB()) const server = new ApolloServer({ schema: await createSchema(), @@ -17,10 +17,9 @@ import express = require("express") const app = express() server.applyMiddleware({ app }) - const APP_PORT = process.env.APP_PORT || 4000 - app.listen({ port: APP_PORT }, () => + app.listen({ port: process.env.APP_PORT }, () => console.log( - `🚀 Server ready at http://localhost:${APP_PORT}${server.graphqlPath}. ` + `Server ready at http://localhost:${process.env.APP_PORT}${server.graphqlPath}` ) ) })() diff --git a/src/app/UserResolver.spec.ts b/src/app/UserResolver.spec.ts index dd8f154..a4c276b 100644 --- a/src/app/UserResolver.spec.ts +++ b/src/app/UserResolver.spec.ts @@ -1,12 +1,12 @@ import { gql } from "apollo-server" import { createConnection, getConnection } from "typeorm" -import { callSchema, connectionOptions } from "./schema" +import { callSchema, connectionOptionsforDB } from "./schema" import { signToken, verifyToken } from "./userResolver/auth" -import { Tokens } from "./userResolver/Tokens" +import { LoginTokens } from "./userResolver/LoginTokens" import { User } from "./userResolver/User" beforeAll(async () => { - return await createConnection(connectionOptions) + return await createConnection(connectionOptionsforDB("testing")) }) afterAll(async () => { @@ -60,17 +60,17 @@ describe("resolver of user", () => { }) }) - describe("tokens query should", () => { - const tokensQuery = gql` + describe("loginTokens query should", () => { + const loginTokensQuery = gql` query { - tokens(email: "email@email.com", password: "good-password") { + loginTokens(email: "email@email.com", password: "good-password") { accessToken } } ` it("return error for non-existent user", async () => { - const response = await callSchema(tokensQuery) + const response = await callSchema(loginTokensQuery) expect(response.errors).not.toBeUndefined() expect(response.data).toBeNull() @@ -82,7 +82,7 @@ describe("resolver of user", () => { password: "BAD-password", }).save() - const response = await callSchema(tokensQuery) + const response = await callSchema(loginTokensQuery) expect(response.errors).not.toBeUndefined() expect(response.data).toBeNull() @@ -94,14 +94,14 @@ describe("resolver of user", () => { password: "good-password", }).save() - const response = await callSchema(tokensQuery) - const token = response.data!.tokens.accessToken - const tokens = new Tokens() - tokens.accessToken = token + const response = await callSchema(loginTokensQuery) + const accessToken = response.data!.loginTokens.accessToken + const loginTokens = new LoginTokens() + loginTokens.accessToken = accessToken expect(response.errors).toBeUndefined() - expect(response.data).toMatchObject({ tokens }) - expect(verifyToken(token)).toBeTruthy() + expect(response.data).toMatchObject({ loginTokens }) + expect(verifyToken(accessToken)).toBeTruthy() }) }) diff --git a/src/app/UserResolver.ts b/src/app/UserResolver.ts index ca998cc..7fad970 100644 --- a/src/app/UserResolver.ts +++ b/src/app/UserResolver.ts @@ -1,7 +1,7 @@ import "reflect-metadata" import { Arg, Authorized, Ctx, Mutation, Query } from "type-graphql" import { comparePassword, MyContext, signToken } from "./userResolver/auth" -import { Tokens } from "./userResolver/Tokens" +import { LoginTokens } from "./userResolver/LoginTokens" import { User } from "./userResolver/User" export class UserResolver { @@ -10,11 +10,11 @@ export class UserResolver { return await User.find() } - @Query(() => Tokens) - async tokens( + @Query(() => LoginTokens) + async loginTokens( @Arg("email") email: string, @Arg("password") password: string - ): Promise { + ): Promise { try { const user = await User.findOne({ where: { email } }) diff --git a/src/app/schema.ts b/src/app/schema.ts index 1af75e0..dd3d633 100644 --- a/src/app/schema.ts +++ b/src/app/schema.ts @@ -26,14 +26,18 @@ export const createSchema = () => authChecker: customAuthChecker, }) -export const connectionOptions: ConnectionOptions = { - type: "postgres", - host: process.env.DB_HOST, - port: 5432, - database: process.env.DB_NAME, - username: process.env.DB_USER, - password: process.env.DB_PASS, - entities: [User], - synchronize: true, - logging: false, +export const connectionOptionsforDB = (dbName?: string) => { + let connectionOptions: ConnectionOptions = { + type: "postgres", + host: process.env.DB_HOST, + port: 5432, + database: dbName || process.env.DB_NAME, + username: process.env.DB_USER, + password: process.env.DB_PASS, + entities: [User], + synchronize: true, + logging: false, + } + + return connectionOptions } diff --git a/src/app/userResolver/Tokens.ts b/src/app/userResolver/LoginTokens.ts similarity index 78% rename from src/app/userResolver/Tokens.ts rename to src/app/userResolver/LoginTokens.ts index b8c7e3a..46df569 100644 --- a/src/app/userResolver/Tokens.ts +++ b/src/app/userResolver/LoginTokens.ts @@ -2,7 +2,7 @@ import "reflect-metadata" import { Field, ObjectType } from "type-graphql" @ObjectType() -export class Tokens { +export class LoginTokens { @Field() accessToken: string = "" } diff --git a/src/app/userResolver/auth.ts b/src/app/userResolver/auth.ts index 90856b1..a200ffc 100644 --- a/src/app/userResolver/auth.ts +++ b/src/app/userResolver/auth.ts @@ -43,13 +43,13 @@ export const verifyToken = (token: string) => { export const customAuthChecker: AuthChecker = ({ context }) => { try { const authHeader = context.req.headers["authorization"] - const token = authHeader!.split(" ")[1] - const payload = verifyToken(token) + const accessToken = authHeader!.split(" ")[1] + const payload = verifyToken(accessToken) context.payload = payload as any return true } catch (error) { - throw new Error("the valid authorization header is required") + throw new Error("the valid authorization header is required: ") } }