diff --git a/backend/src/api/tutorials.py b/backend/src/api/tutorials.py new file mode 100644 index 00000000..98dd2602 --- /dev/null +++ b/backend/src/api/tutorials.py @@ -0,0 +1,21 @@ +from fastapi import APIRouter +from fastapi.exceptions import HTTPException +import logging as log +from ..db import Database +from ..api_types import CamelModel + +router = APIRouter() + + +class Tutorial(CamelModel): + title: str + + +@router.get("/tutorials", response_model=list[Tutorial]) +def get_all_tutorials(): + return [ + Tutorial(title="Tutorial 1"), + Tutorial(title="Tutorial 2"), + Tutorial(title="Tutorial 3"), + Tutorial(title="Tutorial 4"), + ] diff --git a/backend/src/server.py b/backend/src/server.py index 5ba52c1d..082548e7 100644 --- a/backend/src/server.py +++ b/backend/src/server.py @@ -1,11 +1,11 @@ import os from .setup import disable_cors, init_fastapi_app, serve_endpoints -from .api import users, search, protein +from .api import users, search, protein, tutorials app = init_fastapi_app() disable_cors(app, origins=[os.environ["PUBLIC_FRONTEND_URL"]]) -serve_endpoints(app, modules=[users, search, protein]) +serve_endpoints(app, modules=[users, search, protein, tutorials]) def export_app_for_docker(): diff --git a/frontend/src/Router.svelte b/frontend/src/Router.svelte index 1c4e99d0..e7be4880 100644 --- a/frontend/src/Router.svelte +++ b/frontend/src/Router.svelte @@ -8,6 +8,7 @@ import Protein from "./routes/Protein.svelte"; import Error from "./routes/Error.svelte"; import Edit from "./routes/Edit.svelte"; + import Tutorials from "./routes/Tutorials.svelte"; @@ -19,6 +20,7 @@ + diff --git a/frontend/src/lib/openapi/index.ts b/frontend/src/lib/openapi/index.ts index 010f8998..d793acf7 100644 --- a/frontend/src/lib/openapi/index.ts +++ b/frontend/src/lib/openapi/index.ts @@ -15,6 +15,7 @@ export type { ProteinEntry } from './models/ProteinEntry'; export type { RangeFilter } from './models/RangeFilter'; export type { SearchProteinsBody } from './models/SearchProteinsBody'; export type { SearchProteinsResults } from './models/SearchProteinsResults'; +export type { Tutorial } from './models/Tutorial'; export type { UploadBody } from './models/UploadBody'; export { UploadError } from './models/UploadError'; export type { ValidationError } from './models/ValidationError'; diff --git a/frontend/src/lib/openapi/models/Tutorial.ts b/frontend/src/lib/openapi/models/Tutorial.ts new file mode 100644 index 00000000..ac0512ad --- /dev/null +++ b/frontend/src/lib/openapi/models/Tutorial.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Tutorial = { + title: string; +}; + diff --git a/frontend/src/lib/openapi/services/DefaultService.ts b/frontend/src/lib/openapi/services/DefaultService.ts index 3305c295..db29e7d8 100644 --- a/frontend/src/lib/openapi/services/DefaultService.ts +++ b/frontend/src/lib/openapi/services/DefaultService.ts @@ -8,6 +8,7 @@ import type { LoginResponse } from '../models/LoginResponse'; import type { ProteinEntry } from '../models/ProteinEntry'; import type { SearchProteinsBody } from '../models/SearchProteinsBody'; import type { SearchProteinsResults } from '../models/SearchProteinsResults'; +import type { Tutorial } from '../models/Tutorial'; import type { UploadBody } from '../models/UploadBody'; import type { UploadError } from '../models/UploadError'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -205,4 +206,15 @@ export class DefaultService { }, }); } + /** + * Get All Tutorials + * @returns Tutorial Successful Response + * @throws ApiError + */ + public static getAllTutorials(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/tutorials', + }); + } } diff --git a/frontend/src/routes/Tutorials.svelte b/frontend/src/routes/Tutorials.svelte new file mode 100644 index 00000000..fb27f3b0 --- /dev/null +++ b/frontend/src/routes/Tutorials.svelte @@ -0,0 +1,21 @@ + + +
+ {#each tutorials as tutorial} +
+

{tutorial.title}

+
+ {/each} +
+ +