diff --git a/.github/workflows/open-api-validation.yml b/.github/workflows/open-api-validation.yml new file mode 100644 index 000000000..80c9ef0a1 --- /dev/null +++ b/.github/workflows/open-api-validation.yml @@ -0,0 +1,39 @@ +name: OpenAPI Schema Validation + +on: + push: + paths: + - "openapi/**" + pull_request: + paths: + - "openapi/**" + +jobs: + validate: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x] + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Check file extensions + run: | + shopt -s globstar + for file in openapi/*.yaml; do + if [[ ! "$file" =~ \.yaml$ ]]; then + echo "Error: $file does not have the .yml extension" + exit 1 + fi + done + - name: Validate OpenAPI files + run: | + yarn add swagger-cli + for file in openapi/*.yaml + do + echo "Validating $file" + yarn swagger-cli validate $file --no-color || exit 1 + done \ No newline at end of file diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml new file mode 100644 index 000000000..5ece8720f --- /dev/null +++ b/openapi/openapi.yaml @@ -0,0 +1,58 @@ +openapi: 3.1.0 +info: + version: 1.0.0 + title: Deep Learning Playground Backend API + contact: + email: dlp@datasciencegt.org + url: https://github.com/DSGT-DLP/Deep-Learning-Playground + license: + name: MIT + url: https://github.com/DSGT-DLP/Deep-Learning-Playground/blob/nextjs/LICENSE + description: > + Deep Learning Playground Backend API specifications + +tags: + - name: dataset + description: Everything about dataset + - name: s3 + description: Everything about s3 + - name: test + description: Test API endpoints + - name: trainspace + description: Everything about trainspace +servers: + - url: http://localhost:8000 +paths: + /api/dataset/defaultDataset: + $ref: paths/dataset/defaultDataset.yaml + /api/dataset/getColumnsFromDatasetFile: + $ref: paths/dataset/getColumnsFromDatasetFile.yaml + /api/s3/getExecutionsFilesPresignedUrls: + $ref: paths/s3/getExecutionsFilesPresignedUrls.yaml + /api/s3/getSignedUploadUrl: + $ref: paths/s3/getSignedUploadUrl.yaml + /api/s3/getUserDatasetFilesData: + $ref: paths/s3/getUserDatasetFilesData.yaml + /api/test: + $ref: paths/test/none.yaml + /api/trainspace/create-trainspace: + $ref: paths/trainspace/create-trainspace.yaml + /api/trainspace/getTrainspaceData: + $ref: paths/trainspace/getTrainspaceData.yaml +# components: +# securitySchemes: +# main_auth: +# type: oauth2 +# flows: +# implicit: +# authorizationUrl: http://example.com/api/oauth/dialog +# scopes: +# read:users: read users info +# write:users: modify or remove users +# api_key: +# type: apiKey +# in: header +# name: api_key +# basic_auth: +# type: http +# scheme: basic diff --git a/openapi/paths/dataset/defaultDataset.yaml b/openapi/paths/dataset/defaultDataset.yaml new file mode 100644 index 000000000..f99b7708a --- /dev/null +++ b/openapi/paths/dataset/defaultDataset.yaml @@ -0,0 +1,42 @@ +post: + summary: Default dataset + description: Endpoint to get user selected default dataset for training + tags: + - dataset + requestBody: + content: + application/json: + schema: + type: object + required: + - using_default_dataset + properties: + using_default_dataset: + type: string + description: dataset selected for training + example: + using_default_dataset: "IRIS" + required: true + responses: + "200": + description: Dataset selected successfully + content: + application/json: + schema: + type: object + properties: + columns: + type: array + example: [col1, col2, col3] + "400": + description: Dataset wasn't selected properly. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated" diff --git a/openapi/paths/dataset/getColumnsFromDatasetFile.yaml b/openapi/paths/dataset/getColumnsFromDatasetFile.yaml new file mode 100644 index 000000000..336aaa998 --- /dev/null +++ b/openapi/paths/dataset/getColumnsFromDatasetFile.yaml @@ -0,0 +1,52 @@ +post: + summary: Get columns from dataset file + description: "API Endpoint to retrieve columns from a user uploaded dataset file (eg: column names for a CSV file)" + tags: + - dataset + requestBody: + content: + application/json: + schema: + type: object + required: + - uid + - data_source + - name + properties: + uid: + type: string + description: User Id + data_source: + type: string + description: "What type of training was the user running (eg: TABULAR, PRETRAINED, OBJECT_DETECTION, IMAGE, etc)" + name: + type: string + description: Name of dataset file + example: + uid: "1234" + data_source: "TABULAR" + name: "data.csv" + required: true + responses: + "200": + description: Columns Fetched Successfully + content: + application/json: + schema: + type: object + properties: + columns: + type: array + example: [col1, col2, col3] + "400": + description: Dataset columns weren't selected properly. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated" diff --git a/openapi/paths/s3/getExecutionsFilesPresignedUrls.yaml b/openapi/paths/s3/getExecutionsFilesPresignedUrls.yaml new file mode 100644 index 000000000..6cddebcf3 --- /dev/null +++ b/openapi/paths/s3/getExecutionsFilesPresignedUrls.yaml @@ -0,0 +1,42 @@ +post: + summary: Get S3 Presigned URLs for result files + description: API Endpoint to use S3 Presigned URLs to retrieve result files from S3 given an execution id + tags: + - s3 + requestBody: + content: + application/json: + schema: + type: object + required: + - exec_id + properties: + exec_id: + type: string + description: The execution id + example: + exec_id: "1234" + required: true + responses: + "200": + description: Result files for your execution fetched successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Result file fetch successful" + "400": + description: Result file fetch didn't go through successfully. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated" diff --git a/openapi/paths/s3/getSignedUploadUrl.yaml b/openapi/paths/s3/getSignedUploadUrl.yaml new file mode 100644 index 000000000..95d07739c --- /dev/null +++ b/openapi/paths/s3/getSignedUploadUrl.yaml @@ -0,0 +1,52 @@ +post: + summary: Get Signed Upload URL + description: Endpoint to upload files to S3 + tags: + - s3 + requestBody: + content: + application/json: + schema: + type: object + required: + - version + - filename + - file + properties: + version: + type: integer + description: The file version + filename: + type: string + description: The name of the file + file: + type: object + description: the file + example: + version: 2 + filename: "file" + file: { "col1": [val1, val2], "col2": [val3, val4] } + required: true + responses: + "200": + description: Data uploaded successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Upload successful" + "400": + description: Upload didn't go through successfully. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated" diff --git a/openapi/paths/s3/getUserDatasetFilesData.yaml b/openapi/paths/s3/getUserDatasetFilesData.yaml new file mode 100644 index 000000000..3581217f0 --- /dev/null +++ b/openapi/paths/s3/getUserDatasetFilesData.yaml @@ -0,0 +1,43 @@ +post: + summary: Get User Dataset Files + description: API Endpoint to retrieve all user dataset files uploaded in S3 + tags: + - s3 + requestBody: + content: + application/json: + schema: + type: object + required: + - uid + - data_source + properties: + uid: + type: string + description: User ID + data_source: + type: string + description: "What type of training was the user running (eg: TABULAR, PRETRAINED, OBJECT_DETECTION, IMAGE, etc)" + responses: + "200": + description: User Dataset files for user fetched successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "User Dataset file fetch successful" + "400": + description: User Dataset files for user wasn't fetched successfully. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated" diff --git a/openapi/paths/test/none.yaml b/openapi/paths/test/none.yaml new file mode 100644 index 000000000..695d483bc --- /dev/null +++ b/openapi/paths/test/none.yaml @@ -0,0 +1,16 @@ +get: + summary: Test Backend alive + description: A simple endpoint to test if our backend is alive + tags: + - test + responses: + 200: + description: Test Backend alive + content: + application/json: + schema: + type: object + properties: + Status: + type: string + example: "Backend is alive" diff --git a/openapi/paths/trainspace/create-trainspace.yaml b/openapi/paths/trainspace/create-trainspace.yaml new file mode 100644 index 000000000..0cd402810 --- /dev/null +++ b/openapi/paths/trainspace/create-trainspace.yaml @@ -0,0 +1,42 @@ +post: + summary: Create Trainspace + description: API Endpoint to create a "trainspace". Trainspace is a new concept/data structure we introduce to track user's training requests. Concept similar to execution_id. + tags: + - trainspace + requestBody: + content: + application/json: + schema: + type: object + required: + - uid + properties: + uid: + type: string + description: User ID + example: + uid: "1234" + required: true + responses: + "200": + description: Trainspace created successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Trainspace Creation successful" + "400": + description: Trainspace Creation didn't go through successfully. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated" diff --git a/openapi/paths/trainspace/getTrainspaceData.yaml b/openapi/paths/trainspace/getTrainspaceData.yaml new file mode 100644 index 000000000..0911a3a3b --- /dev/null +++ b/openapi/paths/trainspace/getTrainspaceData.yaml @@ -0,0 +1,42 @@ +post: + summary: Get Trainspace Data + description: API Endpoint to identify all trainspaces for a given user id. + tags: + - trainspace + requestBody: + content: + application/json: + schema: + type: object + required: + - uid + properties: + uid: + type: string + description: User ID + example: + uid: "1234" + required: true + responses: + "200": + description: Able to query and retrieve trainspace objects belonging to a user + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Trainspace Retrieval Successful" + "400": + description: Trainspace Retrieval didn't go through successfully. This is usually something wrong with your code + "401": + description: User is not authenticated + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "User is not authenticated"