This is the repo for generic code challenge #2.
It calls a 3rd party API as a data source. The API accesses data about estimated solar panel production and is briefly described below. The requested data is retrieved, a simple transformation is made to that data, and this data is displayed in the client UI.
It consists of one repo, which contains code for both the backend and the frontend.
This project uses Typescript / React / Node as the main elements of its stack.
You can start the Docker container for a simple start-up of the project. If you don't want to do this, the required modules for both the frontend and backend must first be installed.
- The 3rd party API is described at this url: https://doc.forecast.solar/doku.php?id=api:estimate.
- This API provides a solar production estimate for specific location (defined by latitude and longitude) and a specific plane orientation (defined by declination and azimuth) for an installed module power. Basically 'where the solar panel is' and 'in which direction the solar panel is pointing'.
- To keep things simple, calls to this API receive a solar production estimate as JSON for 52° north, 12° east, for a installation with a declination of 37° looking south (0°) with 5.67 kWp.
- Further refinement of this application should allow an end user to specify lat / long values, as well as declination / other variables.
First, you need to clone the repo and move to the root directory:
- Clone the repo:
git clone https://github.com/mattburnett-repo/generic_code_challenge_02
- Change to the
generic_code_challenge_02
directory:
cd generic_code_challenge_02
From here you can avoid the installation steps by starting the Docker container for this project.
That being said, here is how to install and start the pieces of this project:
After cloning the repo and changing to its root directory, you can install the backend, compile it to TypeScript, and start it.
- Install the backend modules:
cd backend
yarn
- Copy the
.sample.env
to the.env
file:
cp .sample.env .env
- The backend uses a 3rd party API to retrieve data for a given search term. The URL for this API is provided in the
.env
file
You will need to run the Typescript compiler to create the JavaScript files for the backend.
- In the
backend
directory, type
yarn tsc
- This should run the TypeScript complier, which emits JavaScript files to the
dist
folder. - The backend runs from code in the
dist
folder.
To start the backend in development mode (using nodemon):
yarn start:dev
To start the backend without nodemon:
yarn start
You should find the backend app at http://localhost:4000
Open a separate terminal window and cd to the generic_code_challenge_02
directory.
Change to the frontend directory and install the frontend modules:
cd frontend
yarn
Copy the .sample.env
to the .env
file:
cp .sample.env .env
Start the frontend:
yarn start
You should find the frontend app in your browser at http://localhost:3000
You can start the entire project by using Docker. There are a few steps to take, before bringing up the Docker project.
The following steps assume that you have already cloned the repo and are in the generic_code_challenge_02
directory.
First, set up the backend:
cd backend
cp .sample.env .env
Compile the TypeScript for the backend:
yarn tsc
Next, set up the frontend:
cd ../frontend
cp .sample.env .env
Change back to the project root and start the Docker container
cd ..
docker compose up
- You should find the app in your browser at
http://localhost:3000
To stop the Docker container, you can either
docker compose down
in another terminal, or just Ctrl+C in the terminal that is running the container.
- Everything can always be better.
- More / better linting.
- TS, mostly.
- Figure out how to intercept errors sent from the server to Axios, rather than showing the user a generic Axios error.
- Change estimate display layout to grid format, instead of stacking each estimate on top of each other.
- Use TypeScript
<Record>
type. - More / better typing in frontend components (refer to TODO's in files).
- Add UI functionality to allow end user to specify lat / long values and other possible variables.
- Upload Docker container to Dockerhub.
- Replace data fetch in frontend/AppContainer.tsx with useQuery().
- Clean up the minor TODO's in the files.
- Incorporate more API's and combine them using graphQL.
- Logging.
- Tests
- For a project this small, tests are overkill. But it could be a good excercise to build out tests.