diff --git a/README.md b/README.md new file mode 100644 index 0000000..55f22e1 --- /dev/null +++ b/README.md @@ -0,0 +1,238 @@ +# Lithium + +Micro-service for file storage and processing written in Go. + +## Features + +- Image processing pipelines for various transformations +- Web API for storing & retrieving files + +## Requirements + +- [Go 1.17+](https://go.dev/) +- [*Docker*](https://docs.docker.com/) (optional) + +## Setup + +#### 1. Clone repository + +```shell +git clone git@gogs.informatik.hs-fulda.de:FabianVowie/Lithium.git +``` + +#### 2. Pull dependencies + +```shell +go get +``` + +#### 3. Build & start application + +```shell +go run . +``` + +**Run using [Docker](https://docs.docker.com/) container** + +```shell +docker run --rm -p 8000:8000 -v "$PWD":/usr/src/lithium -w /usr/src/lithium golang:1.17 go run . +``` + +## Testing + +```shell +go test ./... +``` + +### Run tests in verbose logging mode + +```shell +go test ./... -v +``` + +### Run tests in [Docker](https://docs.docker.com/) container + +```shell +docker run --rm -v "$PWD":/usr/src/lithium -w /usr/src/lithium golang:1.17 go test ./... +``` + +## API + +### `GET` `/` + +Show application information. + +**Required headers**: +```shell +Authorization: Bearer +``` + +**Example response**: + +```json +{ + "name": "Lithium", + "version": "0.1.0" +} +``` + +### `GET` `/{pipeline}` + +Show pipeline information. + +**Required headers**: +```shell +Authorization: Bearer +``` + +**Example response**: + +```json +{ + "name": "example pipeline", + "slug": "example", + "type": 0, + "remove_metadata": false, + "steps": [ + { + "name": "resize image", + "type": 0, + "options": { + "width": 1280, + "height": 720, + "upscale": false + } + } + ], + "output": { + "format": 0, + "quality": 90 + } +} +``` + +## Configuration + +Config options can be adjusted via the [`settings.json`](settings.json) file in the root directory. + +```json +{ + "endpoint": "0.0.0.0:8000", + "token": "changeme", + "storage_provider": { + "type": 0, + "base_path": "assets" + } +} +``` + +## Pipelines + +The project uses a pipeline system defined by [JSON](https://en.wikipedia.org/wiki/JSON) files located in the [config](config) folder. +Take a look at the [example pipeline configuration file](config/example.json). + +Available pipeline `type`s: `0` (Image), `1` (Video) + +```json +{ + "name": "example pipeline", + "slug": "example", + "type": 0, + "removeMetadata": false, + "steps": [], + "output": {} +} +``` + +### Images pipeline + +The image pipeline offers the following additional output options. + +Available `format` types: `0` (jpeg) +The `quality` field can contain any integer between 1 and 100. + +```json +{ + "output": { + "format": 0, + "quality": 90 + } +} +``` + +### Available pipeline steps + +Each pipeline step consists of an optional `name`, a predefined `type` and configurable `options`. +See the available options below for more information. + +```json +{ + "name": "step name", + "type": 0, + "options": {} +} +``` + +#### Resizing images + +Resize an image by a given `width` and `height`. + +**Step definition**: + +```json +{ + "type": 0, + "options": { + "width": 1280, + "height": 720 + } +} +``` + +#### Rotating images + +Rotate an image with a given `angle` in degrees. + +**Step definition**: + +```json +{ + "type": 1, + "options": { + "angle": 90.0 + } +} +``` + +#### Flipping images + +Flip an image with a given direction. +Allowed values for the `direction` option are `"h"` (horizontal), `"v"` (vertical) + +**Step definition**: + +```json +{ + "type": 2, + "options": { + "direction": "h" + } +} +``` + +#### Grayscale + +Convert the colorspace of an image into grayscale. + +**Step definition**: + +```json +{ + "type": 3 +} +``` + +## Authors + +- [Fabian Vowie](https://gogs.informatik.hs-fulda.de/FabianVowie) +- [Roman Zipp](https://gogs.informatik.hs-fulda.de/roman.zipp) diff --git a/config/example.json b/config/example.json index eb65944..f2c773c 100644 --- a/config/example.json +++ b/config/example.json @@ -22,7 +22,10 @@ }, { "name": "flip image", - "type": 2 + "type": 2, + "options": { + "direction": "h" + } }, { "name": "grayscale", diff --git a/lithium.md b/lithium.md deleted file mode 100644 index 6d0ed5c..0000000 --- a/lithium.md +++ /dev/null @@ -1,16 +0,0 @@ -# Lithium - -Micro-service for file storage and processing. - -## Features - -- File storing with various providers - - S3 (or S3 compatible like MinIO) - - Locally (for development purposes) -- File processing "pipelines" for various formats - - Compression, Resizing for images - - Encoding for videos - - Remove metadata (e.g. EXIF) -- File-based configuration for pipelines - - JSON/YAML/TOML? -- Web api to store and retrieve files diff --git a/main.go b/main.go index e8733c1..bac331a 100644 --- a/main.go +++ b/main.go @@ -14,8 +14,8 @@ const Name string = "Lithium" const Version string = "0.1.0" type Metadata struct { - Name string - Version string + Name string `json:"name"` + Version string `json:"version"` } func PipelineHandler(pipeline pipelines.IPipeline, storageProvider storage.IStorageProvider, w http.ResponseWriter, r *http.Request) {