add tasks to READMEs. Add more TODOs

uebung_entities
michael 2025-02-02 03:37:40 +01:00
parent d8ca863c8c
commit b63828cc7b
13 changed files with 59 additions and 51 deletions

View File

@ -5,4 +5,12 @@ dont 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.
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.

View File

@ -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.")

Binary file not shown.

View File

@ -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.');
},

View File

@ -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();

View File

@ -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 = `

View File

@ -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
# 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.

View File

@ -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()

View File

@ -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"

View File

@ -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)

View File

@ -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()

View File

@ -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
# 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.

View File

@ -2,4 +2,4 @@ from typing import Optional, List
class IUserRepository:
pass
#TODO: define interface functions for creating and getting user
#TODO: define interface functions for creating a user