{
    "openapi": "3.0.3",
    "info": {
        "title": "Clockora API",
        "version": "2.0.0",
        "description": "Time entries, employees, projects and period totals. Durations are integer minutes. Clockora records hours, never money."
    },
    "servers": [
        {
            "url": "http://clockora.ownware.io"
        }
    ],
    "components": {
        "securitySchemes": {
            "bearer": {
                "type": "http",
                "scheme": "bearer"
            }
        },
        "schemas": {
            "Entry": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "employee_id": {
                        "type": "integer"
                    },
                    "entry_date": {
                        "type": "string",
                        "format": "date"
                    },
                    "method": {
                        "type": "string",
                        "enum": [
                            "clock",
                            "manual"
                        ]
                    },
                    "minutes": {
                        "type": "integer"
                    },
                    "duration": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "draft",
                            "submitted",
                            "approved",
                            "rejected"
                        ]
                    }
                }
            }
        }
    },
    "security": [
        {
            "bearer": []
        }
    ],
    "paths": {
        "/api/ping": {
            "get": {
                "summary": "Verify a key",
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/api/entries": {
            "get": {
                "summary": "List time entries",
                "parameters": [
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "project_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "draft",
                                "submitted",
                                "approved",
                                "rejected"
                            ]
                        }
                    },
                    {
                        "name": "from",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            },
            "post": {
                "summary": "Log time (clock span or manual duration)",
                "responses": {
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "Refused by the same rule the form applies"
                    }
                }
            }
        },
        "/api/entries/{id}": {
            "get": {
                "summary": "One entry",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "404": {
                        "description": "Not found"
                    }
                }
            }
        },
        "/api/entries/{id}/submit": {
            "post": {
                "summary": "Submit for approval",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "409": {
                        "description": "Wrong status"
                    }
                }
            }
        },
        "/api/entries/{id}/approve": {
            "post": {
                "summary": "Approve a submitted entry",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "409": {
                        "description": "Wrong status"
                    }
                }
            }
        },
        "/api/entries/{id}/reject": {
            "post": {
                "summary": "Reject a submitted entry",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "409": {
                        "description": "Wrong status"
                    }
                }
            }
        },
        "/api/employees": {
            "get": {
                "summary": "List employees",
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/api/projects": {
            "get": {
                "summary": "List projects",
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/api/timesheet": {
            "get": {
                "summary": "Period totals by employee and project",
                "parameters": [
                    {
                        "name": "from",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    }
}
