# SQL Trainer API Documentation :rocket: ## Table of Contents 1. [Return Status](#return-status) 2. [Views](#views) 3. [Authentication API](#authentication-api) 3.1. [Login](#login) 3.2. [Logout](#logout) 4. [User API](#user-api) 5. [Role API](#role-api) 6. [SchemaDef API](#schemadef-api) 7. [TableDef API](#tabledef-api) 8. [ColumnDef API](#columndef-api) 9. [ForeignKeyDef API](#foreignkey-api) 10. [ForeignKeyRelationDef API](#foreignkeyrelation-api) 11. [Task API](#task-api) ## Return Status ### 200 - ok Returned if everything ran as expected. The responses are described for the individual routes. ### 400-403 **Response:** ```json { } ``` ### 404 - not found **Response:** ```json { } ``` ### 500-??? - internal Server Error **Response:** ## Different views Relations in delivered objects are represented differently dependent on the used front end (since the [Trainer App](https://github.com/RDB-Academy/Interface-Module-SQL) and the [Admin App](https://github.com/RDB-Academy/Interface-Module-SQL-Admin) are using different front end libraries, [Ember](https://emberjs.com/) and [React](https://facebook.github.io/react/)). Example-wise, dependent on the front-end, two [TableDef](#tabledef-api) objects with id 2,3 respectively are represented as a relation-list within other objects differently. In the Trainer-App only the ids are represented, ```json [ 2, 3 ] ``` while the Admin App also delivers a list of basic views on the linked objects: ```json [ { "id":2, "name":"table2Name", "columnDefListSize":10, "createdAt":"2017-05-15T17:30:24.468", "modifiedAt":"2017-05-15T17:30:24.574" },{ "id":3, "name":"table3Name", "columnDefListSize":4, "createdAt":"2017-05-15T17:30:24.468", "modifiedAt":"2017-05-15T17:30:24.574" } ] ``` :::info In the Admin App, a basic view on any object contains all but the relational attributes. Also a full view, containing relations, exists for each object. Basic objects are always delivered, when requesting a list of objects. Full objects need to be requested individualy. ::: ## Authentication API ### Login This method... **Required Permission:** Admin, Hiwi, User, Anonymous ++**Request:**++ ``` POST /api/login ``` *Body:* ```json { "email": "test@test.de", "password": "test" } ``` ++**Response:**++ ```json { } ``` ### Logout **Required Permission:** Admin, Hiwi, User ++**Request:**++ ``` DELETE /api/session ``` ++**Response:**++ *HTTP-Status:* ***OK*** ### Validate Session **Required Permission:*** Admin, Hiwi, User **Required:** ``` GET /api/login ``` ## User API ## Role API 0. [Overview](#overview) 1. [Create Role](#create-role) 2. [Get all Role](#get-all-role) 3. [Get a single Role](#get-a-single-role) 4. [Update Role](#update-role) 5. [Delete Role](#delete-role) ### Overview 4 Roles are present in descending rights: - Admin - any permissions - Hiwi - any permissions except Role permissions - User - standard permissions - Anonymous - almost no permissions ### Create Role ### Get all Roles ### Get a single Role ### Update Role ### Delete Role ## SchemaDef API A schemaDef describes an existent Schema. Owns [Tables](#tabledef-api), [ForeignKeys](foreignkey-api) and [Tasks](#task-api). 1. [Create SchemaDef](#create-schemadef) 2. [Get all SchemaDefs](#get-all-schemadefs) 3. [Get a single SchemaDef](#get-a-single-schemadef) 4. [Update SchemaDef](#update-schemadef) 5. [Delete SchemaDef](#delete-schemadef) ### Create SchemaDef **Required Permission:** Admin, Hiwi **Request:** ``` POST /api/schema-defs ``` **Request Body:** | Name | Type | Description | |-----------|---------|-------------------------------| | name | String | Schema Name | | available | Boolean | Availability of the SchemaDef | **Response:** The created [SchemaDef](#get-a-single-schemadef) ### Get all SchemaDefs **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/schema-defs ``` :::info **Parameters:** | Name | Type | Description | |-----------|---------|-------------------------------| | name | String | Schema Name | | available | Boolean | Availability of the SchemaDef | | creator | String | Creator of the SchemaDef | ::: **Response:** Matching [SchemaDef](#get-a-single-schemadef)s ```json [ SchemaDef1, SchemaDef2, ... ] ``` ### Get a Single SchemaDef **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/schema-defs/{:id} ``` **Response:** ```json { "id":1, "name":"SchemaDefName", "available":true, "createdAt":"2017-05-08T15:59:02.93", "modifiedAt":"2017-05-08T15:59:03.014", "tableCount":2, "foreignKeyCount":1, "taskCount":2, "relations": { "tableDefList": [ 4, 5 ], "foreignKeyList": [ 1 ], "taskList": [ 1, 2 ] } } ``` ### Update SchemaDef **Required Permission:** Admin, Hiwi **Request:** ``` PATCH /api/schema-defs ``` **Request Body:** ```json { } ``` **Response:** The updated [SchemaDef](#get-a-single-schemadef) ### Delete SchemaDef **Required Permission:** Admin, Hiwi **Request:** ``` DELETE /api/schema-defs/{:id} ``` **Request Body:** ```json { } ``` **Response:** ## TableDef API A table existent in some schema. Owns [Columns](#columndef-api) and its owning [Schema](#schemadef-api). 1. [Create TableDef](#create-tabledef) 2. [Get all TableDefs](#get-all-tabledefs) 3. [Get a single TableDef](#get-a-single-tabledef) 4. [Update TableDef](#update-tabledef) 5. [Delete TableDef](#delete-tabledef) ### Create TableDef **Required Permission:** Admin, Hiwi **Request:** ``` POST /api/table-defs ``` **Request Body:** ```json { } ``` **Response:** The created [TableDef](#get-a-single-tabledef) ### Get all TableDefs **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/table-defs ``` :::info **Parameters:** | Name | Type | Description | |------------|--------|--------------| | Schema-Def | Number | SchemaDef Id | ::: **Response:** Matching [TableDef](#get-a-single-tabledef)s ```json [ tableDef1, tableDef2, ... ] ``` ### Get a single TableDef **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/table-defs/{:id} ``` **Response:** ```json { } ``` ### Update TableDef **Required Permission:** Admin, Hiwi **Request:** ``` PATCH /api/table-defs/{:id} ``` **Response:** The updated [TableDef](#get-a-single-tabledef) ### Delete TableDef **Required Permission:** Admin, Hiwi **Request:** ``` DELETE /api/table-defs/{:id} ``` **Response:** ``` ``` ## ColumnDef API A column existent in some table. Consists its owning [Table](#tabledef-api) and its owning [ForeignKeyRelation](#foreignkeyrelation-api)s. 1. [Create ColumnDef](#create-columndef) 2. [Get all ColumnDefs](#get-all-columndefs) 3. [Get a single ColumnDef](#get-a-single-columndef) 4. [Update ColumnDef](#update-columndef) 5. [Delete ColumnDef](#delete-columndef) ### Create ColumnDef **Required Permission:** Admin, Hiwi **Request:** ``` POST /api/column-defs ``` **Request Body:** ```json { } ``` **Response:** The created [ColumnDef](#get-a-single-columndef) ### Get all ColumnDefs **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/column-defs ``` :::info **Parameters:** | Name | Type | Description | |-----------|---------|-----------------| | Table-Def | Integer | TableDef Id | ::: **Response:** Matching [ColumnDef](#get-a-single-columndef)s ```json [ ColumnDef1, ColumnDef2, ... ] ``` ### Get a single ColumnDef **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/table-defs/{:id} ``` **Response:** ``` ``` ### Update ColumnDef **Required Permission:** Admin, Hiwi **Request:** ``` PATCH /api/table-defs/{:id} ``` **Response:** The updated [ColumnDef](#get-a-single-columndef) ### Delete ColumnDef **Required Permission:** Admin, Hiwi **Request:** ``` DELETE /api/column-defs/{:id} ``` **Response:** ``` ``` ## ForeignKey API A foreign Key between existing tables in some schema. Consists of (possibly multiple) [ForeignKeyRelation](#foreignkeyrelation-api)s. Also contains the owning [Schema](#schemadef-api). 1. [Create ForeignKey](#create-foreignkey) 2. [Get all ForeignKeys](#get-all-foreignkeys) 3. [Get a single ForeignKey](#get-a-single-foreignkey) 4. [Update ForeignKey](#update-foreignkey) 5. [Delete ForeignKey](#delete-foreignkey) ### Create ForeignKey **Required Permission:** Admin, Hiwi **Request:** ``` POST /api/foreign-keys ``` **Response:** The created [ForeinKey](#get-a-single-foreignkey) ### Get all ForeignKeys **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/foreign-keys ``` :::info **Parameter:** | Name | Type | Description | |-----------|---------|-----------------| | Table-Def | Integer | TableDef Id | ::: **Response:** Matching [ForeinKey](#get-a-single-foreignkey)s ```json [ ForeignKey1, ForeignKey2, ... ] ``` ### Get a single ForeignKey **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/foreign-keys/{:id} ``` **Response:** ``` ``` ### Update ForeignKey **Required Permission:** Admin, Hiwi **Request:** ``` PATCH /api/foreign-keys/{:id} ``` **Response:** The updated [ForeinKey](#get-a-single-foreignkey) ### Delete ForeignKey **Required Permission:** Admin, Hiwi **Request:** ``` DELETE /api/foreign-keys/{:id} ``` **Response:** ``` ``` ## ForeignKeyRelation API Direct Mapping of a source [Column](#column-api) to a foreignKey [Column](#column-api). Also contains the owning [ForeignKey](#foreignkey-api). 1. [Create ForeignKeyRelation](#create-foreignkeyrelation) 2. [Get all ForeignKeyRelations](#get-all-foreignkeyrelations) 3. [Get a single ForeignKeyRelation](#get-a-single-foreignkeyrelation) 4. [Update ForeignKeyRelation](#update-foreignkeyrelation) 5. [Delete ForeignKeyRelation](#delete-foreignkeyrelation) ### Create ForeignkeyRelation **Required Permission:** Admin, Hiwi **Request:** ``` POST /api/foreign-key-relations ``` **Response:** The created [ForeignKeyRelation](#get-a-single-foreignkeyrelation) ### Get all ForeignKeyRelations **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/foreign-key-relations/{:id} ``` :::info **Parameter:** | Name | Type | Description | |-----------|---------|-----------------| | Table-Def | Integer | TableDef Id | ::: **Response:** Matching [ForeinKeyRelation](#get-a-single-foreignkeyrelation)s ```json ForeignKeyRelation1, ForeignKeyRelation2, ... ``` ### Get a single ForeignKeyRelation **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/forreign-key-relation/{:id} ``` **Response:** ``` ``` ### Update ForeignKeyRelation **Required Permission:** Admin, Hiwi **Request:** ``` PATCH /api/foreign-key-relations/{:id} ``` **Response:** The updated [ForeinKeyRelation](#get-a-single-foreignkeyrelation) ### Delete ForeignKeyRelation **Required Permission:** Admin, Hiwi **Request:** ``` DELETE /api/foreign-key-relations/{:id} ``` **Response:** ``` ``` ## Task API A task for the owning [Schema](#schemadef-api). 0. [Different Views](#views) 1. [Create Task](#create-task) 2. [Get all Tasks](#get-all-tasks) 3. [Get a single Task](#get-a-single-task) 4. [Update Task](#update-task) 5. [Delete Task](#delete-task) ### Views Based on Role, Requests will deliver different Views on the data due to solutions of the tasks. For a User, the following task object is delivered. ```json { } ``` Otherwise (Admin, Hiwi) the complete object is deliviered as described in the respective subtopic. ### Create Task **Required Permission:** Admin, Hiwi **Request:** ``` POST /api/tasks ``` **Response:** The created [Task](#get-a-single-task) ### Get All Tasks **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/tasks ``` :::info **Parameters:** | Name | Type | Description | |------------|---------|---------------------| | Task | Integer | TableDef Id | | Difficulty | Integer | TableDef Difficulty | ::: **Response:** Matching [Task](#get-a-single-task)s ```json [ Task1, Task2, ... ] ``` ### Get a single Task **Required Permission:** Admin, Hiwi, User **Request:** ``` GET /api/tasks/{:id} ``` **Response:** ``` ``` ### Update Task **Required Permission:** Admin, Hiwi **Request:** ``` PATCH /api/tasks/{:id} ``` **Response:** The updated [Task](#get-a-single-task) ### Delete Task **Required Permission:** Admin, Hiwi **Request:** ``` DELETE /api/tasks/{:id} ``` **Response:** ``` ```