diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b694934 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..5707cef --- /dev/null +++ b/app.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask_restful import Api +from models import db +from controller import LibraryResource, LibraryListResource + +app = Flask(__name__) +api = Api(app) + +#DB confifuration +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///library.db' +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + +db.init_app(app) + +@app.before_request +def create_tables(): + db.create_all() + +api.add_resource(LibraryListResource, '/library') +api.add_resource(LibraryResource, '/library/') + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/controller/_init_.py b/controller/_init_.py new file mode 100644 index 0000000..a6ac0c8 --- /dev/null +++ b/controller/_init_.py @@ -0,0 +1 @@ +from .library_controller import LibraryController \ No newline at end of file diff --git a/controller/library_controller.py b/controller/library_controller.py new file mode 100644 index 0000000..b405f38 --- /dev/null +++ b/controller/library_controller.py @@ -0,0 +1,49 @@ +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 fields"}, 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": "Book deleted successfully"}, 200 + except Exception as e: + db.session.rollback() + return {"error": "Unexpected error occured", "details":str(e)}, 500 + \ No newline at end of file diff --git a/models/_init_.py b/models/_init_.py new file mode 100644 index 0000000..2b42497 --- /dev/null +++ b/models/_init_.py @@ -0,0 +1,5 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + +from .library import Library \ No newline at end of file diff --git a/models/library.py b/models/library.py new file mode 100644 index 0000000..54d157a --- /dev/null +++ b/models/library.py @@ -0,0 +1,15 @@ +from . import db + +class Library(db.model): + _tablename_ = 'library' + + isbn = db.column(db.String(13), primary_key=True) + title = db.column(db.String(255), nullable=False) + author = db.column(db.String(255), nullable=False) + + def to_dict(self): + return{ + "isbn": self.isbn, + "title": self.title, + "author": self.author + } \ No newline at end of file diff --git a/repositiories/_init_.py b/repositiories/_init_.py new file mode 100644 index 0000000..9e068cd --- /dev/null +++ b/repositiories/_init_.py @@ -0,0 +1 @@ +from .library_repository import LibraryRepository \ No newline at end of file diff --git a/repositiories/library_repository.py b/repositiories/library_repository.py new file mode 100644 index 0000000..a20fe56 --- /dev/null +++ b/repositiories/library_repository.py @@ -0,0 +1,38 @@ +from models import Library, db + +class LibraryRepository: + + @staticmethod + def find_all(self): + return Library.query.all() + + @staticmethod + def find_by_id(self, isbn): + return Library.query.get(isbn=isbn).first() + + @staticmethod + def save(self, library): + db.session.add(book) + db.session.commit() + return book + + @staticmethod + def update(self, book): + book = Library.query.get(isbn=isbn) + if not book: + return None + for key, value in book: + if hasattr(book, key): + setattr(book, key, value) + db.session.commit() + return book + + @staticmethod + def delete(self, isbn): + book = Library.query.get(isbn=isbn) + if not book: + return None + + db.session.delete(book) + db.session.commit() + return book diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..beaf3e0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +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 +pytz==2025.2 +six==1.17.0 +SQLAlchemy==2.0.43 +typing_extensions==4.15.0 +Werkzeug==3.1.3 diff --git a/service/_init_.py b/service/_init_.py new file mode 100644 index 0000000..df1e7ab --- /dev/null +++ b/service/_init_.py @@ -0,0 +1,31 @@ +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(book): + book = Library( + isbn = data['isbn'], + title = data['title'], + author = data['author'] + ) + return LibraryRepository.save(book) + + @staticmethod + def update(isbn, data): + book = LibraryRepository.find_by_id(isbn) + book.isbn = data['isbn'] + book.title = data['title'] + book.author = data['author'] + return LibraryRepository.update(book) + + @staticmethod + def delete(isbn): + return LibraryRepository.delete(isbn) \ No newline at end of file diff --git a/service/library_service.py b/service/library_service.py new file mode 100644 index 0000000..f6bf3ff --- /dev/null +++ b/service/library_service.py @@ -0,0 +1 @@ +from .library_service import LibraryService \ No newline at end of file