From b63828cc7b1e839681180be214f22e75059cb5a9 Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 2 Feb 2025 03:37:40 +0100 Subject: [PATCH] add tasks to READMEs. Add more TODOs --- src/framework_driver/README.md | 10 +++++++- src/framework_driver/db/db_setup.py | 21 +++------------- src/framework_driver/db/shop.db | Bin 16384 -> 16384 bytes src/framework_driver/ui/src/controller.js | 2 +- src/framework_driver/ui/src/model.js | 2 ++ src/framework_driver/ui/src/view.js | 4 ++- src/interface_adapters/README.md | 10 +++++++- .../controllers/user_controller.py | 23 +++++++++++++++--- .../repositories/sql_product_repository.py | 20 --------------- .../repositories/sql_user_repository.py | 2 +- src/setup_db.py | 2 -- src/use_cases/README.md | 12 ++++++++- .../repositories/user_repository.py | 2 +- 13 files changed, 59 insertions(+), 51 deletions(-) diff --git a/src/framework_driver/README.md b/src/framework_driver/README.md index a484b2d..036875b 100644 --- a/src/framework_driver/README.md +++ b/src/framework_driver/README.md @@ -5,4 +5,12 @@ don’t write much code in this layer, other than glue code that communicates to next circle inward. The frameworks and drivers layer is where all the details go. The web is a detail. The database is a detail. We keep these things on the outside where they can do little -harm. \ No newline at end of file +harm. + +# Aufgabe + +### Anforderungen: + +#### Implementierungen: +- **UI**: Die UI ist ein Framework. Innerhalb der UI ist es möglich ebenfalls Clean Architecture zu verwenden. In diesem Fall wird MVC verwendet. Implementiere die `createUser`-Methode in `conroller.js` um einen User über die UI anzulegen. +- **DB**: Die Datenbank ist ein Driver. Um einen User anlegen zu können wird eine passende Tabelle in der Datenbank benötigt. Lege diese über das `db/db_setup.py` script an. Über `python setup_db.py` in `src` kann die Datenbank neu aufgesetzt werden. \ No newline at end of file diff --git a/src/framework_driver/db/db_setup.py b/src/framework_driver/db/db_setup.py index 5b135e9..f6e2958 100644 --- a/src/framework_driver/db/db_setup.py +++ b/src/framework_driver/db/db_setup.py @@ -31,11 +31,9 @@ def delete_table(conn, table_name): def main(): database = "framework_driver/db/shop.db" - sql_user_table = """CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY, - name TEXT NOT NULL, - email TEXT NOT NULL - )""" + #TODO: Create User Table + sql_user_table = """ + """ sql_product_table = """CREATE TABLE IF NOT EXISTS products ( id INTEGER PRIMARY KEY, @@ -45,29 +43,16 @@ def main(): quantity INTEGER NOT NULL )""" - sql_cart_table = """CREATE TABLE IF NOT EXISTS cart ( - id INTEGER PRIMARY KEY, - user_id INTEGER NOT NULL, - product_id INTEGER NOT NULL, - name TEXT NOT NULL, - quantity INTEGER NOT NULL, - price REAL NOT NULL, - FOREIGN KEY (user_id) REFERENCES users (id), - FOREIGN KEY (product_id) REFERENCES products (id) - )""" - conn = create_connection(database) if conn is not None: # Delete tables if they exist - delete_table(conn, "cart") delete_table(conn, "products") delete_table(conn, "users") # Create tables create_table(conn, sql_user_table) create_table(conn, sql_product_table) - create_table(conn, sql_cart_table) else: print("Error! Cannot create the database connection.") diff --git a/src/framework_driver/db/shop.db b/src/framework_driver/db/shop.db index 1b074fa040d188cb2ad6bc35bdac002433190cf9..977c8b35391055a9b95de38b6e6ff48335d93cd2 100644 GIT binary patch delta 105 zcmZo@U~Fh$oFFY|$H2hA0>sQf%m~CW6LpM%f_i1$ynHhmn0Um&7K2gUQD5zJ~%?lJ_<~3vBFX5ZHu|SiLxiNxivIf5l zBlBce{@pr_oQ&+^;^K^rg(ZneIjN<^sYS(Lg2_3^)iK0XA;i(i$5jC=G&!DEdvYtk z3|DGyVrGs)h-*a14E*=_ckxf-FW)REkj`H(%fiASY3!VnSd^#$CiUDB zb8;L&+Vqn1bCsBZ(zZc~nR%&25K=EZF(a=yGcOOJhKYqi*3zvgF)v%ePY+D%`RN6h kq-G-2C@=!eu?zwV0nGuEdQqimi8)*ds}>0eEHV%P04JYQ+5i9m diff --git a/src/framework_driver/ui/src/controller.js b/src/framework_driver/ui/src/controller.js index 9942ba9..e42671a 100644 --- a/src/framework_driver/ui/src/controller.js +++ b/src/framework_driver/ui/src/controller.js @@ -2,7 +2,7 @@ const Controller = { async createUser(name, email, password){ - //TODO: use model to send request to backend + //TODO: use model to send request to backend, then call View to render response alert('User Creation functionality not implemented.'); }, diff --git a/src/framework_driver/ui/src/model.js b/src/framework_driver/ui/src/model.js index ed6774a..ed6f21c 100644 --- a/src/framework_driver/ui/src/model.js +++ b/src/framework_driver/ui/src/model.js @@ -1,5 +1,7 @@ // Model: Handles data fetching const Model = { + //TODO: Add function to send CreateUserRequest to Backend + async fetchProducts() { const response = await fetch('http://127.0.0.1:8000/view_products'); return response.json(); diff --git a/src/framework_driver/ui/src/view.js b/src/framework_driver/ui/src/view.js index 64ac537..25b085d 100644 --- a/src/framework_driver/ui/src/view.js +++ b/src/framework_driver/ui/src/view.js @@ -1,5 +1,7 @@ - // View: Handles rendering +// View: Handles rendering const View = { + //TODO: Add function to render UserCreateResponse + renderProducts(products) { const main = document.getElementById('main'); main.innerHTML = ` diff --git a/src/interface_adapters/README.md b/src/interface_adapters/README.md index 2108b1b..5abe805 100644 --- a/src/interface_adapters/README.md +++ b/src/interface_adapters/README.md @@ -16,4 +16,12 @@ Also in this layer is any other adapter necessary to convert data from some exte form, such as an external service, to the internal form used by the use cases and entities." -- Robert C. Martin, Clean Architecture -# Aufgabe \ No newline at end of file +# Aufgabe + +### Anforderungen: + +#### Implementierungen: +- **CreateUserRequest, CreateUserResponse**: Diese Objekte werden für die Kommunikation mit Frameworks wie der UI verwendet. Überlege welche Informationen zwischen Frontend und Backend ausgetauscht werden. +- **CreateUserController**: Der Controller ist dafür verantwortlich die Request entgegenzunehmen, zu validieren und in ein passendes Datenformat für das UseCase umzuwandeln. +- **CreateUserPresenter**: Der Presenter implementiert den OutputPort des UseCases. Er ist dafür verantwortlich die Asugabe zu formatieren und in ein Response DTO umzuwandlen. +- **SQLUserRepository**: Das SQLUserRepository implementiert das IUserRepository Interface und verwendet SQL-Statements um Daten aus der Datenbank zu holen und in ein passendes Format für das UseCase zu konvertieren. diff --git a/src/interface_adapters/controllers/user_controller.py b/src/interface_adapters/controllers/user_controller.py index 235b3f3..fa2c9bf 100644 --- a/src/interface_adapters/controllers/user_controller.py +++ b/src/interface_adapters/controllers/user_controller.py @@ -4,13 +4,28 @@ from fastapi.responses import JSONResponse from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates +from pydantic import BaseModel #dependency imports #TODO: use correct dependencies -# Initialize components -#TODO: initialize + +#TODO: define request and response data + +class CreateUserRequest(BaseModel): + pass + +class CreateUserResponse(BaseModel): + pass + +#TODO: implement CreateUserController and CreateUserPresenter + + +#TODO: initialize all components +create_user_controller = None + router = APIRouter() - -#TODO: implement routes for creating and viewing user +@router.get("/create_user", response_model=CreateUserResponse) +async def create_user(request:CreateUserResponse): + return create_user_controller.handle_request() diff --git a/src/interface_adapters/repositories/sql_product_repository.py b/src/interface_adapters/repositories/sql_product_repository.py index 7d9e6a9..d5a0ce9 100644 --- a/src/interface_adapters/repositories/sql_product_repository.py +++ b/src/interface_adapters/repositories/sql_product_repository.py @@ -47,26 +47,6 @@ class SQLProductRepository(IProductRepository): print(e) return [] - def update_product(self, product_id, product_data): - """Update a product's information.""" - sql = "UPDATE products SET name = ?, price = ?, quantity = ? WHERE id = ?" - try: - c = self.conn.cursor() - c.execute(sql, (*product_data, product_id)) - self.conn.commit() - except sqlite3.Error as e: - print(e) - - def delete_product(self, product_id): - """Delete a product by its ID.""" - sql = "DELETE FROM products WHERE id = ?" - try: - c = self.conn.cursor() - c.execute(sql, (product_id,)) - self.conn.commit() - except sqlite3.Error as e: - print(e) - def main(): database = "framework_driver/db/shop.db" diff --git a/src/interface_adapters/repositories/sql_user_repository.py b/src/interface_adapters/repositories/sql_user_repository.py index c877686..53c18ed 100644 --- a/src/interface_adapters/repositories/sql_user_repository.py +++ b/src/interface_adapters/repositories/sql_user_repository.py @@ -14,7 +14,7 @@ class SQLUserRepository(IUserRepository): def add_user(self, user): """Add a new user to the users table and return the new user's id.""" - sql = "INSERT INTO users (name, email) VALUES (?, ?)" + sql = "INSERT INTO users (name, email, password) VALUES (?, ?, ?)" try: c = self.conn.cursor() c.execute(sql, user) diff --git a/src/setup_db.py b/src/setup_db.py index 3e16679..eeb877d 100644 --- a/src/setup_db.py +++ b/src/setup_db.py @@ -1,8 +1,6 @@ from framework_driver.db import db_setup -from interface_adapters.repositories import sql_cart_repository from interface_adapters.repositories import sql_product_repository from interface_adapters.repositories import sql_user_repository db_setup.main() -sql_cart_repository.main() sql_product_repository.main() sql_user_repository.main() \ No newline at end of file diff --git a/src/use_cases/README.md b/src/use_cases/README.md index 52f1d7f..f385d02 100644 --- a/src/use_cases/README.md +++ b/src/use_cases/README.md @@ -10,4 +10,14 @@ We do, however, expect that changes to the operation of the application will aff the use cases and, therefore, the software in this layer. If the details of a use case change, then some code in this layer will certainly be affected." -- Robert C. Martin, Clean Architecture -# Aufgabe \ No newline at end of file +# Aufgabe + +### Anforderungen: + +#### Interfaces: +- **CreateUserInputPort**: Dieses Interface wird durch die execute methode des UseCases implementiert. Dadurch wird der Controller unabhängig von Änderungen im UseCase. Überlege dir welche Daten das UseCase als Input bekommt und definiere ein passendes Interface. +- **CreateUserOutputPort**: Dieses Interface wird vom UseCase verwendet um Daten auszugeben. Es wird durch die present methode des Presenters implementiert. Dadurch wird das UseCase unabhängig vom Presenter. Überlege dir welche daten das UseCase zurück gibt und definiere ein passendes Interface. +- **IUserRepository**: Dieses Interface wird vom UseCase verwendet um Daten aus der Datenbank zu holen. Dadurch wird das UseCase unabhängig von Datenbanken. Überlege dir welche Queries ausgeführt werden müssen und definiere ein passendes Interface. + +#### UseCase +Implementiere einen UseCase zum Erstellen eines Users. Das UseCase sollte den CreateUserInputPort implementieren, das IUserRepository verwenden um mit der Datenbank zu kommunizieren und den CreateUserOutputPort verwenden um Daten auszugeben. \ No newline at end of file diff --git a/src/use_cases/interfaces/repositories/user_repository.py b/src/use_cases/interfaces/repositories/user_repository.py index 3cd9182..d5d7a41 100644 --- a/src/use_cases/interfaces/repositories/user_repository.py +++ b/src/use_cases/interfaces/repositories/user_repository.py @@ -2,4 +2,4 @@ from typing import Optional, List class IUserRepository: pass - #TODO: define interface functions for creating and getting user \ No newline at end of file + #TODO: define interface functions for creating a user \ No newline at end of file