Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions flask-library/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.venv

__pycache__/
*.pyc
27 changes: 27 additions & 0 deletions flask-library/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from flask import Flask
from flask_restful import Api
from models import db
from controller import LibraryResource, LibraryListResource

#using mysql instead of sql lite
import pymysql

pymysql.install_as_MySQLdb()

app = Flask(__name__)
api = Api(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:C0nf!d3nt@localhost/flask_library'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db.init_app(app)

@app.before_request
def create_tables():
db.create_all()

api.add_resource(LibraryListResource, '/api/library')
api.add_resource(LibraryResource, '/api/library/<string:isbn>')

if __name__ == '__main__':
app.run(debug=True)
1 change: 1 addition & 0 deletions flask-library/controller/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .library_controller import LibraryListResource, LibraryResource
50 changes: 50 additions & 0 deletions flask-library/controller/library_controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from flask_restful import Resource
from flask import request
from service import LibraryService
from models import db

class LibraryListResource(Resource):
def get(self):
books = LibraryService.get_all()
return [book.to_dict() for book in books], 200

def post(self):
try:
data = request.get_json()

if 'isbn' not in data or 'title' not in data or 'author' not in data:
return {'message': "ISBN, title, and author are required"}, 400

book = LibraryService.create(data)
return book.to_dict(), 201
except Exception as e:
db.session.rollback()
return {"error": "Unexpected error occured", "details": str(e)}, 500

class LibraryResource(Resource):
def get(self, isbn):
book = LibraryService.get_by_id(isbn)
if not book:
return {"message": "Book not found"}, 404
return book.to_dict(), 200

def put(self, isbn):
try:
data = request.get_json()
book = LibraryService.update(isbn, data)
if not book:
return {"message": "Book not found"}, 404
return book.to_dict(), 200
except Exception as e:
db.session.rollback()
return {"error": "Unexpected error occured", "details": str(e)}, 500

def delete(self, isbn):
try:
book = LibraryService.delete(isbn)
if not book:
return {"message": "Book not found"}, 404
return {"message": f"Book with ISBN {isbn} deleted"}, 200
except Exception as e:
db.session.rollback()
return {"error": "Unexpected error occured", "details": str(e)}, 500
5 changes: 5 additions & 0 deletions flask-library/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

from .library import Library
17 changes: 17 additions & 0 deletions flask-library/models/library.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from . import db

class Library(db.Model):

# kung library ang tablename sa mysql mag error
__tablename__ = 'books_library'

isbn = db.Column(db.String(13), primary_key=True)
title = db.Column(db.String(80), nullable=False)
author = db.Column(db.String(80), nullable=False)

def to_dict(self):
return {
"isbn": self.isbn,
"title": self.title,
"author": self.author
}
1 change: 1 addition & 0 deletions flask-library/repositories/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .library_repository import LibraryRepository
39 changes: 39 additions & 0 deletions flask-library/repositories/library_repository.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from models import Library, db

class LibraryRepository:
@staticmethod
def find_all():
return Library.query.all()

@staticmethod
def find_by_id(isbn):
return Library.query.get(isbn)

@staticmethod
def save(book):
db.session.add(book)
db.session.commit()
return book

@staticmethod
def update(isbn, data: dict):
book = Library.query.get(isbn)
if not book:
return None

for key, value in data.items():
if hasattr(book, key):
setattr(book, key, value)

db.session.commit()
return book

@staticmethod
def delete(isbn):
book = Library.query.get(isbn)
if not book:
return None

db.session.delete(book)
db.session.commit()
return book
17 changes: 17 additions & 0 deletions flask-library/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
aniso8601==10.0.1
blinker==1.9.0
click==8.3.0
colorama==0.4.6
Flask==3.1.2
Flask-RESTful==0.3.10
Flask-SQLAlchemy==3.1.1
greenlet==3.2.4
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.2
PyMySQL==1.1.2
pytz==2025.2
six==1.17.0
SQLAlchemy==2.0.43
typing_extensions==4.15.0
Werkzeug==3.1.3
1 change: 1 addition & 0 deletions flask-library/service/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .library_service import LibraryService
29 changes: 29 additions & 0 deletions flask-library/service/library_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from repositories import LibraryRepository
from models import Library

class LibraryService:
@staticmethod
def get_all():
return LibraryRepository.find_all()

@staticmethod
def get_by_id(isbn):
return LibraryRepository.find_by_id(isbn)

@staticmethod
def create(data):
book = Library(
isbn = data['isbn'],
title = data['title'],
author = data['author']
)

return LibraryRepository.save(book)

@staticmethod
def update(isbn, data):
return LibraryRepository.update(isbn, data)

@staticmethod
def delete(isbn):
return LibraryRepository.delete(isbn)