Sign inSign up

toggly/toggly-server

By toggly

•Updated almost 8 years ago

Toggly REST API Server

Image
1

199

toggly/toggly-server repository overview

⁠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
ShortLongEnvironmentDefaultDescription
-v--versionShow version
-p--portTOGGLY_API_PORT8080Port
--base-pathTOGGLY_API_BASE_PATH/apiBase API Path
--no-logofalseDo not show application logo
--store.mongo.urlTOGGLY_STORE_MONGO_URLMongo connection url
--cache.typeTOGGLY_CACHE_TYPECache type [memory|redis]
--cache.redis.urlTOGGLY_CACHE_REDIS_URLRedis connection url
-h--helpShow 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:

NameRequiredDescription
X-Toggly-Request-IdNoRequest ID for request tracking. Automatically generated If not specified
X-Toggly-Owner-IdYesOwner 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
            }
        ]
    }
]

Tag summary

Content type

Image

Digest

Size

7.8 MB

Last updated

almost 8 years ago

docker pull toggly/toggly-server