From d26f6b96c9baee358cd2f5d4fac57fcc14ef669e Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 19 Dec 2018 16:41:16 +0000 Subject: [PATCH 1/4] modify docs to reflect new config --- CONTRIBUTING.md | 25 +++++++++++++++++++++++-- README.md | 41 +++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2cab69b..819f3e9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,11 +45,32 @@ WIP ### Before making changes -WIP. Here we'll describe what the expected process and workflow is when making code changes, with regards to branching, forking and so on. +1. If you are a contributor, you will need to create a fork of this repository + on your own GitHub handle, as you will not have commit access to the + forensic architecture repo. +2. Create a new branch from _develop_ (not master or staging). The branch + should be prefixed with 'topic/' if you are intending to submit a feature + ('enhancement' tag in the issue), or with 'fix/' if you are fixing a bug + ('bug' tag in the issue). + +All of your commits go in this branch. When the feature/fix is complete, follow +the instructions below to submit a PR for the branch. ### Submitting changes as Pull Requests -WIP +In order to submit a branch as a PR, you'll need to install the [Travis CLI](https://github.com/travis-ci/travis.rb). The documentation for this is a little shifty: if you're developing on a Mac, you can easily install it with `brew install travis`. The Travis CLI is necessary so that you can encrypt your service account credentials and use them while testing in Travis CI. + +To do this, you need to run one extra command before you push commits +to a remote branch: +``` +npm run travis-encrypt +``` +This command encrypts your private key and service account email in .env in +such a way that they can still be used while running tests on Travis' server. +This command will add a commit to your branch that modifies the binary file +.env.enc, and updates your Travis config accordingly. After running this +command, you should be able to pass the pre-push check and run tests in the +Travis server. ## Additional resources diff --git a/README.md b/README.md index 6a96d26..b5f31b5 100644 --- a/README.md +++ b/README.md @@ -58,21 +58,27 @@ A desaturated Blueprint can be saturated by retrieving its data from the server' A JSON catalogue of the available blueprints (desaturated) in a server is available at `/api/blueprints`. ## [Configuration](#configuration) -Copy the [example.config.js](/src/example.config.js) in the [src](/src) directory into a file named 'config.js'. Modify the options in this file accordingly: +Copy the example environment file: +``` +cp .env.example .env +``` +Inside this file, you will need to modify at least the `SERVICE_ACCOUNT_EMAIL` and `SERVICE_ACCOUNT_PRIVATE_KEY` fields. These fields refer to the credentials of a [Google service account](https://cloud.google.com/iam/docs/understanding-service-accounts). Google requires that developers create these when attempting to access their services programmatically, so that they can attribute requests to users. Service accounts also contain identity information, which means that asset owners can allow certain service accounts access to certain sheets, just as one might differentially grant certain users access to certain cloud assets. -| Option | Description | Type | -| ------- | ----------- | ---- | -| port | The port at which the server will make data available. | integer | -| googleSheets | The configuration object for [Google Sheet](https://www.google.co.uk/sheets/about/) data sources. See the [Sources](#source-google-sheets) section below. | object | +Once you have [created a service account](https://support.google.com/a/answer/7378726?hl=en), create and download an [API key for that account](https://cloud.google.com/iam/docs/creating-managing-service-account-keys). The JSON file for the API key that you download when you create it contains both a service account private key, and an email associated with the service account: add these respectively in the strings in .env for `SERVICE_ACCOUNT_PRIVATE_KEY` and `SERVICE_ACCOUNT_EMAIL`. + +The last thing to do is to grant the service account access to the sheet that +datasheet-server is pulling from. You can add a service account to a sheet as +you would any other Google user: just enter the email address associated. (Note +that this step is not necessary if you are accessing a publicly available +sheet.) + +Other configuration options, such as the port at which the server will expose +resources, are also modifiable from the .env file. #### [Sources](#sources) -###### [Google Sheets](#source-google-sheets) -In order to make the data from a Sheet accessible to the server, you need to [create a service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts). Once created, give the service account email access to each Sheet from which you want to serve data. ('View Only' access is sufficient, as the server never modifies data.) +Sources are specified in [src/sheets_config.js](https://github.com/forensic-architecture/datasheet-server/blob/develop/src/sheets_config.js). Datasheet server currently only supports Google Sheets as a source. -| Option | Description | Type | -| ------ | ----------- | ---- | -| email | The email address of the service account. This is available in the downloadable service account JSON in the `client_email` field. | string | -| privateKey | The private key associated with the service account. This is available in the downloadable service account JSON in the `private_key` field. | string | +###### [Google Sheets](#source-google-sheets) | sheets | A list of objects, one for each sheet that is being used as a source. Each sheet object has a `name` (String), an `id` (String), and a `tabs` (object) field, which are explained below. | object | Each Google Sheet being used as a as source requires a corresponding object in `sheets`. The object should be structured as follows: @@ -88,7 +94,6 @@ Each Google Sheet being used as a as source requires a corresponding object in ` import BP from './lib/blueprinters' export default { - port: 4040, googleSheets: { email: 'project-name@reliable-baptist-23338.iam.gserviceaccount.com', privateKey: 'SOME_PRIVATE_KEY', @@ -97,8 +102,8 @@ export default { name: 'example', id: '1s-vfBR8Uy-B-TLO_C5Ozw4z-L0E3hdP8ohMV761ouRI', tabs: { - 'objects': BP.byRow, - 'fruit': [BP.byRow, BP.byID], + 'objects': BP.rows, + 'fruit': [BP.columns, BP.ids], } }, ] @@ -113,8 +118,12 @@ Clone the repository to your local: ``` git clone https://www.github.com/forensic-architecture/datasheet-server ``` + +Follow the steps in the [configuration](#configuration) section of this +document. + ### Run with Docker -To create a new instance of the server with [Docker](https://www.docker.com/) installed, clone the repository, create a `config.js`, and build the image: +To create a new instance of the server with [Docker](https://www.docker.com/) installed, ensure that you have followed the steps in the quickstart guide above, then and build an image locally. (Note that Docker must be installed): ```sh docker build -t datasheet-server . ``` @@ -152,4 +161,4 @@ If you have any questions or just want to chat, please join our team [fa_open_so ## License -TimeMap is distributed under the MIT License. +Datasheet Server is distributed under the [MIT License](https://github.com/forensic-architecture/datasheet-server/blob/develop/LICENSE). From fd728708af25020a86645800b79f2e6ead4b0802 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 19 Dec 2018 17:52:35 +0000 Subject: [PATCH 2/4] add architecture graphic --- datasheet-server-graphic.jpg | Bin 0 -> 125326 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 datasheet-server-graphic.jpg diff --git a/datasheet-server-graphic.jpg b/datasheet-server-graphic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c45e64efc724b4ec93d7366ee17f5140a597f39c GIT binary patch literal 125326 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

qd!=eVz3^t$6nnk!Q+U-E2XMnGPbRgg@`}x` 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 pw_f|X{NZH%&FsgLPes2u_;Ch5keOfy45x Date: Wed, 19 Dec 2018 17:55:27 +0000 Subject: [PATCH 3/4] add basic architecture doc --- docs/architecture.md | 3 +++ .../datasheet-server-graphic.jpg | Bin 2 files changed, 3 insertions(+) create mode 100644 docs/architecture.md rename datasheet-server-graphic.jpg => docs/datasheet-server-graphic.jpg (100%) diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..9a171dc --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,3 @@ +# Architecture + +![](datasheet-server-graphic.jpg) diff --git a/datasheet-server-graphic.jpg b/docs/datasheet-server-graphic.jpg similarity index 100% rename from datasheet-server-graphic.jpg rename to docs/datasheet-server-graphic.jpg From 8d2c5d261c1a862d27b6d8a86e70849334ab142c Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Thu, 20 Dec 2018 14:15:54 +0000 Subject: [PATCH 4/4] writeup architecture doc --- docs/architecture.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/architecture.md b/docs/architecture.md index 9a171dc..96b39f0 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,3 +1,41 @@ # Architecture ![](datasheet-server-graphic.jpg) + +Datasheet Server uses the architecture diagrammed above to allow effective +management of the sheets it represents. + +It exposes an API with four endpoints: + * `/:sheet/:tab/:resource` - the primary means of accessing data in the + server. The name of a sheet is specified in + [sheets_config.js](https://github.com/forensic-architecture/datasheet-server/blob/develop/src/sheets_config.js#L7). + Each tab on the sheet is in lower case, with spaces replaced by + underscores. The resource name is the same as the name of the blueprinter + specified for the tab is sheets_config.js. + * `/:sheet/:tab/:resource/:id` - when the resource is a list, items in the list + can be accessed individually as well. + * `/update` - when this route is queried with a GET request, each of the + fetchers in the server will update their models from the relevant sheet. + * `/blueprints` - a JSON object that represents all available sheets, tabs, and + resources in the server. + +# Controller +The [controller](https://github.com/forensic-architecture/datasheet-server/blob/develop/src/lib/Controller.js) +manages all of the fetchers in the server. Its `update` triggers the update +mechanisms of all the `update`s in the fetchers it manages. Its `retrieve` and +`retrieveFrag` methods find the appropriate fetcher, and trigger its +respectively named method. Its `bluerprints` method collects the blueprints +from all fetchers, and presents them as a single list. + +# Fetcher +The [fetcher](https://github.com/forensic-architecture/datasheet-server/blob/develop/src/lib/Fetcher.js) +is the most complex component in datasheet server. Its responsiblity is to +interface with a sheet, and store the data from that sheet in a model. It also +makes information from that model available to the controller. + +# Model +The model layer is an [interface](https://github.com/forensic-architecture/datasheet-server/blob/develop/src/models/Interface.js) +that specifies how stored data must be made available to a fetcher. The +implementation of the model layer ([StoreJson](https://github.com/forensic-architecture/datasheet-server/blob/develop/src/models/StoreJson.js) +is one example) determines the time and space complexity of retrieval. +