From 6359ef01653a165dca6519380cb1f671528cdac8 Mon Sep 17 00:00:00 2001 From: Yash Kumar Verma Date: Fri, 29 May 2020 12:26:20 +0530 Subject: [PATCH] Fixes #172: Readne Updated --- README.md | 50 ++++++++++++++++------ docs/illustrations/coding-blocks-logo.png | Bin 0 -> 17880 bytes 2 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 docs/illustrations/coding-blocks-logo.png diff --git a/README.md b/README.md index 5f45ace..8dcc3e1 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,44 @@ -# shortlr2-backend -Source code for backend of Shortlr v2 +

+ Coding Blocks Online

-## Development +

+ + Follow @codingblocksin + +

+ +This is the source code for the URL shortener service for Coding Blocks. It has the backend as well as the frontend combined. With goo.gl having shut down and most unique single word links at bit.ly having run out, we have made cb.lk open for anyone to use. Only one catch - you need to login using a Coding Blocks account. + +## Prerequisites -### Scripts +You will need the following things properly installed on your computer. -#### `yarn start` -Starts the server +- [Git](https://git-scm.com/) +- [Node.js](https://nodejs.org/) +- [Yarn](https://yarnpkg.com/) -#### `yarn lint` -Shows lint errors +## Installation -#### `yarn lint:fix` -Fixes lint error (those that can be auto fixed) +- Clone the repository using `git clone https://github.com/coding-blocks/shortlr2-backend` +- Open the cloned repository `cd shortlr2-backend` +- Create new client credentials on [OneAuth](https://account.codingblocks.com/clients/add) + - Set `domain` as `localhost:3987` + - Set `client ame` as a string to identify this client uniquely + - Set `callback url` as `http://localhost:3987/login/callback` + - Set `default url` as `http://localhost:3987` + - Enter the `ONEAUTH_CLIENT_ID` and `ONEAUTH_CLIENT_SECRET` obtained in `secrets.json` +- Install packages using `yarn install`. + +## Development -#### `yarn test` -Run unit tests +- Start the development version by running `yarn dev` +- Visit [http://localhost:3987](http://localhost:3987). +- To generate coverage reports, run `yarn cover` -#### `yarn cover` -Generate code coverage report +## Production +- Run `yarn start`. This would + - First run linting fixes on application (lint) + - Then transpile the application using typescript (build) + - Then run the tests (test) + - Then launch the application (run) diff --git a/docs/illustrations/coding-blocks-logo.png b/docs/illustrations/coding-blocks-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3005563a574f728cc7080dee7000bfb91f55a99b GIT binary patch literal 17880 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