Skip to content
This repository was archived by the owner on Jan 30, 2020. It is now read-only.
togglyPublic archive

About

Toggly core service

Resources

Stars

0 stars

Watchers

1 watching

Forks

Repository files navigation

Toggly

Build Status Coverage Status Go Report Card Version Docker

Description

Toggle provides service for feature-flag/parameters based applications. Toggly API allows organizing your project configuration as standalone flexible and reliable service.

See GitHub repository for source code.

Features

  • Multiple projects
  • Multiple environments for each project
  • Multiple transports applicable (REST API implemented)
  • Different parameter types (bool, int, string)
  • Flags/Properties inheritance
  • MongoDB as a storage
  • In-memory cache
  • Redis cache

REST API Server

Docker

See Docker Store for details.

Docker Compose

See docker-compose.yml file for details

docker-compose up -d

Docker Run

# Start MongoDB server
docker run -d -v mongo:/data --network toggly --name mongo mongo

# Start Redis server
docker run -d -v redis:/data --network toggly --name redis redis

# Start Toggly server
docker run -it -d --network toggly \
    -p 8080:8080 \
    --name toggly-server \
    toggly/toggly-server \
    --store.mongo.url=mongodb://mongo:27017/toggly \
    --cache.type=redis \
    --cache.redis.url=redis://redis:6379

Parameters

Short Long Environment Default Description
-v --version Show version
-p --port TOGGLY_API_PORT 8080 Port
--base-path TOGGLY_API_BASE_PATH /api Base API Path
--no-logo false Do not show application logo
--store.mongo.url TOGGLY_STORE_MONGO_URL Mongo connection url
--cache.type TOGGLY_CACHE_TYPE Cache type [memory|redis]
--cache.redis.url TOGGLY_CACHE_REDIS_URL Redis connection url
-h --help Show help message

Installation

cd cmd/toggly-server && go install
toggly-server --version

Build Docker image

docker build -t toggly/toggly-server .

REST API

See public OpenAPI specification.

Models

Project model
{
    "owner": "owner1",
    "code": "project1",
    "description": "Project description",
    "status": "active",
    "reg_date": "2018-10-12T23:47:18.967Z"
}

Where:

  • status can be active or disabled
  • reg_date is date in ISO 8601 format
Environment model
{
    "owner": "owner1",
    "project_code": "project1",
    "code": "dev",
    "description": "Development environment",
    "protected": false,
    "reg_date": "2018-10-12T23:47:18.967Z"
}

Where:

  • reg_date is date in ISO 8601 format
Object model
{
    "code": "user",
    "owner": "owner1",
    "project_code": "project1",
    "env_code": "env1",
    "description": "Object 1 description",
    "inherits": {
        "project_code": "project1",
        "env_code": "env1",
        "object_code": "obj0"
    },
    "parameters": [
        {
            "code": "parameter1",
            "description": "Parameter 1",
            "type": "bool",
            "value": false
        }
    ]
}

Where:

  • parameters.type can be boot, int or string
  • parameters.value depends on type

Request headers

Each request has to specify followed headers:

Name Required Description
X-Toggly-Request-Id No Request ID for request tracking. Automatically generated If not specified
X-Toggly-Owner-Id Yes Owner identifier

Project

GET /v1/project - projects list for owner

Response:

[
    {
        "owner": "owner1",
        "code": "project1",
        "description": "Project description",
        "status": "active",
        "reg_date": "2018-10-12T23:47:18.967Z"
    }
]
POST /v1/project - create project

Request:

{
    "code": "project1",
    "description": "Project description",
    "status": "active"
}

Response:

{
    "owner": "owner1",
    "code": "project1",
    "description": "Project description",
    "status": "active",
    "reg_date": "2018-10-12T23:47:18.967Z"
}
PUT /v1/project - update project

Request:

{
    "code": "project1",
    "description": "Project description",
    "status": "active"
}

Response:

{
    "owner": "owner1",
    "code": "project1",
    "description": "Project description",
    "status": "active",
    "reg_date": "2018-10-12T23:47:18.967Z"
}
GET /v1/project/{project_code} - get project information

Response:

{
    "owner": "owner1",
    "code": "project1",
    "description": "Project description",
    "status": "active",
    "reg_date": "2018-10-12T23:47:18.967Z"
}
DELETE /v1/project/{project_code} - delete project

Environment

GET /v1/project/{project_code}/env - environments list for project

Response:

{
  "environments": [
    {
      "owner": "owner1",
      "project_code": "project1",
      "code": "dev",
      "description": "Development environment",
      "protected": false,
      "reg_date": "2018-10-12T23:47:18.967Z"
    }
  ]
}
POST /project/{project_code}/env - create environment

Request:

{
  "code": "dev",
  "description": "Development environment",
  "protected": false
}

Response:

{
  "owner": "owner1",
  "project_code": "project1",
  "code": "dev",
  "description": "Development environment",
  "protected": false,
  "reg_date": "2018-10-12T23:47:18.967Z"
}
PUT /project/{project_code}/env - update environment

Request:

{
  "code": "dev",
  "description": "Development environment",
  "protected": false
}

Response:

{
  "owner": "owner1",
  "project_code": "project1",
  "code": "dev",
  "description": "Development environment",
  "protected": false,
  "reg_date": "2018-10-12T23:47:18.967Z"
}
GET /project/{project_code}/env/{env_code} - get environment information

Response:

{
    "owner": "owner1",
    "project_code": "project1",
    "code": "dev",
    "description": "Development environment",
    "protected": false,
    "reg_date": "2018-10-12T23:47:18.967Z"
}
DELETE /project/{project_code}/env/{env_code} - delete environment

Object

GET /project/{project_code}/env/{env_code}/object - get objects list

Response:

[
    {
        "code": "user",
        "owner": "owner1",
        "project_code": "project1",
        "env_code": "env1",
        "description": "Object 1 description",
        "inherits": {
            "project_code": "project1",
            "env_code": "env1",
            "object_code": "obj0"
        },
        "parameters": [
            {
                "code": "parameter1",
                "description": "Parameter 1",
                "type": "bool",
                "value": false
            }
        ]
    }
]
POST /project/{project_code}/env/{env_code}/object - create object

Request:

{
    "code": "obj1",
    "description": "Object 1 description",
    "inherits": {
        "project_code": "project1",
        "env_code": "env1",
        "object_code": "obj0"
    },
    "parameters": [
        {
            "code": "parameter1",
            "description": "Parameter 1",
            "type": "bool",
            "value": false
        }
    ]
}

Response:

{
    "code": "user",
    "owner": "owner1",
    "project_code": "project1",
    "env_code": "env1",
    "description": "Object 1 description",
    "inherits": {
        "project_code": "project1",
        "env_code": "env1",
        "object_code": "obj0"
    },
    "parameters": [
        {
            "code": "parameter1",
            "description": "Parameter 1",
            "type": "bool",
            "value": false
        }
    ]
}
PUT /project/{project_code}/env/{env_code}/object - create object

Request:

{
    "code": "obj1",
    "description": "Object 1 description",
    "inherits": {
        "project_code": "project1",
        "env_code": "env1",
        "object_code": "obj0"
    },
    "parameters": [
        {
            "code": "parameter1",
            "description": "Parameter 1",
            "type": "bool",
            "value": false
        }
    ]
}

Response:

{
    "code": "user",
    "owner": "owner1",
    "project_code": "project1",
    "env_code": "env1",
    "description": "Object 1 description",
    "inherits": {
        "project_code": "project1",
        "env_code": "env1",
        "object_code": "obj0"
    },
    "parameters": [
        {
            "code": "parameter1",
            "description": "Parameter 1",
            "type": "bool",
            "value": false
        }
    ]
}
GET /project/{project_code}/env/{env_code}/object/{obj_code} - get object information

Response:

{
    "code": "user",
    "owner": "owner1",
    "project_code": "project1",
    "env_code": "env1",
    "description": "Object 1 description",
    "inherits": {
        "project_code": "project1",
        "env_code": "env1",
        "object_code": "obj0"
    },
    "parameters": [
        {
            "code": "parameter1",
            "description": "Parameter 1",
            "type": "bool",
            "value": false
        }
    ]
}
DELETE /project/{project_code}/env/{env_code}/object/{obj_code} - delete object
GET /project/{project_code}/env/{env_code}/object/{obj_code}/inheritors - get all object inheritors as flat list

Response:

[
    {
        "code": "user",
        "owner": "owner1",
        "project_code": "project1",
        "env_code": "env1",
        "description": "Object 1 description",
        "inherits": {
            "project_code": "project1",
            "env_code": "env1",
            "object_code": "obj0"
        },
        "parameters": [
            {
                "code": "parameter1",
                "description": "Parameter 1",
                "type": "bool",
                "value": false
            }
        ]
    }
]

About

Toggly core service

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages