From 568ca7ddc23e6c6d988684c9d81ba17500da51df Mon Sep 17 00:00:00 2001 From: jerick Date: Sun, 3 Sep 2023 02:16:12 +0000 Subject: [PATCH] Initial Commit --- main.py | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..4f571fd --- /dev/null +++ b/main.py @@ -0,0 +1,132 @@ +from flask import Flask, request, jsonify +from flask_sqlalchemy import SQLAlchemy +from flask_marshmallow import Marshmallow +from flask_restful import Resource, Api +from sqlalchemy import func +from datetime import datetime + + +#https://betterdatascience.com/develop-database-driven-rest-api-with-python-in-10-minutes/ +#Initializations for DB and JSON +app = Flask(__name__) +api = Api(app) +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///jobs.db' +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +ma = Marshmallow(app) + + + +#Create class for the Jobs, also allows for SQLAlchemy to create the table +##If you need to create another table do these commands: +### from main import app, db +### app.app_context().push() +### db.create_all() + +class Job(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(32), unique=True) + status = db.Column(db.String(32)) + lastUpdated = db.Column(db.DateTime(timezone=True), server_default=func.now()) + + def __init__(self, name, status, lastUpdated): + self.name = name + self.status = status + self.lastUpdated = lastUpdated + +#Parses the JSON gathered from the DB +class jobSchema(ma.Schema): + class Meta: + fields = ('id', 'name', 'status', 'lastUpdated') + +job_schema = jobSchema() +jobs_schema = jobSchema(many=True) + +#Main class for handling jobs +class jobManager(Resource): + #Logic for fetching one/all jobs + ##Check if id was provided as a parameter, if not pull for all jobs + ##makes a query and returns the result in json format + @staticmethod + def get(): + try: + id = request.args['id'] + except Exception as _: id = None + + if not id: + jobs = Job.query.all() + return jsonify(jobs_schema.dump(jobs)) + job = Job.query.get(id) + return jsonify(job_schema.dump(job)) + + #Insert new Job + ##Fetch provided json data for name, status, and last updated + ##Create instance of the Job class with the provided data + ##Add to the DB and commit + ##Return message stating success + @staticmethod + def post(): + name = request.json['name'] + status = request.json['status'] + #lastUpdated = request.json['lastUpdated'] + lastUpdated = datetime.now() + job = Job(name, status, lastUpdated) + db.session.add(job) + db.session.commit() + + return jsonify({ + 'Message': f'Job {name} has been added' + }) + + #Update existing job + ##check if a job id was passed in the call, if not return an error message + ##fecth json data + ##set values to the db according to provided data + ##return message that it was updated + + @staticmethod + def put(): + try: id = request.args['id'] + except Exception as _: id = None + + if not id: + return jsonify({ 'Message': 'Must provide a job ID'}) + + job = Job.query.get(id) + name = request.json['name'] + status = request.json['status'] + #lastUpdated = request.json['lastUpdated'] + lastUpdated = datetime.now() + + job.name = name + job.status = status + job.lastUpdated = lastUpdated + + db.session.commit() + return jsonify({ + 'Message': f'Job {name} has been altered' + }) + + #Delete Job + @staticmethod + def delete(): + try: id = request.args['id'] + except Exception as _: id = None + + if not id: + return jsonify({ 'Message': 'Must provide the job ID' }) + + job = Job.query.get(id) + db.session.delete(job) + db.session.commit() + + return jsonify({ + 'Message': f'Job {str(id)} deleted.' + }) + +#Attach Job manager class to an endpoint, /api/jobs +api.add_resource(jobManager, '/api/jobs') + +#Runs the Flask app +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file