Skip to content

Commit 2e05bce

Browse files
commit
0 parents  commit 2e05bce

File tree

5 files changed

+308
-0
lines changed

5 files changed

+308
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__pycache__

controller/book_controller.py

+146
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
from http import HTTPStatus
2+
from flask import Flask, jsonify, request # Flask library for build apis
3+
from entity.book import Book
4+
from log.log_app import LogApp
5+
from service.book_service import BookService
6+
7+
log = LogApp(__file__)
8+
9+
class BookController:
10+
11+
__app: Flask
12+
__baseUrl: str = "/api/book"
13+
__bookService: BookService
14+
15+
def __init__(self):
16+
self.__bookService = BookService()
17+
##### *** these functions below @__app.route(...) it works auto
18+
self.__app = Flask(__name__)
19+
self.__httpGetBlock()
20+
self.__httpPostBlock()
21+
self.__httpPutBlock()
22+
self.__httpDeleteBlock()
23+
self.__app.run(host='localhost', port=8080) # start sever
24+
25+
def __httpGetBlock(self):
26+
log.app.debug("http get methods work")
27+
@self.__app.route(f"{self.__baseUrl}/server", methods=['GET'])
28+
def testServer():
29+
return jsonify({
30+
'status': HTTPStatus.OK,
31+
'data': 'hello world'
32+
}), HTTPStatus.OK
33+
34+
@self.__app.route(f"{self.__baseUrl}/reads", methods=['GET'])
35+
@self.__app.route(f"{self.__baseUrl}/", methods=['GET'])
36+
def reads():
37+
return jsonify({
38+
'status': HTTPStatus.OK,
39+
# 'data' : Student(id, 'Alex Owner').__dict__ #.__dir__ return json format
40+
'data': self.__bookService.getBookList()
41+
}), HTTPStatus.OK
42+
43+
@self.__app.route(f"{self.__baseUrl}/read", methods=['GET'])
44+
def read():
45+
id = int(request.args.get('id')) # get parameter on uri
46+
return jsonify({
47+
'status': HTTPStatus.OK,
48+
'data': self.__bookService.getBookById(id)
49+
}), HTTPStatus.OK
50+
51+
def __httpPostBlock(self):
52+
log.app.debug("http post methods work")
53+
54+
@self.__app.route(f"{self.__baseUrl}/create", methods=['POST'])
55+
def create():
56+
# content type is application/json
57+
name: str = request.json['name']
58+
amount: int = int(request.json['amount'])
59+
price: float = float(request.json['price'])
60+
status: bool = bool(request.json['status'])
61+
des: str = request.json['des']
62+
book = Book(0, name, amount, price, status, des)
63+
log.app.debug("book already creates %s",book)
64+
return jsonify({
65+
'status': HTTPStatus.CREATED,
66+
'data': self.__bookService.saveBook(book)
67+
}), HTTPStatus.CREATED
68+
69+
@self.__app.route(f"{self.__baseUrl}/create.form", methods=['POST'])
70+
def createForm():
71+
# content type is form-data
72+
name: str = request.form.get('name')
73+
amount: int = int( request.form.get('amount'))
74+
price: float = float( request.form.get('price'))
75+
status: bool = bool( request.form.get('status'))
76+
des: str = request.form.get('des')
77+
book = Book(0, name, amount, price, status, des)
78+
log.app.debug("book already creates %s",book)
79+
return jsonify({
80+
'status': HTTPStatus.CREATED,
81+
'data': self.__bookService.saveBook(book)
82+
}), HTTPStatus.CREATED
83+
84+
def __httpPutBlock(self):
85+
log.app.debug("http put methods work")
86+
@self.__app.route(f"{self.__baseUrl}/update", methods=['PUT'])
87+
def update():
88+
# content type is application/json
89+
id = int(request.args.get('id'))
90+
name: str = request.json['name']
91+
amount: int = int(request.json['amount'])
92+
price: float = float(request.json['price'])
93+
status: bool = bool(request.json['status'])
94+
des: str = request.json['des']
95+
book = Book(0, name, amount, price, status, des)
96+
97+
log.app.debug("book id %d already updates %s",id,book)
98+
99+
return jsonify({
100+
'status': HTTPStatus.ACCEPTED,
101+
'data': self.__bookService.editBookById(id,book)
102+
}), HTTPStatus.ACCEPTED
103+
104+
@self.__app.route(f"{self.__baseUrl}/update.form", methods=['PUT'])
105+
def updateForm():
106+
# content type is form-data
107+
id = int(request.args.get('id'))
108+
name: str = request.form.get('name')
109+
amount: int = int( request.form.get('amount'))
110+
price: float = float( request.form.get('price'))
111+
status: bool = bool( request.form.get('status'))
112+
des: str = request.form.get('des')
113+
book = Book(0, name, amount, price, status, des)
114+
log.app.debug("book id %d already updates %s",id,book)
115+
116+
return jsonify({
117+
'status': HTTPStatus.ACCEPTED,
118+
'data': self.__bookService.editBookById(id,book)
119+
}), HTTPStatus.ACCEPTED
120+
121+
def __httpDeleteBlock(self):
122+
log.app.debug("http delete methods work")
123+
@self.__app.route(f"{self.__baseUrl}/delete", methods=['DELETE'])
124+
def delete():
125+
# content type is application/json
126+
id = int(request.args.get('id'))
127+
128+
log.app.debug("book id %d already deletes",id,)
129+
130+
return jsonify({
131+
'status': HTTPStatus.ACCEPTED,
132+
'data': self.__bookService.removeBookById(id)
133+
}), HTTPStatus.ACCEPTED
134+
135+
@self.__app.route(f"{self.__baseUrl}/delete.form", methods=['DELETE'])
136+
def deleteForm():
137+
# content type is form-data
138+
id = int(request.args.get('id'))
139+
log.app.debug("book id %d already deletes",id,)
140+
141+
return jsonify({
142+
'status': HTTPStatus.ACCEPTED,
143+
'data': self.__bookService.removeBookById(id)
144+
}), HTTPStatus.ACCEPTED
145+
146+
BookController()

entity/book.py

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from dataclasses import dataclass
2+
# from log.log_app import LogApp
3+
4+
"""
5+
use @dataclass, which automatically generates
6+
__init__(), __repr__(), __str__(),
7+
and more. You just need to add a @dataclass
8+
result of __str__ or __dict__ are
9+
{
10+
"_Book__amount": 1500,
11+
"_Book__des": "Java is a high-level...",
12+
"_Book__id": 1,
13+
"_Book__name": "Java Core 2023",
14+
"_Book__price": 300,
15+
"_Book__status": true
16+
}
17+
"""
18+
@dataclass
19+
class Book:
20+
21+
__id: int
22+
__name: str
23+
__amount: int
24+
__price: float
25+
__status: bool
26+
__des: str
27+
28+
@property
29+
def name(self):
30+
return self.__name
31+
32+
@name.setter
33+
def name(self, value):
34+
self.__name = value
35+
36+
@property
37+
def amount(self):
38+
return self.__amount
39+
40+
@amount.setter
41+
def amount(self, value):
42+
self.__amount = value
43+
44+
@property
45+
def price(self):
46+
return self.__price
47+
48+
@price.setter
49+
def price(self, value):
50+
self.__price = value
51+
52+
@property
53+
def des(self):
54+
return self.__des
55+
56+
@des.setter
57+
def des(self, value):
58+
self.__des = value
59+
60+
@property
61+
def id(self):
62+
return self.__id
63+
64+
@id.setter
65+
def id(self, value):
66+
self.__id = value
67+
68+
@property
69+
def status(self):
70+
return self.__status
71+
72+
@status.setter
73+
def status(self, value):
74+
self.__status = value
75+
76+
77+
78+
79+
80+
#log = LogApp(__file__)
81+
#log.app.debug(Book(1,'Java Core 2023',1500,300.00,True,'Java is a high-level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.').__str__())

log/log_app.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import logging
2+
3+
class LogApp :
4+
def __init__(self,filename):
5+
self.app = logging.getLogger(filename)
6+
# create logger
7+
self.app = logging.getLogger(filename)
8+
# set log level
9+
self.app.setLevel(logging.DEBUG)
10+
# set log format
11+
consoleHandler = logging.StreamHandler()
12+
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s - %(message)s')
13+
consoleHandler.setFormatter(formatter)
14+
self.app.addHandler(consoleHandler)
15+
16+
# LogApp(__file__).app.debug("Test")

service/book_service.py

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from entity.book import Book
2+
# from log.log_app import LogApp
3+
4+
class BookService :
5+
6+
__bookList : list[Book]
7+
8+
def __init__(self):
9+
self.__bookList : list[Book] = []
10+
self.__bookList.insert(0,Book(1,'Java Core 2023',1500,300.00,True,'Java is a high-level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.'))
11+
self.__bookList.insert(1,Book(2,'Python Core 2023',1500,350.00,True,'Python is a high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation.'))
12+
self.__bookList.insert(2,Book(3,'C++ Core 2023',1500,300.00,True,'C++ is an object-oriented programming (OOP) language that is viewed by many as the best language for creating large-scale applications.'))
13+
14+
def getBookList(self):
15+
return self.__bookList
16+
17+
def getBookById(self,id:int):
18+
for book in self.__bookList:
19+
if book.id == id :
20+
return book
21+
return None # None is null
22+
23+
def saveBook(self,book:Book):
24+
size = len(self.__bookList)
25+
# not a good logic
26+
lastBook : Book = self.__bookList[-1] # get last element
27+
book.id = lastBook.id + 1
28+
self.__bookList.insert(int(size),book)
29+
return size is not len(self.__bookList)
30+
31+
def editBookById(self,id:int,book:Book):
32+
for bookHold in self.__bookList:
33+
if bookHold.id == id :
34+
bookHold.name = book.name
35+
bookHold.price = book.price
36+
bookHold.des = book.des
37+
bookHold.amount = book.amount
38+
bookHold.status = book.status
39+
return True
40+
return False
41+
42+
def removeBookById(self,id:int):
43+
for bookHold in self.__bookList:
44+
if bookHold.id == id :
45+
self.__bookList.remove(bookHold)
46+
return True
47+
return False
48+
49+
"""for book in BookService().getBookList():
50+
log.app.debug(book)
51+
52+
log.app.debug(BookService().getBookById(5))
53+
54+
log.app.debug(BookService().saveBook(Book(1,'Java Core 2023',1500,300.00,True,'Java is a high-level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.')))
55+
"""
56+
57+
"""
58+
bookService = BookService()
59+
60+
log.app.debug(bookService.getBookById(1))
61+
62+
log.app.debug(bookService.editBookById(1,Book(1,'Java Core 2025',1900,300.00,True,'Java is a high-level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.')))
63+
64+
log.app.debug(bookService.getBookById(1))"""

0 commit comments

Comments
 (0)