diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app.py b/app.py new file mode 100644 index 0000000..6104bec --- /dev/null +++ b/app.py @@ -0,0 +1,13 @@ +from services import (UserService, UserListService) +from config import app, api, docs, CORS + +#*______________ Service Registration ______________ +api.add_resource(UserService, '/api/user/') +docs.register(UserService) +api.add_resource(UserListService, '/api/list/user') +docs.register(UserListService) +#*______________ Application Creation ______________ +if __name__ == '__main__': + app.run(debug=True) + + diff --git a/config.py b/config.py new file mode 100644 index 0000000..4d75670 --- /dev/null +++ b/config.py @@ -0,0 +1,40 @@ +from flask import Flask +from flask_restful import Api +from apispec import APISpec +from apispec.ext.marshmallow import MarshmallowPlugin +from flask_apispec.extension import FlaskApiSpec +from flask_marshmallow import Marshmallow +from flask_sqlalchemy import SQLAlchemy +from flask_cors import CORS +#!______________ App Setup _____________ _ +app = Flask(__name__, static_url_path='/static') +api_v1_cors_config = { + "origins": ["http://localhost:5000"] +} + +#!______________ CORS Setup _____________ _ +CORS(app, resources={"/api/*": api_v1_cors_config}) + +#!______________ DB Setup ______________ +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///markdown.db' +app.config['SECRET_KEY'] = 'InputSecretKeyHere' +db = SQLAlchemy(app) + +#!______________ Marshmallow Setup ______________ +ma = Marshmallow(app) + +#!______________ API & Swagger Setup ______________ +api = Api(app) +app.config.update({ + 'APISPEC_SPEC': APISpec( + title='Markdown Presenter', + version='v0.0.1', + plugins=[MarshmallowPlugin()], + openapi_version='2.0.0' + ), + 'APISPEC_SWAGGER_URL': '/swagger/', + 'APISPEC_SWAGGER_UI_URL': '/swagger-ui/' +}) + +#!______________ Docs Setup ______________ +docs = FlaskApiSpec(app) \ No newline at end of file diff --git a/models.py b/models.py new file mode 100644 index 0000000..5ac9c7b --- /dev/null +++ b/models.py @@ -0,0 +1,10 @@ +from config import db + +#!______________ DB Models ______________ +class User(db.Model): + __tablename__ = "User" + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(50)) + image = db.Column(db.String()) + description = db.Column(db.String()) + diff --git a/rebuild_db.py b/rebuild_db.py new file mode 100644 index 0000000..2c56232 --- /dev/null +++ b/rebuild_db.py @@ -0,0 +1,18 @@ +import os +from config import db +from termcolor import colored +from config import app + +def RebuildDatabase(): + if os.path.exists('acceth.db'): + print(colored('Removing existing DB', 'blue')) + os.remove('acceth.db') + + with app.app_context(): + db.create_all() + db.session.commit() + + print(colored('New DB created.', 'green')) + +if __name__ == '__main__': + RebuildDatabase() \ No newline at end of file diff --git a/schemes.py b/schemes.py new file mode 100644 index 0000000..7f180fd --- /dev/null +++ b/schemes.py @@ -0,0 +1,25 @@ +from marshmallow_sqlalchemy import SQLAlchemyAutoSchema +from config import db +from models import User +from marshmallow import fields + +#*______________ Base Schema ______________ +class BaseScheme(SQLAlchemyAutoSchema): + def __str__(self): + return str(self.__class__) + ": " + str(self.__dict__) + class Meta: + ordered = True + sqla_session = db.session + include_fk = True + load_instance = True + +#*______________ User Schemes ______________ +class UserSchema(BaseScheme): + class Meta(BaseScheme.Meta): + model = User + id = fields.Int() + name = fields.Str() +class UserInsertSchema(UserSchema): + user_id = fields.Int() +class UserResponseSchema(UserSchema): + name = fields.Str() \ No newline at end of file diff --git a/services.py b/services.py new file mode 100644 index 0000000..70568ed --- /dev/null +++ b/services.py @@ -0,0 +1,46 @@ +from flask_apispec import marshal_with, doc, use_kwargs +from flask_apispec.views import MethodResource +from flask_restful import Resource +from schemes import (UserSchema, UserResponseSchema) +from config import db +from models import User + +#!______________ User ______________ +class UserService(MethodResource, Resource): + @doc(description='Get User by User_id', tags=['User']) + @marshal_with(UserResponseSchema) + def get(self, user_id): + quser = db.session.query(User).get(user_id) + return UserSchema().dump(quser) + + @doc(description='Add new User', tags=['User']) + @use_kwargs(UserSchema, location=('json')) + @marshal_with(UserResponseSchema()) + def post(self, user, user_id): + db.session.add(user) + db.session.commit() + return UserSchema().dump(user) + + @doc(description='Update User with PUT', tags=['User']) + @use_kwargs(UserSchema, location=('json')) + @marshal_with(UserResponseSchema()) + def put(self, user, user_id): + db.session.add(user) + db.session.commit() + return UserSchema().dump(user) + + @doc(description='Delete existing User', tags=['User']) + @use_kwargs(UserSchema, location=('json')) + @marshal_with(UserResponseSchema()) + def delete(self, user, user_id): + user = db.session.query(User).get(user_id) + db.session.delete(user) + db.session.commit() + return UserSchema().dump(user) + +class UserListService(MethodResource, Resource): + @doc(description='Get a List of all User', tags=['List']) + @marshal_with(UserResponseSchema(many=True)) + def get(self): + users = db.session.query(User).all() + return UserSchema(many=True).dump(users) \ No newline at end of file diff --git a/wsgi.py b/wsgi.py new file mode 100644 index 0000000..0ad1c54 --- /dev/null +++ b/wsgi.py @@ -0,0 +1,5 @@ +from config import app + +if __name__ == "__main__": + app.run() +