diff --git a/.eslintrc.json b/.eslintrc.json index 8bff73dd..a9a73639 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,7 +11,7 @@ "prettier" ], "parserOptions": { - "project": "./tsconfig.base.json", + "project": "./tsconfig.json", "ecmaVersion": 6 }, "plugins": ["simple-import-sort"], @@ -38,9 +38,15 @@ // Using a type system makes it safe enough to spread props "react/jsx-props-no-spreading": "off", - "@typescript-eslint/ban-ts-comment": ["error", { - "ts-expect-error": "allow-with-description", - "minimumDescriptionLength": 5 - }] + // we want to be able to use functions before definition + "@typescript-eslint/no-use-before-define": "off", + + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "minimumDescriptionLength": 5 + } + ] } } diff --git a/packages/app-react/.eslintrc.json b/packages/app-react/.eslintrc.json new file mode 100644 index 00000000..02a44a21 --- /dev/null +++ b/packages/app-react/.eslintrc.json @@ -0,0 +1,9 @@ +{ + "parserOptions": { + "project": "./tsconfig.json", + "ecmaVersion": 6 + }, + "env": { + "browser": true + } +} diff --git a/packages/app-react/@types/react-router-dom.d.ts b/packages/app-react/@types/react-router-dom.d.ts deleted file mode 100644 index a068e847..00000000 --- a/packages/app-react/@types/react-router-dom.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'react-router-dom'; diff --git a/packages/app-react/package.json b/packages/app-react/package.json index 66d6418a..5cceb99c 100644 --- a/packages/app-react/package.json +++ b/packages/app-react/package.json @@ -25,6 +25,7 @@ "ethers": "^4.0.47", "graphql": "^15.0.0", "graphql-codegen-hasura-core": "^4.8.4", + "graphql-tag": "^2.10.4", "react": "^16.13.1", "react-dom": "^16.13.1", "react-router-dom": "^5.1.2", @@ -36,7 +37,8 @@ "@types/jest": "^24.0.0", "@types/node": "^12.0.0", "@types/react": "^16.9.0", - "@types/react-dom": "^16.9.0" + "@types/react-dom": "^16.9.0", + "@types/react-router-dom": "^5.1.5" }, "browserslist": { "production": [ diff --git a/packages/app-react/src/App.test.tsx b/packages/app-react/src/App.test.tsx index 4db7ebc2..b95b1bd4 100644 --- a/packages/app-react/src/App.test.tsx +++ b/packages/app-react/src/App.test.tsx @@ -1,6 +1,7 @@ -import React from 'react'; import { render } from '@testing-library/react'; -import App from './App'; +import React from 'react'; + +import { App } from './App'; test('renders learn react link', () => { const { getByText } = render(); diff --git a/packages/app-react/src/App.tsx b/packages/app-react/src/App.tsx index 45b2c68b..449a7d55 100644 --- a/packages/app-react/src/App.tsx +++ b/packages/app-react/src/App.tsx @@ -1,18 +1,16 @@ -import React from 'react'; import { ApolloProvider } from '@apollo/react-hooks'; import { CssBaseline } from '@material-ui/core'; +import React from 'react'; import { BrowserRouter as Router } from 'react-router-dom'; import { createApolloClient } from './apollo'; - -import Web3ContextProvider from './contexts/Web3'; - import Header from './components/Header'; +import { Web3ContextProvider } from './contexts/Web3'; import Routes from './Routes'; const apolloClient = createApolloClient(); -function App() { +export function App() { return ( @@ -25,5 +23,3 @@ function App() { ); } - -export default App; diff --git a/packages/app-react/src/Routes.tsx b/packages/app-react/src/Routes.tsx index 4db28582..bb13d560 100644 --- a/packages/app-react/src/Routes.tsx +++ b/packages/app-react/src/Routes.tsx @@ -1,19 +1,17 @@ import React from 'react'; -import { Switch, Route, Redirect } from 'react-router-dom'; +import { Redirect, Route, Switch } from 'react-router-dom'; import { Home } from './containers/Home'; import { Player } from './containers/Player'; -export default function Routes() { - return ( - - - - - - - - - - ); -} +export const Routes: React.FC = () => ( + + + + + + + + + +); diff --git a/packages/app-react/src/apollo/auth.js b/packages/app-react/src/apollo/auth.js index 83086c6e..2a145496 100644 --- a/packages/app-react/src/apollo/auth.js +++ b/packages/app-react/src/apollo/auth.js @@ -1,4 +1,4 @@ -import queries from '../graphql/queries'; +import { GetMyAccount } from '../graphql/queries'; const STORAGE_KEY = 'auth-token'; @@ -31,7 +31,7 @@ export async function login(client, token, ethAddress) { }); return client .query({ - query: queries.get_MyAccount, + query: GetMyAccount, variables: { eth_address: ethAddress }, }) .then(async (res) => { diff --git a/packages/app-react/src/apollo/client.js b/packages/app-react/src/apollo/client.js index 349f2ba2..234c5810 100644 --- a/packages/app-react/src/apollo/client.js +++ b/packages/app-react/src/apollo/client.js @@ -1,9 +1,8 @@ import ApolloClient from 'apollo-boost'; -import config from '../config'; - -import * as localQueries from './localQueries'; +import { CONFIG } from '../config'; import { logout } from './auth'; +import * as localQueries from './localQueries'; export function createApolloClient() { let client; @@ -15,7 +14,7 @@ export function createApolloClient() { }; async function authMiddleware(operation) { - const queryLogin = client.readQuery({ query: localQueries.get_authState }); + const queryLogin = client.readQuery({ query: localQueries.GetAuthState }); if (queryLogin.authToken) { operation.setContext({ @@ -43,7 +42,7 @@ export function createApolloClient() { } client = new ApolloClient({ - uri: config.graphqlURL, + uri: CONFIG.graphqlURL, request: authMiddleware, onError: onErrorMiddleware, clientState: { diff --git a/packages/app-react/src/apollo/localQueries.js b/packages/app-react/src/apollo/localQueries.js index 6149b9b2..f4af8361 100644 --- a/packages/app-react/src/apollo/localQueries.js +++ b/packages/app-react/src/apollo/localQueries.js @@ -1,6 +1,6 @@ import { gql } from 'apollo-boost'; -export const get_authState = gql` +export const GetAuthState = gql` query AuthState { authState @client authToken @client diff --git a/packages/app-react/src/components/Header.tsx b/packages/app-react/src/components/Header.tsx index 0a5f9fc3..5ee71c34 100644 --- a/packages/app-react/src/components/Header.tsx +++ b/packages/app-react/src/components/Header.tsx @@ -1,17 +1,14 @@ +import { Box } from '@material-ui/core'; import React from 'react'; import { Link } from 'react-router-dom'; -import { Box } from '@material-ui/core'; - import { Login } from '../containers/Login'; -export default function Header() { - return ( - - - - - - - ); -} +export const Header: React.FC = () => ( + + + + + + +); diff --git a/packages/app-react/src/components/PlayerDetails.tsx b/packages/app-react/src/components/PlayerDetails.tsx index d9b8acad..04f63f77 100644 --- a/packages/app-react/src/components/PlayerDetails.tsx +++ b/packages/app-react/src/components/PlayerDetails.tsx @@ -1,13 +1,11 @@ -import React, { useState, useEffect, useCallback } from 'react'; import { useMutation } from '@apollo/react-hooks'; - -import ThreeBox from '3box'; - import { Box } from '@material-ui/core'; +import ThreeBox from '3box'; +import React, { useCallback, useEffect, useState } from 'react'; import { useMyPlayer } from '../graphql/hooks'; +import { UpdateBoxProfiles, UpdateUsername } from '../graphql/mutations'; import { getPlayerETHAddress } from '../utils/players'; -import mutations from '../graphql/mutations'; function getProfilePicture(boxProfile: any) { const imageHash = @@ -18,25 +16,24 @@ function getProfilePicture(boxProfile: any) { boxProfile.image[0].contentUrl['/']; if (imageHash) { return `https://ipfs.infura.io/ipfs/${imageHash}`; - } else { - return 'https://i.imgur.com/RXJO8FD.png'; } + return 'https://i.imgur.com/RXJO8FD.png'; } -export default function PlayerDetails({ player }: { player: any }) { +export const PlayerDetails: React.FC<{ player: any }> = ({ player }) => { const myPlayer = useMyPlayer(); const isMyPlayer = myPlayer && myPlayer.id === player.id; const [boxProfile, setBoxProfile] = useState(); const [usernameInput, setUsernameInput] = useState(player.username); - const [updateBoxProfiles] = useMutation(mutations.UpdateBoxProfiles); - const [updateUsername] = useMutation(mutations.UpdateUsername); + const [updateBoxProfiles] = useMutation(UpdateBoxProfiles); + const [updateUsername] = useMutation(UpdateUsername); const ethAddress = getPlayerETHAddress(player); useEffect(() => { (async () => { - const boxProfile = await ThreeBox.getProfile(ethAddress); - setBoxProfile(boxProfile); + const profile = await ThreeBox.getProfile(ethAddress); + setBoxProfile(profile); })(); }, [ethAddress]); @@ -45,7 +42,7 @@ export default function PlayerDetails({ player }: { player: any }) { }, [ethAddress]); const editUserName = useCallback(() => { - // TODO Apollo does not updates caches as it expects that the mutation returns an object with id, but hasura returns { returning: [{id}] } + // TODO Apollo does not updates caches as it expects that the mutation returns an object with id, but hasura returns { returning: [{id}] } updateUsername({ variables: { username: usernameInput, @@ -66,14 +63,20 @@ export default function PlayerDetails({ player }: { player: any }) {

{player.username}

{player.id}

- {isMyPlayer && } + {isMyPlayer && ( + + )} {isMyPlayer && (
setUsernameInput(e.target.value)} /> - +
)} {boxProfile ? ( @@ -99,9 +102,11 @@ export default function PlayerDetails({ player }: { player: any }) { ))} {isMyPlayer && ( - + )}
); -} +}; diff --git a/packages/app-react/src/components/PlayerListItem.tsx b/packages/app-react/src/components/PlayerListItem.tsx index 4c233de7..c99c9ff9 100644 --- a/packages/app-react/src/components/PlayerListItem.tsx +++ b/packages/app-react/src/components/PlayerListItem.tsx @@ -1,15 +1,12 @@ +import { Box } from '@material-ui/core'; import React from 'react'; import { Link } from 'react-router-dom'; -import { Box } from '@material-ui/core'; - -export default function PlayerListItem({ player }: { player: any }) { - return ( - - {player.username} - - - - - ); -} +export const PlayerListItem: React.FC<{ player: any }> = ({ player }) => ( + + {player.username} + + + + +); diff --git a/packages/app-react/src/config.ts b/packages/app-react/src/config.ts index 9021e7bc..ea9d7716 100644 --- a/packages/app-react/src/config.ts +++ b/packages/app-react/src/config.ts @@ -1,4 +1,4 @@ -export default { +export const CONFIG = { graphqlURL: process.env.REACT_APP_GRAPHQL_URL || 'http://localhost:8080/v1/graphql', infuraId: diff --git a/packages/app-react/src/containers/Home.tsx b/packages/app-react/src/containers/Home.tsx index b3d58b9b..77aecc43 100644 --- a/packages/app-react/src/containers/Home.tsx +++ b/packages/app-react/src/containers/Home.tsx @@ -1,8 +1,7 @@ +import { Box } from '@material-ui/core'; import React from 'react'; -import { Box } from '@material-ui/core'; - -import PlayerList from './PlayerList'; +import { PlayerList } from './PlayerList'; export const Home: React.FC = () => { return ( diff --git a/packages/app-react/src/containers/Login.tsx b/packages/app-react/src/containers/Login.tsx index a030c742..819b9f61 100644 --- a/packages/app-react/src/containers/Login.tsx +++ b/packages/app-react/src/containers/Login.tsx @@ -1,12 +1,11 @@ -import React, { useContext, useCallback } from 'react'; - -import { Box } from '@material-ui/core'; - -import { Web3Context } from '../contexts/Web3'; -import { localQueries } from '../apollo'; import { useQuery } from '@apollo/react-hooks'; +import { Box } from '@material-ui/core'; +import React, { useCallback, useContext } from 'react'; import { Link } from 'react-router-dom'; +import { localQueries } from '../apollo'; +import { Web3Context } from '../contexts/Web3'; + export const Login: React.FC = () => { const { data, loading } = useQuery(localQueries.get_authState); @@ -18,22 +17,26 @@ export const Login: React.FC = () => { if (loading || data?.authState === 'loading') { return Connecting...; - } else if (data?.authState === 'logged') { + } + if (data?.authState === 'logged') { const { playerId } = data; return ( Connected - + - - - ); - } else { - return ( - - + ); } + return ( + + + + ); }; diff --git a/packages/app-react/src/containers/Player.tsx b/packages/app-react/src/containers/Player.tsx index 03f45579..f71dbe03 100644 --- a/packages/app-react/src/containers/Player.tsx +++ b/packages/app-react/src/containers/Player.tsx @@ -1,15 +1,14 @@ -import React from 'react'; import { useQuery } from '@apollo/react-hooks'; -import { useParams } from 'react-router-dom'; import { Box } from '@material-ui/core'; +import React from 'react'; +import { useParams } from 'react-router-dom'; import PlayerDetails from '../components/PlayerDetails'; - -import queries from '../graphql/queries'; +import { GetPlayer } from '../graphql/queries'; export const Player: React.FC = () => { const { playerId } = useParams(); - const { data, loading, error } = useQuery(queries.get_Player, { + const { data, loading, error } = useQuery(GetPlayer, { variables: { player_id: playerId, }, diff --git a/packages/app-react/src/containers/PlayerList.tsx b/packages/app-react/src/containers/PlayerList.tsx index 5cc92db8..53565be4 100644 --- a/packages/app-react/src/containers/PlayerList.tsx +++ b/packages/app-react/src/containers/PlayerList.tsx @@ -1,15 +1,12 @@ +import { useQuery } from '@apollo/react-hooks'; +import { Box } from '@material-ui/core'; import React from 'react'; -import { Box } from '@material-ui/core'; +import { PlayerListItem } from '../components/PlayerListItem'; +import { GetPlayer } from '../graphql/queries'; -import { useQuery } from '@apollo/react-hooks'; - -import queries from '../graphql/queries'; - -import PlayerListItem from '../components/PlayerListItem'; - -export default function PlayerList() { - const { data, loading, error } = useQuery(queries.get_Player); +export const PlayerList: React.FC = () => { + const { data, loading, error } = useQuery(GetPlayer); if (error) { return
error: {error.message}
; @@ -26,4 +23,4 @@ export default function PlayerList() { ))} ); -} +}; diff --git a/packages/app-react/src/contexts/Web3.tsx b/packages/app-react/src/contexts/Web3.tsx index 42598623..9786d607 100644 --- a/packages/app-react/src/contexts/Web3.tsx +++ b/packages/app-react/src/contexts/Web3.tsx @@ -1,14 +1,14 @@ -import React, { createContext, useCallback, useEffect, useState } from 'react'; +import { useApolloClient } from '@apollo/react-hooks'; +import { did } from '@metafam/utils'; import WalletConnectProvider from '@walletconnect/web3-provider'; -import Web3Modal from 'web3modal'; -import Web3 from 'web3'; import { ethers } from 'ethers'; import { AsyncSendable, Web3Provider } from 'ethers/providers'; -import { useApolloClient } from '@apollo/react-hooks'; +import React, { createContext, useCallback, useEffect, useState } from 'react'; +import Web3 from 'web3'; +import Web3Modal from 'web3modal'; -import config from '../config'; -import { did } from '@metafam/utils'; -import { loginLoading, login, logout, getTokenFromStore } from '../apollo/auth'; +import { getTokenFromStore, login, loginLoading, logout } from '../apollo/auth'; +import { CONFIG } from '../config'; type Web3ContextType = { ethersProvider: Web3Provider | null; @@ -26,7 +26,7 @@ const providerOptions = { walletconnect: { package: WalletConnectProvider, options: { - infuraId: config.infuraId, + infuraId: CONFIG.infuraId, }, }, }; @@ -37,7 +37,7 @@ const web3Modal = new Web3Modal({ providerOptions, }); -const Web3ContextProvider: React.FC = (props) => { +export const Web3ContextProvider: React.FC = ({ children }) => { const apolloClient = useApolloClient(); const [ethersProvider, setEthersProvider] = useState( @@ -45,14 +45,14 @@ const Web3ContextProvider: React.FC = (props) => { ); const connectDID = useCallback( - async (ethersProvider: Web3Provider) => { + async (provider: Web3Provider) => { let token = getTokenFromStore(); if (!token) { - token = await did.createToken(ethersProvider); + token = await did.createToken(provider); } - const signer = ethersProvider.getSigner(); + const signer = provider.getSigner(); const address = await signer.getAddress(); await login(apolloClient, token, address); }, @@ -63,15 +63,15 @@ const Web3ContextProvider: React.FC = (props) => { try { loginLoading(apolloClient); - const provider = await web3Modal.connect(); + const modalProvider = await web3Modal.connect(); - const web3Provider = new Web3(provider); - const ethersProvider = new ethers.providers.Web3Provider( + const web3Provider = new Web3(modalProvider); + const provider = new ethers.providers.Web3Provider( web3Provider.currentProvider as AsyncSendable, ); - await connectDID(ethersProvider); + await connectDID(provider); - setEthersProvider(ethersProvider); + setEthersProvider(provider); } catch (e) { loginLoading(apolloClient, false); throw e; @@ -91,9 +91,7 @@ const Web3ContextProvider: React.FC = (props) => { return ( - {props.children} + {children} ); }; - -export default Web3ContextProvider; diff --git a/packages/app-react/src/graphql/fragments.ts b/packages/app-react/src/graphql/fragments.ts index 40a6877b..274e4a90 100644 --- a/packages/app-react/src/graphql/fragments.ts +++ b/packages/app-react/src/graphql/fragments.ts @@ -1,16 +1,12 @@ -const fragments: any = {}; - -fragments.PlayerFragment = ` +export const PlayerFragment = ` fragment PlayerFragment on Player { id username } `; -fragments.AccountFragment = ` +export const AccountFragment = ` fragment AccountFragment on Account { identifier type } `; - -export default fragments; diff --git a/packages/app-react/src/graphql/hooks.ts b/packages/app-react/src/graphql/hooks.ts index b0ea9477..ac529cf1 100644 --- a/packages/app-react/src/graphql/hooks.ts +++ b/packages/app-react/src/graphql/hooks.ts @@ -1,13 +1,12 @@ +import { useLazyQuery, useQuery } from '@apollo/react-hooks'; import { useEffect } from 'react'; -import { useQuery, useLazyQuery } from '@apollo/react-hooks'; - import { localQueries } from '../apollo'; -import queries from './queries'; +import { GetPlayer } from './queries'; export function useMyPlayer() { const authStateQuery = useQuery(localQueries.get_authState); - const [getMyPlayer, myPlayerQuery] = useLazyQuery(queries.get_Player); + const [getMyPlayer, myPlayerQuery] = useLazyQuery(GetPlayer); const playerId = authStateQuery.data?.playerId; diff --git a/packages/app-react/src/graphql/mutations.ts b/packages/app-react/src/graphql/mutations.ts index ad5c2350..156c5d32 100644 --- a/packages/app-react/src/graphql/mutations.ts +++ b/packages/app-react/src/graphql/mutations.ts @@ -1,8 +1,6 @@ import gql from 'graphql-tag'; -const mutations: any = {}; - -mutations.UpdateBoxProfiles = gql` +export const UpdateBoxProfiles = gql` mutation UpdateBoxProfiles { updateBoxProfile { success @@ -11,7 +9,7 @@ mutations.UpdateBoxProfiles = gql` } `; -mutations.UpdateUsername = gql` +export const UpdateUsername = gql` mutation UpdateUsername($username: String!) { update_Player(where: {}, _set: { username: $username }) { affected_rows @@ -22,5 +20,3 @@ mutations.UpdateUsername = gql` } } `; - -export default mutations; diff --git a/packages/app-react/src/graphql/queries.ts b/packages/app-react/src/graphql/queries.ts index 6d0a4047..418da3c1 100644 --- a/packages/app-react/src/graphql/queries.ts +++ b/packages/app-react/src/graphql/queries.ts @@ -1,10 +1,8 @@ import gql from 'graphql-tag'; -import fragments from './fragments'; +import { AccountFragment, PlayerFragment } from './fragments'; -const queries: any = {}; - -queries.get_Player = gql` +export const GetPlayer = gql` query GetPlayer($player_id: uuid) { Player(where: { id: { _eq: $player_id } }) { ...PlayerFragment @@ -13,11 +11,11 @@ queries.get_Player = gql` } } } - ${fragments.PlayerFragment} - ${fragments.AccountFragment} + ${PlayerFragment} + ${AccountFragment} `; -queries.get_MyAccount = gql` +export const GetMyAccount = gql` query GetMyAccount($eth_address: String) { Account( where: { identifier: { _eq: $eth_address }, type: { _eq: "ETHEREUM" } } @@ -28,8 +26,6 @@ queries.get_MyAccount = gql` } } } - ${fragments.PlayerFragment} - ${fragments.AccountFragment} + ${PlayerFragment} + ${AccountFragment} `; - -export default queries; diff --git a/packages/app-react/src/index.tsx b/packages/app-react/src/index.tsx index ef1ddc36..a11506dd 100644 --- a/packages/app-react/src/index.tsx +++ b/packages/app-react/src/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import App from './App'; + +import { App } from './App'; import * as serviceWorker from './serviceWorker'; ReactDOM.render(, document.getElementById('root')); diff --git a/packages/app-react/src/serviceWorker.ts b/packages/app-react/src/serviceWorker.ts index 5bd59f1a..0cb1b996 100644 --- a/packages/app-react/src/serviceWorker.ts +++ b/packages/app-react/src/serviceWorker.ts @@ -66,6 +66,7 @@ function registerValidSW(swUrl: string, config?: Config) { navigator.serviceWorker .register(swUrl) .then((registration) => { + // eslint-disable-next-line no-param-reassign registration.onupdatefound = () => { const installingWorker = registration.installing; if (installingWorker == null) { diff --git a/packages/backend/.eslintrc.json b/packages/backend/.eslintrc.json new file mode 100644 index 00000000..3dc4d587 --- /dev/null +++ b/packages/backend/.eslintrc.json @@ -0,0 +1,14 @@ +{ + "parserOptions": { + "project": "./tsconfig.json", + "ecmaVersion": 6 + }, + "overrides": [ + { + "files": ["./src/handlers/actions/types.ts"], + "rules": { + "@typescript-eslint/naming-convention": "off" + } + } + ] +} diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index e59023a3..12fa4834 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -1,4 +1,4 @@ -export default { +export const CONFIG = { port: process.env.PORT || 4000, graphqlURL: process.env.GRAPHQL_URL || 'http://localhost:8080/v1/graphql', adminKey: process.env.HASURA_GRAPHQL_ADMIN_SECRET || 'metagame_secret', diff --git a/packages/backend/src/handlers/actions/routes.ts b/packages/backend/src/handlers/actions/routes.ts index 5c361718..61383cbc 100644 --- a/packages/backend/src/handlers/actions/routes.ts +++ b/packages/backend/src/handlers/actions/routes.ts @@ -1,11 +1,11 @@ import express from 'express'; import { asyncHandlerWrapper } from '../../lib/apiHelpers'; +import { updateBoxProfileHandler } from './updateBoxProfile/handler'; -import updateBoxProfileHandler from './updateBoxProfile/handler'; +export const actionRoutes = express.Router(); -const router = express.Router(); - -router.post('/updateBoxProfile', asyncHandlerWrapper(updateBoxProfileHandler)); - -export default router; +actionRoutes.post( + '/updateBoxProfile', + asyncHandlerWrapper(updateBoxProfileHandler), +); diff --git a/packages/backend/src/handlers/actions/updateBoxProfile/handler.ts b/packages/backend/src/handlers/actions/updateBoxProfile/handler.ts index bea62b52..fad5a63e 100644 --- a/packages/backend/src/handlers/actions/updateBoxProfile/handler.ts +++ b/packages/backend/src/handlers/actions/updateBoxProfile/handler.ts @@ -1,7 +1,8 @@ +import Box from '3box'; import { Request, Response } from 'express'; + import { hasuraQuery } from '../../../lib/hasuraHelpers'; import { getPlayerETHAddress } from '../../../lib/playerHelpers'; -import Box from '3box'; const getPlayerQuery = ` query GetPlayer ($playerId: uuid!) { @@ -33,10 +34,10 @@ mutation upsert_Account($objects: [Account_insert_input!]!) { } `; -const handler = async (req: Request, res: Response) => { - const { session_variables } = req.body; - const role = session_variables['x-hasura-role']; - const playerId = session_variables['x-hasura-user-id']; +export const updateBoxProfileHandler = async (req: Request, res: Response) => { + const session = req.body.session_variables; + const role = session['x-hasura-role']; + const playerId = session['x-hasura-user-id']; if (role !== 'player') { throw new Error('expected role player'); @@ -104,5 +105,3 @@ async function updateVerifiedProfiles( updatedProfiles, }; } - -export default handler; diff --git a/packages/backend/src/handlers/auth-webhook/handler.ts b/packages/backend/src/handlers/auth-webhook/handler.ts index c4e002f1..a5181454 100644 --- a/packages/backend/src/handlers/auth-webhook/handler.ts +++ b/packages/backend/src/handlers/auth-webhook/handler.ts @@ -1,5 +1,6 @@ -import { Request, Response } from 'express'; import { did } from '@metafam/utils'; +import { Request, Response } from 'express'; + import { getPlayer } from './users'; const unauthorizedVariables = { @@ -7,19 +8,18 @@ const unauthorizedVariables = { }; function getHeaderToken(req: Request): string | null { - const authHeader = req.headers['authorization']; + const authHeader = req.headers.authorization; if (!authHeader) return null; const token = authHeader.replace('Bearer ', ''); if (token.length === 0) return null; return token; } -const handler = async (req: Request, res: Response) => { +export const authHandler = async (req: Request, res: Response) => { const token = getHeaderToken(req); if (!token) { res.json(unauthorizedVariables); - return; } else { const claim = did.verifyToken(token); if (!claim) { @@ -37,5 +37,3 @@ const handler = async (req: Request, res: Response) => { res.json(hasuraVariables); } }; - -export default handler; diff --git a/packages/backend/src/handlers/routes.ts b/packages/backend/src/handlers/routes.ts index 7bebb24b..f35759a0 100644 --- a/packages/backend/src/handlers/routes.ts +++ b/packages/backend/src/handlers/routes.ts @@ -1,18 +1,14 @@ import express from 'express'; import { asyncHandlerWrapper } from '../lib/apiHelpers'; +import { actionRoutes } from './actions/routes'; +import { authHandler } from './auth-webhook/handler'; -import actionsRoutes from './actions/routes'; - -import authHandler from './auth-webhook/handler'; - -const router = express.Router(); +export const router = express.Router(); router.get('/', function (_, res) { res.send('pong'); }); router.get('/auth-webhook', asyncHandlerWrapper(authHandler)); -router.use('/actions', actionsRoutes); - -export default router; +router.use('/actions', actionRoutes); diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 8746d111..08bee990 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -1,19 +1,18 @@ -import express from 'express'; import bodyParser from 'body-parser'; +import express from 'express'; -import config from './config'; - -import routes from './handlers/routes'; +import { CONFIG } from './config'; +import { router } from './handlers/routes'; import { errorMiddleware } from './lib/apiHelpers'; const app = express(); app.use(bodyParser.json()); -app.use(routes); +app.use(router); app.use(errorMiddleware); -app.listen(config.port, function () { - console.log(`Listening on port ${config.port}`); +app.listen(CONFIG.port, () => { + console.log(`Listening on port ${CONFIG.port}`); }); diff --git a/packages/backend/src/lib/apiHelpers.ts b/packages/backend/src/lib/apiHelpers.ts index ab5f367f..07442ad7 100644 --- a/packages/backend/src/lib/apiHelpers.ts +++ b/packages/backend/src/lib/apiHelpers.ts @@ -1,4 +1,4 @@ -import { Request, Response, NextFunction } from 'express'; +import { NextFunction, Request, Response } from 'express'; export function asyncHandlerWrapper(middleware: any) { if (middleware.length === 4) { diff --git a/packages/backend/src/lib/hasuraHelpers.ts b/packages/backend/src/lib/hasuraHelpers.ts index 42e688ce..be6b2e86 100644 --- a/packages/backend/src/lib/hasuraHelpers.ts +++ b/packages/backend/src/lib/hasuraHelpers.ts @@ -1,13 +1,14 @@ import fetch from 'node-fetch'; -import config from '../config'; + +import { CONFIG } from '../config'; export async function hasuraQuery(query: string, qv: any = {}) { - const result = await fetch(config.graphqlURL, { + const result = await fetch(CONFIG.graphqlURL, { method: 'POST', - body: JSON.stringify({ query: query, variables: qv }), + body: JSON.stringify({ query, variables: qv }), headers: { 'Content-Type': 'application/json', - 'x-hasura-access-key': config.adminKey, + 'x-hasura-access-key': CONFIG.adminKey, }, }); diff --git a/packages/graphql-codegen/package.json b/packages/graphql-codegen/package.json index eb75033d..125f0c3e 100644 --- a/packages/graphql-codegen/package.json +++ b/packages/graphql-codegen/package.json @@ -10,6 +10,9 @@ "generate": "yarn get-schema && graphql-codegen --config=graphql-codegen-gql.yaml && graphql-codegen --config=graphql-codegen-typescript.yaml", "typecheck": "echo noop" }, + "dependencies": { + "graphql-tag": "^2.10.4" + }, "devDependencies": { "@graphql-codegen/cli": "^1.13.2", "@graphql-codegen/introspection": "^1.13.2", diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..ffcbb947 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.base.json" +} diff --git a/yarn.lock b/yarn.lock index 9f49ccce..2fec0eed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3679,6 +3679,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/history@*": + version "4.7.6" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" + integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -3791,6 +3796,23 @@ dependencies: "@types/react" "*" +"@types/react-router-dom@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090" + integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa" + integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-transition-group@^4.2.0": version "4.2.4" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.2.4.tgz#c7416225987ccdb719262766c1483da8f826838d" @@ -10990,6 +11012,11 @@ graphql-tag@2.10.3, graphql-tag@^2.10.2, graphql-tag@^2.4.2: resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== +graphql-tag@^2.10.4: + version "2.10.4" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.4.tgz#2f301a98219be8b178a6453bb7e33b79b66d8f83" + integrity sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA== + graphql-tools@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-5.0.0.tgz#67281c834a0e29f458adba8018f424816fa627e9"