add tasks to READMEs. Add more TODOs
parent
d8ca863c8c
commit
b63828cc7b
|
|
@ -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.
|
||||
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.
|
||||
|
|
@ -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.
|
|
@ -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.');
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 = `
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue